1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -relocation-model=static < %s \ 3; RUN: | FileCheck %s --check-prefix=RV32-STATIC 4; RUN: llc -mtriple=riscv32 -relocation-model=pic < %s \ 5; RUN: | FileCheck %s --check-prefix=RV32-PIC 6; RUN: llc -mtriple=riscv64 -relocation-model=static < %s \ 7; RUN: | FileCheck %s --check-prefix=RV64-STATIC 8; RUN: llc -mtriple=riscv64 -relocation-model=pic < %s \ 9; RUN: | FileCheck %s --check-prefix=RV64-PIC 10 11@preemptable_var = dso_preemptable global i32 42 12define ptr @get_preemptable_var() nounwind { 13; RV32-STATIC-LABEL: get_preemptable_var: 14; RV32-STATIC: # %bb.0: 15; RV32-STATIC-NEXT: lui a0, %hi(preemptable_var) 16; RV32-STATIC-NEXT: addi a0, a0, %lo(preemptable_var) 17; RV32-STATIC-NEXT: ret 18; 19; RV32-PIC-LABEL: get_preemptable_var: 20; RV32-PIC: # %bb.0: 21; RV32-PIC-NEXT: .Lpcrel_hi0: 22; RV32-PIC-NEXT: auipc a0, %got_pcrel_hi(preemptable_var) 23; RV32-PIC-NEXT: lw a0, %pcrel_lo(.Lpcrel_hi0)(a0) 24; RV32-PIC-NEXT: ret 25; 26; RV64-STATIC-LABEL: get_preemptable_var: 27; RV64-STATIC: # %bb.0: 28; RV64-STATIC-NEXT: lui a0, %hi(preemptable_var) 29; RV64-STATIC-NEXT: addi a0, a0, %lo(preemptable_var) 30; RV64-STATIC-NEXT: ret 31; 32; RV64-PIC-LABEL: get_preemptable_var: 33; RV64-PIC: # %bb.0: 34; RV64-PIC-NEXT: .Lpcrel_hi0: 35; RV64-PIC-NEXT: auipc a0, %got_pcrel_hi(preemptable_var) 36; RV64-PIC-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi0)(a0) 37; RV64-PIC-NEXT: ret 38 ret ptr @preemptable_var 39} 40 41@dsolocal_var = dso_local global i32 42 42define ptr @get_dsolocal_var() nounwind { 43; RV32-STATIC-LABEL: get_dsolocal_var: 44; RV32-STATIC: # %bb.0: 45; RV32-STATIC-NEXT: lui a0, %hi(dsolocal_var) 46; RV32-STATIC-NEXT: addi a0, a0, %lo(dsolocal_var) 47; RV32-STATIC-NEXT: ret 48; 49; RV32-PIC-LABEL: get_dsolocal_var: 50; RV32-PIC: # %bb.0: 51; RV32-PIC-NEXT: .Lpcrel_hi1: 52; RV32-PIC-NEXT: auipc a0, %pcrel_hi(.Ldsolocal_var$local) 53; RV32-PIC-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi1) 54; RV32-PIC-NEXT: ret 55; 56; RV64-STATIC-LABEL: get_dsolocal_var: 57; RV64-STATIC: # %bb.0: 58; RV64-STATIC-NEXT: lui a0, %hi(dsolocal_var) 59; RV64-STATIC-NEXT: addi a0, a0, %lo(dsolocal_var) 60; RV64-STATIC-NEXT: ret 61; 62; RV64-PIC-LABEL: get_dsolocal_var: 63; RV64-PIC: # %bb.0: 64; RV64-PIC-NEXT: .Lpcrel_hi1: 65; RV64-PIC-NEXT: auipc a0, %pcrel_hi(.Ldsolocal_var$local) 66; RV64-PIC-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi1) 67; RV64-PIC-NEXT: ret 68 ret ptr @dsolocal_var 69} 70 71@weak_dsolocal_var = weak dso_local global i32 42 72define ptr @get_weak_dsolocal_var() nounwind { 73; RV32-STATIC-LABEL: get_weak_dsolocal_var: 74; RV32-STATIC: # %bb.0: 75; RV32-STATIC-NEXT: lui a0, %hi(weak_dsolocal_var) 76; RV32-STATIC-NEXT: addi a0, a0, %lo(weak_dsolocal_var) 77; RV32-STATIC-NEXT: ret 78; 79; RV32-PIC-LABEL: get_weak_dsolocal_var: 80; RV32-PIC: # %bb.0: 81; RV32-PIC-NEXT: .Lpcrel_hi2: 82; RV32-PIC-NEXT: auipc a0, %pcrel_hi(weak_dsolocal_var) 83; RV32-PIC-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi2) 84; RV32-PIC-NEXT: ret 85; 86; RV64-STATIC-LABEL: get_weak_dsolocal_var: 87; RV64-STATIC: # %bb.0: 88; RV64-STATIC-NEXT: lui a0, %hi(weak_dsolocal_var) 89; RV64-STATIC-NEXT: addi a0, a0, %lo(weak_dsolocal_var) 90; RV64-STATIC-NEXT: ret 91; 92; RV64-PIC-LABEL: get_weak_dsolocal_var: 93; RV64-PIC: # %bb.0: 94; RV64-PIC-NEXT: .Lpcrel_hi2: 95; RV64-PIC-NEXT: auipc a0, %pcrel_hi(weak_dsolocal_var) 96; RV64-PIC-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi2) 97; RV64-PIC-NEXT: ret 98 ret ptr @weak_dsolocal_var 99} 100 101@hidden_var = hidden global i32 42 102define ptr @get_hidden_var() nounwind { 103; RV32-STATIC-LABEL: get_hidden_var: 104; RV32-STATIC: # %bb.0: 105; RV32-STATIC-NEXT: lui a0, %hi(hidden_var) 106; RV32-STATIC-NEXT: addi a0, a0, %lo(hidden_var) 107; RV32-STATIC-NEXT: ret 108; 109; RV32-PIC-LABEL: get_hidden_var: 110; RV32-PIC: # %bb.0: 111; RV32-PIC-NEXT: .Lpcrel_hi3: 112; RV32-PIC-NEXT: auipc a0, %pcrel_hi(hidden_var) 113; RV32-PIC-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi3) 114; RV32-PIC-NEXT: ret 115; 116; RV64-STATIC-LABEL: get_hidden_var: 117; RV64-STATIC: # %bb.0: 118; RV64-STATIC-NEXT: lui a0, %hi(hidden_var) 119; RV64-STATIC-NEXT: addi a0, a0, %lo(hidden_var) 120; RV64-STATIC-NEXT: ret 121; 122; RV64-PIC-LABEL: get_hidden_var: 123; RV64-PIC: # %bb.0: 124; RV64-PIC-NEXT: .Lpcrel_hi3: 125; RV64-PIC-NEXT: auipc a0, %pcrel_hi(hidden_var) 126; RV64-PIC-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi3) 127; RV64-PIC-NEXT: ret 128 ret ptr @hidden_var 129} 130 131@protected_var = protected global i32 42 132define ptr @get_protected_var() nounwind { 133; RV32-STATIC-LABEL: get_protected_var: 134; RV32-STATIC: # %bb.0: 135; RV32-STATIC-NEXT: lui a0, %hi(protected_var) 136; RV32-STATIC-NEXT: addi a0, a0, %lo(protected_var) 137; RV32-STATIC-NEXT: ret 138; 139; RV32-PIC-LABEL: get_protected_var: 140; RV32-PIC: # %bb.0: 141; RV32-PIC-NEXT: .Lpcrel_hi4: 142; RV32-PIC-NEXT: auipc a0, %pcrel_hi(protected_var) 143; RV32-PIC-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi4) 144; RV32-PIC-NEXT: ret 145; 146; RV64-STATIC-LABEL: get_protected_var: 147; RV64-STATIC: # %bb.0: 148; RV64-STATIC-NEXT: lui a0, %hi(protected_var) 149; RV64-STATIC-NEXT: addi a0, a0, %lo(protected_var) 150; RV64-STATIC-NEXT: ret 151; 152; RV64-PIC-LABEL: get_protected_var: 153; RV64-PIC: # %bb.0: 154; RV64-PIC-NEXT: .Lpcrel_hi4: 155; RV64-PIC-NEXT: auipc a0, %pcrel_hi(protected_var) 156; RV64-PIC-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi4) 157; RV64-PIC-NEXT: ret 158 ret ptr @protected_var 159} 160 161define dso_preemptable ptr @preemptable_func() nounwind { 162; RV32-STATIC-LABEL: preemptable_func: 163; RV32-STATIC: # %bb.0: 164; RV32-STATIC-NEXT: lui a0, %hi(preemptable_func) 165; RV32-STATIC-NEXT: addi a0, a0, %lo(preemptable_func) 166; RV32-STATIC-NEXT: ret 167; 168; RV32-PIC-LABEL: preemptable_func: 169; RV32-PIC: # %bb.0: 170; RV32-PIC-NEXT: .Lpcrel_hi5: 171; RV32-PIC-NEXT: auipc a0, %got_pcrel_hi(preemptable_func) 172; RV32-PIC-NEXT: lw a0, %pcrel_lo(.Lpcrel_hi5)(a0) 173; RV32-PIC-NEXT: ret 174; 175; RV64-STATIC-LABEL: preemptable_func: 176; RV64-STATIC: # %bb.0: 177; RV64-STATIC-NEXT: lui a0, %hi(preemptable_func) 178; RV64-STATIC-NEXT: addi a0, a0, %lo(preemptable_func) 179; RV64-STATIC-NEXT: ret 180; 181; RV64-PIC-LABEL: preemptable_func: 182; RV64-PIC: # %bb.0: 183; RV64-PIC-NEXT: .Lpcrel_hi5: 184; RV64-PIC-NEXT: auipc a0, %got_pcrel_hi(preemptable_func) 185; RV64-PIC-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi5)(a0) 186; RV64-PIC-NEXT: ret 187 ret ptr @preemptable_func 188} 189 190define dso_local ptr @dsolocal_func() nounwind { 191; RV32-STATIC-LABEL: dsolocal_func: 192; RV32-STATIC: # %bb.0: 193; RV32-STATIC-NEXT: lui a0, %hi(dsolocal_func) 194; RV32-STATIC-NEXT: addi a0, a0, %lo(dsolocal_func) 195; RV32-STATIC-NEXT: ret 196; 197; RV32-PIC-LABEL: dsolocal_func: 198; RV32-PIC: # %bb.0: 199; RV32-PIC-NEXT: .Lpcrel_hi6: 200; RV32-PIC-NEXT: auipc a0, %pcrel_hi(.Ldsolocal_func$local) 201; RV32-PIC-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi6) 202; RV32-PIC-NEXT: ret 203; 204; RV64-STATIC-LABEL: dsolocal_func: 205; RV64-STATIC: # %bb.0: 206; RV64-STATIC-NEXT: lui a0, %hi(dsolocal_func) 207; RV64-STATIC-NEXT: addi a0, a0, %lo(dsolocal_func) 208; RV64-STATIC-NEXT: ret 209; 210; RV64-PIC-LABEL: dsolocal_func: 211; RV64-PIC: # %bb.0: 212; RV64-PIC-NEXT: .Lpcrel_hi6: 213; RV64-PIC-NEXT: auipc a0, %pcrel_hi(.Ldsolocal_func$local) 214; RV64-PIC-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi6) 215; RV64-PIC-NEXT: ret 216 ret ptr @dsolocal_func 217} 218 219define weak dso_local ptr @weak_dsolocal_func() nounwind { 220; RV32-STATIC-LABEL: weak_dsolocal_func: 221; RV32-STATIC: # %bb.0: 222; RV32-STATIC-NEXT: lui a0, %hi(weak_dsolocal_func) 223; RV32-STATIC-NEXT: addi a0, a0, %lo(weak_dsolocal_func) 224; RV32-STATIC-NEXT: ret 225; 226; RV32-PIC-LABEL: weak_dsolocal_func: 227; RV32-PIC: # %bb.0: 228; RV32-PIC-NEXT: .Lpcrel_hi7: 229; RV32-PIC-NEXT: auipc a0, %pcrel_hi(weak_dsolocal_func) 230; RV32-PIC-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi7) 231; RV32-PIC-NEXT: ret 232; 233; RV64-STATIC-LABEL: weak_dsolocal_func: 234; RV64-STATIC: # %bb.0: 235; RV64-STATIC-NEXT: lui a0, %hi(weak_dsolocal_func) 236; RV64-STATIC-NEXT: addi a0, a0, %lo(weak_dsolocal_func) 237; RV64-STATIC-NEXT: ret 238; 239; RV64-PIC-LABEL: weak_dsolocal_func: 240; RV64-PIC: # %bb.0: 241; RV64-PIC-NEXT: .Lpcrel_hi7: 242; RV64-PIC-NEXT: auipc a0, %pcrel_hi(weak_dsolocal_func) 243; RV64-PIC-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi7) 244; RV64-PIC-NEXT: ret 245 ret ptr @weak_dsolocal_func 246} 247 248;; call .Ldsolocal_func$local either resolves to a constant at assembly time 249;; or produces a relocation referencing a non-preemptible local symbol. 250define dso_local void @call_dsolocal_func() nounwind { 251; RV32-STATIC-LABEL: call_dsolocal_func: 252; RV32-STATIC: # %bb.0: 253; RV32-STATIC-NEXT: addi sp, sp, -16 254; RV32-STATIC-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 255; RV32-STATIC-NEXT: call dsolocal_func 256; RV32-STATIC-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 257; RV32-STATIC-NEXT: addi sp, sp, 16 258; RV32-STATIC-NEXT: ret 259; 260; RV32-PIC-LABEL: call_dsolocal_func: 261; RV32-PIC: # %bb.0: 262; RV32-PIC-NEXT: addi sp, sp, -16 263; RV32-PIC-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 264; RV32-PIC-NEXT: call .Ldsolocal_func$local 265; RV32-PIC-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 266; RV32-PIC-NEXT: addi sp, sp, 16 267; RV32-PIC-NEXT: ret 268; 269; RV64-STATIC-LABEL: call_dsolocal_func: 270; RV64-STATIC: # %bb.0: 271; RV64-STATIC-NEXT: addi sp, sp, -16 272; RV64-STATIC-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 273; RV64-STATIC-NEXT: call dsolocal_func 274; RV64-STATIC-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 275; RV64-STATIC-NEXT: addi sp, sp, 16 276; RV64-STATIC-NEXT: ret 277; 278; RV64-PIC-LABEL: call_dsolocal_func: 279; RV64-PIC: # %bb.0: 280; RV64-PIC-NEXT: addi sp, sp, -16 281; RV64-PIC-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 282; RV64-PIC-NEXT: call .Ldsolocal_func$local 283; RV64-PIC-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 284; RV64-PIC-NEXT: addi sp, sp, 16 285; RV64-PIC-NEXT: ret 286 call ptr @dsolocal_func() 287 ret void 288} 289