Index: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -2127,6 +2127,7 @@ uint64_t Offset = 0); static void emitGlobalConstantFP(const ConstantFP *CFP, AsmPrinter &AP); +static void emitGlobalConstantFP(APFloat APF, Type *ET, AsmPrinter &AP); /// isRepeatedByteSequence - Determine whether the given value is /// composed of a repeated sequence of identical bytes and return the @@ -2204,8 +2205,9 @@ ElementByteSize); } } else { + Type *ET = CDS->getElementType(); for (unsigned I = 0, E = CDS->getNumElements(); I != E; ++I) - emitGlobalConstantFP(cast(CDS->getElementAsConstant(I)), AP); + emitGlobalConstantFP(CDS->getElementAsAPFloat(I), ET, AP); } unsigned Size = DL.getTypeAllocSize(CDS->getType()); @@ -2274,17 +2276,17 @@ "Layout of constant struct may be incorrect!"); } -static void emitGlobalConstantFP(const ConstantFP *CFP, AsmPrinter &AP) { - APInt API = CFP->getValueAPF().bitcastToAPInt(); +static void emitGlobalConstantFP(APFloat APF, Type *ET, AsmPrinter &AP) { + APInt API = APF.bitcastToAPInt(); // First print a comment with what we think the original floating-point value // should have been. if (AP.isVerbose()) { SmallString<8> StrVal; - CFP->getValueAPF().toString(StrVal); + APF.toString(StrVal); - if (CFP->getType()) - CFP->getType()->print(AP.OutStreamer->GetCommentOS()); + if (ET) + ET->print(AP.OutStreamer->GetCommentOS()); else AP.OutStreamer->GetCommentOS() << "Printing Type"; AP.OutStreamer->GetCommentOS() << ' ' << StrVal << '\n'; @@ -2299,7 +2301,7 @@ // PPC's long double has odd notions of endianness compared to how LLVM // handles it: p[0] goes first for *big* endian on PPC. - if (AP.getDataLayout().isBigEndian() && !CFP->getType()->isPPC_FP128Ty()) { + if (AP.getDataLayout().isBigEndian() && !ET->isPPC_FP128Ty()) { int Chunk = API.getNumWords() - 1; if (TrailingBytes) @@ -2318,8 +2320,11 @@ // Emit the tail padding for the long double. const DataLayout &DL = AP.getDataLayout(); - AP.OutStreamer->EmitZeros(DL.getTypeAllocSize(CFP->getType()) - - DL.getTypeStoreSize(CFP->getType())); + AP.OutStreamer->EmitZeros(DL.getTypeAllocSize(ET) - DL.getTypeStoreSize(ET)); +} + +static void emitGlobalConstantFP(const ConstantFP *CFP, AsmPrinter &AP) { + emitGlobalConstantFP(CFP->getValueAPF(), CFP->getType(), AP); } static void emitGlobalConstantLargeInt(const ConstantInt *CI, AsmPrinter &AP) {