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