diff options
-rw-r--r-- | llvm/lib/Target/X86/X86MCInstLower.cpp | 9 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/pr25828.ll | 30 |
2 files changed, 35 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/X86MCInstLower.cpp b/llvm/lib/Target/X86/X86MCInstLower.cpp index af386807cd7..d0c03d6ab7c 100644 --- a/llvm/lib/Target/X86/X86MCInstLower.cpp +++ b/llvm/lib/Target/X86/X86MCInstLower.cpp @@ -1145,11 +1145,12 @@ void X86AsmPrinter::EmitInstruction(const MachineInstr *MI) { bool hasFP = FrameLowering->hasFP(*MF); // TODO: This is needed only if we require precise CFA. - bool NeedsDwarfCFI = - (MMI->hasDebugInfo() || MF->getFunction()->needsUnwindTableEntry()); + bool HasActiveDwarfFrame = OutStreamer->getNumFrameInfos() && + !OutStreamer->getDwarfFrameInfos().back().End; + int stackGrowth = -RI->getSlotSize(); - if (NeedsDwarfCFI && !hasFP) { + if (HasActiveDwarfFrame && !hasFP) { OutStreamer->EmitCFIAdjustCfaOffset(-stackGrowth); } @@ -1160,7 +1161,7 @@ void X86AsmPrinter::EmitInstruction(const MachineInstr *MI) { EmitAndCountInstruction(MCInstBuilder(X86::POP32r) .addReg(MI->getOperand(0).getReg())); - if (NeedsDwarfCFI && !hasFP) { + if (HasActiveDwarfFrame && !hasFP) { OutStreamer->EmitCFIAdjustCfaOffset(stackGrowth); } return; diff --git a/llvm/test/CodeGen/X86/pr25828.ll b/llvm/test/CodeGen/X86/pr25828.ll new file mode 100644 index 00000000000..8fbabc7d0c6 --- /dev/null +++ b/llvm/test/CodeGen/X86/pr25828.ll @@ -0,0 +1,30 @@ +; RUN: llc < %s -mtriple=i686-pc-windows-msvc -relocation-model=pic | FileCheck %s +; MOVPC32r should not generate CFI under windows + +; CHECK-LABEL: _foo: +; CHECK-NOT: .cfi_adjust_cfa_offset +define void @foo(i8) { +entry-block: + switch i8 %0, label %bb2 [ + i8 1, label %bb1 + i8 2, label %bb2 + i8 3, label %bb3 + i8 4, label %bb4 + i8 5, label %bb5 + ] + +bb1: + ret void + +bb2: + ret void + +bb3: + ret void + +bb4: + ret void + +bb5: + ret void +} |