r210294 - Provide fallback locations for backend remarks

Alp Toker alp at nuanti.com
Thu Jun 5 15:11:12 PDT 2014


Author: alp
Date: Thu Jun  5 17:11:12 2014
New Revision: 210294

URL: http://llvm.org/viewvc/llvm-project?rev=210294&view=rev
Log:
Provide fallback locations for backend remarks

Instead of disembodied diagnostics when debug info is disabled it's now
possible to identify the associated function's location in order to provide
some amount of of context.

We use the definition's body right brace location to differentiate the fallback
from diagnostics that genuinely relate to the function declaration itself (a
convention also used by gcc).

Modified:
    cfe/trunk/lib/CodeGen/CodeGenAction.cpp
    cfe/trunk/test/Frontend/optimization-remark-line-directive.c
    cfe/trunk/test/Frontend/optimization-remark.c

Modified: cfe/trunk/lib/CodeGen/CodeGenAction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenAction.cpp?rev=210294&r1=210293&r2=210294&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenAction.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenAction.cpp Thu Jun  5 17:11:12 2014
@@ -424,15 +424,22 @@ void BackendConsumer::EmitOptimizationRe
   StringRef Filename;
   unsigned Line, Column;
   D.getLocation(&Filename, &Line, &Column);
-  SourceLocation Loc;
+  SourceLocation DILoc;
   const FileEntry *FE = FileMgr.getFile(Filename);
   if (FE && Line > 0) {
     // If -gcolumn-info was not used, Column will be 0. This upsets the
-    // source manager, so if Column is not set, set it to 1.
-    if (Column == 0)
-      Column = 1;
-    Loc = SourceMgr.translateFileLineCol(FE, Line, Column);
+    // source manager, so pass 1 if Column is not set.
+    DILoc = SourceMgr.translateFileLineCol(FE, Line, Column ? Column : 1);
   }
+
+  // If a location isn't available, try to approximate it using the associated
+  // function definition. We use the definition's right brace to differentiate
+  // from diagnostics that genuinely relate to the function itself.
+  FullSourceLoc Loc(DILoc, SourceMgr);
+  if (Loc.isInvalid())
+    if (const Decl *FD = Gen->GetDeclForMangledName(D.getFunction().getName()))
+      Loc = FD->getASTContext().getFullLoc(FD->getBodyRBrace());
+
   Diags.Report(Loc, DiagID) << AddFlagValue(D.getPassName())
                             << D.getMsg().str();
 
@@ -443,13 +450,13 @@ void BackendConsumer::EmitOptimizationRe
     // FIXME: We should really be generating !srcloc annotations when
     // -Rpass is used. !srcloc annotations need to be emitted in
     // approximately the same spots as !dbg nodes.
-    Diags.Report(diag::note_fe_backend_optimization_remark_missing_loc);
-  else if (Loc.isInvalid())
+    Diags.Report(Loc, diag::note_fe_backend_optimization_remark_missing_loc);
+  else if (DILoc.isInvalid())
     // If we were not able to translate the file:line:col information
     // back to a SourceLocation, at least emit a note stating that
     // we could not translate this location. This can happen in the
     // case of #line directives.
-    Diags.Report(diag::note_fe_backend_optimization_remark_invalid_loc)
+    Diags.Report(Loc, diag::note_fe_backend_optimization_remark_invalid_loc)
         << Filename << Line << Column;
 }
 

Modified: cfe/trunk/test/Frontend/optimization-remark-line-directive.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/optimization-remark-line-directive.c?rev=210294&r1=210293&r2=210294&view=diff
==============================================================================
--- cfe/trunk/test/Frontend/optimization-remark-line-directive.c (original)
+++ cfe/trunk/test/Frontend/optimization-remark-line-directive.c Thu Jun  5 17:11:12 2014
@@ -2,14 +2,11 @@
 // directives. We cannot map #line directives back to
 // a SourceLocation.
 
