[clang] [clang] Stub out gcc_struct attribute (PR #71148)

Dan Klishch via cfe-commits cfe-commits at lists.llvm.org
Wed Nov 29 12:11:12 PST 2023


DanShaders wrote:

@MaskRay 

> I am now confused by the subject "[clang] Stub out gcc_struct attribute".

The user-facing change is `[[gcc_struct]]` attribute implemented for Itanium C++ ABI. Better handling of `-mms-bitfields` is just a byproduct. I agree that commit message should be more specific about changes to them.

> `-mms-bitfields` wants to be supported by all architectures, or just x86 Darwin targets.

It's not like supporting `-mms-bitfields` for all targets adds a big maintenance burden. The architecture check you are talking about can be easily added in the future if proves to be needed.

------

As Andrew said, I indeed was referring to code used by cross-platform Ladybird browser.

Microsoft bit-field layout didn't break an overly-specific regression test but rendered unusable double to string conversion. The culprit was the following snippet:
```c++
union Extractor {
  double value;
  struct {
    bool sign : 1;
    u32 exponent : 11;
    u64 mantissa : 52;
  };
};
```
According to MSVC ABI, there should be padding between fields. I hope you agree that this is not an intuitive and expected behavior.

I later found that, in Wasi implementation, we have more bit-fields that rely on the absence of padding which are susceptible to the same problem (they look like `struct { 
bool flag1 : 1; bool flag2 : 1; u32 _unused : 30 };`). To fix them, we have to split single `_unused` field into 3 (and this field cannot be a transformed to a padding since we have to ensure it is zeroed).

https://github.com/llvm/llvm-project/pull/71148


More information about the cfe-commits mailing list