xref: /llvm-project/llvm/test/Linker/comdat-any.ll (revision 41d5033eb162cb92b684855166cabfa3983b74c6)
1; RUN: rm -rf %t && split-file %s %t
2; RUN: llvm-link -S %t/1.ll %t/1-aux.ll -o - | FileCheck %s
3; RUN: llvm-link -S %t/2.ll %t/2-aux.ll -o - | FileCheck %s --check-prefix=CHECK2
4
5;; A private linkage variable can be copied.
6; RUN: llvm-link -S %t/3.ll %t/3-aux.ll -o - | FileCheck %s --check-prefix=CHECK3
7
8;--- 1.ll
9; CHECK: @foo = global i8 0, comdat
10
11; CHECK: define void @zed() {
12; CHECK:   call void @bar()
13; CHECK:   ret void
14; CHECK: }
15
16; CHECK: declare void @bar()
17
18$foo = comdat any
19@foo = global i8 0, comdat
20
21;--- 1-aux.ll
22$foo = comdat any
23@foo = global i8 1, comdat
24define void @zed() {
25  call void @bar()
26  ret void
27}
28define void @bar() comdat($foo) {
29  ret void
30}
31
32;--- 2.ll
33$c1 = comdat any
34
35@v1 = weak_odr global i32 42, comdat($c1)
36define weak_odr i32 @f1(ptr) comdat($c1) {
37bb10:
38  br label %bb11
39bb11:
40  ret i32 42
41}
42
43@r11 = global ptr @v1
44@r12 = global ptr @f1
45
46@a11 = alias i32, ptr @v1
47@a12 = alias i16, ptr @v1
48
49@a13 = alias i32 (ptr), ptr @f1
50@a14 = alias i16, ptr @f1
51@a15 = alias i16, ptr @a14
52
53; CHECK2: $c1 = comdat any
54; CHECK2: $c2 = comdat any
55
56; CHECK2-DAG: @will_be_undefined = external global i32
57
58; CHECK2-DAG: @v1 = weak_odr global i32 42, comdat($c1)
59
60; CHECK2-DAG: @r11 = global ptr @v1{{$}}
61; CHECK2-DAG: @r12 = global ptr @f1{{$}}
62
63; CHECK2-DAG: @r21 = global ptr @v1{{$}}
64; CHECK2-DAG: @r22 = global ptr @f1{{$}}
65
66; CHECK2-DAG: @v1.1 = internal global i32 41, comdat($c2)
67
68; CHECK2-DAG: @a11 = alias i32, ptr @v1{{$}}
69; CHECK2-DAG: @a12 = alias i16, ptr @v1
70
71; CHECK2-DAG: @a13 = alias i32 (ptr), ptr @f1{{$}}
72; CHECK2-DAG: @a14 = alias i16, ptr @f1
73
74; CHECK2-DAG: @a21 = alias i32, ptr @v1.1{{$}}
75; CHECK2-DAG: @a22 = alias i16, ptr @v1.1
76
77; CHECK2-DAG: @a23 = alias i32 (ptr), ptr @f1.2{{$}}
78; CHECK2-DAG: @a24 = alias i16, ptr @f1.2
79
80; CHECK2:      define weak_odr protected i32 @f1(ptr %0) comdat($c1) {
81; CHECK2-NEXT: bb10:
82; CHECK2-NEXT:   br label %bb11{{$}}
83; CHECK2:      bb11:
84; CHECK2-NEXT:   ret i32 42
85; CHECK2-NEXT: }
86
87; CHECK2:      define internal i32 @f1.2(ptr %this) comdat($c2) {
88; CHECK2-NEXT: bb20:
89; CHECK2-NEXT:   store ptr %this, ptr null
90; CHECK2-NEXT:   br label %bb21
91; CHECK2:      bb21:
92; CHECK2-NEXT:   ret i32 41
93; CHECK2-NEXT: }
94
95;--- 2-aux.ll
96$c2 = comdat any
97$c1 = comdat any
98
99; This is only present in this file. The linker will keep $c1 from the first
100; file and this will be undefined.
101@will_be_undefined = global i32 1, comdat($c1)
102@use = global ptr @will_be_undefined
103
104@v1 = weak_odr global i32 41, comdat($c2)
105define weak_odr protected i32 @f1(ptr %this) comdat($c2) {
106bb20:
107  store ptr %this, ptr null
108  br label %bb21
109bb21:
110  ret i32 41
111}
112
113@r21 = global ptr @v1
114@r22 = global ptr @f1
115
116@a21 = alias i32, ptr @v1
117@a22 = alias i16, ptr @v1
118
119@a23 = alias i32(ptr), ptr @f1
120@a24 = alias i16, ptr @f1
121@a25 = alias i16, ptr @a24
122
123;--- 3.ll
124; CHECK3: @bar = global i32 0, comdat($a1)
125; CHECK3: @baz = private global i32 42, comdat($a1)
126; CHECK3: @a1 = internal alias i32, ptr @baz
127$a1 = comdat any
128@bar = global i32 0, comdat($a1)
129
130;--- 3-aux.ll
131$a1 = comdat any
132@baz = private global i32 42, comdat($a1)
133@a1 = internal alias i32, ptr @baz
134define ptr @abc() {
135  ret ptr @a1
136}
137