summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlp Toker <alp@nuanti.com>2014-06-05 22:11:12 +0000
committerAlp Toker <alp@nuanti.com>2014-06-05 22:11:12 +0000
commit817255ea365533dece0a00566c6098b7b0de8d0f (patch)
treec47aa416c913510c5bc69c0fce40da57b8d4acd5
parentc1ba5d5c4623443fe4cd25ef70d0af149f97b16c (diff)
downloadclang-817255ea365533dece0a00566c6098b7b0de8d0f.tar.gz
clang-817255ea365533dece0a00566c6098b7b0de8d0f.tar.bz2
clang-817255ea365533dece0a00566c6098b7b0de8d0f.tar.xz
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). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@210294 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/CodeGenAction.cpp23
-rw-r--r--test/Frontend/optimization-remark-line-directive.c9
-rw-r--r--test/Frontend/optimization-remark.c30
3 files changed, 34 insertions, 28 deletions
diff --git a/lib/CodeGen/CodeGenAction.cpp b/lib/CodeGen/CodeGenAction.cpp
index 455299f2df..db3ecc5672 100644
--- a/lib/CodeGen/CodeGenAction.cpp
+++ b/lib/CodeGen/CodeGenAction.cpp
@@ -424,15 +424,22 @@ void BackendConsumer::EmitOptimizationRemark(
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::EmitOptimizationRemark(
// 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;
}
diff --git a/test/Frontend/optimization-remark-line-directive.c b/test/Frontend/optimization-remark-line-directive.c
index b4b1b92324..c7606276ed 100644
--- a/test/Frontend/optimization-remark-line-directive.c
+++ b/test/Frontend/optimization-remark-line-directive.c
@@ -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@+2 {{foo inlined into bar}} expected-note@+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
diff --git a/test/Frontend/optimization-remark.c b/test/Frontend/optimization-remark.c
index c36a9d4292..7e96a0ff53 100644
--- a/test/Frontend/optimization-remark.c
+++ b/test/Frontend/optimization-remark.c
@@ -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@+6 {{foz should never be inlined (cost=never)}}
-// expected-remark@+5 {{foz will not be inlined into bar}}
-// expected-remark@+4 {{foz should never be inlined}}
-// expected-remark@+3 {{foz will not be inlined into bar}}
-// expected-remark@+2 {{foo should always be inlined}}
-// expected-remark@+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@+7 {{foz should never be inlined (cost=never)}}
+// expected-remark@+6 {{foz will not be inlined into bar}}
+// expected-remark@+5 {{foz should never be inlined}}
+// expected-remark@+4 {{foz will not be inlined into bar}}
+// expected-remark@+3 {{foo should always be inlined}}
+// expected-remark@+2 {{foo inlined into bar}}
+#endif
+ return foo(j, j - 2) * foz(j - 2, j);
+}
+#ifdef NDEBUG
+// expected-remark@-2 {{foo inlined into bar}} expected-note@-2 {{use -gline-tables-only -gcolumn-info to track source location information for this optimization remark}}
+#endif