[clang-tidy][modernize-use-starts-ends-with] Fix operator rewriting false negative...
[llvm-project.git] / lld / test / ELF / common-archive-lookup.s
bloba30d0f18d01adc13ab941ea44305082255be0b9c
1 # REQUIRES: ppc
3 # RUN: rm -rf %t.dir
4 # RUN: split-file %s %t.dir
5 # RUN: cd %t.dir
7 ## Object files.
8 # RUN: llvm-mc -triple=powerpc64le -filetype=obj ref.s -o 1.o
9 # RUN: llvm-mc -triple=powerpc64le -filetype=obj refanddef.s -o 2.o
10 # RUN: llvm-mc -triple=powerpc64le -filetype=obj def.s -o strong_data_only.o
11 # RUN: llvm-mc -triple=powerpc64le -filetype=obj weak.s -o weak_data_only.o
13 # RUN: llvm-mc -triple=powerpc64le -filetype=obj main.s -o main.o
15 ## Object file archives.
16 # RUN: llvm-ar crs 1.a 1.o strong_data_only.o
17 # RUN: llvm-ar crs 2.a 1.o weak_data_only.o
18 # RUN: llvm-ar crs 3.a 2.o strong_data_only.o
20 ## Bitcode files.
21 # RUN: llvm-as -o 1.bc commonblock.ll
22 # RUN: llvm-as -o 2.bc blockdata.ll
23 # RUN: llvm-as -o 3.bc weak.ll
25 ## Bitcode archive.
26 # RUN: llvm-ar crs 4.a 1.bc 2.bc
28 # RUN: ld.lld -o 1 main.o 1.a --fortran-common
29 # RUN: llvm-objdump -D -j .data 1 | FileCheck --check-prefix=TEST1 %s
31 # RUN: ld.lld -o 2 main.o --start-lib 1.o strong_data_only.o --end-lib --fortran-common
32 # RUN: llvm-objdump -D -j .data 2 | FileCheck --check-prefix=TEST1 %s
34 # RUN: ld.lld -o 3 main.o 2.a
35 # RUN: llvm-objdump -t 3 | FileCheck --check-prefix=BSS %s
37 # RUN: ld.lld -o 4 main.o --start-lib 1.o weak_data_only.o --end-lib
38 # RUN: llvm-objdump -t 4 | FileCheck --check-prefix=BSS %s
40 # RUN: ld.lld -o 5 main.o 3.a --print-map | FileCheck --check-prefix=MAP %s
42 # RUN: ld.lld -o 6 main.o 2.o 1.a
43 # RUN: llvm-objdump -D -j .data 6 | FileCheck --check-prefix=TEST2 %s
45 # RUN: ld.lld -o 7 main.o 2.o --start-lib 1.o strong_data_only.o --end-lib
46 # RUN: llvm-objdump -D -j .data 7 | FileCheck --check-prefix=TEST2 %s
48 # RUN: not ld.lld -o 8 main.o 1.a strong_data_only.o --fortran-common 2>&1 | \
49 # RUN: FileCheck --check-prefix=ERR %s
51 # RUN: not ld.lld -o 9 main.o --start-lib 1.o 2.o --end-lib strong_data_only.o --fortran-common 2>&1 | \
52 # RUN: FileCheck --check-prefix=ERR %s
54 # ERR: ld.lld: error: duplicate symbol: block
56 # RUN: ld.lld --no-fortran-common -o 10 main.o 1.a
57 # RUN: llvm-readobj --syms 10 | FileCheck --check-prefix=NFC %s
58 # RUN: ld.lld -o 10 main.o 1.a
59 # RUN: llvm-readobj --syms 10 | FileCheck --check-prefix=NFC %s
61 # RUN: ld.lld --no-fortran-common -o 11 main.o --start-lib 1.o strong_data_only.o --end-lib
62 # RUN: llvm-readobj --syms 11 | FileCheck --check-prefix=NFC %s
64 # RUN: ld.lld -o out main.o 4.a --fortran-common --lto-emit-asm
65 # RUN: FileCheck --check-prefix=ASM %s < out.lto.s
67 # RUN: rm out.lto.s
68 # RUN: ld.lld -o out main.o --start-lib 1.bc 2.bc --end-lib --fortran-common --lto-emit-asm
69 # RUN: FileCheck --check-prefix=ASM %s < out.lto.s
71 ## COMMON overrides weak. Don't extract 3.bc which provides a weak definition.
72 # RUN: ld.lld -o /dev/null main.o --start-lib 1.bc 3.bc --end-lib -y block | FileCheck --check-prefix=LTO_WEAK %s
74 ## Old FORTRAN that mixes use of COMMON blocks and BLOCK DATA requires that we
75 ## search through archives for non-tentative definitions (from the BLOCK DATA)
76 ## to replace the tentative definitions (from the COMMON block(s)).
78 ## Ensure we have used the initialized definition of 'block' instead of a
79 ## common definition.
80 # TEST1-LABEL: Disassembly of section .data:
81 # TEST1: <block>:
82 # TEST1-NEXT: ea 2e 44 54
83 # TEST1-NEXT: fb 21 09 40
84 # TEST1-NEXT: ...
86 # BSS: [[#%x,]] g O .bss 0000000000000028 block
88 # NFC: Name: block
89 # NFC-NEXT: Value:
90 # NFC-NEXT: Size: 40
91 # NFC-NEXT: Binding: Global (0x1)
92 # NFC-NEXT: Type: Object (0x1)
93 # NFC-NEXT: Other: 0
94 # NFC-NEXT: Section: .bss
96 ## Expecting the strong definition from the object file, and the definitions from
97 ## the archive do not interfere.
98 # TEST2-LABEL: Disassembly of section .data:
99 # TEST2: <block>:
100 # TEST2-NEXT: 03 57 14 8b
101 # TEST2-NEXT: 0a bf 05 40
102 # TEST2-NEXT: ...
104 # MAP: 28 8 3.a(2.o):(.data)
105 # MAP-NEXT: 28 1 block
107 # ASM: .type block,@object
108 # ASM: block:
109 # ASM-NEXT: .long 5
110 # ASM: .size block, 20
112 # LTO_WEAK: 1.bc: common definition of block
113 # LTO_WEAK: <internal>: reference to block
114 # LTO_WEAK-NOT: {{.}}
116 #--- ref.s
117 .text
118 .abiversion 2
119 .global bar
120 .type bar,@function
121 bar:
122 addis 4, 2, block@toc@ha
123 addi 4, 4, block@toc@l
125 ## Tentative definition of 'block'.
126 .comm block,40,8
128 #--- refanddef.s
129 ## An alternate strong definition of block, in the same file as
130 ## a different referenced symbol.
131 .text
132 .abiversion 2
133 .global bar
134 .type bar,@function
135 bar:
136 addis 4, 2, block@toc@ha
137 addi 4, 4, block@toc@l
139 .data
140 .type block,@object
141 .global block
142 .p2align 3
143 block:
144 .quad 0x4005bf0a8b145703 # double 2.7182818284589998
145 .space 32
146 .size block, 40
148 #--- def.s
149 ## Strong definition of 'block'.
150 .data
151 .type block,@object
152 .global block
153 .p2align 3
154 block:
155 .quad 0x400921fb54442eea # double 3.1415926535900001
156 .space 32
157 .size block, 40
159 #--- weak.s
160 ## Weak definition of `block`.
161 .data
162 .type block,@object
163 .weak block
164 .p2align 3
165 block:
166 .quad 0x400921fb54442eea # double 3.1415926535900001
167 .space 32
168 .size block, 40
170 #--- main.s
171 .global _start
172 _start:
173 bl bar
177 #--- blockdata.ll
178 target datalayout = "e-m:e-Fn32-i64:64-n32:64-S128-v256:256:256-v512:512:512"
179 target triple = "powerpc64le-unknown-linux-gnu"
181 @block = dso_local local_unnamed_addr global [5 x i32] [i32 5, i32 0, i32 0, i32 0, i32 0], align 4
183 #--- weak.ll
184 target datalayout = "e-m:e-Fn32-i64:64-n32:64-S128-v256:256:256-v512:512:512"
185 target triple = "powerpc64le-unknown-linux-gnu"
187 @block = weak dso_local global [5 x i32] [i32 5, i32 0, i32 0, i32 0, i32 0], align 4
189 #--- commonblock.ll
190 target datalayout = "e-m:e-Fn32-i64:64-n32:64-S128-v256:256:256-v512:512:512"
191 target triple = "powerpc64le-unknown-linux-gnu"
193 @block = common dso_local local_unnamed_addr global [5 x i32] zeroinitializer, align 4
195 define dso_local i32 @bar(i32 signext %i) local_unnamed_addr {
196 entry:
197 %idxprom = sext i32 %i to i64
198 %arrayidx = getelementptr inbounds [5 x i32], ptr @block, i64 0, i64 %idxprom
199 %0 = load i32, ptr %arrayidx, align 8
200 ret i32 %0