From 49d915bb9a60b1dc9d1b5313dc8849427a034dfa Mon Sep 17 00:00:00 2001 From: Dale Johannesen Date: Tue, 6 Apr 2010 22:45:26 +0000 Subject: [PATCH] Revert 100573, it's causing some testsuite problems. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100578 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 61 +----------------- lib/Target/X86/AsmPrinter/X86MCInstLower.cpp | 68 +++++++++++++++++++- 2 files changed, 70 insertions(+), 59 deletions(-) diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 9dfa964ac9d..c86e2411d30 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -434,59 +434,7 @@ static void EmitKill(const MachineInstr *MI, AsmPrinter &AP) { AP.OutStreamer.AddBlankLine(); } -static void EmitDebugValueComment(const MachineInstr *MI, AsmPrinter &AP) { - char buf[100]; - std::string Str = "\t"; - Str += AP.MAI->getCommentString(); - Str += "DEBUG_VALUE: "; - // This code handles only the 3-operand target-independent form. - assert(MI->getNumOperands() == 3); - // cast away const; DIetc do not take const operands for some reason. - DIVariable V((MDNode*)(MI->getOperand(2).getMetadata())); - Str += V.getName(); - Str += " <- "; - - // Register or immediate value. Register 0 means undef. - if (MI->getOperand(0).isFPImm()) { - APFloat APF = APFloat(MI->getOperand(0).getFPImm()->getValueAPF()); - if (MI->getOperand(0).getFPImm()->getType()->isFloatTy()) { - sprintf(buf, "%e", APF.convertToFloat()); - Str += buf; - } else if (MI->getOperand(0).getFPImm()->getType()->isDoubleTy()) { - sprintf(buf, "%e", APF.convertToDouble()); - Str += buf; - } else { - // There is no good way to print long double. Convert a copy to - // double. Ah well, it's only a comment. - bool ignored; - APF.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, - &ignored); - Str += "(long double) "; - sprintf(buf, "%e", APF.convertToDouble()); - Str += buf; - } - } else if (MI->getOperand(0).isImm()) { - sprintf(buf, "%lld", MI->getOperand(0).getImm()); - Str += buf; - } else if (MI->getOperand(0).isReg()) { - if (MI->getOperand(0).getReg() == 0) { - // Suppress offset, it is not meaningful here. - Str += "undef"; - // NOTE: Want this comment at start of line, don't emit with AddComment. - AP.OutStreamer.EmitRawText(Twine(Str)); - return; - } - Str += AP.TM.getRegisterInfo()->getName(MI->getOperand(0).getReg()); - } else - llvm_unreachable("Unknown operand type"); - - Str += '+'; - sprintf(buf, "%lld", MI->getOperand(1).getImm()); - Str += buf; - // NOTE: Want this comment at start of line, don't emit with AddComment. - AP.OutStreamer.EmitRawText(Twine(Str)); -} /// EmitFunctionBody - This method emits the body and trailer for a /// function. @@ -525,9 +473,6 @@ void AsmPrinter::EmitFunctionBody() { case TargetOpcode::INLINEASM: EmitInlineAsm(II); break; - case TargetOpcode::DBG_VALUE: - if (isVerbose()) EmitDebugValueComment(II, *this); - break; case TargetOpcode::IMPLICIT_DEF: if (isVerbose()) EmitImplicitDef(II, *this); break; @@ -1291,7 +1236,7 @@ static void EmitGlobalConstantFP(const ConstantFP *CFP, unsigned AddrSpace, if (CFP->getType()->isX86_FP80Ty()) { // all long double variants are printed as hex - // API needed to prevent premature destruction + // api needed to prevent premature destruction APInt API = CFP->getValueAPF().bitcastToAPInt(); const uint64_t *p = API.getRawData(); if (AP.isVerbose()) { @@ -1321,8 +1266,8 @@ static void EmitGlobalConstantFP(const ConstantFP *CFP, unsigned AddrSpace, assert(CFP->getType()->isPPC_FP128Ty() && "Floating point constant type not handled"); - // All long double variants are printed as hex - // API needed to prevent premature destruction. + // All long double variants are printed as hex api needed to prevent + // premature destruction. APInt API = CFP->getValueAPF().bitcastToAPInt(); const uint64_t *p = API.getRawData(); if (AP.TM.getTargetData()->isBigEndian()) { diff --git a/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp b/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp index 9b2340804cd..a290eb0f2a5 100644 --- a/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp +++ b/lib/Target/X86/AsmPrinter/X86MCInstLower.cpp @@ -326,10 +326,76 @@ void X86MCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const { } } +void X86AsmPrinter::PrintDebugValueComment(const MachineInstr *MI, + raw_ostream &O) { + // FIXME: if this is implemented for another target before it goes + // away completely, the common part should be moved into AsmPrinter. + O << '\t' << MAI->getCommentString() << "DEBUG_VALUE: "; + unsigned NOps = MI->getNumOperands(); + // cast away const; DIetc do not take const operands for some reason. + DIVariable V((MDNode*)(MI->getOperand(NOps-1).getMetadata())); + O << V.getName(); + O << " <- "; + if (NOps==3) { + // Register or immediate value. Register 0 means undef. + assert(MI->getOperand(0).isReg() || + MI->getOperand(0).isImm() || + MI->getOperand(0).isFPImm()); + if (MI->getOperand(0).isReg() && MI->getOperand(0).getReg() == 0) { + // Suppress offset in this case, it is not meaningful. + O << "undef"; + OutStreamer.AddBlankLine(); + return; + } + + if (MI->getOperand(0).isFPImm()) { + // This is more naturally done in printOperand, but since the only use + // of such an operand is in this comment and that is temporary (and it's + // ugly), we prefer to keep this localized. + // The include of Type.h may be removable when this code is. + if (MI->getOperand(0).getFPImm()->getType()->isFloatTy() || + MI->getOperand(0).getFPImm()->getType()->isDoubleTy()) + MI->getOperand(0).print(O, &TM); + else { + // There is no good way to print long double. Convert a copy to + // double. Ah well, it's only a comment. + bool ignored; + APFloat APF = APFloat(MI->getOperand(0).getFPImm()->getValueAPF()); + APF.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, + &ignored); + O << "(long double) " << APF.convertToDouble(); + } + } else + printOperand(MI, 0, O); + } else { + if (MI->getOperand(0).isReg() && MI->getOperand(0).getReg() == 0) { + // Suppress offset in this case, it is not meaningful. + O << "undef"; + OutStreamer.AddBlankLine(); + return; + } + // Frame address. Currently handles register +- offset only. + assert(MI->getOperand(0).isReg() && MI->getOperand(3).isImm()); + O << '['; printOperand(MI, 0, O); O << '+'; printOperand(MI, 3, O); + O << ']'; + } + O << "+"; + printOperand(MI, NOps-2, O); +} + + void X86AsmPrinter::EmitInstruction(const MachineInstr *MI) { X86MCInstLower MCInstLowering(OutContext, Mang, *this); switch (MI->getOpcode()) { - + case TargetOpcode::DBG_VALUE: + if (isVerbose() && OutStreamer.hasRawTextSupport()) { + std::string TmpStr; + raw_string_ostream OS(TmpStr); + PrintDebugValueComment(MI, OS); + OutStreamer.EmitRawText(StringRef(OS.str())); + } + return; + case X86::MOVPC32r: { MCInst TmpInst; // This is a pseudo op for a two instruction sequence with a label, which