| ; RUN: llc -mtriple=x86_64-linux-gnu -relocation-model=pic -data-sections -o - %s --asm-verbose=0 | FileCheck %s -check-prefixes=CHECK |
| |
| ; Just ensure that we can write to an object file without error. |
| ; RUN: llc -filetype=obj -mtriple=x86_64-linux-gnu -relocation-model=pic -data-sections -o /dev/null %s |
| |
| declare void @extern_func() |
| |
| ; CHECK: call_extern_func: |
| ; CHECK: callq extern_func@PLT |
| define void @call_extern_func() { |
| call void dso_local_equivalent @extern_func() |
| ret void |
| } |
| |
| declare hidden void @hidden_func() |
| declare protected void @protected_func() |
| declare dso_local void @dso_local_func() |
| define internal void @internal_func() { |
| entry: |
| ret void |
| } |
| define private void @private_func() { |
| entry: |
| ret void |
| } |
| |
| ; CHECK: call_hidden_func: |
| ; CHECK: callq hidden_func{{$}} |
| define void @call_hidden_func() { |
| call void dso_local_equivalent @hidden_func() |
| ret void |
| } |
| |
| ; CHECK: call_protected_func: |
| ; CHECK: callq protected_func{{$}} |
| define void @call_protected_func() { |
| call void dso_local_equivalent @protected_func() |
| ret void |
| } |
| |
| ; CHECK: call_dso_local_func: |
| ; CHECK: callq dso_local_func{{$}} |
| define void @call_dso_local_func() { |
| call void dso_local_equivalent @dso_local_func() |
| ret void |
| } |
| |
| ; CHECK: call_internal_func: |
| ; CHECK: callq internal_func{{$}} |
| define void @call_internal_func() { |
| call void dso_local_equivalent @internal_func() |
| ret void |
| } |
| |
| define void @aliasee_func() { |
| entry: |
| ret void |
| } |
| |
| @alias_func = alias void (), void ()* @aliasee_func |
| @dso_local_alias_func = dso_local alias void (), void ()* @aliasee_func |
| |
| ; CHECK: call_alias_func: |
| ; CHECK: callq alias_func@PLT |
| define void @call_alias_func() { |
| call void dso_local_equivalent @alias_func() |
| ret void |
| } |
| |
| ; CHECK: call_dso_local_alias_func: |
| ; CHECK: callq .Ldso_local_alias_func$local{{$}} |
| define void @call_dso_local_alias_func() { |
| call void dso_local_equivalent @dso_local_alias_func() |
| ret void |
| } |
| |
| @ifunc_func = ifunc void (), void ()* ()* @resolver |
| @dso_local_ifunc_func = dso_local ifunc void (), void ()* ()* @resolver |
| |
| define internal void ()* @resolver() { |
| entry: |
| ret void ()* null |
| } |
| |
| ; If an ifunc is not dso_local already, then we should still emit a stub for it |
| ; to ensure it will be dso_local. |
| ; CHECK: call_ifunc_func: |
| ; CHECK: callq ifunc_func@PLT |
| define void @call_ifunc_func() { |
| call void dso_local_equivalent @ifunc_func() |
| ret void |
| } |
| |
| ; CHECK: call_dso_local_ifunc_func: |
| ; CHECK: callq dso_local_ifunc_func{{$}} |
| define void @call_dso_local_ifunc_func() { |
| call void dso_local_equivalent @dso_local_ifunc_func() |
| ret void |
| } |