[Clang][CodeGen]`vtable`, `typeinfo` et al. are globals
[llvm-project.git] / llvm / test / Linker / comdat-any.ll
blobef6db661c3e559e4f4c1dc50e2a7f3ce84e83af2
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
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
8 ;--- 1.ll
9 ; CHECK: @foo = global i8 0, comdat
11 ; CHECK: define void @zed() {
12 ; CHECK:   call void @bar()
13 ; CHECK:   ret void
14 ; CHECK: }
16 ; CHECK: declare void @bar()
18 $foo = comdat any
19 @foo = global i8 0, comdat
21 ;--- 1-aux.ll
22 $foo = comdat any
23 @foo = global i8 1, comdat
24 define void @zed() {
25   call void @bar()
26   ret void
28 define void @bar() comdat($foo) {
29   ret void
32 ;--- 2.ll
33 $c1 = comdat any
35 @v1 = weak_odr global i32 42, comdat($c1)
36 define weak_odr i32 @f1(ptr) comdat($c1) {
37 bb10:
38   br label %bb11
39 bb11:
40   ret i32 42
43 @r11 = global ptr @v1
44 @r12 = global ptr @f1
46 @a11 = alias i32, ptr @v1
47 @a12 = alias i16, ptr @v1
49 @a13 = alias i32 (ptr), ptr @f1
50 @a14 = alias i16, ptr @f1
51 @a15 = alias i16, ptr @a14
53 ; CHECK2: $c1 = comdat any
54 ; CHECK2: $c2 = comdat any
56 ; CHECK2-DAG: @will_be_undefined = external global i32
58 ; CHECK2-DAG: @v1 = weak_odr global i32 42, comdat($c1)
60 ; CHECK2-DAG: @r11 = global ptr @v1{{$}}
61 ; CHECK2-DAG: @r12 = global ptr @f1{{$}}
63 ; CHECK2-DAG: @r21 = global ptr @v1{{$}}
64 ; CHECK2-DAG: @r22 = global ptr @f1{{$}}
66 ; CHECK2-DAG: @v1.1 = internal global i32 41, comdat($c2)
68 ; CHECK2-DAG: @a11 = alias i32, ptr @v1{{$}}
69 ; CHECK2-DAG: @a12 = alias i16, ptr @v1
71 ; CHECK2-DAG: @a13 = alias i32 (ptr), ptr @f1{{$}}
72 ; CHECK2-DAG: @a14 = alias i16, ptr @f1
74 ; CHECK2-DAG: @a21 = alias i32, ptr @v1.1{{$}}
75 ; CHECK2-DAG: @a22 = alias i16, ptr @v1.1
77 ; CHECK2-DAG: @a23 = alias i32 (ptr), ptr @f1.2{{$}}
78 ; CHECK2-DAG: @a24 = alias i16, ptr @f1.2
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: }
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: }
95 ;--- 2-aux.ll
96 $c2 = comdat any
97 $c1 = comdat any
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
104 @v1 = weak_odr global i32 41, comdat($c2)
105 define weak_odr protected i32 @f1(ptr %this) comdat($c2) {
106 bb20:
107   store ptr %this, ptr null
108   br label %bb21
109 bb21:
110   ret i32 41
113 @r21 = global ptr @v1
114 @r22 = global ptr @f1
116 @a21 = alias i32, ptr @v1
117 @a22 = alias i16, ptr @v1
119 @a23 = alias i32(ptr), ptr @f1
120 @a24 = alias i16, ptr @f1
121 @a25 = alias i16, ptr @a24
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)
130 ;--- 3-aux.ll
131 $a1 = comdat any
132 @baz = private global i32 42, comdat($a1)
133 @a1 = internal alias i32, ptr @baz
134 define ptr @abc() {
135   ret ptr @a1