I'm having an issue with a piece of code I'm trying to compile using mingw-w64
gcc.  The pieces of code I'm specifically having an issue with is as follows...

struct duplicate {

  pthread_mutex_t mutex;

  size_t count;

  struct digest_t digest;

  struct vector devices;

  struct hash_entry hash;

  struct queue_entry queue;
};

struct vector {

  size_t size;
  size_t limit;

  void** store;
};

struct device {

  dev_t device;

  struct vector entries;
};

struct entry {

  dev_t device;
  ino_t inode;
  off_t size;

  uid_t uid;
  gid_t gid;
  mode_t mode;

#ifdef HAVE_STAT_BLKSIZE
  blksize_t bs;
#endif

  time_t mtime_sec;
  time_t mtime_nsec;

  bool valid;

  int fd;
  void* mm;

  struct vector aliases;
};

int do_print(const struct duplicate* d) {

  const bool n = opts.null;
  const char de = n ? '\0' : '\n';

  if (opts.quiet)
    return 0;

  const struct device* v;

  vector_for_each(v, &d->devices) {

    struct entry* e;

    vector_for_each(e, &v->entries) {

      const char* const a = entry_alias(e);

      if (entry_handle_modify(e))
          continue;

      printf("%s%c", a, de);

      if (e->aliases.size == 1)
        continue;

      for (size_t k = 1; k < e->aliases.size; k++) {

        const char* const a = vector_get(&e->aliases, k);

        printf("  * %s%c", a, de);
      }
    }
  }

  return 0;
}

The disassembly for it looks like this...

000000000040226e <do_print>:
  40226e:       55                      push   rbp
  40226f:       48 89 e5                mov    rbp,rsp
  402272:       48 83 ec 60             sub    rsp,0x60
  402276:       48 89 4d 10             mov    QWORD PTR [rbp+0x10],rcx
  40227a:       48 8b 05 ef 1e 01 00    mov    rax,QWORD PTR [rip+0x11eef]      
  # 414170 <.refptr.opts>
  402281:       0f b6 40 03             movzx  eax,BYTE PTR [rax+0x3]
  402285:       88 45 e7                mov    BYTE PTR [rbp-0x19],al
  402288:       80 7d e7 00             cmp    BYTE PTR [rbp-0x19],0x0
  40228c:       74 07                   je     402295 <do_print+0x27>
  40228e:       b8 00 00 00 00          mov    eax,0x0
  402293:       eb 05                   jmp    40229a <do_print+0x2c>
  402295:       b8 0a 00 00 00          mov    eax,0xa
  40229a:       88 45 e6                mov    BYTE PTR [rbp-0x1a],al
  40229d:       48 8b 05 cc 1e 01 00    mov    rax,QWORD PTR [rip+0x11ecc]      
  # 414170 <.refptr.opts>
  4022a4:       0f b6 40 02             movzx  eax,BYTE PTR [rax+0x2]
  4022a8:       84 c0                   test   al,al
  4022aa:       74 0a                   je     4022b6 <do_print+0x48>
  4022ac:       b8 00 00 00 00          mov    eax,0x0
  4022b1:       e9 2a 01 00 00          jmp    4023e0 <do_print+0x172>
  4022b6:       48 c7 45 f8 00 00 00    mov    QWORD PTR [rbp-0x8],0x0
  4022bd:       00 
  4022be:       e9 e5 00 00 00          jmp    4023a8 <do_print+0x13a>
  4022c3:       48 c7 45 f0 00 00 00    mov    QWORD PTR [rbp-0x10],0x0
  4022ca:       00 
  4022cb:       e9 a0 00 00 00          jmp    402370 <do_print+0x102>
  4022d0:       48 8b 45 d0             mov    rax,QWORD PTR [rbp-0x30]
  4022d4:       48 89 c1                mov    rcx,rax
  4022d7:       e8 32 f6 ff ff          call   40190e <entry_alias>
  4022dc:       48 89 45 c8             mov    QWORD PTR [rbp-0x38],rax
  4022e0:       48 8b 45 d0             mov    rax,QWORD PTR [rbp-0x30]
  4022e4:       48 89 c1                mov    rcx,rax
  4022e7:       e8 cc f6 ff ff          call   4019b8 <entry_handle_modify>
  4022ec:       84 c0                   test   al,al
  4022ee:       74 02                   je     4022f2 <do_print+0x84>
  4022f0:       eb 79                   jmp    40236b <do_print+0xfd>
  4022f2:       0f be 55 e6             movsx  edx,BYTE PTR [rbp-0x1a]
  4022f6:       48 8b 45 c8             mov    rax,QWORD PTR [rbp-0x38]
  4022fa:       41 89 d0                mov    r8d,edx
  4022fd:       48 89 c2                mov    rdx,rax
  402300:       48 8d 0d bd f6 00 00    lea    rcx,[rip+0xf6bd]        # 4119c4 
