brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.4 KiB · dc06a34 Raw
303 lines · plain
1; RUN: llc -mtriple x86_64-pc-linux -relocation-model=static < %s | \2; RUN:   FileCheck --check-prefixes=COMMON,STATIC %s3; RUN: llc -mtriple x86_64-pc-linux -relocation-model=pic < %s | \4; RUN:   FileCheck --check-prefixes=COMMON,CHECK %s5; RUN: llc -mtriple x86_64-pc-linux -relocation-model=dynamic-no-pic < %s | \6; RUN:   FileCheck --check-prefixes=COMMON,CHECK %s7 8; 32 bits9 10; RUN: llc -mtriple i386-pc-linux \11; RUN:     -relocation-model=pic     < %s | FileCheck --check-prefix=CHECK32 %s12 13; globals14 15@strong_default_global = global i32 4216define ptr @get_strong_default_global() {17  ret ptr @strong_default_global18}19; CHECK: movq strong_default_global@GOTPCREL(%rip), %rax20; STATIC: movq strong_default_global@GOTPCREL(%rip), %rax21; CHECK32: movl strong_default_global@GOT(%eax), %eax22 23@strong_hidden_global = hidden global i32 4224define ptr @get_hidden_default_global() {25  ret ptr @strong_hidden_global26}27; CHECK: leaq strong_hidden_global(%rip), %rax28; STATIC: movl $strong_hidden_global, %eax29; CHECK32: leal strong_hidden_global@GOTOFF(%eax), %eax30 31@weak_default_global = weak global i32 4232define ptr @get_weak_default_global() {33  ret ptr @weak_default_global34}35; CHECK: movq weak_default_global@GOTPCREL(%rip), %rax36; STATIC: movq weak_default_global@GOTPCREL(%rip), %rax37; CHECK32: movl weak_default_global@GOT(%eax), %eax38 39@external_default_global = external global i3240define ptr @get_external_default_global() {41  ret ptr @external_default_global42}43; CHECK: movq external_default_global@GOTPCREL(%rip), %rax44; STATIC: movq external_default_global@GOTPCREL(%rip), %rax45; CHECK32: movl external_default_global@GOT(%eax), %eax46 47@strong_local_global = dso_local global i32 4248define ptr @get_strong_local_global() {49  ret ptr @strong_local_global50}51; CHECK: leaq .Lstrong_local_global$local(%rip), %rax52; STATIC: movl $strong_local_global, %eax53; CHECK32: leal .Lstrong_local_global$local@GOTOFF(%eax), %eax54 55@weak_local_global = weak dso_local global i32 4256define ptr @get_weak_local_global() {57  ret ptr @weak_local_global58}59; CHECK: leaq weak_local_global(%rip), %rax60; STATIC: movl $weak_local_global, %eax61; CHECK32: leal weak_local_global@GOTOFF(%eax), %eax62 63@external_local_global = external dso_local global i3264define ptr @get_external_local_global() {65  ret ptr @external_local_global66}67; CHECK: leaq external_local_global(%rip), %rax68; STATIC: movl $external_local_global, %eax69; CHECK32: leal external_local_global@GOTOFF(%eax), %eax70 71 72@strong_preemptable_global = dso_preemptable global i32 4273define ptr @get_strong_preemptable_global() {74  ret ptr @strong_preemptable_global75}76; CHECK: movq strong_preemptable_global@GOTPCREL(%rip), %rax77; STATIC: movq strong_preemptable_global@GOTPCREL(%rip), %rax78; CHECK32: movl strong_preemptable_global@GOT(%eax), %eax79 80@weak_preemptable_global = weak dso_preemptable global i32 4281define ptr @get_weak_preemptable_global() {82  ret ptr @weak_preemptable_global83}84; CHECK: movq weak_preemptable_global@GOTPCREL(%rip), %rax85; STATIC: movq weak_preemptable_global@GOTPCREL(%rip), %rax86; CHECK32: movl weak_preemptable_global@GOT(%eax), %eax87 88@external_preemptable_global = external dso_preemptable global i3289define ptr @get_external_preemptable_global() {90  ret ptr @external_preemptable_global91}92; CHECK: movq external_preemptable_global@GOTPCREL(%rip), %rax93; STATIC: movq external_preemptable_global@GOTPCREL(%rip), %rax94; CHECK32: movl external_preemptable_global@GOT(%eax), %eax95 96; aliases97@aliasee = global i32 4298 99@strong_default_alias = alias i32, ptr @aliasee100define ptr @get_strong_default_alias() {101  ret ptr @strong_default_alias102}103; CHECK: movq strong_default_alias@GOTPCREL(%rip), %rax104; STATIC: movq strong_default_alias@GOTPCREL(%rip), %rax105; CHECK32: movl strong_default_alias@GOT(%eax), %eax106 107@strong_hidden_alias = hidden alias i32, ptr @aliasee108define ptr @get_strong_hidden_alias() {109  ret ptr @strong_hidden_alias110}111; CHECK: leaq strong_hidden_alias(%rip), %rax112; STATIC: movl $strong_hidden_alias, %eax113; CHECK32: leal strong_hidden_alias@GOTOFF(%eax), %eax114 115@weak_default_alias = weak alias i32, ptr @aliasee116define ptr @get_weak_default_alias() {117  ret ptr @weak_default_alias118}119; CHECK: movq weak_default_alias@GOTPCREL(%rip), %rax120; STATIC: movq weak_default_alias@GOTPCREL(%rip), %rax121; CHECK32: movl weak_default_alias@GOT(%eax), %eax122 123@strong_local_alias = dso_local alias i32, ptr @aliasee124define ptr @get_strong_local_alias() {125  ret ptr @strong_local_alias126}127; CHECK: leaq .Lstrong_local_alias$local(%rip), %rax128; STATIC: movl $strong_local_alias, %eax129; CHECK32: leal .Lstrong_local_alias$local@GOTOFF(%eax), %eax130 131@weak_local_alias = weak dso_local alias i32, ptr @aliasee132define ptr @get_weak_local_alias() {133  ret ptr @weak_local_alias134}135; CHECK: leaq weak_local_alias(%rip), %rax136; STATIC: movl $weak_local_alias, %eax137; CHECK32: leal weak_local_alias@GOTOFF(%eax), %eax138 139 140@strong_preemptable_alias = dso_preemptable alias i32, ptr @aliasee141define ptr @get_strong_preemptable_alias() {142  ret ptr @strong_preemptable_alias143}144; CHECK: movq strong_preemptable_alias@GOTPCREL(%rip), %rax145; STATIC: movq strong_preemptable_alias@GOTPCREL(%rip), %rax146; CHECK32: movl strong_preemptable_alias@GOT(%eax), %eax147 148@weak_preemptable_alias = weak dso_preemptable alias i32, ptr @aliasee149define ptr @get_weak_preemptable_alias() {150  ret ptr @weak_preemptable_alias151}152; CHECK: movq weak_preemptable_alias@GOTPCREL(%rip), %rax153; STATIC: movq weak_preemptable_alias@GOTPCREL(%rip), %rax154; CHECK32: movl weak_preemptable_alias@GOT(%eax), %eax155 156; functions157 158define void @strong_default_function() {159  ret void160}161define ptr @get_strong_default_function() {162  ret ptr @strong_default_function163}164; CHECK: movq strong_default_function@GOTPCREL(%rip), %rax165; STATIC: movq strong_default_function@GOTPCREL(%rip), %rax166; CHECK32: movl strong_default_function@GOT(%eax), %eax167 168define hidden void @strong_hidden_function() {169  ret void170}171define ptr @get_strong_hidden_function() {172  ret ptr @strong_hidden_function173}174; CHECK: leaq strong_hidden_function(%rip), %rax175; STATIC: movl $strong_hidden_function, %eax176; CHECK32: leal strong_hidden_function@GOTOFF(%eax), %eax177 178define weak void @weak_default_function() {179  ret void180}181define ptr @get_weak_default_function() {182  ret ptr @weak_default_function183}184; CHECK: movq weak_default_function@GOTPCREL(%rip), %rax185; STATIC: movq weak_default_function@GOTPCREL(%rip), %rax186; CHECK32: movl weak_default_function@GOT(%eax), %eax187 188declare void @external_default_function()189define ptr @get_external_default_function() {190  ret ptr @external_default_function191}192; CHECK: movq external_default_function@GOTPCREL(%rip), %rax193; STATIC: movq external_default_function@GOTPCREL(%rip), %rax194; CHECK32: movl external_default_function@GOT(%eax), %eax195 196define dso_local void @strong_local_function() {197  ret void198}199define ptr @get_strong_local_function() {200  ret ptr @strong_local_function201}202; COMMON:     {{^}}strong_local_function:203; CHECK-NEXT: .Lstrong_local_function$local:204; CHECK: leaq .Lstrong_local_function$local(%rip), %rax205; STATIC: movl $strong_local_function, %eax206; CHECK32: leal .Lstrong_local_function$local@GOTOFF(%eax), %eax207 208define weak dso_local void @weak_local_function() {209  ret void210}211define ptr @get_weak_local_function() {212  ret ptr @weak_local_function213}214; CHECK: leaq weak_local_function(%rip), %rax215; STATIC: movl $weak_local_function, %eax216; CHECK32: leal weak_local_function@GOTOFF(%eax), %eax217 218declare dso_local void @external_local_function()219define ptr @get_external_local_function() {220  ret ptr @external_local_function221}222; CHECK: leaq external_local_function(%rip), %rax223; STATIC: movl $external_local_function, %eax224; CHECK32: leal external_local_function@GOTOFF(%eax), %eax225 226 227define dso_preemptable void @strong_preemptable_function() {228  ret void229}230define ptr @get_strong_preemptable_function() {231  ret ptr @strong_preemptable_function232}233; CHECK: movq strong_preemptable_function@GOTPCREL(%rip), %rax234; STATIC: movq strong_preemptable_function@GOTPCREL(%rip), %rax235; CHECK32: movl strong_preemptable_function@GOT(%eax), %eax236 237define weak dso_preemptable void @weak_preemptable_function() {238  ret void239}240define ptr @get_weak_preemptable_function() {241  ret ptr @weak_preemptable_function242}243; CHECK: movq weak_preemptable_function@GOTPCREL(%rip), %rax244; STATIC: movq weak_preemptable_function@GOTPCREL(%rip), %rax245; CHECK32: movl weak_preemptable_function@GOT(%eax), %eax246 247declare dso_preemptable void @external_preemptable_function()248define ptr @get_external_preemptable_function() {249  ret ptr @external_preemptable_function250}251; CHECK: movq external_preemptable_function@GOTPCREL(%rip), %rax252; STATIC: movq external_preemptable_function@GOTPCREL(%rip), %rax253; CHECK32: movl external_preemptable_function@GOT(%eax), %eax254 255$comdat_nodeduplicate_local = comdat nodeduplicate256$comdat_nodeduplicate_preemptable = comdat nodeduplicate257$comdat_any_local = comdat any258 259;; -fpic -fno-semantic-interposition may add dso_local. Some instrumentation260;; may add comdat nodeduplicate. We should use local aliases to make the symbol261;; non-preemptible in the linker.262define dso_local ptr @comdat_nodeduplicate_local() comdat {263  ret ptr @comdat_nodeduplicate_local264}265; CHECK: leaq .Lcomdat_nodeduplicate_local$local(%rip), %rax266; STATIC: movl $comdat_nodeduplicate_local, %eax267 268define dso_preemptable ptr @comdat_nodeduplicate_preemptable() comdat {269  ret ptr @comdat_nodeduplicate_preemptable270}271; CHECK: movq comdat_nodeduplicate_preemptable@GOTPCREL(%rip), %rax272; STATIC: movq comdat_nodeduplicate_preemptable@GOTPCREL(%rip), %rax273 274;; Check the behavior for the invalid construct.275define dso_local ptr @comdat_any_local() comdat {276  ret ptr @comdat_any_local277}278; CHECK: leaq comdat_any_local(%rip), %rax279; STATIC: movl $comdat_any_local, %eax280 281!llvm.module.flags = !{!0}282!0 = !{i32 7, !"PIC Level", i32 2}283 284; COMMON:     {{^}}strong_local_global:285; CHECK-NEXT: .Lstrong_local_global$local:286 287; COMMON:      .globl strong_default_alias288; COMMON-NEXT: strong_default_alias = aliasee289; COMMON-NEXT: .globl strong_hidden_alias290; COMMON-NEXT: .hidden strong_hidden_alias291; COMMON-NEXT: strong_hidden_alias = aliasee292; COMMON-NEXT: .weak weak_default_alias293; COMMON-NEXT: weak_default_alias = aliasee294; COMMON-NEXT: .globl strong_local_alias295; COMMON-NEXT: strong_local_alias = aliasee296; CHECK-NEXT:  .Lstrong_local_alias$local = aliasee297; COMMON-NEXT: .weak weak_local_alias298; COMMON-NEXT: weak_local_alias = aliasee299; COMMON-NEXT: .globl strong_preemptable_alias300; COMMON-NEXT: strong_preemptable_alias = aliasee301; COMMON-NEXT: .weak weak_preemptable_alias302; COMMON-NEXT: weak_preemptable_alias = aliasee303