xref: /llvm-project/lld/test/ELF/common-archive-lookup.s (revision f7669ba3d9443bc95dd63fa25beea13e6265fdc5)
1# REQUIRES: ppc
2
3# RUN: rm -rf %t.dir
4# RUN: split-file %s %t.dir
5# RUN: cd %t.dir
6
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
12
13# RUN: llvm-mc -triple=powerpc64le -filetype=obj main.s -o main.o
14
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
19
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
24
25## Bitcode archive.
26# RUN: llvm-ar crs 4.a 1.bc 2.bc
27
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
30
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
33
34# RUN: ld.lld -o 3 main.o 2.a
35# RUN: llvm-objdump -t 3 | FileCheck --check-prefix=BSS %s
36
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
39
40# RUN: ld.lld -o 5 main.o 3.a --print-map | FileCheck --check-prefix=MAP %s
41
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
44
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
47
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
50
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
53
54# ERR: ld.lld: error: duplicate symbol: block
55
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
60
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
63
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
66
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
70
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
73
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)).
77
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:       ...
85
86# BSS:       [[#%x,]] g     O .bss   0000000000000028 block
87
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
95
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:     ...
103
104# MAP:       28 8 3.a(2.o):(.data)
105# MAP-NEXT:  28 1 block
106
107# ASM:         .type   block,@object
108# ASM:       block:
109# ASM-NEXT:    .long 5
110# ASM:         .size   block, 20
111
112# LTO_WEAK:     1.bc: common definition of block
113# LTO_WEAK:     <internal>: reference to block
114# LTO_WEAK-NOT: {{.}}
115
116#--- ref.s
117  .text
118  .abiversion 2
119  .global bar
120  .type bar,@function
121bar:
122  addis 4, 2, block@toc@ha
123  addi  4, 4, block@toc@l
124
125## Tentative definition of 'block'.
126  .comm block,40,8
127
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
135bar:
136  addis 4, 2, block@toc@ha
137  addi  4, 4, block@toc@l
138
139  .data
140  .type block,@object
141  .global block
142  .p2align 3
143block:
144  .quad   0x4005bf0a8b145703              # double 2.7182818284589998
145  .space  32
146  .size   block, 40
147
148#--- def.s
149## Strong definition of 'block'.
150  .data
151  .type block,@object
152  .global block
153  .p2align 3
154block:
155  .quad   0x400921fb54442eea              # double 3.1415926535900001
156  .space  32
157  .size   block, 40
158
159#--- weak.s
160## Weak definition of `block`.
161  .data
162  .type block,@object
163  .weak block
164  .p2align 3
165block:
166  .quad   0x400921fb54442eea              # double 3.1415926535900001
167  .space  32
168  .size   block, 40
169
170#--- main.s
171  .global _start
172_start:
173  bl bar
174  blr
175
176
177#--- blockdata.ll
178target datalayout = "e-m:e-Fn32-i64:64-n32:64-S128-v256:256:256-v512:512:512"
179target triple = "powerpc64le-unknown-linux-gnu"
180
181@block = dso_local local_unnamed_addr global [5 x i32] [i32 5, i32 0, i32 0, i32 0, i32 0], align 4
182
183#--- weak.ll
184target datalayout = "e-m:e-Fn32-i64:64-n32:64-S128-v256:256:256-v512:512:512"
185target triple = "powerpc64le-unknown-linux-gnu"
186
187@block = weak dso_local global [5 x i32] [i32 5, i32 0, i32 0, i32 0, i32 0], align 4
188
189#--- commonblock.ll
190target datalayout = "e-m:e-Fn32-i64:64-n32:64-S128-v256:256:256-v512:512:512"
191target triple = "powerpc64le-unknown-linux-gnu"
192
193@block =  common dso_local local_unnamed_addr global [5 x i32] zeroinitializer, align 4
194
195define dso_local i32 @bar(i32 signext %i) local_unnamed_addr {
196entry:
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
201}
202