1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-22 20:43:44 +02:00
llvm-mirror/test/CodeGen/X86/weak-undef.ll
Rafael Espindola 8302c0a6f3 Handle undefined weak hidden symbols on all architectures.
We were handling the non-hidden case in lib/Target/TargetMachine.cpp,
but the hidden case was handled in architecture dependent code and
only X86_64 and AArch64 were covered.

While it is true that some code sequences in some ABIs might be able
to produce the correct value at runtime, that doesn't seem to be the
common case.

I left the AArch64 code in place since it also forces a got access for
non-pic code. It is not clear if that is needed, but it is probably
better to change that in another commit.

llvm-svn: 316799
2017-10-27 21:18:48 +00:00

59 lines
1.2 KiB
LLVM

; RUN: llc < %s -relocation-model=pic -mtriple=x86_64-pc-linux | FileCheck %s
; RUN: llc < %s -relocation-model=pic -mtriple=i386-pc-linux | FileCheck --check-prefix=I386 %s
@foo1 = extern_weak hidden global i32, align 4
define i32* @bar1() {
ret i32* @foo1
}
; CHECK: bar1:
; CHECK: movq foo1@GOTPCREL(%rip), %rax
; I386: bar1:
; I386: movl foo1@GOT(%eax), %eax
@foo2 = external hidden global i32, align 4
define i32* @bar2() {
ret i32* @foo2
}
; CHECK: bar2:
; CHECK: leaq foo2(%rip), %rax
; I386: bar2:
; I386: leal foo2@GOTOFF(%eax), %eax
declare extern_weak hidden void @foo3()
define void @bar3() {
call void @foo3()
ret void
}
; CHECK: bar3:
; CHECK: callq foo3
; I386: bar3:
; I386: calll foo3
declare external hidden void @foo4()
define void @bar4() {
call void @foo4()
ret void
}
; CHECK: bar4:
; CHECK: callq foo4
; I386: bar4:
; I386: calll foo4
declare extern_weak hidden i32 @foo5()
define i32()* @bar5() {
ret i32()* @foo5
}
; CHECK: bar5:
; CHECK: movq foo5@GOTPCREL(%rip), %rax
; I386: bar5:
; I386: movl foo5@GOT(%eax), %eax
declare external hidden i32 @foo6()
define i32()* @bar6() {
ret i32()* @foo6
}
; CHECK: bar6:
; CHECK: leaq foo6(%rip), %rax
; I386: bar6:
; I386: leal foo6@GOTOFF(%eax), %eax