-// RUN: %clang -c %s -Rpass=inline -O0 -S -gmlt -o /dev/null 2> %t.err
-// RUN: FileCheck < %t.err %s --check-prefix=INLINE-INVALID-LOC
-//
+// RUN: %clang_cc1 %s -Rpass=inline -S -gline-tables-only -dwarf-column-info -emit-llvm-only -verify
+
 int foo(int x, int y) __attribute__((always_inline));
 int foo(int x, int y) { return x + y; }
 
+// expected-remark at +2 {{foo inlined into bar}} expected-note at +2 {{could not determine the original source location for /bad/path/to/original.c:1230:25}}
 #line 1230 "/bad/path/to/original.c"
 int bar(int j) { return foo(j, j - 2); }
-
-// INLINE-INVALID-LOC: {{^remark: foo inlined into bar}}
-// INLINE-INVALID-LOC: note: could not determine the original source location for /bad/path/to/original.c:1230:0

Modified: cfe/trunk/test/Frontend/optimization-remark.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/optimization-remark.c?rev=210294&r1=210293&r2=210294&view=diff
==============================================================================
--- cfe/trunk/test/Frontend/optimization-remark.c (original)
+++ cfe/trunk/test/Frontend/optimization-remark.c Thu Jun  5 17:11:12 2014
@@ -3,10 +3,8 @@
 // always trigger the inliner, so it should be independent of the
 // optimization level.
 
-// RUN: %clang_cc1 %s -Rpass=inline -Rpass-analysis=inline -Rpass-missed=inline -O0 -gline-tables-only -emit-obj -verify -S -o /dev/null 2> %t.err
-
-// RUN: %clang -c %s -Rpass=inline -O0 -S -o /dev/null 2> %t.err
-// RUN: FileCheck < %t.err %s --check-prefix=INLINE-NO-LOC
+// RUN: %clang_cc1 %s -Rpass=inline -Rpass-analysis=inline -Rpass-missed=inline -O0 -gline-tables-only -emit-llvm-only -verify -S
+// RUN: %clang_cc1 %s -DNDEBUG -Rpass=inline -emit-llvm-only -verify -S
 
 int foo(int x, int y) __attribute__((always_inline));
 int foo(int x, int y) { return x + y; }
@@ -17,13 +15,17 @@ float foz(int x, int y) { return x * y;
 // The negative diagnostics are emitted twice because the inliner runs
 // twice.
 //
-// expected-remark at +6 {{foz should never be inlined (cost=never)}}
-// expected-remark at +5 {{foz will not be inlined into bar}}
-// expected-remark at +4 {{foz should never be inlined}}
-// expected-remark at +3 {{foz will not be inlined into bar}}
-// expected-remark at +2 {{foo should always be inlined}}
-// expected-remark at +1 {{foo inlined into bar}}
-int bar(int j) { return foo(j, j - 2) * foz(j - 2, j); }
-
-// INLINE-NO-LOC: {{^remark: foo inlined into bar}}
-// INLINE-NO-LOC: note: use -gline-tables-only -gcolumn-info to track
+int bar(int j) {
+#ifndef NDEBUG
+// expected-remark at +7 {{foz should never be inlined (cost=never)}}
+// expected-remark at +6 {{foz will not be inlined into bar}}
+// expected-remark at +5 {{foz should never be inlined}}
+// expected-remark at +4 {{foz will not be inlined into bar}}
+// expected-remark at +3 {{foo should always be inlined}}
+// expected-remark at +2 {{foo inlined into bar}}
+#endif
+  return foo(j, j - 2) * foz(j - 2, j);
+}
+#ifdef NDEBUG
+// expected-remark at -2 {{foo inlined into bar}} expected-note at -2 {{use -gline-tables-only -gcolumn-info to track source location information for this optimization remark}}
+#endif





More information about the cfe-commits mailing list