<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/111009>111009</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[Clang][CodeGen] __bdos off by 4
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Cydox
</td>
</tr>
</table>
<pre>
Under certain circumstances __bdos can be off by 4 bytes compared to gcc.
Seen in the linux kernel:
https://lore.kernel.org/linux-kernel/3D0816D1-0807-4D37-8D5F-3C55CA910FAA@linux.dev/
Reproducer from Thorsten Blum (also here: https://godbolt.org/z/vvK9PE1Yq):
```C
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int counter;
} atomic_t;
typedef struct refcount_struct {
atomic_t refs;
} refcount_t;
struct callback_head {
struct callback_head *next;
void (*func)(struct callback_head *head);
} __attribute__((aligned(sizeof(void *))));
#define rcu_head callback_head
typedef struct {
uid_t val;
} kuid_t;
typedef struct {
gid_t val;
} kgid_t;
struct posix_acl_entry {
short e_tag;
unsigned short e_perm;
union {
kuid_t e_uid;
kgid_t e_gid;
};
};
struct posix_acl {
refcount_t a_refcount;
struct rcu_head a_rcu;
unsigned int a_count;
struct posix_acl_entry a_entries[] __attribute__((counted_by(a_count)));
};
int main() {
unsigned int count = 1;
struct posix_acl *acl;
acl = malloc(sizeof(struct posix_acl) +
sizeof(struct posix_acl_entry) * count);
acl->a_count = count;
printf("%zu", __builtin_dynamic_object_size(acl, 0));
return 0;
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVcuS6yYQ_Rq8oeySwBpLCy081jiLbFJ5LLJSIWjJZBA4CFzj-foUSH7I1zO5LhUYuvtw-gHNhkF2GqBE2SvKqgXz7mBsuTsL87FojDiXf2kBFnOwjkmNubTc94NjmsOA67oRZsCcadwANm2LmzNe4-bsYMDc9EdmQWBncMf5CiUVSrbj-AeAxlJjdwCspPYf-B2sBoXopHBw7jiEFdkjslfGwmrUWBnbhZ1gtJyMyJ5WSZ6-VOkyyZPNcl3RzTKvsv2S7rJsty3SZL_donUSrVYCTgH2js44_g5Ha4TnYHFrTY__PBg7OND4VfkeI5IzNRh8AAuIbvGcYWdEY5Sb2H0isj-dfi1-e0v__heR4uoWeknGbzetCZWaKy8AI7obnJBmdUD07Qupks29OI7ufAQBLR6c9dxhtHkd9zHGWGqHufHagUV02kebCjNneslrd9t8BmWhjcb1M-gLRNAaZuBXs0f4CYYzpRrG3-sDMDEHfa5Btho-bmBB8WRkEOSIbFuveQgxyb-yDnNMwh3JumbOWdl4B3UdgXKmwk0QAUh-gmkRyadjthH_8l1hCBXQSg3Ycj8eNjv6Z5PkpagdPjE1I_get79P0Aymew7TPYGZzI9mkB8146oG7ez5IRUHYx2G2rFuFnmv44MhrgpHsP1Nw2tp9Bwp_EZvMNReihlcFHaTsLsXok1178n_uDA_8laCmNWXxQ36Ut-XtLHacv_cy3CDWP1gf6vUxxCyOEsYxuf0WZmN91HUzTnU3AT9Y3H94HFg0jOpI0px5--Ma4TDiFY4_ZZvqGrG1cMZ8WIHIa1wz5Qy_P42PGJEGuQhmdffl2ZjqEbjLb76f8-WcbVE9G2KTqQzT8GkerRSuzZGhCCSffo470Jf8lI5qWtx1iy8U6b5B7irA6kQ9kB-h5OHoI-l47zVOJll4r5VXF7whSipKGjBFlCmG7IpNslLsV4cyqbdpDwrmpeE8pZwyiErIF1nWcvbPG2ShSxJQtZpktA0y1K6XvGU8jzPC0o5gWSToXUCPZNqpdSpDy1lIYfBQ5mmaZIUC8UaUEPs2IRwxXQX3M6qhS2DwbLx3RCb3eCGG4STTsU2v4sWWRX-GgG_gB4rNbbySw9feKvKhxYn3cE3K2760H_V6TItj9aE4CKyjzQHRPYT01NJ_gsAAP__DUd-dA">