Revert 100573, it's causing some testsuite problems.
authorDale Johannesen <dalej@apple.com>
Tue, 6 Apr 2010 22:45:26 +0000 (22:45 +0000)
committerDale Johannesen <dalej@apple.com>
Tue, 6 Apr 2010 22:45:26 +0000 (22:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100578 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/Target/X86/AsmPrinter/X86MCInstLower.cpp

index 9dfa964ac9d90506ee45d9fa6a809430a8a85bc9..c86e2411d303b537a1196a0769840b1825aa4dae 100644 (file)
@@ -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()) {
index 9b2340804cd7922577bace9b90d191a79b90ea9a..a290eb0f2a5fcfbaca73048c48d2d4218feea0ee 100644 (file)
@@ -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