From 95c1984e6b0b299f74d8a428fac6b6be266ae169 Mon Sep 17 00:00:00 2001
From: Devang Patel <dpatel@apple.com>
Date: Wed, 16 Sep 2009 18:16:11 +0000
Subject: Add an interface to attach debugging information with an instruction.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82062 91177308-0d34-0410-b5e6-96231b3b80d8
---
 include/llvm/Support/IRBuilder.h | 30 ++++++++++++++++++++++++------
 1 file changed, 24 insertions(+), 6 deletions(-)

(limited to 'include')

diff --git a/include/llvm/Support/IRBuilder.h b/include/llvm/Support/IRBuilder.h
index 4080f90..b1f4354 100644
--- a/include/llvm/Support/IRBuilder.h
+++ b/include/llvm/Support/IRBuilder.h
@@ -20,6 +20,7 @@
 #include "llvm/GlobalAlias.h"
 #include "llvm/GlobalVariable.h"
 #include "llvm/Function.h"
+#include "llvm/Metadata.h"
 #include "llvm/LLVMContext.h"
 #include "llvm/ADT/Twine.h"
 #include "llvm/Support/ConstantFolder.h"
@@ -60,35 +61,38 @@ template<bool preserveNames = true, typename T = ConstantFolder,
 class IRBuilder : public Inserter {
   BasicBlock *BB;
   BasicBlock::iterator InsertPt;
+  MDKindID MDKind;
+  MDNode *CurLocation;
   LLVMContext &Context;
   T Folder;
 public:
   IRBuilder(LLVMContext &C, const T &F, const Inserter &I = Inserter())
-    : Inserter(I), Context(C), Folder(F) {
+    : Inserter(I), MDKind(0), CurLocation(0), Context(C), Folder(F) {
     ClearInsertionPoint(); 
   }
   
-  explicit IRBuilder(LLVMContext &C) : Context(C), Folder(C) {
+  explicit IRBuilder(LLVMContext &C) 
+    : MDKind(0), CurLocation(0), Context(C), Folder(C) {
     ClearInsertionPoint();
   }
   
   explicit IRBuilder(BasicBlock *TheBB, const T &F)
-      : Context(TheBB->getContext()), Folder(F) {
+    : MDKind(0), CurLocation(0), Context(TheBB->getContext()), Folder(F) {
     SetInsertPoint(TheBB);
   }
   
   explicit IRBuilder(BasicBlock *TheBB)
-      : Context(TheBB->getContext()), Folder(Context) {
+    : MDKind(0), CurLocation(0), Context(TheBB->getContext()), Folder(Context) {
     SetInsertPoint(TheBB);
   }
   
   IRBuilder(BasicBlock *TheBB, BasicBlock::iterator IP, const T& F)
-      : Context(TheBB->getContext()), Folder(F) {
+    : MDKind(0), CurLocation(0), Context(TheBB->getContext()), Folder(F) {
     SetInsertPoint(TheBB, IP);
   }
   
   IRBuilder(BasicBlock *TheBB, BasicBlock::iterator IP)
-      : Context(TheBB->getContext()), Folder(Context) {
+    : MDKind(0), CurLocation(0), Context(TheBB->getContext()), Folder(Context) {
     SetInsertPoint(TheBB, IP);
   }
 
@@ -127,10 +131,24 @@ public:
     InsertPt = IP;
   }
 
+  /// SetCurrentLocation - This specifies the location information used
+  /// by debugging information.
+  void SetCurrentLocation(MDNode *L) {
+    if (MDKind == 0) {
+      Context.getMetadata().RegisterMDKind("dbg");
+      MDKind = Context.getMetadata().getMDKind("dbg");
+    }
+    CurLocation = L;
+  }
+
+  MDNode *getCurrentLocation() const { return CurLocation; }
+  
   /// Insert - Insert and return the specified instruction.
   template<typename InstTy>
   InstTy *Insert(InstTy *I, const Twine &Name = "") const {
     this->InsertHelper(I, Name, BB, InsertPt);
+    if (CurLocation)
+      Context.getMetadata().setMD(MDKind, CurLocation, I);
     return I;
   }
 
-- 
cgit v1.1