12ec43a7bSFangrui Song; RUN: llc < %s -asm-verbose=false -wasm-disable-explicit-locals -wasm-keep-registers | FileCheck %s -check-prefixes=NON-PIC,CHECK 22ec43a7bSFangrui Song 32ec43a7bSFangrui Songtarget triple = "wasm32-unknown-emscripten" 42ec43a7bSFangrui Song 52ec43a7bSFangrui Song@hidden_global = external hidden global i32 62ec43a7bSFangrui Song@hidden_global_array = external hidden global [10 x i32] 72ec43a7bSFangrui Song@external_global = external dso_local global i32 82ec43a7bSFangrui Song@external_global_array = external dso_local global [10 x i32] 92ec43a7bSFangrui Song 102ec43a7bSFangrui Songdeclare i32 @foo(); 112ec43a7bSFangrui Song 122ec43a7bSFangrui Song; For hidden symbols PIC code needs to offset all loads and stores 132ec43a7bSFangrui Song; by the value of the __memory_base global 142ec43a7bSFangrui Song 152ec43a7bSFangrui Songdefine i32 @load_hidden_global() { 162ec43a7bSFangrui Song; CHECK-LABEL: load_hidden_global: 172ec43a7bSFangrui Song; NON-PIC: i32.const $push0=, 0{{$}} 182ec43a7bSFangrui Song; NON-PIC-NEXT: i32.load $push1=, hidden_global($pop0){{$}} 192ec43a7bSFangrui Song; CHECK-NEXT: end_function 202ec43a7bSFangrui Song 21*73856247SNikita Popov %1 = load i32, ptr @hidden_global 222ec43a7bSFangrui Song ret i32 %1 232ec43a7bSFangrui Song} 242ec43a7bSFangrui Song 252ec43a7bSFangrui Songdefine i32 @load_hidden_global_offset() { 262ec43a7bSFangrui Song; CHECK-LABEL: load_hidden_global_offset: 272ec43a7bSFangrui Song; NON-PIC: i32.const $push0=, 0{{$}} 282ec43a7bSFangrui Song; NON-PIC-NEXT:i32.load $push1=, hidden_global_array+20($pop0){{$}} 292ec43a7bSFangrui Song; CHECK-NEXT: end_function 302ec43a7bSFangrui Song 31*73856247SNikita Popov %1 = getelementptr [10 x i32], ptr @hidden_global_array, i32 0, i32 5 32*73856247SNikita Popov %2 = load i32, ptr %1 332ec43a7bSFangrui Song ret i32 %2 342ec43a7bSFangrui Song} 352ec43a7bSFangrui Song 362ec43a7bSFangrui Song; Store to a hidden global 372ec43a7bSFangrui Song 382ec43a7bSFangrui Songdefine void @store_hidden_global(i32 %n) { 392ec43a7bSFangrui Song; CHECK-LABEL: store_hidden_global: 402ec43a7bSFangrui Song; NON-PIC: i32.const $push0=, 0{{$}} 412ec43a7bSFangrui Song; NON-PIC-NEXT: i32.store hidden_global($pop0), $0{{$}} 422ec43a7bSFangrui Song; CHECK-NEXT: end_function 432ec43a7bSFangrui Song 44*73856247SNikita Popov store i32 %n, ptr @hidden_global 452ec43a7bSFangrui Song ret void 462ec43a7bSFangrui Song} 472ec43a7bSFangrui Song 482ec43a7bSFangrui Songdefine void @store_hidden_global_offset(i32 %n) { 492ec43a7bSFangrui Song; CHECK-LABEL: store_hidden_global_offset: 502ec43a7bSFangrui Song; NON-PIC: i32.const $push0=, 0{{$}} 512ec43a7bSFangrui Song; NON-PIC-NEXT: i32.store hidden_global_array+20($pop0), $0{{$}} 522ec43a7bSFangrui Song; CHECK-NEXT: end_function 532ec43a7bSFangrui Song 54*73856247SNikita Popov %1 = getelementptr [10 x i32], ptr @hidden_global_array, i32 0, i32 5 55*73856247SNikita Popov store i32 %n, ptr %1 562ec43a7bSFangrui Song ret void 572ec43a7bSFangrui Song} 582ec43a7bSFangrui Song 592ec43a7bSFangrui Song; For non-hidden globals PIC code has to load the address from a wasm global 602ec43a7bSFangrui Song; using the @GOT relocation type. 612ec43a7bSFangrui Song 622ec43a7bSFangrui Song 632ec43a7bSFangrui Songdefine i32 @load_external_global() { 642ec43a7bSFangrui Song; CHECK-LABEL: load_external_global: 652ec43a7bSFangrui Song; NON-PIC: i32.const $push0=, 0{{$}} 662ec43a7bSFangrui Song; NON-PIC-NEXT: i32.load $push1=, external_global($pop0){{$}} 672ec43a7bSFangrui Song; CHECK-NEXT: end_function 682ec43a7bSFangrui Song 69*73856247SNikita Popov %1 = load i32, ptr @external_global 702ec43a7bSFangrui Song ret i32 %1 712ec43a7bSFangrui Song} 722ec43a7bSFangrui Song 732ec43a7bSFangrui Songdefine i32 @load_external_global_offset() { 742ec43a7bSFangrui Song; CHECK-LABEL: load_external_global_offset: 752ec43a7bSFangrui Song; NON-PIC: i32.const $push[[L0:[0-9]+]]=, 0{{$}} 762ec43a7bSFangrui Song; NON-PIC-NEXT: i32.load $push{{[0-9]+}}=, external_global_array+20($pop[[L0]]){{$}} 772ec43a7bSFangrui Song; CHECK-NEXT: end_function 782ec43a7bSFangrui Song 79*73856247SNikita Popov %1 = getelementptr [10 x i32], ptr @external_global_array, i32 0, i32 5 80*73856247SNikita Popov %2 = load i32, ptr %1 812ec43a7bSFangrui Song ret i32 %2 822ec43a7bSFangrui Song} 832ec43a7bSFangrui Song 842ec43a7bSFangrui Song; Store to a non-hidden global via the wasm global. 852ec43a7bSFangrui Song 862ec43a7bSFangrui Songdefine void @store_external_global(i32 %n) { 872ec43a7bSFangrui Song; CHECK-LABEL: store_external_global: 882ec43a7bSFangrui Song; NON-PIC: i32.const $push0=, 0{{$}} 892ec43a7bSFangrui Song; NON-PIC-NEXT: i32.store external_global($pop0), $0{{$}} 902ec43a7bSFangrui Song; CHECK-NEXT: end_function 912ec43a7bSFangrui Song 92*73856247SNikita Popov store i32 %n, ptr @external_global 932ec43a7bSFangrui Song ret void 942ec43a7bSFangrui Song} 952ec43a7bSFangrui Song 962ec43a7bSFangrui Songdefine void @store_external_global_offset(i32 %n) { 972ec43a7bSFangrui Song; CHECK-LABEL: store_external_global_offset: 982ec43a7bSFangrui Song; NON-PIC: i32.const $push0=, 0{{$}} 992ec43a7bSFangrui Song; NON-PIC-NEXT: i32.store external_global_array+20($pop0), $0{{$}} 1002ec43a7bSFangrui Song; CHECK-NEXT: end_function 1012ec43a7bSFangrui Song 102*73856247SNikita Popov %1 = getelementptr [10 x i32], ptr @external_global_array, i32 0, i32 5 103*73856247SNikita Popov store i32 %n, ptr %1 1042ec43a7bSFangrui Song ret void 1052ec43a7bSFangrui Song} 106