Add InlineAsmDiagnosticHandler for bitcode input

Summary:
This patch installs an InlineAsmDiagnosticsHandler to avoid the crash
report when the input is bitcode and the bitcode contains invalid inline
assembly. The handler will simply print the same error message that will
print from the backend.

Add CHECK in test-case

Reviewers: echristo, rafael

Reviewed By: rafael

Subscribers: rafael, cfe-commits

Differential Revision: http://reviews.llvm.org/D7568

llvm-svn: 228898
This commit is contained in:
Steven Wu 2015-02-12 02:06:55 +00:00
parent 3c567fce46
commit 15b385f854
2 changed files with 14 additions and 0 deletions

View File

@ -667,6 +667,12 @@ CodeGenAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {
return std::move(Result); return std::move(Result);
} }
static void BitcodeInlineAsmDiagHandler(const llvm::SMDiagnostic &SM,
void *Context,
unsigned LocCookie) {
SM.print(nullptr, llvm::errs());
}
void CodeGenAction::ExecuteAction() { void CodeGenAction::ExecuteAction() {
// If this is an IR file, we have to treat it specially. // If this is an IR file, we have to treat it specially.
if (getCurrentFileKind() == IK_LLVM_IR) { if (getCurrentFileKind() == IK_LLVM_IR) {
@ -715,6 +721,8 @@ void CodeGenAction::ExecuteAction() {
TheModule->setTargetTriple(TargetOpts.Triple); TheModule->setTargetTriple(TargetOpts.Triple);
} }
LLVMContext &Ctx = TheModule->getContext();
Ctx.setInlineAsmDiagnosticHandler(BitcodeInlineAsmDiagHandler);
EmitBackendOutput(CI.getDiagnostics(), CI.getCodeGenOpts(), TargetOpts, EmitBackendOutput(CI.getDiagnostics(), CI.getCodeGenOpts(), TargetOpts,
CI.getLangOpts(), CI.getTarget().getTargetDescription(), CI.getLangOpts(), CI.getTarget().getTargetDescription(),
TheModule.get(), BA, OS); TheModule.get(), BA, OS);

View File

@ -3,6 +3,12 @@
// RUN: true // RUN: true
// UN: not %clang_cc1 -triple i386-apple-darwin10 -emit-obj %s -o /dev/null > %t 2>&1 // UN: not %clang_cc1 -triple i386-apple-darwin10 -emit-obj %s -o /dev/null > %t 2>&1
// UN: FileCheck %s < %t // UN: FileCheck %s < %t
// RUN: %clang_cc1 -triple i386-apple-darwin10 -emit-llvm-bc %s -o %t.bc
// RUN: %clang_cc1 -triple i386-apple-darwin10 -emit-obj %t.bc -o /dev/null 2>&1 | \
// RUN: FileCheck --check-prefix=CRASH-REPORT %s
// CRASH-REPORT: <inline asm>:
// CRASH-REPORT: error: invalid instruction mnemonic 'abc'
// CRASH-REPORT-NOT: note: diagnostic msg:
int test1(int X) { int test1(int X) {
// CHECK: error: invalid instruction mnemonic 'abc' // CHECK: error: invalid instruction mnemonic 'abc'