summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDale Johannesen <dalej@apple.com>2010-04-06 22:45:26 +0000
committerDale Johannesen <dalej@apple.com>2010-04-06 22:45:26 +0000
commitd706c64ce2ac8c507f021d451e2f647512b0c4ec (patch)
treed609cd27f8decf36f13d4245dd1b6ed177d6a015
parent2fb774fa3bd93106fceaa80e792c91409a4eb4bc (diff)
downloadexternal_llvm-d706c64ce2ac8c507f021d451e2f647512b0c4ec.zip
external_llvm-d706c64ce2ac8c507f021d451e2f647512b0c4ec.tar.gz
external_llvm-d706c64ce2ac8c507f021d451e2f647512b0c4ec.tar.bz2
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
-rw-r--r--lib/CodeGen/AsmPrinter/AsmPrinter.cpp63
-rw-r--r--lib/Target/X86/AsmPrinter/X86MCInstLower.cpp68
2 files changed, 71 insertions, 60 deletions
diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index 9dfa964..c86e241 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 9b23408..a290eb0 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