Skip to content
Snippets Groups Projects
Commit 459bb10b authored by Diego Novillo's avatar Diego Novillo
Browse files

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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@208315 91177308-0d34-0410-b5e6-96231b3b80d8
parent c52c190c
No related branches found
No related tags found
No related merge requests found
......@@ -37,6 +37,8 @@ def remark_fe_backend_optimization_remark : Remark<"%0">, CatBackend,
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;
......
......@@ -396,13 +396,13 @@ void BackendConsumer::OptimizationRemarkHandler(
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::OptimizationRemarkHandler(
// -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;
}
}
......
// 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment