mirror of
https://github.com/intel/llvm.git
synced 2026-01-16 05:32:28 +08:00
[PAC][clang] Add signed GOT cc1 flag (#96160)
Add `-fptrauth-elf-got` clang cc1 flag and set `ptrauth_elf_got` preprocessor feature and `PointerAuthELFGOT` LangOption correspondingly. No additional checks like ensuring OS binary format is ELF are performed: it should be done on clang driver level when a pauth-enabled environment implying signed GOT enabled is requested. If the cc1 flag is passed, "ptrauth-elf-got" IR module flag is set.
This commit is contained in:
@@ -116,6 +116,7 @@ FEATURE(ptrauth_function_pointer_type_discrimination, LangOpts.PointerAuthFuncti
|
||||
FEATURE(ptrauth_indirect_gotos, LangOpts.PointerAuthIndirectGotos)
|
||||
FEATURE(ptrauth_init_fini, LangOpts.PointerAuthInitFini)
|
||||
FEATURE(ptrauth_init_fini_address_discrimination, LangOpts.PointerAuthInitFiniAddressDiscrimination)
|
||||
FEATURE(ptrauth_elf_got, LangOpts.PointerAuthELFGOT)
|
||||
EXTENSION(swiftcc,
|
||||
PP.getTargetInfo().checkCallingConvention(CC_Swift) ==
|
||||
clang::TargetInfo::CCCR_OK)
|
||||
|
||||
@@ -4356,6 +4356,7 @@ defm ptrauth_indirect_gotos : OptInCC1FFlag<"ptrauth-indirect-gotos",
|
||||
defm ptrauth_init_fini : OptInCC1FFlag<"ptrauth-init-fini", "Enable signing of function pointers in init/fini arrays">;
|
||||
defm ptrauth_init_fini_address_discrimination : OptInCC1FFlag<"ptrauth-init-fini-address-discrimination",
|
||||
"Enable address discrimination of function pointers in init/fini arrays">;
|
||||
defm ptrauth_elf_got : OptInCC1FFlag<"ptrauth-elf-got", "Enable authentication of pointers from GOT (ELF only)">;
|
||||
}
|
||||
|
||||
def fenable_matrix : Flag<["-"], "fenable-matrix">, Group<f_Group>,
|
||||
|
||||
@@ -1213,6 +1213,9 @@ void CodeGenModule::Release() {
|
||||
getModule().addModuleFlag(llvm::Module::Min,
|
||||
"sign-return-address-with-bkey", 1);
|
||||
|
||||
if (LangOpts.PointerAuthELFGOT)
|
||||
getModule().addModuleFlag(llvm::Module::Min, "ptrauth-elf-got", 1);
|
||||
|
||||
if (getTriple().isOSLinux()) {
|
||||
assert(getTriple().isOSBinFormatELF());
|
||||
using namespace llvm::ELF;
|
||||
|
||||
@@ -3452,6 +3452,8 @@ static void GeneratePointerAuthArgs(const LangOptions &Opts,
|
||||
GenerateArg(Consumer, OPT_fptrauth_init_fini);
|
||||
if (Opts.PointerAuthInitFiniAddressDiscrimination)
|
||||
GenerateArg(Consumer, OPT_fptrauth_init_fini_address_discrimination);
|
||||
if (Opts.PointerAuthELFGOT)
|
||||
GenerateArg(Consumer, OPT_fptrauth_elf_got);
|
||||
}
|
||||
|
||||
static void ParsePointerAuthArgs(LangOptions &Opts, ArgList &Args,
|
||||
@@ -3472,6 +3474,7 @@ static void ParsePointerAuthArgs(LangOptions &Opts, ArgList &Args,
|
||||
Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
|
||||
Opts.PointerAuthInitFiniAddressDiscrimination =
|
||||
Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);
|
||||
Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got);
|
||||
}
|
||||
|
||||
/// Check if input file kind and language standard are compatible.
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
//// TODO: also test with -fptrauth-elf-got when the driver flag is supported
|
||||
|
||||
// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \
|
||||
// RUN: -fptrauth-intrinsics \
|
||||
// RUN: -fptrauth-calls \
|
||||
@@ -9,6 +7,7 @@
|
||||
// RUN: -fptrauth-vtable-pointer-type-discrimination \
|
||||
// RUN: -fptrauth-init-fini \
|
||||
// RUN: -fptrauth-init-fini-address-discrimination \
|
||||
// RUN: -fptrauth-elf-got \
|
||||
// RUN: -fptrauth-indirect-gotos \
|
||||
// RUN: -fptrauth-type-info-vtable-pointer-discrimination \
|
||||
// RUN: -fptrauth-function-pointer-type-discrimination %s | \
|
||||
@@ -42,6 +41,9 @@
|
||||
// RUN: -fptrauth-calls -fptrauth-init-fini -fptrauth-init-fini-address-discrimination %s | \
|
||||
// RUN: FileCheck %s --check-prefix=INITFINIADDR
|
||||
|
||||
// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \
|
||||
// RUN: -fptrauth-elf-got %s | FileCheck %s --check-prefix=ELFGOT
|
||||
|
||||
// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \
|
||||
// RUN: -fptrauth-indirect-gotos %s | FileCheck %s --check-prefix=GOTOS
|
||||
|
||||
@@ -54,7 +56,7 @@
|
||||
// RUN: FileCheck %s --check-prefix=FPTRTYPE
|
||||
|
||||
// ALL: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458}
|
||||
// ALL: !{i32 1, !"aarch64-elf-pauthabi-version", i32 3839}
|
||||
// ALL: !{i32 1, !"aarch64-elf-pauthabi-version", i32 4095}
|
||||
|
||||
// INTRIN: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458}
|
||||
// INTRIN: !{i32 1, !"aarch64-elf-pauthabi-version", i32 1}
|
||||
@@ -80,6 +82,9 @@
|
||||
// INITFINIADDR: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458}
|
||||
// INITFINIADDR: !{i32 1, !"aarch64-elf-pauthabi-version", i32 194}
|
||||
|
||||
// ELFGOT: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458}
|
||||
// ELFGOT: !{i32 1, !"aarch64-elf-pauthabi-version", i32 256}
|
||||
|
||||
// GOTOS: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458}
|
||||
// GOTOS: !{i32 1, !"aarch64-elf-pauthabi-version", i32 512}
|
||||
|
||||
|
||||
8
clang/test/CodeGen/ptrauth-module-flags.c
Normal file
8
clang/test/CodeGen/ptrauth-module-flags.c
Normal file
@@ -0,0 +1,8 @@
|
||||
// RUN: %clang_cc1 -triple aarch64-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=OFF
|
||||
// RUN: %clang_cc1 -triple aarch64-linux-gnu -fptrauth-elf-got -emit-llvm %s -o - | FileCheck %s --check-prefix=ELFGOT
|
||||
|
||||
// ELFGOT: !llvm.module.flags = !{
|
||||
// ELFGOT-SAME: !1
|
||||
// ELFGOT: !1 = !{i32 8, !"ptrauth-elf-got", i32 1}
|
||||
|
||||
// OFF-NOT: "ptrauth-
|
||||
@@ -2,34 +2,37 @@
|
||||
//// For example, -fptrauth-init-fini will not affect codegen without -fptrauth-calls, but the preprocessor feature would be set anyway.
|
||||
|
||||
// RUN: %clang_cc1 -E %s -triple=aarch64 -fptrauth-intrinsics | \
|
||||
// RUN: FileCheck %s --check-prefixes=INTRIN,NOCALLS,NORETS,NOVPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,NOFUNC,NOINITFINI,NOINITFINI_ADDR_DISCR,NOGOTOS
|
||||
// RUN: FileCheck %s --check-prefixes=INTRIN,NOCALLS,NORETS,NOVPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,NOFUNC,NOINITFINI,NOINITFINI_ADDR_DISCR,NOGOTOS,NOELFGOT
|
||||
|
||||
// RUN: %clang_cc1 -E %s -triple=aarch64 -fptrauth-calls | \
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,CALLS,NORETS,NOVPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,NOFUNC,NOINITFINI,NOINITFINI_ADDR_DISCR,NOGOTOS
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,CALLS,NORETS,NOVPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,NOFUNC,NOINITFINI,NOINITFINI_ADDR_DISCR,NOGOTOS,NOELFGOT
|
||||
|
||||
// RUN: %clang_cc1 -E %s -triple=aarch64 -fptrauth-returns | \
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,NOCALLS,RETS,NOVPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,NOFUNC,NOINITFINI,NOINITFINI_ADDR_DISCR,NOGOTOS
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,NOCALLS,RETS,NOVPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,NOFUNC,NOINITFINI,NOINITFINI_ADDR_DISCR,NOGOTOS,NOELFGOT
|
||||
|
||||
// RUN: %clang_cc1 -E %s -triple=aarch64 -fptrauth-vtable-pointer-address-discrimination | \
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,NOCALLS,NORETS,VPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,NOFUNC,NOINITFINI,NOINITFINI_ADDR_DISCR,NOGOTOS
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,NOCALLS,NORETS,VPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,NOFUNC,NOINITFINI,NOINITFINI_ADDR_DISCR,NOGOTOS,NOELFGOT
|
||||
|
||||
// RUN: %clang_cc1 -E %s -triple=aarch64 -fptrauth-vtable-pointer-type-discrimination | \
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,NOCALLS,NORETS,NOVPTR_ADDR_DISCR,VPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,NOFUNC,NOINITFINI,NOINITFINI_ADDR_DISCR,NOGOTOS
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,NOCALLS,NORETS,NOVPTR_ADDR_DISCR,VPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,NOFUNC,NOINITFINI,NOINITFINI_ADDR_DISCR,NOGOTOS,NOELFGOT
|
||||
|
||||
// RUN: %clang_cc1 -E %s -triple=aarch64 -fptrauth-type-info-vtable-pointer-discrimination | \
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,NOCALLS,NORETS,NOVPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,TYPE_INFO_DISCR,NOFUNC,NOINITFINI,NOINITFINI_ADDR_DISCR,NOGOTOS
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,NOCALLS,NORETS,NOVPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,TYPE_INFO_DISCR,NOFUNC,NOINITFINI,NOINITFINI_ADDR_DISCR,NOGOTOS,NOELFGOT
|
||||
|
||||
// RUN: %clang_cc1 -E %s -triple=aarch64 -fptrauth-function-pointer-type-discrimination | \
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,NOCALLS,NORETS,NOVPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,FUNC,NOINITFINI,NOINITFINI_ADDR_DISCR,NOGOTOS
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,NOCALLS,NORETS,NOVPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,FUNC,NOINITFINI,NOINITFINI_ADDR_DISCR,NOGOTOS,NOELFGOT
|
||||
|
||||
// RUN: %clang_cc1 -E %s -triple=aarch64 -fptrauth-init-fini | \
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,NOCALLS,NORETS,NOVPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,NOFUNC,INITFINI,NOINITFINI_ADDR_DISCR,NOGOTOS
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,NOCALLS,NORETS,NOVPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,NOFUNC,INITFINI,NOINITFINI_ADDR_DISCR,NOGOTOS,NOELFGOT
|
||||
|
||||
// RUN: %clang_cc1 -E %s -triple=aarch64 -fptrauth-init-fini-address-discrimination | \
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,NOCALLS,NORETS,NOVPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,NOFUNC,NOINITFINI,INITFINI_ADDR_DISCR,NOGOTOS
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,NOCALLS,NORETS,NOVPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,NOFUNC,NOINITFINI,INITFINI_ADDR_DISCR,NOGOTOS,NOELFGOT
|
||||
|
||||
// RUN: %clang_cc1 -E %s -triple=aarch64 -fptrauth-indirect-gotos | \
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,NOCALLS,NORETS,NOVPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,NOFUNC,NOINITFINI,NOINITFINI_ADDR_DISCR,GOTOS
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,NOCALLS,NORETS,NOVPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,NOFUNC,NOINITFINI,NOINITFINI_ADDR_DISCR,GOTOS,NOELFGOT
|
||||
|
||||
// RUN: %clang_cc1 -E %s -triple=aarch64 -fptrauth-elf-got | \
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,NOCALLS,NORETS,NOVPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,NOFUNC,NOINITFINI,NOINITFINI_ADDR_DISCR,NOGOTOS,ELFGOT
|
||||
|
||||
#if __has_feature(ptrauth_intrinsics)
|
||||
// INTRIN: has_ptrauth_intrinsics
|
||||
@@ -119,3 +122,11 @@ void has_ptrauth_indirect_gotos() {}
|
||||
// NOGOTOS: no_ptrauth_indirect_gotos
|
||||
void no_ptrauth_indirect_gotos() {}
|
||||
#endif
|
||||
|
||||
#if __has_feature(ptrauth_elf_got)
|
||||
// ELFGOT: has_ptrauth_elf_got
|
||||
void has_ptrauth_elf_got() {}
|
||||
#else
|
||||
// NOELFGOT: no_ptrauth_elf_got
|
||||
void no_ptrauth_elf_got() {}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user