Stop abusing EmitInstrWithCustomInserter for target-dependent
authorDale Johannesen <dalej@apple.com>
Sun, 25 Apr 2010 21:33:54 +0000 (21:33 +0000)
committerDale Johannesen <dalej@apple.com>
Sun, 25 Apr 2010 21:33:54 +0000 (21:33 +0000)
form of DEBUG_VALUE, as it doesn't have reasonable default
behavior for unsupported targets.  Add a new hook instead.
No functional change.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@102320 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetLowering.h
lib/CodeGen/SelectionDAG/InstrEmitter.cpp
lib/Target/X86/X86ISelLowering.cpp
lib/Target/X86/X86ISelLowering.h

index 58037dded131ea23a83ec911e5a36a8e004d50b8..2c77331533a388383ab27202f6b4a30d5b3f932c 100644 (file)
@@ -1255,6 +1255,16 @@ public:
     return SDValue();
   }
 
+  /// EmitTargetCodeForFrameDebugValue - Emit a target-dependent form of
+  /// DBG_VALUE encoding the address of a frame index.  Addresses would
+  /// normally be lowered the same way as other addresses on the target,
+  /// e.g. in load instructions.  For targets that do not support this
+  /// the debug info is simply lost.
+  virtual void
+  EmitTargetCodeForFrameDebugValue(MachineBasicBlock* BB, unsigned FrameIx,
+                                   uint64_t Offset, MDNode *MDPtr,
+                                   DebugLoc dl) const {}
+
   /// LowerOperationWrapper - This callback is invoked by the type legalizer
   /// to legalize nodes with an illegal operand type but legal result types.
   /// It replaces the LowerOperation callback in the type Legalizer.
index 4a78ccce64796e9c26ab5313426284dbb34ed06a..ff77d82cc9434afc10c1088ee2a3d773158ef5d5 100644 (file)
@@ -514,6 +514,14 @@ MachineInstr *InstrEmitter::EmitDbgValue(SDDbgValue *SD,
   MDNode* MDPtr = SD->getMDPtr();
   DebugLoc DL = SD->getDebugLoc();
 
+  if (SD->getKind() == SDDbgValue::FRAMEIX) {
+    // Stack address; this needs to be lowered in target-dependent fashion.
+    // EmitTargetCodeForFrameDebugValue is responsible for allocation.
+    unsigned FrameIx = SD->getFrameIx();
+    TLI->EmitTargetCodeForFrameDebugValue(InsertBB, FrameIx, Offset, MDPtr, DL);
+    return 0;
+  }
+  // Otherwise, we're going to create an instruction here.
   const TargetInstrDesc &II = TII->get(TargetOpcode::DBG_VALUE);
   MachineInstrBuilder MIB = BuildMI(*MF, DL, II);
   if (SD->getKind() == SDDbgValue::SDNODE) {
@@ -541,15 +549,6 @@ MachineInstr *InstrEmitter::EmitDbgValue(SDDbgValue *SD,
       // dropped.
       MIB.addReg(0U);
     }
-  } else if (SD->getKind() == SDDbgValue::FRAMEIX) {
-    unsigned FrameIx = SD->getFrameIx();
-    // Stack address; this needs to be lowered in target-dependent fashion.
-    // FIXME test that the target supports this somehow; if not emit Undef.
-    // Create a pseudo for EmitInstrWithCustomInserter's consumption.
-    MIB.addImm(FrameIx).addImm(Offset).addMetadata(MDPtr);
-    abort();
-    TLI->EmitInstrWithCustomInserter(&*MIB, InsertBB, EM);
-    return 0;
   } else {
     // Insert an Undef so we can see what we dropped.
     MIB.addReg(0U);
index 2060dbf312fd163f803d56d6bfc51d6d54485d2a..6a14fda5b4d43f95ff35199c1172c45678afa364 100644 (file)
@@ -8622,6 +8622,19 @@ X86TargetLowering::EmitLoweredMingwAlloca(MachineInstr *MI,
   return BB;
 }
 
+void
+X86TargetLowering::EmitTargetCodeForFrameDebugValue(MachineBasicBlock* BB,
+                                      unsigned FrameIx, uint64_t Offset,
+                                      MDNode *MDPtr, DebugLoc DL) const {
+  // Target dependent DBG_VALUE.  Only the frame index case is done here.
+  const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
+  X86AddressMode AM;
+  AM.BaseType = X86AddressMode::FrameIndexBase;
+  AM.Base.FrameIndex = FrameIx;
+  addFullAddress(BuildMI(BB, DL, TII->get(X86::DBG_VALUE)), AM).
+    addImm(Offset).addMetadata(MDPtr);
+}
+
 MachineBasicBlock *
 X86TargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
                                                MachineBasicBlock *BB,
@@ -8724,21 +8737,6 @@ X86TargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
     F->DeleteMachineInstr(MI);   // The pseudo instruction is gone now.
     return BB;
   }
-    // DBG_VALUE.  Only the frame index case is done here.
-  case X86::DBG_VALUE: {
-    const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
-    DebugLoc DL = MI->getDebugLoc();
-    X86AddressMode AM;
-    MachineFunction *F = BB->getParent();
-    AM.BaseType = X86AddressMode::FrameIndexBase;
-    AM.Base.FrameIndex = MI->getOperand(0).getImm();
-    addFullAddress(BuildMI(BB, DL, TII->get(X86::DBG_VALUE)), AM).
-      addImm(MI->getOperand(1).getImm()).
-      addMetadata(MI->getOperand(2).getMetadata());
-    F->DeleteMachineInstr(MI);      // Remove pseudo.
-    return BB;
-  }
-
     // String/text processing lowering.
   case X86::PCMPISTRM128REG:
     return EmitPCMP(MI, BB, 3, false /* in-mem */);
index 7996184f33f309066f49a137e92f76e4259e0237..79cd08bdc7918fc725b000a637f87c232e067f13 100644 (file)
@@ -453,6 +453,11 @@ namespace llvm {
     /// and some i16 instructions are slow.
     virtual bool IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const;
 
+    virtual void
+    EmitTargetCodeForFrameDebugValue(MachineBasicBlock* BB,
+                                     unsigned FrameIx, uint64_t Offset,
+                                     MDNode *MDPtr, DebugLoc DL) const;
+
     virtual MachineBasicBlock *EmitInstrWithCustomInserter(MachineInstr *MI,
                                                          MachineBasicBlock *MBB,
                     DenseMap<MachineBasicBlock*, MachineBasicBlock*> *EM) const;