xref: /llvm-project/llvm/test/ThinLTO/X86/visibility-elf.ll (revision daf3079222b09683a24dd5b11815f6467ae41b8d)
1; RUN: split-file %s %t
2; RUN: opt -module-summary %t/a.ll -o %ta.bc
3; RUN: opt -module-summary %t/b.ll -o %tb.bc
4
5;; Test visibility propagation. The prevailing definitions are all from %tb.bc.
6; RUN: llvm-lto2 run -save-temps -enable-import-metadata -o %t1.bc %ta.bc %tb.bc \
7; RUN:   -r=%ta.bc,var1,l -r=%ta.bc,var2,l \
8; RUN:   -r=%ta.bc,hidden_def_weak_def,l -r=%ta.bc,protected_def_weak_def,l -r=%ta.bc,protected_def_weak_hidden_def,l \
9; RUN:   -r=%ta.bc,protected_def_hidden_ref,l -r=%ta.bc,not_imported,l -r=%ta.bc,hidden_def_ref,l \
10; RUN:   -r=%ta.bc,hidden_def_weak_ref,l \
11; RUN:   -r=%ta.bc,ext, -r=%ta.bc,main,plx \
12; RUN:   -r=%tb.bc,var1,plx -r=%tb.bc,var2,plx \
13; RUN:   -r=%tb.bc,hidden_def_weak_def,pl -r=%tb.bc,protected_def_weak_def,pl -r=%tb.bc,protected_def_weak_hidden_def,pl \
14; RUN:   -r=%tb.bc,protected_def_hidden_ref,pl -r=%tb.bc,not_imported,pl -r=%tb.bc,hidden_def_ref,pl \
15; RUN:   -r=%tb.bc,hidden_def_weak_ref,pl
16; RUN: llvm-dis < %t1.bc.1.3.import.bc | FileCheck %s
17
18;; %tb.bc does not import anything, so we just check 1.promote.
19; RUN: llvm-dis < %t1.bc.2.1.promote.bc | FileCheck %s --check-prefix=CHECK2
20
21;--- a.ll
22target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
23target triple = "x86_64-unknown-linux-gnu"
24
25; CHECK:      @var1 = external hidden global i32, align 4
26; CHECK-NEXT: @var2 = available_externally hidden global i32 1, align 4
27
28@var1 = weak global i32 1, align 4
29@var2 = extern_weak global i32
30
31declare void @ext(ptr)
32
33; CHECK: declare hidden i32 @hidden_def_weak_def()
34; CHECK: declare protected void @protected_def_weak_def()
35; CHECK: declare hidden void @protected_def_weak_hidden_def()
36;; Currently the visibility is not propagated onto an unimported function,
37;; because we don't have summaries for declarations.
38; CHECK: declare extern_weak void @not_imported()
39; CHECK: define available_externally hidden void @hidden_def_ref() !thinlto_src_module !0 !thinlto_src_file !1
40; CHECK: define available_externally hidden void @hidden_def_weak_ref() !thinlto_src_module !0 !thinlto_src_file !1
41;; This can be hidden, but we cannot communicate the declaration's visibility
42;; to other modules because declarations don't have summaries, and the IRLinker
43;; overrides it when importing the protected def.
44; CHECK: define available_externally protected void @protected_def_hidden_ref() !thinlto_src_module !0 !thinlto_src_file !1
45
46; CHECK2: define hidden i32 @hidden_def_weak_def()
47; CHECK2: define protected void @protected_def_weak_def()
48; CHECK2: define hidden void @protected_def_weak_hidden_def()
49; CHECK2: define hidden void @hidden_def_ref()
50; CHECK2: define hidden void @hidden_def_weak_ref()
51; CHECK2: define protected void @protected_def_hidden_ref()
52; CHECK2: define hidden void @not_imported()
53
54define weak i32 @hidden_def_weak_def() {
55entry:
56  %0 = load i32, ptr @var2
57  ret i32 %0
58}
59
60define weak void @protected_def_weak_def() {
61entry:
62  ret void
63}
64
65define weak hidden void @protected_def_weak_hidden_def() {
66entry:
67  ret void
68}
69
70declare extern_weak void @not_imported()
71
72declare void @hidden_def_ref()
73declare extern_weak void @hidden_def_weak_ref()
74declare hidden void @protected_def_hidden_ref()
75
76define i32 @main() {
77entry:
78  call void @ext(ptr @hidden_def_weak_def)
79  call void @ext(ptr @protected_def_weak_def)
80  call void @ext(ptr @protected_def_weak_hidden_def)
81  call void @ext(ptr @hidden_def_ref)
82  call void @ext(ptr @hidden_def_weak_ref)
83  call void @ext(ptr @protected_def_hidden_ref)
84  call void @ext(ptr @not_imported)
85
86  ;; Calls ensure the functions are imported.
87  call i32 @hidden_def_weak_def()
88  call void @protected_def_weak_def()
89  call void @protected_def_weak_hidden_def()
90  call void @hidden_def_ref()
91  call void @hidden_def_weak_ref()
92  call void @protected_def_hidden_ref()
93  ret i32 0
94}
95
96;--- b.ll
97target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
98target triple = "x86_64-unknown-linux-gnu"
99
100@var1 = hidden global i32 1, align 4
101@var2 = hidden global i32 1, align 4
102
103define hidden i32 @hidden_def_weak_def() {
104entry:
105  %0 = load i32, ptr @var1
106  ret i32 %0
107}
108
109define protected void @protected_def_weak_def() {
110entry:
111  ret void
112}
113
114define protected void @protected_def_weak_hidden_def() {
115entry:
116  ret void
117}
118
119define hidden void @hidden_def_ref() {
120entry:
121  ret void
122}
123
124define hidden void @hidden_def_weak_ref() {
125entry:
126  ret void
127}
128
129define protected void @protected_def_hidden_ref() {
130entry:
131  ret void
132}
133
134define hidden void @not_imported() {
135entry:
136  ret void
137}
138