Skip to content

Commit 6377ae4

Browse files
authored
[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. Reviewed By: heiher, SixWeining Pull Request: #117099
1 parent bc7f24c commit 6377ae4

File tree

6 files changed

+50
-50
lines changed

6 files changed

+50
-50
lines changed

llvm/lib/Target/LoongArch/LoongArchExpandPseudoInsts.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,7 @@ bool LoongArchPreRAExpandPseudo::expandFunctionCALL(
564564
? MF->getRegInfo().createVirtualRegister(&LoongArch::GPRRegClass)
565565
: LoongArch::R1;
566566

567-
bool UseGOT = Func.isGlobal() && !Func.getGlobal()->isDSOLocal();
567+
bool UseGOT = Func.getTargetFlags() == LoongArchII::MO_CALL_PLT;
568568
unsigned MO = UseGOT ? LoongArchII::MO_GOT_PC_HI : LoongArchII::MO_PCREL_LO;
569569
unsigned LAOpcode = UseGOT ? LoongArch::LDX_D : LoongArch::ADD_D;
570570
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 $a3, %pc_hi20(memset)
86-
; LARGE-NEXT: addi.d $ra, $zero, %pc_lo12(memset)
87-
; LARGE-NEXT: lu32i.d $ra, %pc64_lo20(memset)
88-
; LARGE-NEXT: lu52i.d $ra, $ra, %pc64_hi12(memset)
89-
; LARGE-NEXT: add.d $ra, $ra, $a3
85+
; LARGE-NEXT: pcalau12i $a3, %got_pc_hi20(memset)
86+
; LARGE-NEXT: addi.d $ra, $zero, %got_pc_lo12(memset)
87+
; LARGE-NEXT: lu32i.d $ra, %got64_pc_lo20(memset)
88+
; LARGE-NEXT: lu52i.d $ra, $ra, %got64_pc_hi12(memset)
89+
; LARGE-NEXT: ldx.d $ra, $ra, $a3
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/expand-adjacency.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ declare void @llvm.memset.p0.i64(ptr, i8, i64, i1)
1414

1515
define void @call_external_sym(ptr %dst) {
1616
; LARGE-LABEL: call_external_sym:
17-
; LARGE: pcalau12i [[REG1:\$[a-z0-9]+]], %pc_hi20(memset)
18-
; LARGE-NEXT: addi.d [[REG2:\$[a-z0-9]+]], $zero, %pc_lo12(memset)
19-
; LARGE-NEXT: lu32i.d [[REG2]], %pc64_lo20(memset)
20-
; LARGE-NEXT: lu52i.d [[REG2]], [[REG2]], %pc64_hi12(memset)
17+
; LARGE: pcalau12i [[REG1:\$[a-z0-9]+]], %got_pc_hi20(memset)
18+
; LARGE-NEXT: addi.d [[REG2:\$[a-z0-9]+]], $zero, %got_pc_lo12(memset)
19+
; LARGE-NEXT: lu32i.d [[REG2]], %got64_pc_lo20(memset)
20+
; LARGE-NEXT: lu52i.d [[REG2]], [[REG2]], %got64_pc_hi12(memset)
2121
entry:
2222
call void @llvm.memset.p0.i64(ptr %dst, i8 0, i64 1000, i1 false)
2323
ret void

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -279,11 +279,11 @@ define void @test_la_tls_ld(i32 signext %n) {
279279
; LA64LARGE-NEXT: .LBB3_1: # %loop
280280
; LA64LARGE-NEXT: # =>This Inner Loop Header: Depth=1
281281
; LA64LARGE-NEXT: move $a0, $s0
282-
; LA64LARGE-NEXT: pcalau12i $a1, %pc_hi20(__tls_get_addr)
283-
; LA64LARGE-NEXT: addi.d $ra, $zero, %pc_lo12(__tls_get_addr)
284-
; LA64LARGE-NEXT: lu32i.d $ra, %pc64_lo20(__tls_get_addr)
285-
; LA64LARGE-NEXT: lu52i.d $ra, $ra, %pc64_hi12(__tls_get_addr)
286-
; LA64LARGE-NEXT: add.d $ra, $ra, $a1
282+
; LA64LARGE-NEXT: pcalau12i $a1, %got_pc_hi20(__tls_get_addr)
283+
; LA64LARGE-NEXT: addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr)
284+
; LA64LARGE-NEXT: lu32i.d $ra, %got64_pc_lo20(__tls_get_addr)
285+
; LA64LARGE-NEXT: lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr)
286+
; LA64LARGE-NEXT: ldx.d $ra, $ra, $a1
287287
; LA64LARGE-NEXT: jirl $ra, $ra, 0
288288
; LA64LARGE-NEXT: ld.w $zero, $a0, 0
289289
; LA64LARGE-NEXT: addi.w $s1, $s1, 1
@@ -445,11 +445,11 @@ define void @test_la_tls_gd(i32 signext %n) nounwind {
445445
; LA64LARGE-NEXT: .LBB5_1: # %loop
446446
; LA64LARGE-NEXT: # =>This Inner Loop Header: Depth=1
447447
; LA64LARGE-NEXT: move $a0, $s0
448-
; LA64LARGE-NEXT: pcalau12i $a1, %pc_hi20(__tls_get_addr)
449-
; LA64LARGE-NEXT: addi.d $ra, $zero, %pc_lo12(__tls_get_addr)
450-
; LA64LARGE-NEXT: lu32i.d $ra, %pc64_lo20(__tls_get_addr)
451-
; LA64LARGE-NEXT: lu52i.d $ra, $ra, %pc64_hi12(__tls_get_addr)
452-
; LA64LARGE-NEXT: add.d $ra, $ra, $a1
448+
; LA64LARGE-NEXT: pcalau12i $a1, %got_pc_hi20(__tls_get_addr)
449+
; LA64LARGE-NEXT: addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr)
450+
; LA64LARGE-NEXT: lu32i.d $ra, %got64_pc_lo20(__tls_get_addr)
451+
; LA64LARGE-NEXT: lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr)
452+
; LA64LARGE-NEXT: ldx.d $ra, $ra, $a1
453453
; LA64LARGE-NEXT: jirl $ra, $ra, 0
454454
; LA64LARGE-NEXT: ld.w $zero, $a0, 0
455455
; 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
@@ -102,23 +102,23 @@ define void @foo() nounwind {
102102
; LARGE_NO_SCH-NEXT: lu32i.d $a1, %got64_pc_lo20(gd)
103103
; LARGE_NO_SCH-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(gd)
104104
; LARGE_NO_SCH-NEXT: add.d $a0, $a1, $a0
105-
; LARGE_NO_SCH-NEXT: pcalau12i $a1, %pc_hi20(__tls_get_addr)
106-
; LARGE_NO_SCH-NEXT: addi.d $ra, $zero, %pc_lo12(__tls_get_addr)
107-
; LARGE_NO_SCH-NEXT: lu32i.d $ra, %pc64_lo20(__tls_get_addr)
108-
; LARGE_NO_SCH-NEXT: lu52i.d $ra, $ra, %pc64_hi12(__tls_get_addr)
109-
; LARGE_NO_SCH-NEXT: add.d $ra, $ra, $a1
105+
; LARGE_NO_SCH-NEXT: pcalau12i $a1, %got_pc_hi20(__tls_get_addr)
106+
; LARGE_NO_SCH-NEXT: addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr)
107+
; LARGE_NO_SCH-NEXT: lu32i.d $ra, %got64_pc_lo20(__tls_get_addr)
108+
; LARGE_NO_SCH-NEXT: lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr)
109+
; LARGE_NO_SCH-NEXT: ldx.d $ra, $ra, $a1
110110
; LARGE_NO_SCH-NEXT: jirl $ra, $ra, 0
111111
; LARGE_NO_SCH-NEXT: ld.d $zero, $a0, 0
112112
; LARGE_NO_SCH-NEXT: pcalau12i $a0, %ld_pc_hi20(ld)
113113
; LARGE_NO_SCH-NEXT: addi.d $a1, $zero, %got_pc_lo12(ld)
114114
; LARGE_NO_SCH-NEXT: lu32i.d $a1, %got64_pc_lo20(ld)
115115
; LARGE_NO_SCH-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(ld)
116116
; LARGE_NO_SCH-NEXT: add.d $a0, $a1, $a0
117-
; LARGE_NO_SCH-NEXT: pcalau12i $a1, %pc_hi20(__tls_get_addr)
118-
; LARGE_NO_SCH-NEXT: addi.d $ra, $zero, %pc_lo12(__tls_get_addr)
119-
; LARGE_NO_SCH-NEXT: lu32i.d $ra, %pc64_lo20(__tls_get_addr)
120-
; LARGE_NO_SCH-NEXT: lu52i.d $ra, $ra, %pc64_hi12(__tls_get_addr)
121-
; LARGE_NO_SCH-NEXT: add.d $ra, $ra, $a1
117+
; LARGE_NO_SCH-NEXT: pcalau12i $a1, %got_pc_hi20(__tls_get_addr)
118+
; LARGE_NO_SCH-NEXT: addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr)
119+
; LARGE_NO_SCH-NEXT: lu32i.d $ra, %got64_pc_lo20(__tls_get_addr)
120+
; LARGE_NO_SCH-NEXT: lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr)
121+
; LARGE_NO_SCH-NEXT: ldx.d $ra, $ra, $a1
122122
; LARGE_NO_SCH-NEXT: jirl $ra, $ra, 0
123123
; LARGE_NO_SCH-NEXT: ld.d $zero, $a0, 0
124124
; LARGE_NO_SCH-NEXT: pcalau12i $a0, %ie_pc_hi20(ie)
@@ -158,23 +158,23 @@ define void @foo() nounwind {
158158
; LARGE_SCH-NEXT: lu32i.d $a1, %got64_pc_lo20(gd)
159159
; LARGE_SCH-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(gd)
160160
; LARGE_SCH-NEXT: add.d $a0, $a1, $a0
161-
; LARGE_SCH-NEXT: pcalau12i $a1, %pc_hi20(__tls_get_addr)
162-
; LARGE_SCH-NEXT: addi.d $ra, $zero, %pc_lo12(__tls_get_addr)
163-
; LARGE_SCH-NEXT: lu32i.d $ra, %pc64_lo20(__tls_get_addr)
164-
; LARGE_SCH-NEXT: lu52i.d $ra, $ra, %pc64_hi12(__tls_get_addr)
165-
; LARGE_SCH-NEXT: add.d $ra, $ra, $a1
161+
; LARGE_SCH-NEXT: pcalau12i $a1, %got_pc_hi20(__tls_get_addr)
162+
; LARGE_SCH-NEXT: addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr)
163+
; LARGE_SCH-NEXT: lu32i.d $ra, %got64_pc_lo20(__tls_get_addr)
164+
; LARGE_SCH-NEXT: lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr)
165+
; LARGE_SCH-NEXT: ldx.d $ra, $ra, $a1
166166
; LARGE_SCH-NEXT: jirl $ra, $ra, 0
167167
; LARGE_SCH-NEXT: ld.d $zero, $a0, 0
168168
; LARGE_SCH-NEXT: pcalau12i $a0, %ld_pc_hi20(ld)
169169
; LARGE_SCH-NEXT: addi.d $a1, $zero, %got_pc_lo12(ld)
170170
; LARGE_SCH-NEXT: lu32i.d $a1, %got64_pc_lo20(ld)
171171
; LARGE_SCH-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(ld)
172172
; LARGE_SCH-NEXT: add.d $a0, $a1, $a0
173-
; LARGE_SCH-NEXT: pcalau12i $a1, %pc_hi20(__tls_get_addr)
174-
; LARGE_SCH-NEXT: addi.d $ra, $zero, %pc_lo12(__tls_get_addr)
175-
; LARGE_SCH-NEXT: lu32i.d $ra, %pc64_lo20(__tls_get_addr)
176-
; LARGE_SCH-NEXT: lu52i.d $ra, $ra, %pc64_hi12(__tls_get_addr)
177-
; LARGE_SCH-NEXT: add.d $ra, $ra, $a1
173+
; LARGE_SCH-NEXT: pcalau12i $a1, %got_pc_hi20(__tls_get_addr)
174+
; LARGE_SCH-NEXT: addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr)
175+
; LARGE_SCH-NEXT: lu32i.d $ra, %got64_pc_lo20(__tls_get_addr)
176+
; LARGE_SCH-NEXT: lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr)
177+
; LARGE_SCH-NEXT: ldx.d $ra, $ra, $a1
178178
; LARGE_SCH-NEXT: jirl $ra, $ra, 0
179179
; LARGE_SCH-NEXT: ld.d $zero, $a0, 0
180180
; LARGE_SCH-NEXT: pcalau12i $a0, %ie_pc_hi20(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 $a1, %got64_pc_lo20(unspecified)
5656
; LA64LARGEPIC-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(unspecified)
5757
; LA64LARGEPIC-NEXT: add.d $a0, $a1, $a0
58-
; LA64LARGEPIC-NEXT: pcalau12i $a1, %pc_hi20(__tls_get_addr)
59-
; LA64LARGEPIC-NEXT: addi.d $ra, $zero, %pc_lo12(__tls_get_addr)
60-
; LA64LARGEPIC-NEXT: lu32i.d $ra, %pc64_lo20(__tls_get_addr)
61-
; LA64LARGEPIC-NEXT: lu52i.d $ra, $ra, %pc64_hi12(__tls_get_addr)
62-
; LA64LARGEPIC-NEXT: add.d $ra, $ra, $a1
58+
; LA64LARGEPIC-NEXT: pcalau12i $a1, %got_pc_hi20(__tls_get_addr)
59+
; LA64LARGEPIC-NEXT: addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr)
60+
; LA64LARGEPIC-NEXT: lu32i.d $ra, %got64_pc_lo20(__tls_get_addr)
61+
; LA64LARGEPIC-NEXT: lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr)
62+
; LA64LARGEPIC-NEXT: ldx.d $ra, $ra, $a1
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
@@ -168,11 +168,11 @@ define ptr @f2() nounwind {
168168
; LA64LARGEPIC-NEXT: lu32i.d $a1, %got64_pc_lo20(ld)
169169
; LA64LARGEPIC-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(ld)
170170
; LA64LARGEPIC-NEXT: add.d $a0, $a1, $a0
171-
; LA64LARGEPIC-NEXT: pcalau12i $a1, %pc_hi20(__tls_get_addr)
172-
; LA64LARGEPIC-NEXT: addi.d $ra, $zero, %pc_lo12(__tls_get_addr)
173-
; LA64LARGEPIC-NEXT: lu32i.d $ra, %pc64_lo20(__tls_get_addr)
174-
; LA64LARGEPIC-NEXT: lu52i.d $ra, $ra, %pc64_hi12(__tls_get_addr)
175-
; LA64LARGEPIC-NEXT: add.d $ra, $ra, $a1
171+
; LA64LARGEPIC-NEXT: pcalau12i $a1, %got_pc_hi20(__tls_get_addr)
172+
; LA64LARGEPIC-NEXT: addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr)
173+
; LA64LARGEPIC-NEXT: lu32i.d $ra, %got64_pc_lo20(__tls_get_addr)
174+
; LA64LARGEPIC-NEXT: lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr)
175+
; LA64LARGEPIC-NEXT: ldx.d $ra, $ra, $a1
176176
; LA64LARGEPIC-NEXT: jirl $ra, $ra, 0
177177
; LA64LARGEPIC-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
178178
; LA64LARGEPIC-NEXT: addi.d $sp, $sp, 16

0 commit comments

Comments
 (0)