[PATCH] D99585: [X86] add dwarf information for loop stack probe
YangKeao via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 21 10:57:17 PDT 2021
YangKeao updated this revision to Diff 339320.
YangKeao added a comment.
rebase origin/main
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D99585/new/
https://reviews.llvm.org/D99585
Files:
llvm/lib/Target/X86/X86FrameLowering.cpp
llvm/test/CodeGen/X86/stack-clash-large.ll
Index: llvm/test/CodeGen/X86/stack-clash-large.ll
===================================================================
--- llvm/test/CodeGen/X86/stack-clash-large.ll
+++ llvm/test/CodeGen/X86/stack-clash-large.ll
@@ -7,6 +7,8 @@
; CHECK-X86-64: # %bb.0:
; CHECK-X86-64-NEXT: movq %rsp, %r11
; CHECK-X86-64-NEXT: subq $69632, %r11 # imm = 0x11000
+; CHECK-X86-64-NEXT: .cfi_def_cfa_register %r11
+; CHECK-X86-64-NEXT: .cfi_adjust_cfa_offset 69632
; CHECK-X86-64-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1
; CHECK-X86-64-NEXT: subq $4096, %rsp # imm = 0x1000
; CHECK-X86-64-NEXT: movq $0, (%rsp)
@@ -14,6 +16,7 @@
; CHECK-X86-64-NEXT: jne .LBB0_1
; CHECK-X86-64-NEXT: # %bb.2:
; CHECK-X86-64-NEXT: subq $2248, %rsp # imm = 0x8C8
+; CHECK-X86-64-NEXT: .cfi_def_cfa_register %rsp
; CHECK-X86-64-NEXT: .cfi_def_cfa_offset 71888
; CHECK-X86-64-NEXT: movl $1, 264(%rsp)
; CHECK-X86-64-NEXT: movl $1, 28664(%rsp)
Index: llvm/lib/Target/X86/X86FrameLowering.cpp
===================================================================
--- llvm/lib/Target/X86/X86FrameLowering.cpp
+++ llvm/lib/Target/X86/X86FrameLowering.cpp
@@ -629,6 +629,8 @@
uint64_t AlignOffset) const {
assert(Offset && "null offset");
+ const bool NeedsDwarfCFI = needsDwarfCFI(MF);
+ const bool HasFP = hasFP(MF);
const X86Subtarget &STI = MF.getSubtarget<X86Subtarget>();
const X86TargetLowering &TLI = *STI.getTargetLowering();
const unsigned MovMIOpc = Is64Bit ? X86::MOV64mi32 : X86::MOV32mi;
@@ -672,11 +674,23 @@
// save loop bound
{
+ const unsigned BoundOffset = Offset / StackProbeSize * StackProbeSize;
const unsigned SUBOpc = getSUBriOpcode(Uses64BitFramePtr, Offset);
BuildMI(MBB, MBBI, DL, TII.get(SUBOpc), FinalStackProbed)
.addReg(FinalStackProbed)
- .addImm(Offset / StackProbeSize * StackProbeSize)
+ .addImm(BoundOffset)
.setMIFlag(MachineInstr::FrameSetup);
+
+ // TODO: generate DWARF information for 32bit architecture
+ // didn't generate dwarf information on 32bit, because R11D is not usable
+ // and decide a safe register could be complicate or with extra cost
+ if (!HasFP && NeedsDwarfCFI && Uses64BitFramePtr) {
+ BuildCFI(MBB, MBBI, DL,
+ MCCFIInstruction::createDefCfaRegister(
+ nullptr, TRI->getDwarfRegNum(FinalStackProbed, true)));
+ BuildCFI(MBB, MBBI, DL,
+ MCCFIInstruction::createAdjustCfaOffset(nullptr, BoundOffset));
+ }
}
// allocate a page
@@ -716,14 +730,23 @@
// handle tail
unsigned TailOffset = Offset % StackProbeSize;
+ MachineBasicBlock::iterator TailMBBIter = tailMBB->begin();
if (TailOffset) {
const unsigned Opc = getSUBriOpcode(Uses64BitFramePtr, TailOffset);
- BuildMI(*tailMBB, tailMBB->begin(), DL, TII.get(Opc), StackPtr)
+ BuildMI(*tailMBB, TailMBBIter, DL, TII.get(Opc), StackPtr)
.addReg(StackPtr)
.addImm(TailOffset)
.setMIFlag(MachineInstr::FrameSetup);
}
+ // TODO: generate DWARF information for 32bit architecture
+ // didn't generate dwarf information on 32bit, because R11D is not usable
+ // and decide a safe register could be complicate or with extra cost
+ if (!HasFP && NeedsDwarfCFI && Uses64BitFramePtr) {
+ BuildCFI(*tailMBB, TailMBBIter, DL,
+ MCCFIInstruction::createDefCfaRegister(
+ nullptr, TRI->getDwarfRegNum(StackPtr, true)));
+ }
// Update Live In information
recomputeLiveIns(*testMBB);
recomputeLiveIns(*tailMBB);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D99585.339320.patch
Type: text/x-patch
Size: 3579 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210421/6d24d283/attachment.bin>
More information about the llvm-commits
mailing list