summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHubert Tong <hubert.reinterpretcast@gmail.com>2019-04-04 00:33:57 +0000
committerHubert Tong <hubert.reinterpretcast@gmail.com>2019-04-04 00:33:57 +0000
commit844a02e509a4cc03f76ef5dd1c358c57ee164b71 (patch)
tree4bd6304684f6bd8006aeb3ecbea40e82c0ce694b
parentcfdd0cb5d9c69fbe4b259cdabbe14c0abc3f15ad (diff)
downloadbcm5719-llvm-844a02e509a4cc03f76ef5dd1c358c57ee164b71.tar.gz
bcm5719-llvm-844a02e509a4cc03f76ef5dd1c358c57ee164b71.zip
[AIX] SelectionDAGNodes.h: Pack bit-fields that are meant to be packed
Summary: Certain classes in the subject file are expected to provide different views of a two-byte field as a collection of various bit-fields. On AIX, the canonical layout of bit-fields would cause these classes to span four bytes. Applying the `pack` pragma for compilers that employ the AIX canonical layout allows these classes 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. Reviewers: xingxue, sfertile, jasonliu Reviewed By: xingxue Subscribers: jsji, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D60164 llvm-svn: 357661
-rw-r--r--llvm/include/llvm/CodeGen/SelectionDAGNodes.h14
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
index e562ffcefd7..4bf37b631bd 100644
--- a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
+++ b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
@@ -488,6 +488,17 @@ protected:
// SubclassData. These are designed to fit within a uint16_t so they pack
// with NodeType.
+#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()
class SDNodeBitfields {
friend class SDNode;
friend class MemIntrinsicSDNode;
@@ -560,6 +571,9 @@ protected:
LoadSDNodeBitfields LoadSDNodeBits;
StoreSDNodeBitfields StoreSDNodeBits;
};
+END_TWO_BYTE_PACK()
+#undef BEGIN_TWO_BYTE_PACK
+#undef END_TWO_BYTE_PACK
// RawSDNodeBits must cover the entirety of the union. This means that all of
// the union's members must have size <= RawSDNodeBits. We write the RHS as
OpenPOWER on IntegriCloud