1; RUN: llc -mtriple=x86_64-linux-gnu -relocation-model=pic -data-sections -o - %s --asm-verbose=0 | FileCheck %s -check-prefixes=CHECK 2 3; Just ensure that we can write to an object file without error. 4; RUN: llc -filetype=obj -mtriple=x86_64-linux-gnu -relocation-model=pic -data-sections -o /dev/null %s 5 6declare void @extern_func() 7 8; CHECK: call_extern_func: 9; CHECK: callq extern_func@PLT 10define void @call_extern_func() { 11 call void dso_local_equivalent @extern_func() 12 ret void 13} 14 15declare hidden void @hidden_func() 16declare protected void @protected_func() 17declare dso_local void @dso_local_func() 18define internal void @internal_func() { 19entry: 20 ret void 21} 22define private void @private_func() { 23entry: 24 ret void 25} 26 27; CHECK: call_hidden_func: 28; CHECK: callq hidden_func{{$}} 29define void @call_hidden_func() { 30 call void dso_local_equivalent @hidden_func() 31 ret void 32} 33 34; CHECK: call_protected_func: 35; CHECK: callq protected_func{{$}} 36define void @call_protected_func() { 37 call void dso_local_equivalent @protected_func() 38 ret void 39} 40 41; CHECK: call_dso_local_func: 42; CHECK: callq dso_local_func{{$}} 43define void @call_dso_local_func() { 44 call void dso_local_equivalent @dso_local_func() 45 ret void 46} 47 48; CHECK: call_internal_func: 49; CHECK: callq internal_func{{$}} 50define void @call_internal_func() { 51 call void dso_local_equivalent @internal_func() 52 ret void 53} 54 55define void @aliasee_func() { 56entry: 57 ret void 58} 59 60@alias_func = alias void (), ptr @aliasee_func 61@dso_local_alias_func = dso_local alias void (), ptr @aliasee_func 62 63; CHECK: call_alias_func: 64; CHECK: callq alias_func@PLT 65define void @call_alias_func() { 66 call void dso_local_equivalent @alias_func() 67 ret void 68} 69 70; CHECK: call_dso_local_alias_func: 71; CHECK: callq .Ldso_local_alias_func$local{{$}} 72define void @call_dso_local_alias_func() { 73 call void dso_local_equivalent @dso_local_alias_func() 74 ret void 75} 76 77@ifunc_func = ifunc void (), ptr @resolver 78@dso_local_ifunc_func = dso_local ifunc void (), ptr @resolver 79 80define internal ptr @resolver() { 81entry: 82 ret ptr null 83} 84 85; If an ifunc is not dso_local already, then we should still emit a stub for it 86; to ensure it will be dso_local. 87; CHECK: call_ifunc_func: 88; CHECK: callq ifunc_func@PLT 89define void @call_ifunc_func() { 90 call void dso_local_equivalent @ifunc_func() 91 ret void 92} 93 94; CHECK: call_dso_local_ifunc_func: 95; CHECK: callq dso_local_ifunc_func{{$}} 96define void @call_dso_local_ifunc_func() { 97 call void dso_local_equivalent @dso_local_ifunc_func() 98 ret void 99} 100 101;; PR57815 102;; Ensure dso_local_equivalent works the exact same way as the previous 103;; examples but with forward-referenced symbols. 104 105; CHECK: call_forward_func: 106; CHECK: callq forward_extern_func@PLT 107define void @call_forward_func() { 108 call void dso_local_equivalent @forward_extern_func() 109 ret void 110} 111 112; CHECK: call_forward_hidden_func: 113; CHECK: callq forward_hidden_func{{$}} 114define void @call_forward_hidden_func() { 115 call void dso_local_equivalent @forward_hidden_func() 116 ret void 117} 118 119; CHECK: call_forward_protected_func: 120; CHECK: callq forward_protected_func{{$}} 121define void @call_forward_protected_func() { 122 call void dso_local_equivalent @forward_protected_func() 123 ret void 124} 125 126; CHECK: call_forward_dso_local_func: 127; CHECK: callq forward_dso_local_func{{$}} 128define void @call_forward_dso_local_func() { 129 call void dso_local_equivalent @forward_dso_local_func() 130 ret void 131} 132 133; CHECK: call_forward_internal_func: 134; CHECK: callq forward_internal_func{{$}} 135define void @call_forward_internal_func() { 136 call void dso_local_equivalent @forward_internal_func() 137 ret void 138} 139 140declare hidden void @forward_hidden_func() 141declare protected void @forward_protected_func() 142declare dso_local void @forward_dso_local_func() 143define internal void @forward_internal_func() { 144entry: 145 ret void 146} 147define private void @forward_private_func() { 148entry: 149 ret void 150} 151 152; CHECK: call_forward_alias_func: 153; CHECK: callq forward_alias_func@PLT 154define void @call_forward_alias_func() { 155 call void dso_local_equivalent @forward_alias_func() 156 ret void 157} 158 159; CHECK: call_forward_dso_local_alias_func: 160; CHECK: callq .Lforward_dso_local_alias_func$local{{$}} 161define void @call_forward_dso_local_alias_func() { 162 call void dso_local_equivalent @forward_dso_local_alias_func() 163 ret void 164} 165 166define void @forward_aliasee_func() { 167entry: 168 ret void 169} 170 171@forward_alias_func = alias void (), ptr @forward_aliasee_func 172@forward_dso_local_alias_func = dso_local alias void (), ptr @forward_aliasee_func 173 174; If an ifunc is not dso_local already, then we should still emit a stub for it 175; to ensure it will be dso_local. 176; CHECK: call_forward_ifunc_func: 177; CHECK: callq forward_ifunc_func@PLT 178define void @call_forward_ifunc_func() { 179 call void dso_local_equivalent @forward_ifunc_func() 180 ret void 181} 182 183; CHECK: call_forward_dso_local_ifunc_func: 184; CHECK: callq forward_dso_local_ifunc_func{{$}} 185define void @call_forward_dso_local_ifunc_func() { 186 call void dso_local_equivalent @forward_dso_local_ifunc_func() 187 ret void 188} 189 190@forward_ifunc_func = ifunc void (), ptr @resolver 191@forward_dso_local_ifunc_func = dso_local ifunc void (), ptr @resolver 192 193;; Test "no-named" variables 194; CHECK: call_no_name_hidden: 195; CHECK: callq __unnamed_{{[0-9]+}}{{$}} 196define void @call_no_name_hidden() { 197 call void dso_local_equivalent @0() 198 ret void 199} 200 201; CHECK: call_no_name_extern: 202; CHECK: callq __unnamed_{{[0-9]+}}@PLT 203define void @call_no_name_extern() { 204 call void dso_local_equivalent @1() 205 ret void 206} 207 208declare hidden void @0() 209declare void @1() 210 211;; Note that we keep this at the very end because llc emits this after all the 212;; functions. 213; CHECK: const: 214; CHECK: .long forward_extern_func@PLT 215@const = constant i32 trunc (i64 ptrtoint (ptr dso_local_equivalent @forward_extern_func to i64) to i32) 216 217declare void @forward_extern_func() 218