forked from OSchip/llvm-project
198 lines
5.7 KiB
ArmAsm
198 lines
5.7 KiB
ArmAsm
# REQUIRES: ppc
|
|
|
|
# RUN: rm -rf %t.dir
|
|
# RUN: split-file %s %t.dir
|
|
# RUN: cd %t.dir
|
|
|
|
## Object files.
|
|
# RUN: llvm-mc -triple=powerpc64le -filetype=obj ref.s -o 1.o
|
|
# RUN: llvm-mc -triple=powerpc64le -filetype=obj refanddef.s -o 2.o
|
|
# RUN: llvm-mc -triple=powerpc64le -filetype=obj def.s -o strong_data_only.o
|
|
# RUN: llvm-mc -triple=powerpc64le -filetype=obj weak.s -o weak_data_only.o
|
|
|
|
# RUN: llvm-mc -triple=powerpc64le -filetype=obj main.s -o main.o
|
|
|
|
## Object file archives.
|
|
# RUN: llvm-ar crs 1.a 1.o strong_data_only.o
|
|
# RUN: llvm-ar crs 2.a 1.o weak_data_only.o
|
|
# RUN: llvm-ar crs 3.a 2.o strong_data_only.o
|
|
|
|
## Bitcode files.
|
|
# RUN: llvm-as -o 1.bc commonblock.ll
|
|
# RUN: llvm-as -o 2.bc blockdata.ll
|
|
# RUN: llvm-as -o 3.bc weak.ll
|
|
|
|
## Bitcode archive.
|
|
# RUN: llvm-ar crs 4.a 1.bc 2.bc
|
|
|
|
# RUN: ld.lld -o 1 main.o 1.a
|
|
# RUN: llvm-objdump -D -j .data 1 | FileCheck --check-prefix=TEST1 %s
|
|
|
|
# RUN: ld.lld -o 2 main.o --start-lib 1.o strong_data_only.o --end-lib
|
|
# RUN: llvm-objdump -D -j .data 2 | FileCheck --check-prefix=TEST1 %s
|
|
|
|
# RUN: ld.lld -o 3 main.o 2.a
|
|
# RUN: llvm-objdump -t 3 | FileCheck --check-prefix=BSS %s
|
|
|
|
# RUN: ld.lld -o 4 main.o --start-lib 1.o weak_data_only.o --end-lib
|
|
# RUN: llvm-objdump -t 4 | FileCheck --check-prefix=BSS %s
|
|
|
|
# RUN: ld.lld -o 5 main.o 3.a --print-map | FileCheck --check-prefix=MAP %s
|
|
|
|
# RUN: ld.lld -o 6 main.o 2.o 1.a
|
|
# RUN: llvm-objdump -D -j .data 6 | FileCheck --check-prefix=TEST2 %s
|
|
|
|
# RUN: ld.lld -o 7 main.o 2.o --start-lib 1.o strong_data_only.o --end-lib
|
|
# RUN: llvm-objdump -D -j .data 7 | FileCheck --check-prefix=TEST2 %s
|
|
|
|
# RUN: not ld.lld -o 8 main.o 1.a strong_data_only.o 2>&1 | \
|
|
# RUN: FileCheck --check-prefix=ERR %s
|
|
|
|
# RUN: not ld.lld -o 9 main.o --start-lib 1.o 2.o --end-lib strong_data_only.o 2>&1 | \
|
|
# RUN: FileCheck --check-prefix=ERR %s
|
|
|
|
# ERR: ld.lld: error: duplicate symbol: block
|
|
|
|
# RUN: ld.lld --no-fortran-common -o 10 main.o 1.a
|
|
# RUN: llvm-readobj --syms 10 | FileCheck --check-prefix=NFC %s
|
|
|
|
# RUN: ld.lld --no-fortran-common -o 11 main.o --start-lib 1.o strong_data_only.o --end-lib
|
|
# RUN: llvm-readobj --syms 11 | FileCheck --check-prefix=NFC %s
|
|
|
|
# RUN: ld.lld -o - main.o 4.a --lto-emit-asm | FileCheck --check-prefix=ASM %s
|
|
|
|
# RUN: ld.lld -o - main.o --start-lib 1.bc 2.bc --end-lib --lto-emit-asm | \
|
|
# RUN: FileCheck --check-prefix=ASM %s
|
|
|
|
## COMMON overrides weak. Don't extract 3.bc which provides a weak definition.
|
|
# RUN: ld.lld -o /dev/null main.o --start-lib 1.bc 3.bc --end-lib -y block | FileCheck --check-prefix=LTO_WEAK %s
|
|
|
|
## Old FORTRAN that mixes use of COMMON blocks and BLOCK DATA requires that we
|
|
## search through archives for non-tentative definitions (from the BLOCK DATA)
|
|
## to replace the tentative definitions (from the COMMON block(s)).
|
|
|
|
## Ensure we have used the initialized definition of 'block' instead of a
|
|
## common definition.
|
|
# TEST1-LABEL: Disassembly of section .data:
|
|
# TEST1: <block>:
|
|
# TEST1-NEXT: ea 2e 44 54
|
|
# TEST1-NEXT: fb 21 09 40
|
|
# TEST1-NEXT: ...
|
|
|
|
# BSS: [[#%x,]] g O .bss 0000000000000028 block
|
|
|
|
# NFC: Name: block
|
|
# NFC-NEXT: Value:
|
|
# NFC-NEXT: Size: 40
|
|
# NFC-NEXT: Binding: Global (0x1)
|
|
# NFC-NEXT: Type: Object (0x1)
|
|
# NFC-NEXT: Other: 0
|
|
# NFC-NEXT: Section: .bss
|
|
|
|
## Expecting the strong definition from the object file, and the defintions from
|
|
## the archive do not interfere.
|
|
# TEST2-LABEL: Disassembly of section .data:
|
|
# TEST2: <block>:
|
|
# TEST2-NEXT: 03 57 14 8b
|
|
# TEST2-NEXT: 0a bf 05 40
|
|
# TEST2-NEXT: ...
|
|
|
|
# MAP: 28 8 3.a(2.o):(.data)
|
|
# MAP-NEXT: 28 1 block
|
|
|
|
# ASM: .type block,@object
|
|
# ASM: block:
|
|
# ASM-NEXT: .long 5
|
|
# ASM: .size block, 20
|
|
|
|
# LTO_WEAK: 1.bc: common definition of block
|
|
# LTO_WEAK: <internal>: reference to block
|
|
# LTO_WEAK-NOT: {{.}}
|
|
|
|
#--- ref.s
|
|
.text
|
|
.abiversion 2
|
|
.global bar
|
|
.type bar,@function
|
|
bar:
|
|
addis 4, 2, block@toc@ha
|
|
addi 4, 4, block@toc@l
|
|
|
|
## Tentative definition of 'block'.
|
|
.comm block,40,8
|
|
|
|
#--- refanddef.s
|
|
## An alternate strong definition of block, in the same file as
|
|
## a different referenced symbol.
|
|
.text
|
|
.abiversion 2
|
|
.global bar
|
|
.type bar,@function
|
|
bar:
|
|
addis 4, 2, block@toc@ha
|
|
addi 4, 4, block@toc@l
|
|
|
|
.data
|
|
.type block,@object
|
|
.global block
|
|
.p2align 3
|
|
block:
|
|
.quad 0x4005bf0a8b145703 # double 2.7182818284589998
|
|
.space 32
|
|
.size block, 40
|
|
|
|
#--- def.s
|
|
## Strong definition of 'block'.
|
|
.data
|
|
.type block,@object
|
|
.global block
|
|
.p2align 3
|
|
block:
|
|
.quad 0x400921fb54442eea # double 3.1415926535900001
|
|
.space 32
|
|
.size block, 40
|
|
|
|
#--- weak.s
|
|
## Weak definition of `block`.
|
|
.data
|
|
.type block,@object
|
|
.weak block
|
|
.p2align 3
|
|
block:
|
|
.quad 0x400921fb54442eea # double 3.1415926535900001
|
|
.space 32
|
|
.size block, 40
|
|
|
|
#--- main.s
|
|
.global _start
|
|
_start:
|
|
bl bar
|
|
blr
|
|
|
|
|
|
#--- blockdata.ll
|
|
target datalayout = "e-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512"
|
|
target triple = "powerpc64le-unknown-linux-gnu"
|
|
|
|
@block = dso_local local_unnamed_addr global [5 x i32] [i32 5, i32 0, i32 0, i32 0, i32 0], align 4
|
|
|
|
#--- weak.ll
|
|
target datalayout = "e-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512"
|
|
target triple = "powerpc64le-unknown-linux-gnu"
|
|
|
|
@block = weak dso_local global [5 x i32] [i32 5, i32 0, i32 0, i32 0, i32 0], align 4
|
|
|
|
#--- commonblock.ll
|
|
target datalayout = "e-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512"
|
|
target triple = "powerpc64le-unknown-linux-gnu"
|
|
|
|
@block = common dso_local local_unnamed_addr global [5 x i32] zeroinitializer, align 4
|
|
|
|
define dso_local i32 @bar(i32 signext %i) local_unnamed_addr {
|
|
entry:
|
|
%idxprom = sext i32 %i to i64
|
|
%arrayidx = getelementptr inbounds [5 x i32], [5 x i32]* @block, i64 0, i64 %idxprom
|
|
%0 = load i32, i32* %arrayidx, align 8
|
|
ret i32 %0
|
|
}
|