r208315 - Fix segmentation fault when mixing -Rpass with #line.

Diego Novillo dnovillo at google.com
Thu May 8 06:49:55 PDT 2014


Author: dnovillo
Date: Thu May  8 08:49:54 2014
New Revision: 208315

URL: http://llvm.org/viewvc/llvm-project?rev=208315&view=rev
Log:
Fix segmentation fault when mixing -Rpass with #line.

Summary:
When using #line directives, FileManager::getFile() will return a nil
entry. This triggers an assert in translateFileLineCol().

This patch handles nil FileEntry instances by emitting a note that the
location could not be translated back to a SourceLocation. I don't
really like this solution, but we are translating presumed locations,
so some information has already been lost.

Reviewers: rsmith

Subscribers: cfe-commits

Differential Revision: http://reviews.llvm.org/D3625

Added:
    cfe/trunk/test/Frontend/optimization-remark-line-directive.c
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
    cfe/trunk/lib/CodeGen/CodeGenAction.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td?rev=208315&r1=208314&r2=208315&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td Thu May  8 08:49:54 2014
@@ -37,6 +37,8 @@ def remark_fe_backend_optimization_remar
 def note_fe_backend_optimization_remark_missing_loc : Note<"use "
   "-gline-tables-only -gcolumn-info to track source location information "
   "for this optimization remark">;
+def note_fe_backend_optimization_remark_invalid_loc : Note<"could "
+  "not determine the original source location for %0:%1:%2">;
 
 def err_fe_invalid_code_complete_file : Error<
     "cannot locate code-completion file %0">, DefaultFatal;

Modified: cfe/trunk/lib/CodeGen/CodeGenAction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenAction.cpp?rev=208315&r1=208314&r2=208315&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenAction.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenAction.cpp Thu May  8 08:49:54 2014
@@ -396,13 +396,13 @@ void BackendConsumer::OptimizationRemark
     unsigned Line, Column;
     D.getLocation(&Filename, &Line, &Column);
     SourceLocation Loc;
-    if (Line > 0) {
+    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(FileMgr.getFile(Filename), Line,
-                                           Column);
+      Loc = SourceMgr.translateFileLineCol(FE, Line, Column);
     }
     Diags.Report(Loc, diag::remark_fe_backend_optimization_remark)
         << AddFlagValue(D.getPassName()) << D.getMsg().str();
@@ -415,6 +415,13 @@ void BackendConsumer::OptimizationRemark
       // -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())
+      // 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)
+        << Filename << Line << Column;
   }
 }
 

Added: 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=208315&view=auto
==============================================================================
--- cfe/trunk/test/Frontend/optimization-remark-line-directive.c (added)
+++ cfe/trunk/test/Frontend/optimization-remark-line-directive.c Thu May  8 08:49:54 2014
@@ -0,0 +1,15 @@
+// This file tests -Rpass diagnostics together with #line
+// 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
+//
+int foo(int x, int y) __attribute__((always_inline));
+int foo(int x, int y) { return x + y; }
+
+#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





More information about the cfe-commits mailing list