Skip to content

Commit 4cb90ca

Browse files
authored
[Thumb,ELF] Fix access to dso_preemptable __stack_chk_guard with static relocation model (#78950)
PR #70014 fixes A32 to use GOT for dso_preemptable `__stack_chk_guard` with static relocation model (e.g. -fPIE/-fPIC LTO compiles with -no-pie linking). This patch fixes such `__stack_chk_guard` access for Thumb1 and Thumb2. Note: `t2LDRLIT_ga_pcrel` is only for ELF. mingw needs `.refptr.__stack_chk_guard` (https://reviews.llvm.org/D92738). Fix #64999
1 parent 7c8030e commit 4cb90ca

File tree

3 files changed

+28
-12
lines changed

3 files changed

+28
-12
lines changed

llvm/lib/Target/ARM/Thumb1InstrInfo.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,14 +135,14 @@ void Thumb1InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
135135
void Thumb1InstrInfo::expandLoadStackGuard(
136136
MachineBasicBlock::iterator MI) const {
137137
MachineFunction &MF = *MI->getParent()->getParent();
138-
const TargetMachine &TM = MF.getTarget();
139138
const ARMSubtarget &ST = MF.getSubtarget<ARMSubtarget>();
139+
const auto *GV = cast<GlobalValue>((*MI->memoperands_begin())->getValue());
140140

141141
assert(MF.getFunction().getParent()->getStackProtectorGuard() != "tls" &&
142142
"TLS stack protector not supported for Thumb1 targets");
143143

144144
unsigned Instr;
145-
if (TM.isPositionIndependent())
145+
if (!GV->isDSOLocal())
146146
Instr = ARM::tLDRLIT_ga_pcrel;
147147
else if (ST.genExecuteOnly() && ST.hasV8MBaselineOps())
148148
Instr = ARM::t2MOVi32imm;

llvm/lib/Target/ARM/Thumb2InstrInfo.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -261,10 +261,8 @@ void Thumb2InstrInfo::expandLoadStackGuard(
261261
return;
262262
}
263263

264-
const GlobalValue *GV =
265-
cast<GlobalValue>((*MI->memoperands_begin())->getValue());
266-
267-
if (MF.getSubtarget<ARMSubtarget>().isGVInGOT(GV))
264+
const auto *GV = cast<GlobalValue>((*MI->memoperands_begin())->getValue());
265+
if (MF.getSubtarget<ARMSubtarget>().isTargetELF() && !GV->isDSOLocal())
268266
expandLoadStackGuardBase(MI, ARM::t2LDRLIT_ga_pcrel, ARM::t2LDRi12);
269267
else if (MF.getTarget().isPositionIndependent())
270268
expandLoadStackGuardBase(MI, ARM::t2MOV_ga_pcrel, ARM::t2LDRi12);

llvm/test/CodeGen/ARM/stack-guard-elf.ll

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ define i32 @test1() #0 {
5959
; THUMB1-NEXT: .pad #16
6060
; THUMB1-NEXT: sub sp, #16
6161
; THUMB1-NEXT: ldr r0, .LCPI0_0
62+
; THUMB1-NEXT: .LPC0_0:
63+
; THUMB1-NEXT: add r0, pc
6264
; THUMB1-NEXT: ldr r0, [r0]
6365
; THUMB1-NEXT: ldr r0, [r0]
6466
; THUMB1-NEXT: add r1, sp, #904
@@ -67,7 +69,9 @@ define i32 @test1() #0 {
6769
; THUMB1-NEXT: bl foo
6870
; THUMB1-NEXT: add r0, sp, #904
6971
; THUMB1-NEXT: ldr r0, [r0, #124]
70-
; THUMB1-NEXT: ldr r1, .LCPI0_0
72+
; THUMB1-NEXT: ldr r1, .LCPI0_1
73+
; THUMB1-NEXT: .LPC0_1:
74+
; THUMB1-NEXT: add r1, pc
7175
; THUMB1-NEXT: ldr r1, [r1]
7276
; THUMB1-NEXT: ldr r1, [r1]
7377
; THUMB1-NEXT: cmp r1, r0
@@ -83,7 +87,11 @@ define i32 @test1() #0 {
8387
; THUMB1-NEXT: .p2align 2
8488
; THUMB1-NEXT: @ %bb.3:
8589
; THUMB1-NEXT: .LCPI0_0:
86-
; THUMB1-NEXT: .long __stack_chk_guard
90+
; THUMB1-NEXT: .Ltmp0:
91+
; THUMB1-NEXT: .long __stack_chk_guard(GOT_PREL)-((.LPC0_0+4)-.Ltmp0)
92+
; THUMB1-NEXT: .LCPI0_1:
93+
; THUMB1-NEXT: .Ltmp1:
94+
; THUMB1-NEXT: .long __stack_chk_guard(GOT_PREL)-((.LPC0_1+4)-.Ltmp1)
8795
;
8896
; THUMB1-PIC-LABEL: test1:
8997
; THUMB1-PIC: @ %bb.0:
@@ -136,16 +144,18 @@ define i32 @test1() #0 {
136144
; THUMB2-NEXT: push {r7, lr}
137145
; THUMB2-NEXT: .pad #1032
138146
; THUMB2-NEXT: sub.w sp, sp, #1032
139-
; THUMB2-NEXT: movw r0, :lower16:__stack_chk_guard
140-
; THUMB2-NEXT: movt r0, :upper16:__stack_chk_guard
147+
; THUMB2-NEXT: ldr r0, .LCPI0_0
148+
; THUMB2-NEXT: .LPC0_0:
149+
; THUMB2-NEXT: add r0, pc
141150
; THUMB2-NEXT: ldr r0, [r0]
142151
; THUMB2-NEXT: ldr r0, [r0]
143152
; THUMB2-NEXT: str.w r0, [sp, #1028]
144153
; THUMB2-NEXT: add r0, sp, #4
145154
; THUMB2-NEXT: bl foo
146-
; THUMB2-NEXT: movw r1, :lower16:__stack_chk_guard
147155
; THUMB2-NEXT: ldr.w r0, [sp, #1028]
148-
; THUMB2-NEXT: movt r1, :upper16:__stack_chk_guard
156+
; THUMB2-NEXT: ldr r1, .LCPI0_1
157+
; THUMB2-NEXT: .LPC0_1:
158+
; THUMB2-NEXT: add r1, pc
149159
; THUMB2-NEXT: ldr r1, [r1]
150160
; THUMB2-NEXT: ldr r1, [r1]
151161
; THUMB2-NEXT: cmp r1, r0
@@ -155,6 +165,14 @@ define i32 @test1() #0 {
155165
; THUMB2-NEXT: popeq {r7, pc}
156166
; THUMB2-NEXT: .LBB0_1:
157167
; THUMB2-NEXT: bl __stack_chk_fail
168+
; THUMB2-NEXT: .p2align 2
169+
; THUMB2-NEXT: @ %bb.2:
170+
; THUMB2-NEXT: .LCPI0_0:
171+
; THUMB2-NEXT: .Ltmp0:
172+
; THUMB2-NEXT: .long __stack_chk_guard(GOT_PREL)-((.LPC0_0+4)-.Ltmp0)
173+
; THUMB2-NEXT: .LCPI0_1:
174+
; THUMB2-NEXT: .Ltmp1:
175+
; THUMB2-NEXT: .long __stack_chk_guard(GOT_PREL)-((.LPC0_1+4)-.Ltmp1)
158176
;
159177
; THUMB2-PIC-LABEL: test1:
160178
; THUMB2-PIC: @ %bb.0:

0 commit comments

Comments
 (0)