|
| 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 %t1.o |
| 9 | +# RUN: llvm-mc -triple=powerpc64le -filetype=obj refanddef.s -o %t2.o |
| 10 | +# RUN: llvm-mc -triple=powerpc64le -filetype=obj def.s -o %tstrong_data_only.o |
| 11 | +# RUN: llvm-mc -triple=powerpc64le -filetype=obj weak.s -o %tweak_data_only.o |
| 12 | + |
| 13 | +# RUN: llvm-mc -triple=powerpc64le -filetype=obj main.s -o %tmain.o |
| 14 | + |
| 15 | +## Object file archives. |
| 16 | +# RUN: llvm-ar crs %t1.a %t1.o %tstrong_data_only.o |
| 17 | +# RUN: llvm-ar crs %t2.a %t1.o %tweak_data_only.o |
| 18 | +# RUN: llvm-ar crs %t3.a %t2.o %tstrong_data_only.o |
| 19 | + |
| 20 | +## Bitcode files. |
| 21 | +# RUN: llvm-as -o %t1.bc commonblock.ll |
| 22 | +# RUN: llvm-as -o %t2.bc blockdata.ll |
| 23 | + |
| 24 | +## Bitcode archive. |
| 25 | +# RUN: llvm-ar crs %t4.a %t1.bc %t2.bc |
| 26 | + |
| 27 | +# RUN: ld.lld -o %t1 %tmain.o %t1.a |
| 28 | +# RUN: llvm-objdump -D -j .data %t1 | FileCheck --check-prefix=TEST1 %s |
| 29 | + |
| 30 | +# RUN: ld.lld -o %t2 %tmain.o --start-lib %t1.o %tstrong_data_only.o --end-lib |
| 31 | +# RUN: llvm-objdump -D -j .data %t2 | FileCheck --check-prefix=TEST1 %s |
| 32 | + |
| 33 | +# RUN: ld.lld -o %t3 %tmain.o %t2.a |
| 34 | +# RUN: llvm-objdump -D -j .data %t3 | FileCheck --check-prefix=TEST1 %s |
| 35 | + |
| 36 | +# RUN: ld.lld -o %t4 %tmain.o --start-lib %t1.o %tweak_data_only.o --end-lib |
| 37 | +# RUN: llvm-objdump -D -j .data %t4 | FileCheck --check-prefix=TEST1 %s |
| 38 | + |
| 39 | +# RUN: ld.lld -o %t5 %tmain.o %t3.a --print-map | FileCheck --check-prefix=MAP %s |
| 40 | + |
| 41 | +# RUN: ld.lld -o %t6 %tmain.o %t2.o %t1.a |
| 42 | +# RUN: llvm-objdump -D -j .data %t6 | FileCheck --check-prefix=TEST2 %s |
| 43 | + |
| 44 | +# RUN: ld.lld -o %t7 %tmain.o %t2.o --start-lib %t1.o %tstrong_data_only.o --end-lib |
| 45 | +# RUN: llvm-objdump -D -j .data %t7 | FileCheck --check-prefix=TEST2 %s |
| 46 | + |
| 47 | +# RUN: not ld.lld -o %t8 %tmain.o %t1.a %tstrong_data_only.o 2>&1 | \ |
| 48 | +# RUN: FileCheck --check-prefix=ERR %s |
| 49 | + |
| 50 | +# RUN: not ld.lld -o %t9 %tmain.o --start-lib %t1.o %t2.o --end-lib %tstrong_data_only.o 2>&1 | \ |
| 51 | +# RUN: FileCheck --check-prefix=ERR %s |
| 52 | + |
| 53 | +# ERR: ld.lld: error: duplicate symbol: block |
| 54 | + |
| 55 | +# RUN: ld.lld --no-fortran-common -o %t10 %tmain.o %t1.a |
| 56 | +# RUN: llvm-readobj --syms %t10 | FileCheck --check-prefix=NFC %s |
| 57 | + |
| 58 | +# RUN: ld.lld --no-fortran-common -o %t11 %tmain.o --start-lib %t1.o %tstrong_data_only.o --end-lib |
| 59 | +# RUN: llvm-readobj --syms %t11 | FileCheck --check-prefix=NFC %s |
| 60 | + |
| 61 | +# RUN: ld.lld -o - %tmain.o %t4.a --lto-emit-asm | FileCheck --check-prefix=ASM %s |
| 62 | + |
| 63 | +# RUN: ld.lld -o - %tmain.o --start-lib %t1.bc %t2.bc --end-lib --lto-emit-asm | \ |
| 64 | +# RUN: FileCheck --check-prefix=ASM %s |
| 65 | + |
| 66 | +## Old FORTRAN that mixes use of COMMON blocks and BLOCK DATA requires that we |
| 67 | +## search through archives for non-tentative definitions (from the BLOCK DATA) |
| 68 | +## to replace the tentative definitions (from the COMMON block(s)). |
| 69 | + |
| 70 | +## Ensure we have used the initialized definition of 'block' instead of a |
| 71 | +## common definition. |
| 72 | +# TEST1-LABEL: Disassembly of section .data: |
| 73 | +# TEST1: <block>: |
| 74 | +# TEST1-NEXT: ea 2e 44 54 |
| 75 | +# TEST1-NEXT: fb 21 09 40 |
| 76 | +# TEST1-NEXT: ... |
| 77 | + |
| 78 | + |
| 79 | +# NFC: Name: block |
| 80 | +# NFC-NEXT: Value: |
| 81 | +# NFC-NEXT: Size: 40 |
| 82 | +# NFC-NEXT: Binding: Global (0x1) |
| 83 | +# NFC-NEXT: Type: Object (0x1) |
| 84 | +# NFC-NEXT: Other: 0 |
| 85 | +# NFC-NEXT: Section: .bss |
| 86 | + |
| 87 | +## Expecting the strong definition from the object file, and the defintions from |
| 88 | +## the archive do not interfere. |
| 89 | +# TEST2-LABEL: Disassembly of section .data: |
| 90 | +# TEST2: <block>: |
| 91 | +# TEST2-NEXT: 03 57 14 8b |
| 92 | +# TEST2-NEXT: 0a bf 05 40 |
| 93 | +# TEST2-NEXT: ... |
| 94 | + |
| 95 | +# MAP: 28 8 {{.*}}tmp3.a(common-archive-lookup.s.tmp2.o):(.data) |
| 96 | +# MAP-NEXT: 28 1 block |
| 97 | + |
| 98 | +# ASM: .type block,@object |
| 99 | +# ASM: block: |
| 100 | +# ASM-NEXT: .long 5 |
| 101 | +# ASM: .size block, 20 |
| 102 | + |
| 103 | +#--- ref.s |
| 104 | + .text |
| 105 | + .abiversion 2 |
| 106 | + .global bar |
| 107 | + .type bar,@function |
| 108 | +bar: |
| 109 | + addis 4, 2, block@toc@ha |
| 110 | + addi 4, 4, block@toc@l |
| 111 | + |
| 112 | +## Tentative definition of 'block'. |
| 113 | + .comm block,40,8 |
| 114 | + |
| 115 | +#--- refanddef.s |
| 116 | +## An alternate strong definition of block, in the same file as |
| 117 | +## a different referenced symbol. |
| 118 | + .text |
| 119 | + .abiversion 2 |
| 120 | + .global bar |
| 121 | + .type bar,@function |
| 122 | +bar: |
| 123 | + addis 4, 2, block@toc@ha |
| 124 | + addi 4, 4, block@toc@l |
| 125 | + |
| 126 | + .data |
| 127 | + .type block,@object |
| 128 | + .global block |
| 129 | + .p2align 3 |
| 130 | +block: |
| 131 | + .quad 0x4005bf0a8b145703 # double 2.7182818284589998 |
| 132 | + .space 32 |
| 133 | + .size block, 40 |
| 134 | + |
| 135 | +#--- def.s |
| 136 | +## Strong definition of 'block'. |
| 137 | + .data |
| 138 | + .type block,@object |
| 139 | + .global block |
| 140 | + .p2align 3 |
| 141 | +block: |
| 142 | + .quad 0x400921fb54442eea # double 3.1415926535900001 |
| 143 | + .space 32 |
| 144 | + .size block, 40 |
| 145 | + |
| 146 | +#--- weak.s |
| 147 | +## Weak definition of `block`. |
| 148 | + .data |
| 149 | + .type block,@object |
| 150 | + .weak block |
| 151 | + .p2align 3 |
| 152 | +block: |
| 153 | + .quad 0x400921fb54442eea # double 3.1415926535900001 |
| 154 | + .space 32 |
| 155 | + .size block, 40 |
| 156 | + |
| 157 | +#--- main.s |
| 158 | + .global _start |
| 159 | +_start: |
| 160 | + bl bar |
| 161 | + blr |
| 162 | + |
| 163 | + |
| 164 | +#--- blockdata.ll |
| 165 | +target datalayout = "e-m:e-i64:64-n32:64-v256:256:256-v512:512:512" |
| 166 | +target triple = "powerpc64le-unknown-linux-gnu" |
| 167 | + |
| 168 | +@block = dso_local local_unnamed_addr global [5 x i32] [i32 5, i32 0, i32 0, i32 0, i32 0], align 4 |
| 169 | + |
| 170 | +#--- commonblock.ll |
| 171 | +target datalayout = "e-m:e-i64:64-n32:64-v256:256:256-v512:512:512" |
| 172 | +target triple = "powerpc64le-unknown-linux-gnu" |
| 173 | + |
| 174 | +@block = common dso_local local_unnamed_addr global [5 x i32] zeroinitializer, align 4 |
| 175 | + |
| 176 | +define dso_local i32 @bar(i32 signext %i) local_unnamed_addr { |
| 177 | +entry: |
| 178 | + %idxprom = sext i32 %i to i64 |
| 179 | + %arrayidx = getelementptr inbounds [5 x i32], [5 x i32]* @block, i64 0, i64 %idxprom |
| 180 | + %0 = load i32, i32* %arrayidx, align 8 |
| 181 | + ret i32 %0 |
| 182 | +} |
0 commit comments