aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/CodeGenAction.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/CodeGen/CodeGenAction.cpp')
-rw-r--r--clang/lib/CodeGen/CodeGenAction.cpp12
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)