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 _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
