summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorAlp Toker <alp@nuanti.com>2014-06-30 01:33:59 +0000
committerAlp Toker <alp@nuanti.com>2014-06-30 01:33:59 +0000
commit7b463d5a07a3f18710c5ec4a6f9e3392ffe7a85b (patch)
tree0987302ba28f463a580cb97be1a9b0e6009ea66a /clang
parent034bbd5db77e2ae69b26eb9b1159867728807624 (diff)
downloadbcm5719-llvm-7b463d5a07a3f18710c5ec4a6f9e3392ffe7a85b.tar.gz
bcm5719-llvm-7b463d5a07a3f18710c5ec4a6f9e3392ffe7a85b.zip
CodeGenAction::ExecuteAction(): check for invalid LLVM source locations
Add sign checks to deal with the fact that IR parser line/column pairs are signed integers and sometimes invalid. The crash path is potentially triggered by corrupt '.bc' files in practice, though I don't have a binary input test case that can be checked-in right now. (Unfortunately the backend itself crashes on various ill-formed '.bc' inputs so this bandage isn't as helpful as it appears yet.) llvm-svn: 212007
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/CodeGen/CodeGenAction.cpp16
1 files changed, 11 insertions, 5 deletions
diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp
index 3342aa12c86..0f637594413 100644
--- a/clang/lib/CodeGen/CodeGenAction.cpp
+++ b/clang/lib/CodeGen/CodeGenAction.cpp
@@ -641,17 +641,23 @@ void CodeGenAction::ExecuteAction() {
bool Invalid;
SourceManager &SM = CI.getSourceManager();
- llvm::MemoryBuffer *MainFile = SM.getBuffer(SM.getMainFileID(), &Invalid);
+ FileID FID = SM.getMainFileID();
+ llvm::MemoryBuffer *MainFile = SM.getBuffer(FID, &Invalid);
if (Invalid)
return;
llvm::SMDiagnostic Err;
TheModule.reset(ParseIR(MainFile, Err, *VMContext));
if (!TheModule) {
- // Translate from the diagnostic info to the SourceManager location.
- SourceLocation Loc = SM.translateFileLineCol(
- SM.getFileEntryForID(SM.getMainFileID()), Err.getLineNo(),
- Err.getColumnNo() + 1);
+ // Translate from the diagnostic info to the SourceManager location if
+ // available.
+ // TODO: Unify this with ConvertBackendLocation()
+ SourceLocation Loc;
+ if (Err.getLineNo() > 0) {
+ assert(Err.getColumnNo() >= 0);
+ Loc = SM.translateFileLineCol(SM.getFileEntryForID(FID),
+ Err.getLineNo(), Err.getColumnNo() + 1);
+ }
// Strip off a leading diagnostic code if there is one.
StringRef Msg = Err.getMessage();
OpenPOWER on IntegriCloud