[PATCH] D60748: Adds an option "malign-pass-aggregate" to make the alignment of the struct and union parameters compatible with the default gcc

James Y Knight via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 19 08:37:35 PDT 2020


jyknight added a comment.

Since the ABI this is trying to match is not documented literally anywhere, I think we need to have some confidence that what this implements is actually the same as what GCC does. While I wrote up what I think the algorithm is, without some sort of script to allow testing it against a bunch of examples, I wouldn't say I'm confident of its correctness.

I'm not sure if you can reverse-engineer what the alignment must have been from the assembly output, or from some debug flags. Or if maybe doing something silly like modifying the source to insert a printf would be the best method to test this.



================
Comment at: clang/lib/CodeGen/TargetInfo.cpp:1542-1544
+    // i386 System V ABI 2.1: Structures and unions assume the alignment of their
+    // most strictly aligned component.
+    //
----------------
This comment isn't useful. While it may be what the System V ABI document says, that's clearly incorreect, and is  not what the code is or should be doing. Please document what is actually implemented, instead.


================
Comment at: clang/lib/CodeGen/TargetInfo.cpp:1559
+          if (const auto *AT = QT->getAsArrayTypeUnsafe())
+            TempAlignment = getContext().getTypeAlign(AT->getElementType()) / 8;
+          else // recursively to get each type's alignment
----------------
Also needs to call getTypeStackAlignInBytes?


================
Comment at: clang/lib/CodeGen/TargetInfo.cpp:1567
+      if (MaxAlignment >= 16)
+        return std::max(MaxAlignment, Align);
+      else // return 4 when all the type alignments less than 16 bytes
----------------
I think this is wrong and that it should only return Align. The computation of the alignment of the elements is only to see if their alignment is >= 16.

If the alignment of the elements' types is >= 16, but the alignment of the structure is less than the alignment of one of its elements (e.g. due to `__attribute__ packed`), we should return the alignment of the structure.


================
Comment at: clang/lib/CodeGen/TargetInfo.cpp:1570
+        return 4;
+    } else if (Align < 16)
+      return MinABIStackAlignInBytes;
----------------
If I understood GCC's algorithm correctly, I think this needs to come first?


================
Comment at: clang/test/CodeGen/x86_32-align-linux.cpp:9
+
+class __attribute__((aligned(64))) X1 {
+  class  __attribute__((aligned(32))) {
----------------
Confused me that this was a different X1 than in the test-case above. I'm not sure why the tests need to be duplicated here in a .cpp file in the first place?


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D60748/new/

https://reviews.llvm.org/D60748





More information about the cfe-commits mailing list