summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2010-03-15 19:15:44 +0000
committerDevang Patel <dpatel@apple.com>2010-03-15 19:15:44 +0000
commitf2bce7cbaef5f3101f5a01349d13493c53703942 (patch)
treeee7e6fc1636e979a2444060b4d64c43355e2be2c /llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
parent347a0eb85cd4f44f2ae78a8b62aa11d936086f58 (diff)
downloadbcm5719-llvm-f2bce7cbaef5f3101f5a01349d13493c53703942.tar.gz
bcm5719-llvm-f2bce7cbaef5f3101f5a01349d13493c53703942.zip
Create SDDbgValue for dbg_value intrinsics and remember its connections with DAG nodes.
This is a work in progress. Patch by Dale Johannesen! llvm-svn: 98568
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp33
1 files changed, 28 insertions, 5 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index 3c0a230cfae..3d9a4d523b6 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#define DEBUG_TYPE "isel"
+#include "SDNodeDbgValue.h"
#include "SelectionDAGBuilder.h"
#include "FunctionLoweringInfo.h"
#include "llvm/ADT/BitVector.h"
@@ -3800,11 +3801,6 @@ SelectionDAGBuilder::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
return 0;
}
case Intrinsic::dbg_value: {
- // FIXME: currently, we get here only if OptLevel != CodeGenOpt::None.
- // The real handling of this intrinsic is in FastISel.
- if (OptLevel != CodeGenOpt::None)
- // FIXME: Variable debug info is not supported here.
- return 0;
DwarfWriter *DW = DAG.getDwarfWriter();
if (!DW)
return 0;
@@ -3813,9 +3809,36 @@ SelectionDAGBuilder::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
return 0;
MDNode *Variable = DI.getVariable();
+ uint64_t Offset = DI.getOffset();
Value *V = DI.getValue();
if (!V)
return 0;
+
+ // Build an entry in DbgOrdering. Debug info input nodes get an SDNodeOrder
+ // but do not always have a corresponding SDNode built. The SDNodeOrder
+ // absolute, but not relative, values are different depending on whether
+ // debug info exists.
+ ++SDNodeOrder;
+ if (isa<ConstantInt>(V) || isa<ConstantFP>(V)) {
+ SDDbgValue* dv = new SDDbgValue(Variable, V, Offset, dl, SDNodeOrder);
+ DAG.RememberDbgInfo(dv);
+ } else {
+ SDValue &N = NodeMap[V];
+ if (N.getNode()) {
+ SDDbgValue *dv = new SDDbgValue(Variable, N.getNode(),
+ N.getResNo(), Offset, dl, SDNodeOrder);
+ DAG.AssignDbgInfo(N.getNode(), dv);
+ } else {
+ // We may expand this to cover more cases. One case where we have no
+ // data available is an unreferenced parameter; we need this fallback.
+ SDDbgValue* dv = new SDDbgValue(Variable,
+ UndefValue::get(V->getType()),
+ Offset, dl, SDNodeOrder);
+ DAG.RememberDbgInfo(dv);
+ }
+ }
+
+ // Build a debug info table entry.
if (BitCastInst *BCI = dyn_cast<BitCastInst>(V))
V = BCI->getOperand(0);
AllocaInst *AI = dyn_cast<AllocaInst>(V);
OpenPOWER on IntegriCloud