Emit column debug information for loads
authorTobias Grosser <tobias@grosser.es>
Tue, 29 Jul 2014 06:10:47 +0000 (06:10 +0000)
committerTobias Grosser <tobias@grosser.es>
Tue, 29 Jul 2014 06:10:47 +0000 (06:10 +0000)
This allows us to give more precise diagnostics.

Diego kindly tested the impact on debug info size: "The increase on average
debug sizes is 0.1%. The total file size increase is ~0%."

llvm-svn: 214162

clang/lib/CodeGen/CGExpr.cpp
clang/test/CodeGen/debug-info-column.c [new file with mode: 0644]
clang/test/CodeGen/linetable-endscope.c
clang/test/CodeGenCXX/PR20038.cpp
clang/test/CodeGenObjC/arc-linetable.m

index 512b323..d3a01ab 100644 (file)
@@ -1258,6 +1258,9 @@ void CodeGenFunction::EmitStoreOfScalar(llvm::Value *value, LValue lvalue,
 /// method emits the address of the lvalue, then loads the result as an rvalue,
 /// returning the rvalue.
 RValue CodeGenFunction::EmitLoadOfLValue(LValue LV, SourceLocation Loc) {
+  if (CGDebugInfo *DI = getDebugInfo())
+    DI->EmitLocation(Builder, Loc, true);
+
   if (LV.isObjCWeak()) {
     // load of a __weak object.
     llvm::Value *AddrWeakObj = LV.getAddress();
diff --git a/clang/test/CodeGen/debug-info-column.c b/clang/test/CodeGen/debug-info-column.c
new file mode 100644 (file)
index 0000000..2a635ac
--- /dev/null
@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -emit-llvm -o - -g %s | FileCheck %s
+void foo(float A[100], float B[100]) {
+  B[12] = A[10] + A[20] + A[30];
+}
+// CHECK-LABEL: foo
+// CHECK: load float* %arrayidx{{.*}}, !dbg [[LOC0:.*]]
+// CHECK: load float* %arrayidx{{.*}}, !dbg [[LOC1:.*]]
+// CHECK: load float* %arrayidx{{.*}}, !dbg [[LOC2:.*]]
+// CHECK: store float {{.*}} float* %arrayidx{{.*}}, !dbg [[LOC3:.*]]
+// CHECK-DAG: [[LOC0]] = metadata !{i32 3, i32 11, metadata {{.*}}, null}
+// CHECK-DAG: [[LOC1]] = metadata !{i32 3, i32 19, metadata {{.*}}, null}
+// CHECK-DAG: [[LOC2]] = metadata !{i32 3, i32 27, metadata {{.*}}, null}
+// CHECK-DAG: [[LOC3]] = metadata !{i32 3, i32 3, metadata {{.*}}, null}
index 236f605..b39df78 100644 (file)
@@ -11,7 +11,7 @@
 void foo(char c)
 {
   int i;
-  // CHECK: ![[CONV]] = metadata !{i32 [[@LINE+1]], i32 0, metadata !{{.*}}, null}
+  // CHECK: ![[CONV]] = metadata !{i32 [[@LINE+1]], i32 7, metadata !{{.*}}, null}
   i = c;
   // CHECK: ![[RET]] = metadata !{i32 [[@LINE+1]], i32 0, metadata !{{.*}}, null}
 }
index c24685d..f72219f 100644 (file)
@@ -11,6 +11,6 @@ extern bool b;
 // CHECK: [[DTOR_CALL1_LOC]] = metadata !{i32 [[@LINE+2]], i32 0, metadata [[FUN1_BLOCK:.*]], null}
 // CHECK: [[FUN1_BLOCK]] = metadata !{{{[^,]*}}, {{[^,]*}}, metadata [[FUN1]],
 void fun1() { b && (C(), 1); }
-// CHECK: [[DTOR_CALL2_LOC]] = metadata !{i32 [[@LINE+2]], i32 0, metadata [[FUN2_BLOCK1:.*]], null}
+// CHECK: [[DTOR_CALL2_LOC]] = metadata !{i32 [[@LINE+2]], i32 28, metadata [[FUN2_BLOCK1:.*]], null}
 // CHECK: [[FUN2_BLOCK1]] = metadata !{{{[^,]*}}, {{[^,]*}}, metadata [[FUN2]],
 bool fun2() { return (C(), b) && 0; }
index 2d56ab3..9d6c5b3 100644 (file)
@@ -76,7 +76,7 @@ typedef signed char BOOL;
 - (int)testMultiline:(NSString *)foo {
   // CHECK: ![[MSG4]] = metadata !{i32 [[@LINE+1]], i32 0, metadata !{{.*}}, null}
   int r = [self testSideEffect :foo];
-  // CHECK: ![[EXP4]] = metadata !{i32 [[@LINE+1]], i32 0, metadata !{{.*}}, null}
+  // CHECK: ![[EXP4]] = metadata !{i32 [[@LINE+1]], i32 10, metadata !{{.*}}, null}
   return r;
   // CHECK: ![[RET4]] = metadata !{i32 [[@LINE+1]], i32 0, metadata !{{.*}}, null}
 }
@@ -94,7 +94,7 @@ typedef signed char BOOL;
 }
 
 - (int)testNoCleanupSideEffect {
-  // CHECK: ![[MSG7]] = metadata !{i32 [[@LINE+1]], i32 0, metadata !{{.*}}, null}
+  // CHECK: ![[MSG7]] = metadata !{i32 [[@LINE+1]], i32 4, metadata !{{.*}}, null}
   [self testVoid :@"foo"];
   // CHECK: ![[RET7]] = metadata !{i32 [[@LINE+1]], i32 0, metadata !{{.*}}, null}
   return 1;
@@ -102,7 +102,7 @@ typedef signed char BOOL;
 
 - (void)testCleanupVoid:(BOOL)skip withDelegate: (AppDelegate *) delegate {
   static BOOL skip_all;
-  // CHECK: ![[SKIP1]] = metadata !{i32 [[@LINE+1]], i32 0,
+  // CHECK: ![[SKIP1]] = metadata !{i32 [[@LINE+1]], i32 8,
   if (!skip_all) {
     if (!skip) {
       return;