[PATCH] D74911: [AIX] Pack BasicBlockBits

David Tenty via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 20 09:43:19 PST 2020


daltenty created this revision.
daltenty added reviewers: jasonliu, hubert.reinterpretcast, sfertile, xingxue.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
daltenty edited the summary of this revision.

D51664 <https://reviews.llvm.org/D51664> introduces a new structure BasicBlockBits which it expects to be
packed a certain way. This change is very similar to D60164 <https://reviews.llvm.org/D60164>, and we apply the
same fix:

"On AIX, the canonical layout of bit-fields would cause 
these ... to span four bytes. Applying the pack pragma for compilers that 
employ the AIX canonical layout allows these ... to fit within the expected
two bytes. In the future, the pragma would also likely need to be applied when
building with Clang on AIX."


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D74911

Files:
  llvm/include/llvm/IR/BasicBlock.h


Index: llvm/include/llvm/IR/BasicBlock.h
===================================================================
--- llvm/include/llvm/IR/BasicBlock.h
+++ llvm/include/llvm/IR/BasicBlock.h
@@ -461,11 +461,26 @@
   void validateInstrOrdering() const;
 
 private:
+#if defined(_AIX) && (!defined(__GNUC__) || defined(__ibmxl__))
+// Except for GCC; by default, AIX compilers store bit-fields in 4-byte words
+// and give the `pack` pragma push semantics.
+#define BEGIN_TWO_BYTE_PACK() _Pragma("pack(2)")
+#define END_TWO_BYTE_PACK() _Pragma("pack(pop)")
+#else
+#define BEGIN_TWO_BYTE_PACK()
+#define END_TWO_BYTE_PACK()
+#endif
+
+BEGIN_TWO_BYTE_PACK()
   /// Bitfield to help interpret the bits in Value::SubclassData.
   struct BasicBlockBits {
     unsigned short BlockAddressRefCount : 15;
     unsigned short InstrOrderValid : 1;
   };
+END_TWO_BYTE_PACK()
+
+#undef BEGIN_TWO_BYTE_PACK
+#undef END_TWO_BYTE_PACK
 
   /// Safely reinterpret the subclass data bits to a more useful form.
   BasicBlockBits getBasicBlockBits() const {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D74911.245680.patch
Type: text/x-patch
Size: 1034 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200220/d9d523cb/attachment.bin>


More information about the llvm-commits mailing list