summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/CodeGen/SelectionDAGNodes.h22
1 files changed, 18 insertions, 4 deletions
diff --git a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
index fad77ae2389..a1dca4946b4 100644
--- a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
+++ b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h
@@ -463,6 +463,7 @@ protected:
};
union {
+ char RawSDNodeBits[sizeof(uint16_t)];
SDNodeBitfields SDNodeBits;
ConstantSDNodeBitfields ConstantSDNodeBits;
MemSDNodeBitfields MemSDNodeBits;
@@ -471,6 +472,21 @@ protected:
StoreSDNodeBitfields StoreSDNodeBits;
};
+ // RawSDNodeBits must cover the entirety of the union. This means that all
+ // of the union's members must have size <= RawSDNodeBits.
+ static_assert(sizeof(SDNodeBits) <= sizeof(RawSDNodeBits),
+ "SDNodeBits too wide");
+ static_assert(sizeof(ConstantSDNodeBits) <= sizeof(RawSDNodeBits),
+ "ConstantSDNodeBits too wide");
+ static_assert(sizeof(MemSDNodeBits) <= sizeof(RawSDNodeBits),
+ "MemSDNodeBits too wide");
+ static_assert(sizeof(LSBaseSDNodeBits) <= sizeof(RawSDNodeBits),
+ "LSBaseSDNodeBits too wide");
+ static_assert(sizeof(LoadSDNodeBits) <= sizeof(RawSDNodeBits),
+ "LoadSDNodeBits too wide");
+ static_assert(sizeof(StoreSDNodeBits) <= sizeof(RawSDNodeBits),
+ "StoreSDNodeBits too wide");
+
private:
/// Unique id per SDNode in the DAG.
int NodeId;
@@ -876,7 +892,7 @@ protected:
: NodeType(Opc), NodeId(-1), OperandList(nullptr), ValueList(VTs.VTs),
UseList(nullptr), NumOperands(0), NumValues(VTs.NumVTs), IROrder(Order),
debugLoc(std::move(dl)) {
- memset(&SDNodeBits, 0, sizeof(SDNodeBits));
+ memset(&RawSDNodeBits, 0, sizeof(RawSDNodeBits));
assert(debugLoc.hasTrivialDestructor() && "Expected trivial destructor");
assert(NumValues == VTs.NumVTs &&
"NumValues wasn't wide enough for its operands!");
@@ -1095,9 +1111,7 @@ public:
/// function should only be used to compute a FoldingSetNodeID value.
unsigned getRawSubclassData() const {
uint16_t Data;
- memcpy(&Data, &SDNodeBits, sizeof(SDNodeBits));
- static_assert(sizeof(SDNodeBits) <= sizeof(uint16_t),
- "SDNodeBits field too large?");
+ memcpy(&Data, &RawSDNodeBits, sizeof(RawSDNodeBits));
return Data;
}
OpenPOWER on IntegriCloud