brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.5 KiB · 12a3448 Raw
392 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=1 -verify-machineinstrs -global-isel-abort=1 2>&1 | \7; RUN:   FileCheck --check-prefix=ERR1 %s8; RUN: not --crash llc < err1.ll -mtriple arm64-apple-ios -mattr=+pauth \9; RUN:   -global-isel=1 -verify-machineinstrs -global-isel-abort=1 2>&1 | \10; RUN:   FileCheck --check-prefix=ERR1 %s11 12@g = external global i3213 14define ptr @foo() {15; ERR1: LLVM ERROR: key in ptrauth global out of range [0, 3]16  ret ptr ptrauth (ptr @g, i32 4)17}18 19;--- err2.ll20 21; RUN: not --crash llc < err2.ll -mtriple aarch64-elf -mattr=+pauth \22; RUN:   -global-isel=1 -verify-machineinstrs -global-isel-abort=1 2>&1 | \23; RUN:   FileCheck --check-prefix=ERR2 %s24; RUN: not --crash llc < err2.ll -mtriple arm64-apple-ios -mattr=+pauth \25; RUN:   -global-isel=1 -verify-machineinstrs -global-isel-abort=1 2>&1 | \26; RUN:   FileCheck --check-prefix=ERR2 %s27 28@g = external global i3229 30define ptr @foo() {31; ERR2: LLVM ERROR: constant discriminator in ptrauth global out of range [0, 0xffff]32  ret ptr ptrauth (ptr @g, i32 2, i64 65536)33}34 35;--- err3.ll36 37; RUN: not --crash llc < err3.ll -mtriple aarch64-elf -mattr=+pauth \38; RUN:   -global-isel=1 -verify-machineinstrs -global-isel-abort=1 2>&1 | \39; RUN:   FileCheck --check-prefix=ERR3 %s40; RUN: not --crash llc < err3.ll -mtriple arm64-apple-ios -mattr=+pauth \41; RUN:   -global-isel=1 -verify-machineinstrs -global-isel-abort=1 2>&1 | \42; RUN:   FileCheck --check-prefix=ERR3 %s43 44@g_weak = extern_weak global i3245 46define ptr @foo() {47; ERR3: LLVM ERROR: unsupported non-zero offset in weak ptrauth global reference48  ret ptr ptrauth (ptr getelementptr (i8, ptr @g_weak, i64 16), i32 2, i64 42)49}50 51;--- err4.ll52 53; RUN: not --crash llc < err4.ll -mtriple aarch64-elf -mattr=+pauth \54; RUN:   -global-isel=1 -verify-machineinstrs -global-isel-abort=1 2>&1 | \55; RUN:   FileCheck --check-prefix=ERR4 %s56; RUN: not --crash llc < err4.ll -mtriple arm64-apple-ios -mattr=+pauth \57; RUN:   -global-isel=1 -verify-machineinstrs -global-isel-abort=1 2>&1 | \58; RUN:   FileCheck --check-prefix=ERR4 %s59 60@g_weak = extern_weak global i3261@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)62 63define ptr @foo() {64; ERR4: LLVM ERROR: unsupported weak addr-div ptrauth global65  ret ptr ptrauth (ptr @g_weak, i32 0, i64 42, ptr @g_weak.ref.da.42.addr)66}67 68;--- err5.ll69 70; RUN: not --crash llc < err5.ll -mtriple aarch64-windows -mattr=+pauth \71; RUN:   -global-isel=1 -verify-machineinstrs -global-isel-abort=1 2>&1 | \72; RUN:   FileCheck --check-prefix=ERR5 %s73 74@g = external global i3275 76define ptr @foo() {77; ERR5: LLVM ERROR: ptrauth global lowering only supported on MachO/ELF78  ret ptr ptrauth (ptr @g, i32 0)79}80 81;--- ok.ll82 83; RUN: llc < ok.ll -mtriple aarch64-elf -mattr=+pauth -global-isel=1 \84; RUN:   -verify-machineinstrs -global-isel-abort=1 | \85; RUN:   FileCheck %s --check-prefix=ELF86; RUN: llc < ok.ll -mtriple aarch64-elf -mattr=+pauth -global-isel=1 \87; RUN:   -verify-machineinstrs -global-isel-abort=1 -filetype=obj88 89; RUN: llc < ok.ll -mtriple arm64-apple-ios -mattr=+pauth -global-isel=1 \90; RUN:   -verify-machineinstrs -global-isel-abort=1 | \91; RUN:   FileCheck %s --check-prefix=MACHO92; RUN: llc < ok.ll -mtriple aarch64-elf -mattr=+pauth -global-isel=1 \93; RUN:   -verify-machineinstrs -global-isel-abort=1 -filetype=obj94 95@g = external global i3296@g_weak = extern_weak global i3297@g_strong_def = dso_local constant i32 4298 99define ptr @test_global_zero_disc() {100; ELF-LABEL:   test_global_zero_disc:101; ELF:         // %bb.0:102; ELF-NEXT:      adrp    x16, :got:g103; ELF-NEXT:      ldr     x16, [x16, :got_lo12:g]104; ELF-NEXT:      paciza  x16105; ELF-NEXT:      mov     x0, x16106; ELF-NEXT:      ret107 108; MACHO-LABEL: _test_global_zero_disc:109; MACHO:       ; %bb.0:110; MACHO-NEXT:    adrp    x16, _g@GOTPAGE111; MACHO-NEXT:    ldr     x16, [x16, _g@GOTPAGEOFF]112; MACHO-NEXT:    paciza  x16113; MACHO-NEXT:    mov     x0, x16114; MACHO-NEXT:    ret115 116  ret ptr ptrauth (ptr @g, i32 0)117}118 119define ptr @test_global_offset_zero_disc() {120; ELF-LABEL: test_global_offset_zero_disc:121; ELF:       // %bb.0:122; ELF-NEXT:    adrp    x16, :got:g123; ELF-NEXT:    ldr     x16, [x16, :got_lo12:g]124; ELF-NEXT:    add     x16, x16, #16125; ELF-NEXT:    pacdza  x16126; ELF-NEXT:    mov     x0, x16127; ELF-NEXT:    ret128 129; MACHO-LABEL: _test_global_offset_zero_disc:130; MACHO:       ; %bb.0:131; MACHO-NEXT:    adrp    x16, _g@GOTPAGE132; MACHO-NEXT:    ldr     x16, [x16, _g@GOTPAGEOFF]133; MACHO-NEXT:    add     x16, x16, #16134; MACHO-NEXT:    pacdza  x16135; MACHO-NEXT:    mov     x0, x16136; MACHO-NEXT:    ret137 138  ret ptr ptrauth (ptr getelementptr (i8, ptr @g, i64 16), i32 2)139}140 141define ptr @test_global_neg_offset_zero_disc() {142; ELF-LABEL: test_global_neg_offset_zero_disc:143; ELF:       // %bb.0:144; ELF-NEXT:    adrp    x16, :got:g145; ELF-NEXT:    ldr     x16, [x16, :got_lo12:g]146; ELF-NEXT:    sub     x16, x16, #576147; ELF-NEXT:    sub     x16, x16, #30, lsl #12148; ELF-NEXT:    pacdza  x16149; ELF-NEXT:    mov     x0, x16150; ELF-NEXT:    ret151 152; MACHO-LABEL: _test_global_neg_offset_zero_disc:153; MACHO:       ; %bb.0:154; MACHO-NEXT:    adrp    x16, _g@GOTPAGE155; MACHO-NEXT:    ldr     x16, [x16, _g@GOTPAGEOFF]156; MACHO-NEXT:    sub     x16, x16, #576157; MACHO-NEXT:    sub     x16, x16, #30, lsl #12158; MACHO-NEXT:    pacdza  x16159; MACHO-NEXT:    mov     x0, x16160; MACHO-NEXT:    ret161 162  ret ptr ptrauth (ptr getelementptr (i8, ptr @g, i64 -123456), i32 2)163}164 165define ptr @test_global_big_offset_zero_disc() {166; ELF-LABEL: test_global_big_offset_zero_disc:167; ELF:       // %bb.0:168; ELF-NEXT:    adrp    x16, :got:g169; ELF-NEXT:    ldr     x16, [x16, :got_lo12:g]170; ELF-NEXT:    mov     x17, #1171; ELF-NEXT:    movk    x17, #32769, lsl #16172; ELF-NEXT:    add     x16, x16, x17173; ELF-NEXT:    pacdza  x16174; ELF-NEXT:    mov     x0, x16175; ELF-NEXT:    ret176 177; MACHO-LABEL: _test_global_big_offset_zero_disc:178; MACHO:       ; %bb.0:179; MACHO-NEXT:    adrp    x16, _g@GOTPAGE180; MACHO-NEXT:    ldr     x16, [x16, _g@GOTPAGEOFF]181; MACHO-NEXT:    mov     x17, #1182; MACHO-NEXT:    movk    x17, #32769, lsl #16183; MACHO-NEXT:    add     x16, x16, x17184; MACHO-NEXT:    pacdza  x16185; MACHO-NEXT:    mov     x0, x16186; MACHO-NEXT:    ret187 188  ret ptr ptrauth (ptr getelementptr (i8, ptr @g, i64 add (i64 2147483648, i64 65537)), i32 2)189}190 191define ptr @test_global_big_neg_offset_zero_disc() {192; ELF-LABEL: test_global_big_neg_offset_zero_disc:193; ELF:       // %bb.0:194; ELF-NEXT:    adrp    x16, :got:g195; ELF-NEXT:    ldr     x16, [x16, :got_lo12:g]196; ELF-NEXT:    mov     x17, #-52501197; ELF-NEXT:    movk    x17, #63652, lsl #16198; ELF-NEXT:    add     x16, x16, x17199; ELF-NEXT:    pacdza  x16200; ELF-NEXT:    mov     x0, x16201; ELF-NEXT:    ret202 203; MACHO-LABEL: _test_global_big_neg_offset_zero_disc:204; MACHO:       ; %bb.0:205; MACHO-NEXT:    adrp    x16, _g@GOTPAGE206; MACHO-NEXT:    ldr     x16, [x16, _g@GOTPAGEOFF]207; MACHO-NEXT:    mov     x17, #-52501208; MACHO-NEXT:    movk    x17, #63652, lsl #16209; MACHO-NEXT:    add     x16, x16, x17210; MACHO-NEXT:    pacdza  x16211; MACHO-NEXT:    mov     x0, x16212; MACHO-NEXT:    ret213 214  ret ptr ptrauth (ptr getelementptr (i8, ptr @g, i64 -123456789), i32 2)215}216 217define ptr @test_global_huge_neg_offset_zero_disc() {218; ELF-LABEL: test_global_huge_neg_offset_zero_disc:219; ELF:       // %bb.0:220; ELF-NEXT:    adrp    x16, :got:g221; ELF-NEXT:    ldr     x16, [x16, :got_lo12:g]222; ELF-NEXT:    mov     x17, #-65536223; ELF-NEXT:    movk    x17, #0, lsl #16224; ELF-NEXT:    movk    x17, #0, lsl #32225; ELF-NEXT:    movk    x17, #32768, lsl #48226; ELF-NEXT:    add     x16, x16, x17227; ELF-NEXT:    pacdza  x16228; ELF-NEXT:    mov     x0, x16229; ELF-NEXT:    ret230 231; MACHO-LABEL: _test_global_huge_neg_offset_zero_disc:232; MACHO:       ; %bb.0:233; MACHO-NEXT:    adrp    x16, _g@GOTPAGE234; MACHO-NEXT:    ldr     x16, [x16, _g@GOTPAGEOFF]235; MACHO-NEXT:    mov     x17, #-65536236; MACHO-NEXT:    movk    x17, #0, lsl #16237; MACHO-NEXT:    movk    x17, #0, lsl #32238; MACHO-NEXT:    movk    x17, #32768, lsl #48239; MACHO-NEXT:    add     x16, x16, x17240; MACHO-NEXT:    pacdza  x16241; MACHO-NEXT:    mov     x0, x16242; MACHO-NEXT:    ret243 244  ret ptr ptrauth (ptr getelementptr (i8, ptr @g, i64 -9223372036854775808), i32 2)245}246 247define ptr @test_global_disc() {248; ELF-LABEL: test_global_disc:249; ELF:       // %bb.0:250; ELF-NEXT:    adrp    x16, :got:g251; ELF-NEXT:    ldr     x16, [x16, :got_lo12:g]252; ELF-NEXT:    mov     x17, #42 // =0x2a253; ELF-NEXT:    pacia   x16, x17254; ELF-NEXT:    mov     x0, x16255; ELF-NEXT:    ret256 257; MACHO-LABEL: _test_global_disc:258; MACHO:       ; %bb.0:259; MACHO-NEXT:    adrp    x16, _g@GOTPAGE260; MACHO-NEXT:    ldr     x16, [x16, _g@GOTPAGEOFF]261; MACHO-NEXT:    mov     x17, #42 ; =0x2a262; MACHO-NEXT:    pacia   x16, x17263; MACHO-NEXT:    mov     x0, x16264; MACHO-NEXT:    ret265 266  ret ptr ptrauth (ptr @g, i32 0, i64 42)267}268 269@g.ref.da.42.addr = dso_local constant ptr ptrauth (ptr @g, i32 2, i64 42, ptr @g.ref.da.42.addr)270 271define ptr @test_global_addr_disc() {272; ELF-LABEL: test_global_addr_disc:273; ELF:       // %bb.0:274; ELF-NEXT:    adrp x8, g.ref.da.42.addr275; ELF-NEXT:    add x8, x8, :lo12:g.ref.da.42.addr276; ELF-NEXT:    adrp x16, :got:g277; ELF-NEXT:    ldr x16, [x16, :got_lo12:g]278; ELF-NEXT:    mov x17, x8279; ELF-NEXT:    movk x17, #42, lsl #48280; ELF-NEXT:    pacda x16, x17281; ELF-NEXT:    mov x0, x16282; ELF-NEXT:    ret283 284; MACHO-LABEL: _test_global_addr_disc:285; MACHO:       ; %bb.0:286; MACHO-NEXT:   Lloh{{.*}}:287; MACHO-NEXT:    adrp x8, _g.ref.da.42.addr@PAGE288; MACHO-NEXT:   Lloh{{.*}}:289; MACHO-NEXT:    add x8, x8, _g.ref.da.42.addr@PAGEOFF290; MACHO-NEXT:    adrp x16, _g@GOTPAGE291; MACHO-NEXT:    ldr x16, [x16, _g@GOTPAGEOFF]292; MACHO-NEXT:    mov x17, x8293; MACHO-NEXT:    movk x17, #42, lsl #48294; MACHO-NEXT:    pacda x16, x17295; MACHO-NEXT:    mov x0, x16296; MACHO-NEXT:    ret297 298  ret ptr ptrauth (ptr @g, i32 2, i64 42, ptr @g.ref.da.42.addr)299}300 301define ptr @test_global_process_specific() {302; ELF-LABEL: test_global_process_specific:303; ELF:       // %bb.0:304; ELF-NEXT:    adrp    x16, :got:g305; ELF-NEXT:    ldr     x16, [x16, :got_lo12:g]306; ELF-NEXT:    pacizb  x16307; ELF-NEXT:    mov     x0, x16308; ELF-NEXT:    ret309 310; MACHO-LABEL: _test_global_process_specific:311; MACHO:       ; %bb.0:312; MACHO-NEXT:    adrp    x16, _g@GOTPAGE313; MACHO-NEXT:    ldr     x16, [x16, _g@GOTPAGEOFF]314; MACHO-NEXT:    pacizb  x16315; MACHO-NEXT:    mov     x0, x16316; MACHO-NEXT:    ret317 318  ret ptr ptrauth (ptr @g, i32 1)319}320 321; Non-external symbols don't need to be accessed through the GOT.322 323define ptr @test_global_strong_def() {324; ELF-LABEL: test_global_strong_def:325; ELF:       // %bb.0:326; ELF-NEXT:    adrp    x16, g_strong_def327; ELF-NEXT:    add     x16, x16, :lo12:g_strong_def328; ELF-NEXT:    pacdza  x16329; ELF-NEXT:    mov     x0, x16330; ELF-NEXT:    ret331 332; MACHO-LABEL: _test_global_strong_def:333; MACHO:       ; %bb.0:334; MACHO-NEXT:    adrp    x16, _g_strong_def@PAGE335; MACHO-NEXT:    add     x16, x16, _g_strong_def@PAGEOFF336; MACHO-NEXT:    pacdza  x16337; MACHO-NEXT:    mov     x0, x16338; MACHO-NEXT:    ret339 340  ret ptr ptrauth (ptr @g_strong_def, i32 2)341}342 343; weak symbols can't be assumed to be non-nil. Use $auth_ptr$ stub slot always.344; The alternative is to emit a null-check here, but that'd be redundant with345; whatever null-check follows in user code.346 347define ptr @test_global_weak() {348; ELF-LABEL: test_global_weak:349; ELF:       // %bb.0:350; ELF-NEXT:    adrp    x0, g_weak$auth_ptr$ia$42351; ELF-NEXT:    ldr     x0, [x0, :lo12:g_weak$auth_ptr$ia$42]352; ELF-NEXT:    ret353 354; MACHO-LABEL: _test_global_weak:355; MACHO:       ; %bb.0:356; MACHO-NEXT:    adrp    x0, l_g_weak$auth_ptr$ia$42@PAGE357; MACHO-NEXT:    ldr     x0, [x0, l_g_weak$auth_ptr$ia$42@PAGEOFF]358; MACHO-NEXT:    ret359 360  ret ptr ptrauth (ptr @g_weak, i32 0, i64 42)361}362 363; Test another weak symbol to check that stubs are emitted in a stable order.364 365@g_weak_2 = extern_weak global i32366 367define ptr @test_global_weak_2() {368; ELF-LABEL: test_global_weak_2:369; ELF:       // %bb.0:370; ELF-NEXT:    adrp    x0, g_weak_2$auth_ptr$ia$42371; ELF-NEXT:    ldr     x0, [x0, :lo12:g_weak_2$auth_ptr$ia$42]372; ELF-NEXT:    ret373 374; MACHO-LABEL: _test_global_weak_2:375; MACHO:       ; %bb.0:376; MACHO-NEXT:    adrp    x0, l_g_weak_2$auth_ptr$ia$42@PAGE377; MACHO-NEXT:    ldr     x0, [x0, l_g_weak_2$auth_ptr$ia$42@PAGEOFF]378; MACHO-NEXT:    ret379 380  ret ptr ptrauth (ptr @g_weak_2, i32 0, i64 42)381}382 383; ELF-LABEL: g_weak$auth_ptr$ia$42:384; ELF-NEXT:    .xword  g_weak@AUTH(ia,42)385; ELF-LABEL: g_weak_2$auth_ptr$ia$42:386; ELF-NEXT:    .xword  g_weak_2@AUTH(ia,42)387 388; MACHO-LABEL: l_g_weak$auth_ptr$ia$42:389; MACHO-NEXT:    .quad  _g_weak@AUTH(ia,42)390; MACHO-LABEL: l_g_weak_2$auth_ptr$ia$42:391; MACHO-NEXT:    .quad  _g_weak_2@AUTH(ia,42)392