This commit implements gcc_struct attribute with the behavior similar to
one in GCC. Current behavior is as follows:
When ItaniumRecordLayoutBuilder is used, [[gcc_struct]] will locally
cancel the effect of -mms-bitfields on a record. If -mms-bitfields is
not supplied and is not a default behavior on a target, [[gcc_struct]]
will be a no-op. This should provide enough compatibility with GCC.
If C++ ABI is "Microsoft", [[gcc_struct]] will currently always produce
a diagnostic, since support for it is not yet implemented in
MicrosoftRecordLayoutBuilder. Note, however, that all the infrastructure
is ready for the future implementation.
In particular, check for default value of -mms-bitfields is moved from a
driver to ASTContext, since it now non-trivially depends on other
supplied flags. This also, unfortunately, makes it impossible to use
usual argument parsing for `-m{no-,}ms-bitfields`.
The patch doesn't introduce any backwards-incompatible changes, except
for situations when cc1 is called directly with `-mms-bitfields` option.
Work towards #24757
---------
Co-authored-by: Martin Storsjö <martin@martin.st>
19 lines
607 B
C
19 lines
607 B
C
// RUN: %clang_cc1 -emit-llvm-only -triple x86_64-pc-linux-gnu %s
|
|
// RUN: %clang_cc1 -emit-llvm-only -triple x86_64-pc-linux-gnu -fms-layout-compatibility=microsoft %s
|
|
// RUN: %clang_cc1 -emit-llvm-only -triple x86_64-pc-windows-gnu %s
|
|
// RUN: %clang_cc1 -emit-llvm-only -triple x86_64-pc-windows-gnu -fms-layout-compatibility=itanium %s
|
|
|
|
struct {
|
|
int a : 24;
|
|
char b : 8;
|
|
} __attribute__((gcc_struct)) t1;
|
|
_Static_assert(sizeof(t1) == 4, "");
|
|
|
|
#pragma ms_struct on
|
|
struct {
|
|
int a : 24;
|
|
char b : 8;
|
|
} __attribute__((gcc_struct)) t2;
|
|
_Static_assert(sizeof(t2) == 4, "");
|
|
#pragma ms_struct off
|