Skip to content

Commit 336f877

Browse files
wangleiattru
authored andcommitted
[LoongArch] Fix GOT usage for non-dso_local function calls in large code model
This commit fixes an issue in the large code model where non-dso_local function calls did not use the GOT as expected in PIC mode. Instead, direct PC-relative access was incorrectly applied, leading to linker errors when building shared libraries. For `ExternalSymbol`, it is not possible to determine whether it is dso_local during pseudo-instruction expansion. We use target flags to differentiate whether GOT should be used. Cherry-picked from #117099, used for fix linker errors when bulding shared libraries with large code model.
1 parent 5bd0474 commit 336f877

File tree

5 files changed

+46
-46
lines changed

5 files changed

+46
-46
lines changed

llvm/lib/Target/LoongArch/LoongArchExpandPseudoInsts.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -721,7 +721,7 @@ bool LoongArchExpandPseudo::expandFunctionCALL(
721721
IsTailCall ? LoongArch::PseudoJIRL_TAIL : LoongArch::PseudoJIRL_CALL;
722722
Register AddrReg = IsTailCall ? LoongArch::R19 : LoongArch::R1;
723723

724-
bool UseGOT = Func.isGlobal() && !Func.getGlobal()->isDSOLocal();
724+
bool UseGOT = Func.getTargetFlags() == LoongArchII::MO_CALL_PLT;
725725
unsigned MO = UseGOT ? LoongArchII::MO_GOT_PC_HI : LoongArchII::MO_PCREL_LO;
726726
unsigned LAOpcode = UseGOT ? LoongArch::LDX_D : LoongArch::ADD_D;
727727
expandLargeAddressLoad(MBB, MBBI, NextMBBI, LAOpcode, MO, Func, AddrReg,

llvm/test/CodeGen/LoongArch/code-models.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,11 @@ define void @call_external_sym(ptr %dst) {
8282
; LARGE-NEXT: .cfi_offset 1, -8
8383
; LARGE-NEXT: ori $a2, $zero, 1000
8484
; LARGE-NEXT: move $a1, $zero
85-
; LARGE-NEXT: pcalau12i $ra, %pc_hi20(memset)
86-
; LARGE-NEXT: addi.d $t8, $zero, %pc_lo12(memset)
87-
; LARGE-NEXT: lu32i.d $t8, %pc64_lo20(memset)
88-
; LARGE-NEXT: lu52i.d $t8, $t8, %pc64_hi12(memset)
89-
; LARGE-NEXT: add.d $ra, $t8, $ra
85+
; LARGE-NEXT: pcalau12i $ra, %got_pc_hi20(memset)
86+
; LARGE-NEXT: addi.d $t8, $zero, %got_pc_lo12(memset)
87+
; LARGE-NEXT: lu32i.d $t8, %got64_pc_lo20(memset)
88+
; LARGE-NEXT: lu52i.d $t8, $t8, %got64_pc_hi12(memset)
89+
; LARGE-NEXT: ldx.d $ra, $t8, $ra
9090
; LARGE-NEXT: jirl $ra, $ra, 0
9191
; LARGE-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
9292
; LARGE-NEXT: addi.d $sp, $sp, 16

llvm/test/CodeGen/LoongArch/machinelicm-address-pseudos.ll

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -282,11 +282,11 @@ define void @test_la_tls_ld(i32 signext %n) {
282282
; LA64LARGE-NEXT: .LBB3_1: # %loop
283283
; LA64LARGE-NEXT: # =>This Inner Loop Header: Depth=1
284284
; LA64LARGE-NEXT: move $a0, $s0
285-
; LA64LARGE-NEXT: pcalau12i $ra, %pc_hi20(__tls_get_addr)
286-
; LA64LARGE-NEXT: addi.d $t8, $zero, %pc_lo12(__tls_get_addr)
287-
; LA64LARGE-NEXT: lu32i.d $t8, %pc64_lo20(__tls_get_addr)
288-
; LA64LARGE-NEXT: lu52i.d $t8, $t8, %pc64_hi12(__tls_get_addr)
289-
; LA64LARGE-NEXT: add.d $ra, $t8, $ra
285+
; LA64LARGE-NEXT: pcalau12i $ra, %got_pc_hi20(__tls_get_addr)
286+
; LA64LARGE-NEXT: addi.d $t8, $zero, %got_pc_lo12(__tls_get_addr)
287+
; LA64LARGE-NEXT: lu32i.d $t8, %got64_pc_lo20(__tls_get_addr)
288+
; LA64LARGE-NEXT: lu52i.d $t8, $t8, %got64_pc_hi12(__tls_get_addr)
289+
; LA64LARGE-NEXT: ldx.d $ra, $t8, $ra
290290
; LA64LARGE-NEXT: jirl $ra, $ra, 0
291291
; LA64LARGE-NEXT: ld.w $zero, $a0, 0
292292
; LA64LARGE-NEXT: addi.w $s1, $s1, 1
@@ -448,11 +448,11 @@ define void @test_la_tls_gd(i32 signext %n) nounwind {
448448
; LA64LARGE-NEXT: .LBB5_1: # %loop
449449
; LA64LARGE-NEXT: # =>This Inner Loop Header: Depth=1
450450
; LA64LARGE-NEXT: move $a0, $s0
451-
; LA64LARGE-NEXT: pcalau12i $ra, %pc_hi20(__tls_get_addr)
452-
; LA64LARGE-NEXT: addi.d $t8, $zero, %pc_lo12(__tls_get_addr)
453-
; LA64LARGE-NEXT: lu32i.d $t8, %pc64_lo20(__tls_get_addr)
454-
; LA64LARGE-NEXT: lu52i.d $t8, $t8, %pc64_hi12(__tls_get_addr)
455-
; LA64LARGE-NEXT: add.d $ra, $t8, $ra
451+
; LA64LARGE-NEXT: pcalau12i $ra, %got_pc_hi20(__tls_get_addr)
452+
; LA64LARGE-NEXT: addi.d $t8, $zero, %got_pc_lo12(__tls_get_addr)
453+
; LA64LARGE-NEXT: lu32i.d $t8, %got64_pc_lo20(__tls_get_addr)
454+
; LA64LARGE-NEXT: lu52i.d $t8, $t8, %got64_pc_hi12(__tls_get_addr)
455+
; LA64LARGE-NEXT: ldx.d $ra, $t8, $ra
456456
; LA64LARGE-NEXT: jirl $ra, $ra, 0
457457
; LA64LARGE-NEXT: ld.w $zero, $a0, 0
458458
; LA64LARGE-NEXT: addi.w $s1, $s1, 1

llvm/test/CodeGen/LoongArch/psabi-restricted-scheduling.ll

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -105,23 +105,23 @@ define void @foo() nounwind {
105105
; LARGE_NO_SCH-NEXT: lu32i.d $t8, %got64_pc_lo20(gd)
106106
; LARGE_NO_SCH-NEXT: lu52i.d $t8, $t8, %got64_pc_hi12(gd)
107107
; LARGE_NO_SCH-NEXT: add.d $a0, $t8, $a0
108-
; LARGE_NO_SCH-NEXT: pcalau12i $ra, %pc_hi20(__tls_get_addr)
109-
; LARGE_NO_SCH-NEXT: addi.d $t8, $zero, %pc_lo12(__tls_get_addr)
110-
; LARGE_NO_SCH-NEXT: lu32i.d $t8, %pc64_lo20(__tls_get_addr)
111-
; LARGE_NO_SCH-NEXT: lu52i.d $t8, $t8, %pc64_hi12(__tls_get_addr)
112-
; LARGE_NO_SCH-NEXT: add.d $ra, $t8, $ra
108+
; LARGE_NO_SCH-NEXT: pcalau12i $ra, %got_pc_hi20(__tls_get_addr)
109+
; LARGE_NO_SCH-NEXT: addi.d $t8, $zero, %got_pc_lo12(__tls_get_addr)
110+
; LARGE_NO_SCH-NEXT: lu32i.d $t8, %got64_pc_lo20(__tls_get_addr)
111+
; LARGE_NO_SCH-NEXT: lu52i.d $t8, $t8, %got64_pc_hi12(__tls_get_addr)
112+
; LARGE_NO_SCH-NEXT: ldx.d $ra, $t8, $ra
113113
; LARGE_NO_SCH-NEXT: jirl $ra, $ra, 0
114114
; LARGE_NO_SCH-NEXT: ld.d $zero, $a0, 0
115115
; LARGE_NO_SCH-NEXT: pcalau12i $a0, %ld_pc_hi20(ld)
116116
; LARGE_NO_SCH-NEXT: addi.d $t8, $zero, %got_pc_lo12(ld)
117117
; LARGE_NO_SCH-NEXT: lu32i.d $t8, %got64_pc_lo20(ld)
118118
; LARGE_NO_SCH-NEXT: lu52i.d $t8, $t8, %got64_pc_hi12(ld)
119119
; LARGE_NO_SCH-NEXT: add.d $a0, $t8, $a0
120-
; LARGE_NO_SCH-NEXT: pcalau12i $ra, %pc_hi20(__tls_get_addr)
121-
; LARGE_NO_SCH-NEXT: addi.d $t8, $zero, %pc_lo12(__tls_get_addr)
122-
; LARGE_NO_SCH-NEXT: lu32i.d $t8, %pc64_lo20(__tls_get_addr)
123-
; LARGE_NO_SCH-NEXT: lu52i.d $t8, $t8, %pc64_hi12(__tls_get_addr)
124-
; LARGE_NO_SCH-NEXT: add.d $ra, $t8, $ra
120+
; LARGE_NO_SCH-NEXT: pcalau12i $ra, %got_pc_hi20(__tls_get_addr)
121+
; LARGE_NO_SCH-NEXT: addi.d $t8, $zero, %got_pc_lo12(__tls_get_addr)
122+
; LARGE_NO_SCH-NEXT: lu32i.d $t8, %got64_pc_lo20(__tls_get_addr)
123+
; LARGE_NO_SCH-NEXT: lu52i.d $t8, $t8, %got64_pc_hi12(__tls_get_addr)
124+
; LARGE_NO_SCH-NEXT: ldx.d $ra, $t8, $ra
125125
; LARGE_NO_SCH-NEXT: jirl $ra, $ra, 0
126126
; LARGE_NO_SCH-NEXT: pcalau12i $a1, %ie_pc_hi20(ie)
127127
; LARGE_NO_SCH-NEXT: addi.d $t8, $zero, %ie_pc_lo12(ie)
@@ -162,23 +162,23 @@ define void @foo() nounwind {
162162
; LARGE_SCH-NEXT: lu32i.d $t8, %got64_pc_lo20(gd)
163163
; LARGE_SCH-NEXT: lu52i.d $t8, $t8, %got64_pc_hi12(gd)
164164
; LARGE_SCH-NEXT: add.d $a0, $t8, $a0
165-
; LARGE_SCH-NEXT: pcalau12i $ra, %pc_hi20(__tls_get_addr)
166-
; LARGE_SCH-NEXT: addi.d $t8, $zero, %pc_lo12(__tls_get_addr)
167-
; LARGE_SCH-NEXT: lu32i.d $t8, %pc64_lo20(__tls_get_addr)
168-
; LARGE_SCH-NEXT: lu52i.d $t8, $t8, %pc64_hi12(__tls_get_addr)
169-
; LARGE_SCH-NEXT: add.d $ra, $t8, $ra
165+
; LARGE_SCH-NEXT: pcalau12i $ra, %got_pc_hi20(__tls_get_addr)
166+
; LARGE_SCH-NEXT: addi.d $t8, $zero, %got_pc_lo12(__tls_get_addr)
167+
; LARGE_SCH-NEXT: lu32i.d $t8, %got64_pc_lo20(__tls_get_addr)
168+
; LARGE_SCH-NEXT: lu52i.d $t8, $t8, %got64_pc_hi12(__tls_get_addr)
169+
; LARGE_SCH-NEXT: ldx.d $ra, $t8, $ra
170170
; LARGE_SCH-NEXT: jirl $ra, $ra, 0
171171
; LARGE_SCH-NEXT: ld.d $zero, $a0, 0
172172
; LARGE_SCH-NEXT: pcalau12i $a0, %ld_pc_hi20(ld)
173173
; LARGE_SCH-NEXT: addi.d $t8, $zero, %got_pc_lo12(ld)
174174
; LARGE_SCH-NEXT: lu32i.d $t8, %got64_pc_lo20(ld)
175175
; LARGE_SCH-NEXT: lu52i.d $t8, $t8, %got64_pc_hi12(ld)
176176
; LARGE_SCH-NEXT: add.d $a0, $t8, $a0
177-
; LARGE_SCH-NEXT: pcalau12i $ra, %pc_hi20(__tls_get_addr)
178-
; LARGE_SCH-NEXT: addi.d $t8, $zero, %pc_lo12(__tls_get_addr)
179-
; LARGE_SCH-NEXT: lu32i.d $t8, %pc64_lo20(__tls_get_addr)
180-
; LARGE_SCH-NEXT: lu52i.d $t8, $t8, %pc64_hi12(__tls_get_addr)
181-
; LARGE_SCH-NEXT: add.d $ra, $t8, $ra
177+
; LARGE_SCH-NEXT: pcalau12i $ra, %got_pc_hi20(__tls_get_addr)
178+
; LARGE_SCH-NEXT: addi.d $t8, $zero, %got_pc_lo12(__tls_get_addr)
179+
; LARGE_SCH-NEXT: lu32i.d $t8, %got64_pc_lo20(__tls_get_addr)
180+
; LARGE_SCH-NEXT: lu52i.d $t8, $t8, %got64_pc_hi12(__tls_get_addr)
181+
; LARGE_SCH-NEXT: ldx.d $ra, $t8, $ra
182182
; LARGE_SCH-NEXT: jirl $ra, $ra, 0
183183
; LARGE_SCH-NEXT: pcalau12i $a1, %ie_pc_hi20(ie)
184184
; LARGE_SCH-NEXT: addi.d $t8, $zero, %ie_pc_lo12(ie)

llvm/test/CodeGen/LoongArch/tls-models.ll

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@ define ptr @f1() nounwind {
5555
; LA64LARGEPIC-NEXT: lu32i.d $t8, %got64_pc_lo20(unspecified)
5656
; LA64LARGEPIC-NEXT: lu52i.d $t8, $t8, %got64_pc_hi12(unspecified)
5757
; LA64LARGEPIC-NEXT: add.d $a0, $t8, $a0
58-
; LA64LARGEPIC-NEXT: pcalau12i $ra, %pc_hi20(__tls_get_addr)
59-
; LA64LARGEPIC-NEXT: addi.d $t8, $zero, %pc_lo12(__tls_get_addr)
60-
; LA64LARGEPIC-NEXT: lu32i.d $t8, %pc64_lo20(__tls_get_addr)
61-
; LA64LARGEPIC-NEXT: lu52i.d $t8, $t8, %pc64_hi12(__tls_get_addr)
62-
; LA64LARGEPIC-NEXT: add.d $ra, $t8, $ra
58+
; LA64LARGEPIC-NEXT: pcalau12i $ra, %got_pc_hi20(__tls_get_addr)
59+
; LA64LARGEPIC-NEXT: addi.d $t8, $zero, %got_pc_lo12(__tls_get_addr)
60+
; LA64LARGEPIC-NEXT: lu32i.d $t8, %got64_pc_lo20(__tls_get_addr)
61+
; LA64LARGEPIC-NEXT: lu52i.d $t8, $t8, %got64_pc_hi12(__tls_get_addr)
62+
; LA64LARGEPIC-NEXT: ldx.d $ra, $t8, $ra
6363
; LA64LARGEPIC-NEXT: jirl $ra, $ra, 0
6464
; LA64LARGEPIC-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
6565
; LA64LARGEPIC-NEXT: addi.d $sp, $sp, 16
@@ -169,11 +169,11 @@ define ptr @f2() nounwind {
169169
; LA64LARGEPIC-NEXT: lu32i.d $t8, %got64_pc_lo20(ld)
170170
; LA64LARGEPIC-NEXT: lu52i.d $t8, $t8, %got64_pc_hi12(ld)
171171
; LA64LARGEPIC-NEXT: add.d $a0, $t8, $a0
172-
; LA64LARGEPIC-NEXT: pcalau12i $ra, %pc_hi20(__tls_get_addr)
173-
; LA64LARGEPIC-NEXT: addi.d $t8, $zero, %pc_lo12(__tls_get_addr)
174-
; LA64LARGEPIC-NEXT: lu32i.d $t8, %pc64_lo20(__tls_get_addr)
175-
; LA64LARGEPIC-NEXT: lu52i.d $t8, $t8, %pc64_hi12(__tls_get_addr)
176-
; LA64LARGEPIC-NEXT: add.d $ra, $t8, $ra
172+
; LA64LARGEPIC-NEXT: pcalau12i $ra, %got_pc_hi20(__tls_get_addr)
173+
; LA64LARGEPIC-NEXT: addi.d $t8, $zero, %got_pc_lo12(__tls_get_addr)
174+
; LA64LARGEPIC-NEXT: lu32i.d $t8, %got64_pc_lo20(__tls_get_addr)
175+
; LA64LARGEPIC-NEXT: lu52i.d $t8, $t8, %got64_pc_hi12(__tls_get_addr)
176+
; LA64LARGEPIC-NEXT: ldx.d $ra, $t8, $ra
177177
; LA64LARGEPIC-NEXT: jirl $ra, $ra, 0
178178
; LA64LARGEPIC-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
179179
; LA64LARGEPIC-NEXT: addi.d $sp, $sp, 16

0 commit comments

Comments
 (0)