diff options
Diffstat (limited to 'clang/lib/CodeGen/CodeGenAction.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenAction.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp index 4321efd..1f5eb42 100644 --- a/clang/lib/CodeGen/CodeGenAction.cpp +++ b/clang/lib/CodeGen/CodeGenAction.cpp @@ -39,6 +39,7 @@ #include "llvm/IR/LLVMContext.h" #include "llvm/IR/LLVMRemarkStreamer.h" #include "llvm/IR/Module.h" +#include "llvm/IR/Verifier.h" #include "llvm/IRReader/IRReader.h" #include "llvm/LTO/LTOBackend.h" #include "llvm/Linker/Linker.h" @@ -1048,8 +1049,17 @@ CodeGenAction::loadModule(MemoryBufferRef MBRef) { // Handle textual IR and bitcode file with one single module. llvm::SMDiagnostic Err; - if (std::unique_ptr<llvm::Module> M = parseIR(MBRef, Err, *VMContext)) + if (std::unique_ptr<llvm::Module> M = parseIR(MBRef, Err, *VMContext)) { + // For LLVM IR files, always verify the input and report the error in a way + // that does not ask people to report an issue for it. + std::string VerifierErr; + raw_string_ostream VerifierErrStream(VerifierErr); + if (llvm::verifyModule(*M, &VerifierErrStream)) { + CI.getDiagnostics().Report(diag::err_invalid_llvm_ir) << VerifierErr; + return {}; + } return M; + } // If MBRef is a bitcode with multiple modules (e.g., -fsplit-lto-unit // output), place the extra modules (actually only one, a regular LTO module) |