www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 24579] New: stat_t has wrong size for Android armv7a

https://issues.dlang.org/show_bug.cgi?id=24579

          Issue ID: 24579
           Summary: stat_t has wrong size for Android armv7a
           Product: D
           Version: D2
          Hardware: Other
                OS: Other
            Status: NEW
          Severity: normal
          Priority: P1
         Component: druntime
          Assignee: nobody puremagic.com
          Reporter: tim.dlang t-online.de

struct stat has size 104 for Android armv7a in C, but struct
core.sys.posix.sys.stat.stat_t in D has size 88.

File testc.c:
```
#include <stdio.h>
#include <sys/stat.h>

int main()
{
    printf("sizeof(stat_t): %zd\n", sizeof(struct stat));
    return 0;
}
```
Running
`~/Android/Sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi30-clang
-g -Wall testc.c -Xclang -fdump-record-layouts` prints the layout of struct
stat:
```
*** Dumping AST Record Layout
         0 | struct timespec
         0 |   time_t tv_sec
         4 |   long tv_nsec
           | [sizeof=8, align=4]

*** Dumping AST Record Layout
         0 | struct stat
         0 |   unsigned long long st_dev
         8 |   unsigned char[4] __pad0
        12 |   unsigned long __st_ino
        16 |   unsigned int st_mode
        20 |   nlink_t st_nlink
        24 |   uid_t st_uid
        28 |   gid_t st_gid
        32 |   unsigned long long st_rdev
        40 |   unsigned char[4] __pad3
        48 |   long long st_size
        56 |   unsigned long st_blksize
        64 |   unsigned long long st_blocks
        72 |   struct timespec st_atim
        72 |     time_t tv_sec
        76 |     long tv_nsec
        80 |   struct timespec st_mtim
        80 |     time_t tv_sec
        84 |     long tv_nsec
        88 |   struct timespec st_ctim
        88 |     time_t tv_sec
        92 |     long tv_nsec
        96 |   unsigned long long st_ino
           | [sizeof=104, align=8]
```

File test.d:
```
import core.sys.posix.sys.stat;
pragma(msg, "stat_t.sizeof: ", stat_t.sizeof);
static foreach(i; 0 .. stat_t.init.tupleof.length)
{
    pragma(msg, "  ",  stat_t.init.tupleof[i].offsetof, " | ",
__traits(identifier, stat_t.tupleof[i]), " size=",
stat_t.init.tupleof[i].sizeof);
}
```
Running `ldc2 -c -mtriple=armv7a--linux-android30 test.d` prints:
```
stat_t.sizeof: 88u
  0u | st_dev size=8u
  8u | __pad1 size=2u
  12u | st_ino size=4u
  16u | st_mode size=4u
  20u | st_nlink size=4u
  24u | st_uid size=4u
  28u | st_gid size=4u
  32u | st_rdev size=8u
  40u | __pad2 size=2u
  44u | st_size size=4u
  48u | st_blksize size=4u
  52u | st_blocks size=4u
  56u | st_atime size=4u
  60u | st_atimensec size=4u
  64u | st_mtime size=4u
  68u | st_mtimensec size=4u
  72u | st_ctime size=4u
  76u | st_ctimensec size=4u
  80u | __unused4 size=4u
  84u | __unused5 size=4u
```

--
Jun 02