DebugInfo: Ensure the store for an assignment is attributed to the beginning of the...
authorDavid Blaikie <dblaikie@gmail.com>
Mon, 8 Dec 2014 21:48:57 +0000 (21:48 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Mon, 8 Dec 2014 21:48:57 +0000 (21:48 +0000)
llvm-svn: 223699

clang/lib/CodeGen/CGExpr.cpp
clang/test/CodeGenCXX/debug-info-line.cpp [new file with mode: 0644]

index 1a3a61a..6ced6e1 100644 (file)
@@ -3133,6 +3133,8 @@ LValue CodeGenFunction::EmitBinaryOperatorLValue(const BinaryOperator *E) {
 
     RValue RV = EmitAnyExpr(E->getRHS());
     LValue LV = EmitCheckedLValue(E->getLHS(), TCK_Store);
+    if (CGDebugInfo *DI = getDebugInfo())
+      DI->EmitLocation(Builder, E->getLocStart());
     EmitStoreThroughLValue(RV, LV);
     return LV;
   }
diff --git a/clang/test/CodeGenCXX/debug-info-line.cpp b/clang/test/CodeGenCXX/debug-info-line.cpp
new file mode 100644 (file)
index 0000000..0434de5
--- /dev/null
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 -g -std=c++11 -S -emit-llvm %s -o - | FileCheck %s
+
+int src(); int* sink();
+
+void f1() {
+#line 100
+  * // The store for the assignment should be attributed to the start of the
+    // assignment expression here, regardless of the location of subexpressions.
+  (
+  sink
+  (
+  )
+  +
+  3
+  )
+  =
+  src
+  (
+  )
+  +
+  42
+  ;
+  // CHECK: store {{.*}}, !dbg [[DBG1:!.*]]
+}
+
+// CHECK: [[DBG1]] = metadata !{i32 100, {{.*}}