]> granicus.if.org Git - clang/commitdiff
Add support to attach debug info to an instruction.
authorDevang Patel <dpatel@apple.com>
Tue, 6 Oct 2009 18:36:08 +0000 (18:36 +0000)
committerDevang Patel <dpatel@apple.com>
Tue, 6 Oct 2009 18:36:08 +0000 (18:36 +0000)
This is not yet enabled.

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

lib/CodeGen/CGDebugInfo.cpp
lib/CodeGen/CGDebugInfo.h
lib/CodeGen/CGExpr.cpp
lib/CodeGen/CGStmt.cpp

index be742d9b8067dc5e62ad814b0451e60b937ffc24..de9390eb9f415f054fc06851cb6f77e896bd4cac 100644 (file)
@@ -879,7 +879,7 @@ void CGDebugInfo::EmitFunctionStart(const char *Name, QualType ReturnType,
                                   getOrCreateType(ReturnType, Unit),
                                   Fn->hasInternalLinkage(), true/*definition*/);
 
-  DebugFactory.InsertSubprogramStart(SP, Builder.GetInsertBlock());
+//  DebugFactory.InsertSubprogramStart(SP, Builder.GetInsertBlock());
 
   // Push function on region stack.
   RegionStack.push_back(SP);
@@ -903,8 +903,19 @@ void CGDebugInfo::EmitStopPoint(llvm::Function *Fn, CGBuilderTy &Builder) {
   // Get the appropriate compile unit.
   llvm::DICompileUnit Unit = getOrCreateCompileUnit(CurLoc);
   PresumedLoc PLoc = SM.getPresumedLoc(CurLoc);
+
+#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
+  llvm::DIDescriptor DR = RegionStack.back();
+  llvm::DIScope DS = llvm::DIScope(DR.getNode());
+  llvm::DILocation DO(NULL);
+  llvm::DILocation DL = 
+    DebugFactory.CreateLocation(PLoc.getLine(), PLoc.getColumn(),
+                                DS, DO);
+  Builder.SetCurrentDebugLocation(DL.getNode());
+#else
   DebugFactory.InsertStopPoint(Unit, PLoc.getLine(), PLoc.getColumn(),
                                Builder.GetInsertBlock());
+#endif
 }
 
 /// EmitRegionStart- Constructs the debug code for entering a declarative
@@ -915,7 +926,9 @@ void CGDebugInfo::EmitRegionStart(llvm::Function *Fn, CGBuilderTy &Builder) {
     D = RegionStack.back();
   D = DebugFactory.CreateLexicalBlock(D);
   RegionStack.push_back(D);
+#ifndef ATTACH_DEBUG_INFO_TO_AN_INSN
   DebugFactory.InsertRegionStart(D, Builder.GetInsertBlock());
+#endif
 }
 
 /// EmitRegionEnd - Constructs the debug code for exiting a declarative
@@ -926,7 +939,9 @@ void CGDebugInfo::EmitRegionEnd(llvm::Function *Fn, CGBuilderTy &Builder) {
   // Provide an region stop point.
   EmitStopPoint(Fn, Builder);
 
+#ifndef ATTACH_DEBUG_INFO_TO_AN_INSN
   DebugFactory.InsertRegionEnd(RegionStack.back(), Builder.GetInsertBlock());
+#endif
   RegionStack.pop_back();
 }
 
index ff8ec0574c27e6a5efdf711679228acb7c722e6b..0a617b999240e68e1cf76e3adc2f770f77fd7495 100644 (file)
@@ -148,4 +148,5 @@ private:
 } // namespace CodeGen
 } // namespace clang
 
+
 #endif
index d89da3224fc0ee5a8de5bda0b9cc3fd5fb593a4b..7a124b6d130e39314312f2d4bc520925b89491fd 100644 (file)
@@ -31,7 +31,11 @@ llvm::AllocaInst *CodeGenFunction::CreateTempAlloca(const llvm::Type *Ty,
                                                     const char *Name) {
   if (!Builder.isNamePreserving())
     Name = "";
-  return new llvm::AllocaInst(Ty, 0, Name, AllocaInsertPt);
+  llvm::AllocaInst *AI = new llvm::AllocaInst(Ty, 0, Name, AllocaInsertPt);
+#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
+  Builder.SetDebugLocation(AI);
+#endif
+  return AI;
 }
 
 /// EvaluateExprAsBool - Perform the usual unary conversions on the specified
index 2a5d5edd25ebe4684670570dc19b34c8f16583c2..62e465d7028f47956ee94d106697b4516e728eb0 100644 (file)
@@ -148,12 +148,13 @@ RValue CodeGenFunction::EmitCompoundStmt(const CompoundStmt &S, bool GetLast,
 
   CGDebugInfo *DI = getDebugInfo();
   if (DI) {
+#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
+    DI->setLocation(S.getLBracLoc());
+    DI->EmitRegionStart(CurFn, Builder);
+#else
     EnsureInsertPoint();
     DI->setLocation(S.getLBracLoc());
-    // FIXME: The llvm backend is currently not ready to deal with region_end
-    // for block scoping.  In the presence of always_inline functions it gets so
-    // confused that it doesn't emit any debug info.  Just disable this for now.
-    //DI->EmitRegionStart(CurFn, Builder);
+#endif    
   }
 
   // Keep track of the current cleanup stack depth.
@@ -166,13 +167,13 @@ RValue CodeGenFunction::EmitCompoundStmt(const CompoundStmt &S, bool GetLast,
     EmitStmt(*I);
 
   if (DI) {
+#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
+    DI->setLocation(S.getLBracLoc());
+    DI->EmitRegionEnd(CurFn, Builder);
+#else
     EnsureInsertPoint();
-    DI->setLocation(S.getRBracLoc());
-
-    // FIXME: The llvm backend is currently not ready to deal with region_end
-    // for block scoping.  In the presence of always_inline functions it gets so
-    // confused that it doesn't emit any debug info.  Just disable this for now.
-    //DI->EmitRegionEnd(CurFn, Builder);
+    DI->setLocation(S.getLBracLoc());
+#endif    
   }
 
   RValue RV;
@@ -478,6 +479,13 @@ void CodeGenFunction::EmitForStmt(const ForStmt &S) {
   BreakContinueStack.push_back(BreakContinue(AfterFor, ContinueBlock));
 
   // If the condition is true, execute the body of the for stmt.
+#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
+  CGDebugInfo *DI = getDebugInfo();
+  if (DI) {
+    DI->setLocation(S.getSourceRange().getBegin());
+    DI->EmitRegionStart(CurFn, Builder);
+  }
+#endif
   EmitStmt(S.getBody());
 
   BreakContinueStack.pop_back();
@@ -490,6 +498,12 @@ void CodeGenFunction::EmitForStmt(const ForStmt &S) {
 
   // Finally, branch back up to the condition for the next iteration.
   EmitBranch(CondBlock);
+#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
+  if (DI) {
+    DI->setLocation(S.getSourceRange().getEnd());
+    DI->EmitRegionEnd(CurFn, Builder);
+  }
+#endif
 
   // Emit the fall-through block.
   EmitBlock(AfterFor, true);