Mark Phalan
2010-05-12 16:53:47 UTC
Are the padding rules supposed to be consistent between the compiler and
dtrace on x64?
# cat /tmp/s.d
typedef struct _my_data {
uint32_t a;
uint32_t b;
uint64_t c;
} my_data;
typedef struct _more_data {
uint32_t x;
my_data y;
} more_data;
BEGIN {
printf("my_data: %d\n", sizeof(my_data));
printf("more_data: %d\n", sizeof(more_data));
printf("offset: %d\n", offsetof(more_data, y));
exit(0);
}
# cat /tmp/s.d
typedef struct _my_data {
uint32_t a;
uint32_t b;
uint64_t c;
} my_data;
typedef struct _more_data {
uint32_t x;
my_data y;
} more_data;
BEGIN {
printf("my_data: %d\n", sizeof(my_data));
printf("more_data: %d\n", sizeof(more_data));
printf("offset: %d\n", offsetof(more_data, y));
exit(0);
}
$ cc -m64 /tmp/x.c -o /tmp/x
$ /tmp/x
my_data: 16
more_data: 24
offset: 8
# dtrace -qs /tmp/s.d
my_data: 16
more_data: 20
offset: 4
Bug?
dtrace on x64?
# cat /tmp/s.d
typedef struct _my_data {
uint32_t a;
uint32_t b;
uint64_t c;
} my_data;
typedef struct _more_data {
uint32_t x;
my_data y;
} more_data;
BEGIN {
printf("my_data: %d\n", sizeof(my_data));
printf("more_data: %d\n", sizeof(more_data));
printf("offset: %d\n", offsetof(more_data, y));
exit(0);
}
# cat /tmp/s.d
typedef struct _my_data {
uint32_t a;
uint32_t b;
uint64_t c;
} my_data;
typedef struct _more_data {
uint32_t x;
my_data y;
} more_data;
BEGIN {
printf("my_data: %d\n", sizeof(my_data));
printf("more_data: %d\n", sizeof(more_data));
printf("offset: %d\n", offsetof(more_data, y));
exit(0);
}
$ cc -m64 /tmp/x.c -o /tmp/x
$ /tmp/x
my_data: 16
more_data: 24
offset: 8
# dtrace -qs /tmp/s.d
my_data: 16
more_data: 20
offset: 4
Bug?