Skip to content

Commit

Permalink
Add option -verify-cfiinstrs to run verifier in CFIInstrInserter
Browse files Browse the repository at this point in the history
Instead of enabling it for non NDEBUG builds, use -verify-cfiinstrs to
run verifier in CFIInstrInserter. It defaults to false.

Differential Revision: https://reviews.llvm.org/D46444

llvm-svn: 331635
  • Loading branch information
petar-jovanovic committed May 7, 2018
1 parent 1c451db commit cc49157
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 5 deletions.
16 changes: 11 additions & 5 deletions llvm/lib/CodeGen/CFIInstrInserter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@
#include "llvm/Target/TargetMachine.h"
using namespace llvm;

static cl::opt<bool> VerifyCFI("verify-cfiinstrs",
cl::desc("Verify Call Frame Information instructions"),
cl::init(false),
cl::Hidden);

namespace {
class CFIInstrInserter : public MachineFunctionPass {
public:
Expand All @@ -50,11 +55,12 @@ class CFIInstrInserter : public MachineFunctionPass {

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;
Expand Down
26 changes: 26 additions & 0 deletions llvm/test/CodeGen/X86/cfi-inserter-verify-inconsistent-offset.mir
Original file line number Diff line number Diff line change
@@ -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
...
Original file line number Diff line number Diff line change
@@ -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
...

0 comments on commit cc49157

Please sign in to comment.