summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorDiego Novillo <dnovillo@google.com>2014-05-08 13:49:54 +0000
committerDiego Novillo <dnovillo@google.com>2014-05-08 13:49:54 +0000
commit6dc9c4814f40a2f4921245cb61aee25b8c418985 (patch)
tree555605d42602f4f86c2554be77b442aea54e85b1 /clang/lib
parente8172d85f9fa6df413ffce29e2fde5b65503d32b (diff)
downloadbcm5719-llvm-6dc9c4814f40a2f4921245cb61aee25b8c418985.tar.gz
bcm5719-llvm-6dc9c4814f40a2f4921245cb61aee25b8c418985.zip
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 llvm-svn: 208315
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/CodeGen/CodeGenAction.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp
index 795b127e31c..b0c5fa12e65 100644
--- a/clang/lib/CodeGen/CodeGenAction.cpp
+++ b/clang/lib/CodeGen/CodeGenAction.cpp
@@ -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;
}
}
OpenPOWER on IntegriCloud