Index: llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp =================================================================== --- llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp +++ llvm/trunk/lib/CodeGen/CFIInstrInserter.cpp @@ -29,6 +29,11 @@ #include "llvm/Target/TargetMachine.h" using namespace llvm; +static cl::opt VerifyCFI("verify-cfiinstrs", + cl::desc("Verify Call Frame Information instructions"), + cl::init(false), + cl::Hidden); + namespace { class CFIInstrInserter : public MachineFunctionPass { public: @@ -50,11 +55,12 @@ MBBVector.resize(MF.getNumBlockIDs()); calculateCFAInfo(MF); -#ifndef NDEBUG - if (unsigned ErrorNum = verify(MF)) - report_fatal_error("Found " + Twine(ErrorNum) + - " in/out CFI information errors."); -#endif + + if (VerifyCFI) { + if (unsigned ErrorNum = verify(MF)) + report_fatal_error("Found " + Twine(ErrorNum) + + " in/out CFI information errors."); + } bool insertedCFI = insertCFIInstrs(MF); MBBVector.clear(); return insertedCFI; Index: llvm/trunk/test/CodeGen/X86/cfi-inserter-verify-inconsistent-offset.mir =================================================================== --- llvm/trunk/test/CodeGen/X86/cfi-inserter-verify-inconsistent-offset.mir +++ llvm/trunk/test/CodeGen/X86/cfi-inserter-verify-inconsistent-offset.mir @@ -0,0 +1,26 @@ +# RUN: not llc -o - %s -mtriple=x86_64-- -verify-cfiinstrs \ +# RUN: -run-pass=cfi-instr-inserter 2>&1 | FileCheck %s +# Test that CFI verifier finds inconsistent offset between bb.end and one of +# its precedessors. +--- | + define void @inconsistentOffset() { + bb.end: + ret void + } +... +--- +# CHECK: *** Inconsistent CFA register and/or offset between pred and succ *** +# CHECK: Succ: bb.end +# CHECK: LLVM ERROR: Found 1 in/out CFI information errors. +name: inconsistentOffset +body: | + bb.0: + CFI_INSTRUCTION def_cfa_offset 24 + JNE_1 %bb.2, implicit undef $eflags + + bb.1: + CFI_INSTRUCTION def_cfa_offset 32 + + bb.2.bb.end: + RET 0 +... Index: llvm/trunk/test/CodeGen/X86/cfi-inserter-verify-inconsistent-register.mir =================================================================== --- llvm/trunk/test/CodeGen/X86/cfi-inserter-verify-inconsistent-register.mir +++ llvm/trunk/test/CodeGen/X86/cfi-inserter-verify-inconsistent-register.mir @@ -0,0 +1,26 @@ +# RUN: not llc -o - %s -mtriple=x86_64-- -verify-cfiinstrs \ +# RUN: -run-pass=cfi-instr-inserter 2>&1 | FileCheck %s +# Test that CFI verifier finds inconsistent register between bb.end and one of +# its precedessors. +--- | + define void @inconsistentRegister() { + bb.end: + ret void + } +... +--- +# CHECK: *** Inconsistent CFA register and/or offset between pred and succ *** +# CHECK: Succ: bb.end +# CHECK: LLVM ERROR: Found 1 in/out CFI information errors. +name: inconsistentRegister +body: | + bb.0: + CFI_INSTRUCTION def_cfa_register $rbp + JNE_1 %bb.2, implicit undef $eflags + + bb.1: + CFI_INSTRUCTION def_cfa $rsp, 8 + + bb.2.bb.end: + RET 0 +...