[clang] Wire -fptrauth-returns to "ptrauth-returns" fn attribute. (#102416)
We already ended up with -fptrauth-returns, the feature macro, the lang opt, and the actual backend lowering. The only part left is threading it all through PointerAuthOptions, to drive the addition of the "ptrauth-returns" attribute to generated functions. While there, do minor cleanup on ptrauth-function-attributes.c. This also adds ptrauth_key_return_address to ptrauth.h.
This commit is contained in:
@@ -163,6 +163,9 @@ public:
|
||||
};
|
||||
|
||||
struct PointerAuthOptions {
|
||||
/// Should return addresses be authenticated?
|
||||
bool ReturnAddresses = false;
|
||||
|
||||
/// Do indirect goto label addresses need to be authenticated?
|
||||
bool IndirectGotos = false;
|
||||
|
||||
|
||||
@@ -880,6 +880,8 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
|
||||
|
||||
// Add pointer authentication attributes.
|
||||
const CodeGenOptions &CodeGenOpts = CGM.getCodeGenOpts();
|
||||
if (CodeGenOpts.PointerAuth.ReturnAddresses)
|
||||
Fn->addFnAttr("ptrauth-returns");
|
||||
if (CodeGenOpts.PointerAuth.FunctionPointers)
|
||||
Fn->addFnAttr("ptrauth-calls");
|
||||
if (CodeGenOpts.PointerAuth.IndirectGotos)
|
||||
|
||||
@@ -1511,13 +1511,15 @@ void CompilerInvocation::setDefaultPointerAuthOptions(
|
||||
}
|
||||
}
|
||||
Opts.IndirectGotos = LangOpts.PointerAuthIndirectGotos;
|
||||
Opts.ReturnAddresses = LangOpts.PointerAuthReturns;
|
||||
}
|
||||
|
||||
static void parsePointerAuthOptions(PointerAuthOptions &Opts,
|
||||
const LangOptions &LangOpts,
|
||||
const llvm::Triple &Triple,
|
||||
DiagnosticsEngine &Diags) {
|
||||
if (!LangOpts.PointerAuthCalls && !LangOpts.PointerAuthIndirectGotos)
|
||||
if (!LangOpts.PointerAuthCalls && !LangOpts.PointerAuthIndirectGotos &&
|
||||
!LangOpts.PointerAuthReturns)
|
||||
return;
|
||||
|
||||
CompilerInvocation::setDefaultPointerAuthOptions(Opts, LangOpts, Triple);
|
||||
|
||||
@@ -28,6 +28,12 @@ typedef enum {
|
||||
/* A process-specific key which can be used to sign data pointers. */
|
||||
ptrauth_key_process_dependent_data = ptrauth_key_asdb,
|
||||
|
||||
/* The key used to sign return addresses on the stack.
|
||||
The extra data is based on the storage address of the return address.
|
||||
On AArch64, that is always the storage address of the return address + 8
|
||||
(or, in other words, the value of the stack pointer on function entry) */
|
||||
ptrauth_key_return_address = ptrauth_key_process_dependent_code,
|
||||
|
||||
/* The key used to sign C function pointers.
|
||||
The extra data is always 0. */
|
||||
ptrauth_key_function_pointer = ptrauth_key_process_independent_code,
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
// RUN: %clang_cc1 -triple arm64-apple-ios -emit-llvm %s -o - | FileCheck %s --check-prefixes=ALL,OFF
|
||||
// RUN: %clang_cc1 -triple arm64e-apple-ios -emit-llvm %s -o - | FileCheck %s --check-prefixes=ALL,OFF
|
||||
// RUN: %clang_cc1 -triple aarch64-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefixes=ALL,OFF
|
||||
|
||||
// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-calls -emit-llvm %s -o - | FileCheck %s --check-prefixes=ALL,CALLS
|
||||
// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-calls -emit-llvm %s -o - | FileCheck %s --check-prefixes=ALL,CALLS
|
||||
// RUN: %clang_cc1 -triple aarch64-linux-gnu -fptrauth-calls -emit-llvm %s -o - | FileCheck %s --check-prefixes=ALL,CALLS
|
||||
|
||||
// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-returns -emit-llvm %s -o - | FileCheck %s --check-prefixes=ALL,RETS
|
||||
// RUN: %clang_cc1 -triple aarch64-linux-gnu -fptrauth-returns -emit-llvm %s -o - | FileCheck %s --check-prefixes=ALL,RETS
|
||||
|
||||
// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-indirect-gotos -emit-llvm %s -o - | FileCheck %s --check-prefixes=ALL,GOTOS
|
||||
// RUN: %clang_cc1 -triple arm64e-apple-ios -fptrauth-indirect-gotos -emit-llvm %s -o - | FileCheck %s --check-prefixes=ALL,GOTOS
|
||||
// RUN: %clang_cc1 -triple aarch64-linux-gnu -fptrauth-indirect-gotos -emit-llvm %s -o - | FileCheck %s --check-prefixes=ALL,GOTOS
|
||||
|
||||
// ALL: define {{(dso_local )?}}void @test() #0
|
||||
@@ -14,6 +17,8 @@ void test() {
|
||||
|
||||
// CALLS: attributes #0 = {{{.*}} "ptrauth-calls" {{.*}}}
|
||||
|
||||
// RETS: attributes #0 = {{{.*}} "ptrauth-returns" {{.*}}}
|
||||
|
||||
// GOTOS: attributes #0 = {{{.*}} "ptrauth-indirect-gotos" {{.*}}}
|
||||
|
||||
// OFF-NOT: attributes {{.*}} "ptrauth-
|
||||
|
||||
Reference in New Issue
Block a user