This introduces a new "ptrauth" operand bundle to be used in call/invoke. At the IR level, it's semantically equivalent to an @llvm.ptrauth.auth followed by an indirect call, but it additionally provides additional hardening, by preventing the intermediate raw pointer from being exposed. This mostly adds the IR definition, verifier checks, and support in a couple of general helper functions. Clang IRGen and backend support will come separately. Note that we'll eventually want to support this bundle in indirectbr as well, for similar reasons. indirectbr currently doesn't support bundles at all, and the IR data structures need to be updated to allow that. Differential Revision: https://reviews.llvm.org/D113685
33 lines
955 B
LLVM
33 lines
955 B
LLVM
; RUN: llvm-as < %s | llvm-bcanalyzer -dump -disable-histogram | FileCheck %s
|
|
|
|
; CHECK: <OPERAND_BUNDLE_TAGS_BLOCK
|
|
; CHECK-NEXT: <OPERAND_BUNDLE_TAG
|
|
; CHECK-NEXT: <OPERAND_BUNDLE_TAG
|
|
; CHECK-NEXT: <OPERAND_BUNDLE_TAG
|
|
; CHECK-NEXT: <OPERAND_BUNDLE_TAG
|
|
; CHECK-NEXT: <OPERAND_BUNDLE_TAG
|
|
; CHECK-NEXT: <OPERAND_BUNDLE_TAG
|
|
; CHECK-NEXT: <OPERAND_BUNDLE_TAG
|
|
; CHECK-NEXT: <OPERAND_BUNDLE_TAG
|
|
; CHECK-NEXT: <OPERAND_BUNDLE_TAG
|
|
; CHECK-NEXT: <OPERAND_BUNDLE_TAG
|
|
; CHECK-NEXT: </OPERAND_BUNDLE_TAGS_BLOCK
|
|
|
|
; CHECK: <FUNCTION_BLOCK
|
|
; CHECK: <OPERAND_BUNDLE
|
|
; CHECK: <OPERAND_BUNDLE
|
|
; CHECK-NOT: <OPERAND_BUNDLE
|
|
; CHECK: </FUNCTION_BLOCK
|
|
|
|
; CHECK: Block ID #{{[0-9]+}} (OPERAND_BUNDLE_TAGS_BLOCK)
|
|
|
|
declare void @callee0()
|
|
|
|
define void @f0(i32* %ptr) {
|
|
entry:
|
|
%l = load i32, i32* %ptr
|
|
%x = add i32 42, 1
|
|
call void @callee0() [ "foo"(i32 42, i64 100, i32 %x), "bar"(float 0.000000e+00, i64 100, i32 %l) ]
|
|
ret void
|
|
}
|