mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-06 10:54:49 +01:00
[AIX] Pack BasicBlockBits
Summary: D51664 introduces a new structure BasicBlockBits which it expects to be packed a certain way. This change is very similar to 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." Reviewers: jasonliu, hubert.reinterpretcast, sfertile, xingxue Reviewed By: sfertile Subscribers: llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D74911
This commit is contained in:
@@ -461,11 +461,26 @@ public:
|
||||
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 {
|
||||
|
||||
Reference in New Issue
Block a user