brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.1 KiB · 76339a7 Raw
381 lines · plain
1; RUN: rm -rf %t && split-file %s %t && cd %t2 3;--- err1.ll4 5; RUN: not --crash llc < err1.ll -mtriple aarch64-elf -mattr=+pauth \6; RUN:   -global-isel=0 -verify-machineinstrs 2>&1 | FileCheck --check-prefix=ERR1 %s7; RUN: not --crash llc < err1.ll -mtriple arm64-apple-ios -mattr=+pauth \8; RUN:   -global-isel=0 -verify-machineinstrs 2>&1 | FileCheck --check-prefix=ERR1 %s9 10@g = external global i3211 12define ptr @foo() {13; ERR1: LLVM ERROR: key in ptrauth global out of range [0, 3]14  ret ptr ptrauth (ptr @g, i32 4)15}16 17;--- err2.ll18 19; RUN: not --crash llc < err2.ll -mtriple aarch64-elf -mattr=+pauth \20; RUN:   -global-isel=0 -verify-machineinstrs 2>&1 | FileCheck --check-prefix=ERR2 %s21; RUN: not --crash llc < err2.ll -mtriple arm64-apple-ios -mattr=+pauth \22; RUN:   -global-isel=0 -verify-machineinstrs 2>&1 | FileCheck --check-prefix=ERR2 %s23 24@g = external global i3225 26define ptr @foo() {27; ERR2: LLVM ERROR: constant discriminator in ptrauth global out of range [0, 0xffff]28  ret ptr ptrauth (ptr @g, i32 2, i64 65536)29}30 31;--- err3.ll32 33; RUN: not --crash llc < err3.ll -mtriple aarch64-elf -mattr=+pauth \34; RUN:   -global-isel=0 -verify-machineinstrs 2>&1 | FileCheck --check-prefix=ERR3 %s35; RUN: not --crash llc < err3.ll -mtriple arm64-apple-ios -mattr=+pauth \36; RUN:   -global-isel=0 -verify-machineinstrs 2>&1 | FileCheck --check-prefix=ERR3 %s37 38@g_weak = extern_weak global i3239 40define ptr @foo() {41; ERR3: LLVM ERROR: unsupported non-zero offset in weak ptrauth global reference42  ret ptr ptrauth (ptr getelementptr (i8, ptr @g_weak, i64 16), i32 2, i64 42)43}44 45;--- err4.ll46 47; RUN: not --crash llc < err4.ll -mtriple aarch64-elf -mattr=+pauth \48; RUN:   -global-isel=0 -verify-machineinstrs 2>&1 | FileCheck --check-prefix=ERR4 %s49; RUN: not --crash llc < err4.ll -mtriple arm64-apple-ios -mattr=+pauth \50; RUN:   -global-isel=0 -verify-machineinstrs 2>&1 | FileCheck --check-prefix=ERR4 %s51 52@g_weak = extern_weak global i3253@g_weak.ref.da.42.addr = dso_local constant ptr ptrauth (ptr @g_weak, i32 2, i64 42, ptr @g_weak.ref.da.42.addr)54 55define ptr @foo() {56; ERR4: LLVM ERROR: unsupported weak addr-div ptrauth global57  ret ptr ptrauth (ptr @g_weak, i32 0, i64 42, ptr @g_weak.ref.da.42.addr)58}59 60;--- err5.ll61 62; RUN: not --crash llc < err5.ll -mtriple aarch64-windows -mattr=+pauth \63; RUN:   -global-isel=0 -verify-machineinstrs 2>&1 | FileCheck --check-prefix=ERR5 %s64 65@g = external global i3266 67define ptr @foo() {68; ERR5: LLVM ERROR: ptrauth global lowering only supported on MachO/ELF69  ret ptr ptrauth (ptr @g, i32 0)70}71 72;--- ok.ll73 74; RUN: llc < ok.ll -mtriple aarch64-elf -mattr=+pauth -global-isel=0 \75; RUN:   -verify-machineinstrs | FileCheck %s --check-prefix=ELF76; RUN: llc < ok.ll -mtriple aarch64-elf -mattr=+pauth -global-isel=0 \77; RUN:   -verify-machineinstrs -filetype=obj78 79; RUN: llc < ok.ll -mtriple arm64-apple-ios -mattr=+pauth -global-isel=0 \80; RUN:   -verify-machineinstrs | FileCheck %s --check-prefix=MACHO81; RUN: llc < ok.ll -mtriple arm64-apple-ios -mattr=+pauth -global-isel=0 \82; RUN:   -verify-machineinstrs -filetype=obj83 84@g = external global i3285@g_weak = extern_weak global i3286@g_strong_def = dso_local constant i32 4287 88define ptr @test_global_zero_disc() {89; ELF-LABEL:   test_global_zero_disc:90; ELF:         // %bb.0:91; ELF-NEXT:      adrp    x16, :got:g92; ELF-NEXT:      ldr     x16, [x16, :got_lo12:g]93; ELF-NEXT:      paciza  x1694; ELF-NEXT:      mov     x0, x1695; ELF-NEXT:      ret96 97; MACHO-LABEL: _test_global_zero_disc:98; MACHO:       ; %bb.0:99; MACHO-NEXT:    adrp    x16, _g@GOTPAGE100; MACHO-NEXT:    ldr     x16, [x16, _g@GOTPAGEOFF]101; MACHO-NEXT:    paciza  x16102; MACHO-NEXT:    mov     x0, x16103; MACHO-NEXT:    ret104 105  ret ptr ptrauth (ptr @g, i32 0)106}107 108define ptr @test_global_offset_zero_disc() {109; ELF-LABEL: test_global_offset_zero_disc:110; ELF:       // %bb.0:111; ELF-NEXT:    adrp    x16, :got:g112; ELF-NEXT:    ldr     x16, [x16, :got_lo12:g]113; ELF-NEXT:    add     x16, x16, #16114; ELF-NEXT:    pacdza  x16115; ELF-NEXT:    mov     x0, x16116; ELF-NEXT:    ret117 118; MACHO-LABEL: _test_global_offset_zero_disc:119; MACHO:       ; %bb.0:120; MACHO-NEXT:    adrp    x16, _g@GOTPAGE121; MACHO-NEXT:    ldr     x16, [x16, _g@GOTPAGEOFF]122; MACHO-NEXT:    add     x16, x16, #16123; MACHO-NEXT:    pacdza  x16124; MACHO-NEXT:    mov     x0, x16125; MACHO-NEXT:    ret126 127  ret ptr ptrauth (ptr getelementptr (i8, ptr @g, i64 16), i32 2)128}129 130define ptr @test_global_neg_offset_zero_disc() {131; ELF-LABEL: test_global_neg_offset_zero_disc:132; ELF:       // %bb.0:133; ELF-NEXT:    adrp    x16, :got:g134; ELF-NEXT:    ldr     x16, [x16, :got_lo12:g]135; ELF-NEXT:    sub     x16, x16, #576136; ELF-NEXT:    sub     x16, x16, #30, lsl #12137; ELF-NEXT:    pacdza  x16138; ELF-NEXT:    mov     x0, x16139; ELF-NEXT:    ret140 141; MACHO-LABEL: _test_global_neg_offset_zero_disc:142; MACHO:       ; %bb.0:143; MACHO-NEXT:    adrp    x16, _g@GOTPAGE144; MACHO-NEXT:    ldr     x16, [x16, _g@GOTPAGEOFF]145; MACHO-NEXT:    sub     x16, x16, #576146; MACHO-NEXT:    sub     x16, x16, #30, lsl #12147; MACHO-NEXT:    pacdza  x16148; MACHO-NEXT:    mov     x0, x16149; MACHO-NEXT:    ret150 151  ret ptr ptrauth (ptr getelementptr (i8, ptr @g, i64 -123456), i32 2)152}153 154define ptr @test_global_big_offset_zero_disc() {155; ELF-LABEL: test_global_big_offset_zero_disc:156; ELF:       // %bb.0:157; ELF-NEXT:    adrp    x16, :got:g158; ELF-NEXT:    ldr     x16, [x16, :got_lo12:g]159; ELF-NEXT:    mov     x17, #1160; ELF-NEXT:    movk    x17, #32769, lsl #16161; ELF-NEXT:    add     x16, x16, x17162; ELF-NEXT:    pacdza  x16163; ELF-NEXT:    mov     x0, x16164; ELF-NEXT:    ret165 166; MACHO-LABEL: _test_global_big_offset_zero_disc:167; MACHO:       ; %bb.0:168; MACHO-NEXT:    adrp    x16, _g@GOTPAGE169; MACHO-NEXT:    ldr     x16, [x16, _g@GOTPAGEOFF]170; MACHO-NEXT:    mov     x17, #1171; MACHO-NEXT:    movk    x17, #32769, lsl #16172; MACHO-NEXT:    add     x16, x16, x17173; MACHO-NEXT:    pacdza  x16174; MACHO-NEXT:    mov     x0, x16175; MACHO-NEXT:    ret176 177  ret ptr ptrauth (ptr getelementptr (i8, ptr @g, i64 add (i64 2147483648, i64 65537)), i32 2)178}179 180define ptr @test_global_big_neg_offset_zero_disc() {181; ELF-LABEL: test_global_big_neg_offset_zero_disc:182; ELF:       // %bb.0:183; ELF-NEXT:    adrp    x16, :got:g184; ELF-NEXT:    ldr     x16, [x16, :got_lo12:g]185; ELF-NEXT:    mov     x17, #-52501186; ELF-NEXT:    movk    x17, #63652, lsl #16187; ELF-NEXT:    add     x16, x16, x17188; ELF-NEXT:    pacdza  x16189; ELF-NEXT:    mov     x0, x16190; ELF-NEXT:    ret191 192; MACHO-LABEL: _test_global_big_neg_offset_zero_disc:193; MACHO:       ; %bb.0:194; MACHO-NEXT:    adrp    x16, _g@GOTPAGE195; MACHO-NEXT:    ldr     x16, [x16, _g@GOTPAGEOFF]196; MACHO-NEXT:    mov     x17, #-52501197; MACHO-NEXT:    movk    x17, #63652, lsl #16198; MACHO-NEXT:    add     x16, x16, x17199; MACHO-NEXT:    pacdza  x16200; MACHO-NEXT:    mov     x0, x16201; MACHO-NEXT:    ret202 203  ret ptr ptrauth (ptr getelementptr (i8, ptr @g, i64 -123456789), i32 2)204}205 206define ptr @test_global_huge_neg_offset_zero_disc() {207; ELF-LABEL: test_global_huge_neg_offset_zero_disc:208; ELF:       // %bb.0:209; ELF-NEXT:    adrp    x16, :got:g210; ELF-NEXT:    ldr     x16, [x16, :got_lo12:g]211; ELF-NEXT:    mov     x17, #-65536212; ELF-NEXT:    movk    x17, #0, lsl #16213; ELF-NEXT:    movk    x17, #0, lsl #32214; ELF-NEXT:    movk    x17, #32768, lsl #48215; ELF-NEXT:    add     x16, x16, x17216; ELF-NEXT:    pacdza  x16217; ELF-NEXT:    mov     x0, x16218; ELF-NEXT:    ret219 220; MACHO-LABEL: _test_global_huge_neg_offset_zero_disc:221; MACHO:       ; %bb.0:222; MACHO-NEXT:    adrp    x16, _g@GOTPAGE223; MACHO-NEXT:    ldr     x16, [x16, _g@GOTPAGEOFF]224; MACHO-NEXT:    mov     x17, #-65536225; MACHO-NEXT:    movk    x17, #0, lsl #16226; MACHO-NEXT:    movk    x17, #0, lsl #32227; MACHO-NEXT:    movk    x17, #32768, lsl #48228; MACHO-NEXT:    add     x16, x16, x17229; MACHO-NEXT:    pacdza  x16230; MACHO-NEXT:    mov     x0, x16231; MACHO-NEXT:    ret232 233  ret ptr ptrauth (ptr getelementptr (i8, ptr @g, i64 -9223372036854775808), i32 2)234}235 236define ptr @test_global_disc() {237; ELF-LABEL: test_global_disc:238; ELF:       // %bb.0:239; ELF-NEXT:    adrp    x16, :got:g240; ELF-NEXT:    ldr     x16, [x16, :got_lo12:g]241; ELF-NEXT:    mov     x17, #42 // =0x2a242; ELF-NEXT:    pacia   x16, x17243; ELF-NEXT:    mov     x0, x16244; ELF-NEXT:    ret245 246; MACHO-LABEL: _test_global_disc:247; MACHO:       ; %bb.0:248; MACHO-NEXT:    adrp    x16, _g@GOTPAGE249; MACHO-NEXT:    ldr     x16, [x16, _g@GOTPAGEOFF]250; MACHO-NEXT:    mov     x17, #42 ; =0x2a251; MACHO-NEXT:    pacia   x16, x17252; MACHO-NEXT:    mov     x0, x16253; MACHO-NEXT:    ret254 255  ret ptr ptrauth (ptr @g, i32 0, i64 42)256}257 258@g.ref.da.42.addr = dso_local constant ptr ptrauth (ptr @g, i32 2, i64 42, ptr @g.ref.da.42.addr)259 260define ptr @test_global_addr_disc() {261; ELF-LABEL: test_global_addr_disc:262; ELF:       // %bb.0:263; ELF-NEXT:    adrp x8, g.ref.da.42.addr264; ELF-NEXT:    add x8, x8, :lo12:g.ref.da.42.addr265; ELF-NEXT:    adrp x16, :got:g266; ELF-NEXT:    ldr x16, [x16, :got_lo12:g]267; ELF-NEXT:    mov x17, x8268; ELF-NEXT:    movk x17, #42, lsl #48269; ELF-NEXT:    pacda x16, x17270; ELF-NEXT:    mov x0, x16271; ELF-NEXT:    ret272 273; MACHO-LABEL: _test_global_addr_disc:274; MACHO:       ; %bb.0:275; MACHO-NEXT:   Lloh{{.*}}:276; MACHO-NEXT:    adrp x8, _g.ref.da.42.addr@PAGE277; MACHO-NEXT:   Lloh{{.*}}:278; MACHO-NEXT:    add x8, x8, _g.ref.da.42.addr@PAGEOFF279; MACHO-NEXT:    adrp x16, _g@GOTPAGE280; MACHO-NEXT:    ldr x16, [x16, _g@GOTPAGEOFF]281; MACHO-NEXT:    mov x17, x8282; MACHO-NEXT:    movk x17, #42, lsl #48283; MACHO-NEXT:    pacda x16, x17284; MACHO-NEXT:    mov x0, x16285; MACHO-NEXT:    ret286 287  ret ptr ptrauth (ptr @g, i32 2, i64 42, ptr @g.ref.da.42.addr)288}289 290define ptr @test_global_process_specific() {291; ELF-LABEL: test_global_process_specific:292; ELF:       // %bb.0:293; ELF-NEXT:    adrp    x16, :got:g294; ELF-NEXT:    ldr     x16, [x16, :got_lo12:g]295; ELF-NEXT:    pacizb  x16296; ELF-NEXT:    mov     x0, x16297; ELF-NEXT:    ret298 299; MACHO-LABEL: _test_global_process_specific:300; MACHO:       ; %bb.0:301; MACHO-NEXT:    adrp    x16, _g@GOTPAGE302; MACHO-NEXT:    ldr     x16, [x16, _g@GOTPAGEOFF]303; MACHO-NEXT:    pacizb  x16304; MACHO-NEXT:    mov     x0, x16305; MACHO-NEXT:    ret306 307  ret ptr ptrauth (ptr @g, i32 1)308}309 310; Non-external symbols don't need to be accessed through the GOT.311 312define ptr @test_global_strong_def() {313; ELF-LABEL: test_global_strong_def:314; ELF:       // %bb.0:315; ELF-NEXT:    adrp    x16, g_strong_def316; ELF-NEXT:    add     x16, x16, :lo12:g_strong_def317; ELF-NEXT:    pacdza  x16318; ELF-NEXT:    mov     x0, x16319; ELF-NEXT:    ret320 321; MACHO-LABEL: _test_global_strong_def:322; MACHO:       ; %bb.0:323; MACHO-NEXT:    adrp    x16, _g_strong_def@PAGE324; MACHO-NEXT:    add     x16, x16, _g_strong_def@PAGEOFF325; MACHO-NEXT:    pacdza  x16326; MACHO-NEXT:    mov     x0, x16327; MACHO-NEXT:    ret328 329  ret ptr ptrauth (ptr @g_strong_def, i32 2)330}331 332; weak symbols can't be assumed to be non-nil. Use $auth_ptr$ stub slot always.333; The alternative is to emit a null-check here, but that'd be redundant with334; whatever null-check follows in user code.335 336define ptr @test_global_weak() {337; ELF-LABEL: test_global_weak:338; ELF:       // %bb.0:339; ELF-NEXT:    adrp    x0, g_weak$auth_ptr$ia$42340; ELF-NEXT:    ldr     x0, [x0, :lo12:g_weak$auth_ptr$ia$42]341; ELF-NEXT:    ret342 343; MACHO-LABEL: _test_global_weak:344; MACHO:       ; %bb.0:345; MACHO-NEXT:    adrp    x0, l_g_weak$auth_ptr$ia$42@PAGE346; MACHO-NEXT:    ldr     x0, [x0, l_g_weak$auth_ptr$ia$42@PAGEOFF]347; MACHO-NEXT:    ret348 349  ret ptr ptrauth (ptr @g_weak, i32 0, i64 42)350}351 352; Test another weak symbol to check that stubs are emitted in a stable order.353 354@g_weak_2 = extern_weak global i32355 356define ptr @test_global_weak_2() {357; ELF-LABEL: test_global_weak_2:358; ELF:       // %bb.0:359; ELF-NEXT:    adrp    x0, g_weak_2$auth_ptr$ia$42360; ELF-NEXT:    ldr     x0, [x0, :lo12:g_weak_2$auth_ptr$ia$42]361; ELF-NEXT:    ret362 363; MACHO-LABEL: _test_global_weak_2:364; MACHO:       ; %bb.0:365; MACHO-NEXT:    adrp    x0, l_g_weak_2$auth_ptr$ia$42@PAGE366; MACHO-NEXT:    ldr     x0, [x0, l_g_weak_2$auth_ptr$ia$42@PAGEOFF]367; MACHO-NEXT:    ret368 369  ret ptr ptrauth (ptr @g_weak_2, i32 0, i64 42)370}371 372; ELF-LABEL: g_weak$auth_ptr$ia$42:373; ELF-NEXT:    .xword  g_weak@AUTH(ia,42)374; ELF-LABEL: g_weak_2$auth_ptr$ia$42:375; ELF-NEXT:    .xword  g_weak_2@AUTH(ia,42)376 377; MACHO-LABEL: l_g_weak$auth_ptr$ia$42:378; MACHO-NEXT:    .quad  _g_weak@AUTH(ia,42)379; MACHO-LABEL: l_g_weak_2$auth_ptr$ia$42:380; MACHO-NEXT:    .quad  _g_weak_2@AUTH(ia,42)381