<default_init_devices+0xd4>
  402307:       e8 dc d2 00 00          call   40f5e8 <printf>
  40230c:       48 8b 45 d0             mov    rax,QWORD PTR [rbp-0x30]
  402310:       48 8b 40 40             mov    rax,QWORD PTR [rax+0x40]
  402314:       48 83 f8 01             cmp    rax,0x1
  402318:       75 02                   jne    40231c <do_print+0xae>
  40231a:       eb 4f                   jmp    40236b <do_print+0xfd>
  40231c:       48 c7 45 e8 01 00 00    mov    QWORD PTR [rbp-0x18],0x1
  402323:       00 
  402324:       eb 37                   jmp    40235d <do_print+0xef>
  402326:       48 8b 45 d0             mov    rax,QWORD PTR [rbp-0x30]
  40232a:       48 8d 48 40             lea    rcx,[rax+0x40]
  40232e:       48 8b 45 e8             mov    rax,QWORD PTR [rbp-0x18]
  402332:       48 89 c2                mov    rdx,rax
  402335:       e8 1a f5 ff ff          call   401854 <vector_get>
  40233a:       48 89 45 c0             mov    QWORD PTR [rbp-0x40],rax
  40233e:       0f be 55 e6             movsx  edx,BYTE PTR [rbp-0x1a]
  402342:       48 8b 45 c0             mov    rax,QWORD PTR [rbp-0x40]
  402346:       41 89 d0                mov    r8d,edx
  402349:       48 89 c2                mov    rdx,rax
  40234c:       48 8d 0d 76 f6 00 00    lea    rcx,[rip+0xf676]        # 4119c9 
<default_init_devices+0xd9>
  402353:       e8 90 d2 00 00          call   40f5e8 <printf>
  402358:       48 83 45 e8 01          add    QWORD PTR [rbp-0x18],0x1
  40235d:       48 8b 45 d0             mov    rax,QWORD PTR [rbp-0x30]
  402361:       48 8b 40 40             mov    rax,QWORD PTR [rax+0x40]
  402365:       48 3b 45 e8             cmp    rax,QWORD PTR [rbp-0x18]
  402369:       77 bb                   ja     402326 <do_print+0xb8>
  40236b:       48 83 45 f0 01          add    QWORD PTR [rbp-0x10],0x1
  402370:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  402374:       48 8b 40 08             mov    rax,QWORD PTR [rax+0x8]
  402378:       48 3b 45 f0             cmp    rax,QWORD PTR [rbp-0x10]
  40237c:       76 25                   jbe    4023a3 <do_print+0x135>
  40237e:       48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  402382:       48 8b 40 18             mov    rax,QWORD PTR [rax+0x18]
  402386:       48 8b 55 f0             mov    rdx,QWORD PTR [rbp-0x10]
  40238a:       48 c1 e2 03             shl    rdx,0x3
  40238e:       48 01 d0                add    rax,rdx
  402391:       48 8b 00                mov    rax,QWORD PTR [rax]
  402394:       48 89 45 d0             mov    QWORD PTR [rbp-0x30],rax
  402398:       48 83 7d d0 00          cmp    QWORD PTR [rbp-0x30],0x0
  40239d:       0f 85 2d ff ff ff       jne    4022d0 <do_print+0x62>
  4023a3:       48 83 45 f8 01          add    QWORD PTR [rbp-0x8],0x1
  4023a8:       48 8b 45 10             mov    rax,QWORD PTR [rbp+0x10]
  4023ac:       48 8b 40 50             mov    rax,QWORD PTR [rax+0x50]
  4023b0:       48 3b 45 f8             cmp    rax,QWORD PTR [rbp-0x8]
  4023b4:       76 25                   jbe    4023db <do_print+0x16d>
  4023b6:       48 8b 45 10             mov    rax,QWORD PTR [rbp+0x10]
  4023ba:       48 8b 40 60             mov    rax,QWORD PTR [rax+0x60]
  4023be:       48 8b 55 f8             mov    rdx,QWORD PTR [rbp-0x8]
  4023c2:       48 c1 e2 03             shl    rdx,0x3
  4023c6:       48 01 d0                add    rax,rdx
  4023c9:       48 8b 00                mov    rax,QWORD PTR [rax]
  4023cc:       48 89 45 d8             mov    QWORD PTR [rbp-0x28],rax
  4023d0:       48 83 7d d8 00          cmp    QWORD PTR [rbp-0x28],0x0
  4023d5:       0f 85 e8 fe ff ff       jne    4022c3 <do_print+0x55>
  4023db:       b8 00 00 00 00          mov    eax,0x0
  4023e0:       48 83 c4 60             add    rsp,0x60
  4023e4:       5d                      pop    rbp
  4023e5:       c3                      ret    

Anything that dereferences an entry pointer triggers an access violation.  From
the disassembly, it looks like the value of the entry pointer is being pulled
off the stack without dereferencing anything from the actual argument value.
The code does work if it's copied into the calling function however.

Suggestions?

My MinGW version is 4.0.2 (4.9.2).

jason@fi ~/development/git/uxcn/yafd $ $CC --version
x86_64-w64-mingw32-gcc (GCC) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

-Jason

------------------------------------------------------------------------------
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to