
This defines a new kind of IR Constant that represents a ptrauth signed pointer, as used in AArch64 PAuth. It allows representing most kinds of signed pointer constants used thus far in the llvm ptrauth implementations, notably those used in the Darwin and ELF ABIs being implemented for c/c++. These signed pointer constants are then lowered to ELF/MachO relocations. These can be simply thought of as a constant `llvm.ptrauth.sign`, with the interesting addition of discriminator computation: the `ptrauth` constant can also represent a combined blend, when both address and integer discriminator operands are used. Both operands are otherwise optional, with default values 0/null.
25 lines
1.0 KiB
LLVM
25 lines
1.0 KiB
LLVM
; RUN: llvm-as < %s | llvm-dis | FileCheck %s
|
|
|
|
@var = global i32 0
|
|
|
|
; CHECK: @basic = global ptr ptrauth (ptr @var, i32 0)
|
|
@basic = global ptr ptrauth (ptr @var, i32 0)
|
|
|
|
; CHECK: @keyed = global ptr ptrauth (ptr @var, i32 3)
|
|
@keyed = global ptr ptrauth (ptr @var, i32 3)
|
|
|
|
; CHECK: @intdisc = global ptr ptrauth (ptr @var, i32 0, i64 -1)
|
|
@intdisc = global ptr ptrauth (ptr @var, i32 0, i64 -1)
|
|
|
|
; CHECK: @addrdisc = global ptr ptrauth (ptr @var, i32 2, i64 1234, ptr @addrdisc)
|
|
@addrdisc = global ptr ptrauth (ptr @var, i32 2, i64 1234, ptr @addrdisc)
|
|
|
|
|
|
@var1 = addrspace(1) global i32 0
|
|
|
|
; CHECK: @addrspace = global ptr addrspace(1) ptrauth (ptr addrspace(1) @var1, i32 0)
|
|
@addrspace = global ptr addrspace(1) ptrauth (ptr addrspace(1) @var1, i32 0)
|
|
|
|
; CHECK: @addrspace_addrdisc = addrspace(2) global ptr addrspace(1) ptrauth (ptr addrspace(1) @var1, i32 2, i64 1234, ptr addrspace(2) @addrspace_addrdisc)
|
|
@addrspace_addrdisc = addrspace(2) global ptr addrspace(1) ptrauth (ptr addrspace(1) @var1, i32 2, i64 1234, ptr addrspace(2) @addrspace_addrdisc)
|