Skip to content

Commit 43ca67c

Browse files
ShivaChentstellar
authored andcommitted
[RISCV] Fix incorrect FP base CFI offset for variable argument functions
When the FP exists, the FP base CFI directive offset should take the size of variable arguments into account. Differential Revision: https://reviews.llvm.org/D73862 (cherry picked from commit 64f4172)
1 parent 5fa1f1e commit 43ca67c

File tree

2 files changed

+6
-6
lines changed

2 files changed

+6
-6
lines changed

llvm/lib/Target/RISCV/RISCVFrameLowering.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,9 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
181181
adjustReg(MBB, MBBI, DL, FPReg, SPReg,
182182
StackSize - RVFI->getVarArgsSaveSize(), MachineInstr::FrameSetup);
183183

184-
// Emit ".cfi_def_cfa $fp, 0"
184+
// Emit ".cfi_def_cfa $fp, -RVFI->getVarArgsSaveSize()"
185185
unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createDefCfa(
186-
nullptr, RI->getDwarfRegNum(FPReg, true), 0));
186+
nullptr, RI->getDwarfRegNum(FPReg, true), -RVFI->getVarArgsSaveSize()));
187187
BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
188188
.addCFIIndex(CFIIndex);
189189
}

llvm/test/CodeGen/RISCV/vararg.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ define i32 @va1(i8* %fmt, ...) {
6464
; ILP32-ILP32F-WITHFP-NEXT: .cfi_offset ra, -36
6565
; ILP32-ILP32F-WITHFP-NEXT: .cfi_offset s0, -40
6666
; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 16
67-
; ILP32-ILP32F-WITHFP-NEXT: .cfi_def_cfa s0, 0
67+
; ILP32-ILP32F-WITHFP-NEXT: .cfi_def_cfa s0, 32
6868
; ILP32-ILP32F-WITHFP-NEXT: mv a0, a1
6969
; ILP32-ILP32F-WITHFP-NEXT: sw a7, 28(s0)
7070
; ILP32-ILP32F-WITHFP-NEXT: sw a6, 24(s0)
@@ -124,7 +124,7 @@ define i32 @va1(i8* %fmt, ...) {
124124
; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_offset ra, -72
125125
; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_offset s0, -80
126126
; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 32
127-
; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_def_cfa s0, 0
127+
; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_def_cfa s0, 64
128128
; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, 8(s0)
129129
; LP64-LP64F-LP64D-WITHFP-NEXT: sd a7, 56(s0)
130130
; LP64-LP64F-LP64D-WITHFP-NEXT: sd a6, 48(s0)
@@ -1809,7 +1809,7 @@ define i32 @va_large_stack(i8* %fmt, ...) {
18091809
; ILP32-ILP32F-WITHFP-NEXT: .cfi_offset ra, -36
18101810
; ILP32-ILP32F-WITHFP-NEXT: .cfi_offset s0, -40
18111811
; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 2000
1812-
; ILP32-ILP32F-WITHFP-NEXT: .cfi_def_cfa s0, 0
1812+
; ILP32-ILP32F-WITHFP-NEXT: .cfi_def_cfa s0, 32
18131813
; ILP32-ILP32F-WITHFP-NEXT: lui a0, 24414
18141814
; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, -1728
18151815
; ILP32-ILP32F-WITHFP-NEXT: sub sp, sp, a0
@@ -1937,7 +1937,7 @@ define i32 @va_large_stack(i8* %fmt, ...) {
19371937
; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_offset ra, -72
19381938
; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_offset s0, -80
19391939
; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 1968
1940-
; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_def_cfa s0, 0
1940+
; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_def_cfa s0, 64
19411941
; LP64-LP64F-LP64D-WITHFP-NEXT: lui a0, 24414
19421942
; LP64-LP64F-LP64D-WITHFP-NEXT: addiw a0, a0, -1680
19431943
; LP64-LP64F-LP64D-WITHFP-NEXT: sub sp, sp, a0

0 commit comments

Comments
 (0)