diff options
author | Alp Toker <alp@nuanti.com> | 2014-06-30 01:33:59 +0000 |
---|---|---|
committer | Alp Toker <alp@nuanti.com> | 2014-06-30 01:33:59 +0000 |
commit | 7b463d5a07a3f18710c5ec4a6f9e3392ffe7a85b (patch) | |
tree | 0987302ba28f463a580cb97be1a9b0e6009ea66a /clang | |
parent | 034bbd5db77e2ae69b26eb9b1159867728807624 (diff) | |
download | bcm5719-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.cpp | 16 |
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(); |