]> granicus.if.org Git - llvm/commitdiff
Go binding: Add GetCurrentDebugLocation to obtain debug location from builder
authorAndrew Wilkins <axwalk@gmail.com>
Fri, 31 Mar 2017 04:59:57 +0000 (04:59 +0000)
committerAndrew Wilkins <axwalk@gmail.com>
Fri, 31 Mar 2017 04:59:57 +0000 (04:59 +0000)
Summary:

Currently Go binding only has SetCurrentDebugLocation method.
I added GetCurrentDebugLocation method to IRBuilder instance.

I added this because I want to save current debug location, change debug location temporary and restore the saved one finally.
This is useful when source location jumps and goes back after while LLVM IR generation.

I also added tests for this to ir_test.go.
I confirmed that all test passed with this patch based on r298890

Patch by Ryuichi Hayashida!

Differential Revision: https://reviews.llvm.org/D31415

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

bindings/go/llvm/IRBindings.cpp
bindings/go/llvm/IRBindings.h
bindings/go/llvm/ir.go
bindings/go/llvm/ir_test.go

index 20cc05043f28620c5826a09d90dc430aea33e41c..4bfa1bbaf0cc8ac81972947abbc97350e2ec3267 100644 (file)
@@ -14,6 +14,7 @@
 #include "IRBindings.h"
 #include "llvm/IR/Attributes.h"
 #include "llvm/IR/DebugLoc.h"
+#include "llvm/IR/DebugInfoMetadata.h"
 #include "llvm/IR/Function.h"
 #include "llvm/IR/IRBuilder.h"
 #include "llvm/IR/LLVMContext.h"
@@ -71,6 +72,18 @@ void LLVMSetCurrentDebugLocation2(LLVMBuilderRef Bref, unsigned Line,
                     InlinedAt ? unwrap<MDNode>(InlinedAt) : nullptr));
 }
 
+LLVMDebugLocMetadata LLVMGetCurrentDebugLocation2(LLVMBuilderRef Bref) {
+  const auto& Loc = unwrap(Bref)->getCurrentDebugLocation();
+  const auto* InlinedAt = Loc.getInlinedAt();
+  const LLVMDebugLocMetadata md{
+    Loc.getLine(),
+    Loc.getCol(),
+    wrap(Loc.getScope()),
+    InlinedAt == nullptr ? nullptr : wrap(InlinedAt->getRawInlinedAt()),
+  };
+  return md;
+}
+
 void LLVMSetSubprogram(LLVMValueRef Func, LLVMMetadataRef SP) {
   unwrap<Function>(Func)->setSubprogram(unwrap<DISubprogram>(SP));
 }
index 21147712ed5b4a026f4a5282193b625070249131..f4f490391d4f1107558ee889af0628a93cb39b66 100644 (file)
@@ -27,6 +27,12 @@ extern "C" {
 #endif
 
 typedef struct LLVMOpaqueMetadata *LLVMMetadataRef;
+struct LLVMDebugLocMetadata{
+    unsigned Line;
+    unsigned Col;
+    LLVMMetadataRef Scope;
+    LLVMMetadataRef InlinedAt;
+};
 
 LLVMMetadataRef LLVMConstantAsMetadata(LLVMValueRef Val);
 
@@ -46,6 +52,8 @@ void LLVMSetCurrentDebugLocation2(LLVMBuilderRef Bref, unsigned Line,
                                   unsigned Col, LLVMMetadataRef Scope,
                                   LLVMMetadataRef InlinedAt);
 
+struct LLVMDebugLocMetadata LLVMGetCurrentDebugLocation2(LLVMBuilderRef Bref);
+
 void LLVMSetSubprogram(LLVMValueRef Fn, LLVMMetadataRef SP);
 
 #ifdef __cplusplus
index b263c07c512d8e69953f53a7042625d86e8230f4..fe191beb38132ef501e74178d9acf682a218cd90 100644 (file)
@@ -1226,9 +1226,23 @@ func (b Builder) InsertWithName(instr Value, name string) {
 func (b Builder) Dispose() { C.LLVMDisposeBuilder(b.C) }
 
 // Metadata
+type DebugLoc struct {
+       Line, Col      uint
+       Scope          Metadata
+       InlinedAt      Metadata
+}
 func (b Builder) SetCurrentDebugLocation(line, col uint, scope, inlinedAt Metadata) {
        C.LLVMSetCurrentDebugLocation2(b.C, C.unsigned(line), C.unsigned(col), scope.C, inlinedAt.C)
 }
+// Get current debug location. Please do not call this function until setting debug location with SetCurrentDebugLocation()
+func (b Builder) GetCurrentDebugLocation() (loc DebugLoc) {
+       md := C.LLVMGetCurrentDebugLocation2(b.C)
+       loc.Line = uint(md.Line)
+       loc.Col = uint(md.Col)
+       loc.Scope = Metadata{C: md.Scope}
+       loc.InlinedAt = Metadata{C: md.InlinedAt}
+       return
+}
 func (b Builder) SetInstDebugLocation(v Value) { C.LLVMSetInstDebugLocation(b.C, v.C) }
 func (b Builder) InsertDeclare(module Module, storage Value, md Value) Value {
        f := module.NamedFunction("llvm.dbg.declare")
index 13e113957b4d029b3672f822dd77b9f50eb83b3f..c823615a4293c8a2e2997b9fdbaf0a444e0081a3 100644 (file)
@@ -95,3 +95,42 @@ func TestAttributes(t *testing.T) {
                testAttribute(t, name)
        }
 }
+
+func TestDebugLoc(t *testing.T) {
+       mod := NewModule("")
+       defer mod.Dispose()
+
+       ctx := mod.Context()
+
+       b := ctx.NewBuilder()
+       defer b.Dispose()
+
+       d := NewDIBuilder(mod)
+       defer func() {
+               d.Destroy()
+       }()
+       file := d.CreateFile("dummy_file", "dummy_dir")
+       voidInfo := d.CreateBasicType(DIBasicType{Name: "void"})
+       typeInfo := d.CreateSubroutineType(DISubroutineType{file, []Metadata{voidInfo}})
+       scope := d.CreateFunction(file, DIFunction{
+               Name:         "foo",
+               LinkageName:  "foo",
+               Line:         10,
+               ScopeLine:    10,
+               Type:         typeInfo,
+               File:         file,
+               IsDefinition: true,
+       })
+
+       b.SetCurrentDebugLocation(10, 20, scope, Metadata{})
+       loc := b.GetCurrentDebugLocation()
+       if loc.Line != 10 {
+               t.Errorf("Got line %d, though wanted 10", loc.Line)
+       }
+       if loc.Col != 20 {
+               t.Errorf("Got column %d, though wanted 20", loc.Col)
+       }
+       if loc.Scope.C != scope.C {
+               t.Errorf("Got metadata %v as scope, though wanted %v", loc.Scope.C, scope.C)
+       }
+}