|
@@ -1138,6 +1138,21 @@ static void EmitGlobalConstantStruct(const ConstantStruct *CS,
|
|
|
"Layout of constant struct may be incorrect!");
|
|
|
}
|
|
|
|
|
|
+static void EmitGlobalConstantUnion(const ConstantUnion *CU,
|
|
|
+ unsigned AddrSpace, AsmPrinter &AP) {
|
|
|
+ const TargetData *TD = AP.TM.getTargetData();
|
|
|
+ unsigned Size = TD->getTypeAllocSize(CU->getType());
|
|
|
+
|
|
|
+ const Constant *Contents = CU->getOperand(0);
|
|
|
+ unsigned FilledSize = TD->getTypeAllocSize(Contents->getType());
|
|
|
+
|
|
|
+ // Print the actually filled part
|
|
|
+ AP.EmitGlobalConstant(Contents, AddrSpace);
|
|
|
+
|
|
|
+ // And pad with enough zeroes
|
|
|
+ AP.OutStreamer.EmitZeros(Size-FilledSize, AddrSpace);
|
|
|
+}
|
|
|
+
|
|
|
static void EmitGlobalConstantFP(const ConstantFP *CFP, unsigned AddrSpace,
|
|
|
AsmPrinter &AP) {
|
|
|
// FP Constants are printed as integer constants to avoid losing
|
|
@@ -1257,9 +1272,6 @@ void AsmPrinter::EmitGlobalConstant(const Constant *CV, unsigned AddrSpace) {
|
|
|
|
|
|
if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV))
|
|
|
return EmitGlobalConstantFP(CFP, AddrSpace, *this);
|
|
|
-
|
|
|
- if (const ConstantVector *V = dyn_cast<ConstantVector>(CV))
|
|
|
- return EmitGlobalConstantVector(V, AddrSpace, *this);
|
|
|
|
|
|
if (isa<ConstantPointerNull>(CV)) {
|
|
|
unsigned Size = TM.getTargetData()->getTypeAllocSize(CV->getType());
|
|
@@ -1267,6 +1279,12 @@ void AsmPrinter::EmitGlobalConstant(const Constant *CV, unsigned AddrSpace) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ if (const ConstantUnion *CVU = dyn_cast<ConstantUnion>(CV))
|
|
|
+ return EmitGlobalConstantUnion(CVU, AddrSpace, *this);
|
|
|
+
|
|
|
+ if (const ConstantVector *V = dyn_cast<ConstantVector>(CV))
|
|
|
+ return EmitGlobalConstantVector(V, AddrSpace, *this);
|
|
|
+
|
|
|
// Otherwise, it must be a ConstantExpr. Lower it to an MCExpr, then emit it
|
|
|
// thread the streamer with EmitValue.
|
|
|
OutStreamer.EmitValue(LowerConstant(CV, *this),
|