summaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/CodeGenModule.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r--clang/lib/CodeGen/CodeGenModule.cpp66
1 files changed, 42 insertions, 24 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 31f6632df9f2..9aaf90ccfe04 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -116,8 +116,6 @@ createTargetCodeGenInfo(CodeGenModule &CGM) {
default:
return createDefaultTargetCodeGenInfo(CGM);
- case llvm::Triple::le32:
- return createPNaClTargetCodeGenInfo(CGM);
case llvm::Triple::m68k:
return createM68kTargetCodeGenInfo(CGM);
case llvm::Triple::mips:
@@ -1218,8 +1216,12 @@ void CodeGenModule::Release() {
(LangOpts.PointerAuthVTPtrTypeDiscrimination
<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR) |
(LangOpts.PointerAuthInitFini
- << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI);
- static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI ==
+ << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI) |
+ (LangOpts.PointerAuthInitFiniAddressDiscrimination
+ << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC) |
+ (LangOpts.PointerAuthELFGOT
+ << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT);
+ static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT ==
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
"Update when new enum items are defined");
if (PAuthABIVersion != 0) {
@@ -2082,37 +2084,53 @@ void CodeGenModule::AddGlobalDtor(llvm::Function *Dtor, int Priority,
void CodeGenModule::EmitCtorList(CtorList &Fns, const char *GlobalName) {
if (Fns.empty()) return;
- // Ctor function type is void()*.
- llvm::FunctionType* CtorFTy = llvm::FunctionType::get(VoidTy, false);
- llvm::Type *CtorPFTy = llvm::PointerType::get(CtorFTy,
- TheModule.getDataLayout().getProgramAddressSpace());
+ const PointerAuthSchema &InitFiniAuthSchema =
+ getCodeGenOpts().PointerAuth.InitFiniPointers;
- // Get the type of a ctor entry, { i32, void ()*, i8* }.
- llvm::StructType *CtorStructTy = llvm::StructType::get(
- Int32Ty, CtorPFTy, VoidPtrTy);
+ // Ctor function type is ptr.
+ llvm::PointerType *PtrTy = llvm::PointerType::get(
+ getLLVMContext(), TheModule.getDataLayout().getProgramAddressSpace());
+
+ // Get the type of a ctor entry, { i32, ptr, ptr }.
+ llvm::StructType *CtorStructTy = llvm::StructType::get(Int32Ty, PtrTy, PtrTy);
// Construct the constructor and destructor arrays.
- ConstantInitBuilder builder(*this);
- auto ctors = builder.beginArray(CtorStructTy);
+ ConstantInitBuilder Builder(*this);
+ auto Ctors = Builder.beginArray(CtorStructTy);
for (const auto &I : Fns) {
- auto ctor = ctors.beginStruct(CtorStructTy);
- ctor.addInt(Int32Ty, I.Priority);
- ctor.add(I.Initializer);
+ auto Ctor = Ctors.beginStruct(CtorStructTy);
+ Ctor.addInt(Int32Ty, I.Priority);
+ if (InitFiniAuthSchema) {
+ llvm::Constant *StorageAddress =
+ (InitFiniAuthSchema.isAddressDiscriminated()
+ ? llvm::ConstantExpr::getIntToPtr(
+ llvm::ConstantInt::get(
+ IntPtrTy,
+ llvm::ConstantPtrAuth::AddrDiscriminator_CtorsDtors),
+ PtrTy)
+ : nullptr);
+ llvm::Constant *SignedCtorPtr = getConstantSignedPointer(
+ I.Initializer, InitFiniAuthSchema.getKey(), StorageAddress,
+ llvm::ConstantInt::get(
+ SizeTy, InitFiniAuthSchema.getConstantDiscrimination()));
+ Ctor.add(SignedCtorPtr);
+ } else {
+ Ctor.add(I.Initializer);
+ }
if (I.AssociatedData)
- ctor.add(I.AssociatedData);
+ Ctor.add(I.AssociatedData);
else
- ctor.addNullPointer(VoidPtrTy);
- ctor.finishAndAddTo(ctors);
+ Ctor.addNullPointer(PtrTy);
+ Ctor.finishAndAddTo(Ctors);
}
- auto list =
- ctors.finishAndCreateGlobal(GlobalName, getPointerAlign(),
- /*constant*/ false,
- llvm::GlobalValue::AppendingLinkage);
+ auto List = Ctors.finishAndCreateGlobal(GlobalName, getPointerAlign(),
+ /*constant*/ false,
+ llvm::GlobalValue::AppendingLinkage);
// The LTO linker doesn't seem to like it when we set an alignment
// on appending variables. Take it off as a workaround.
- list->setAlignment(std::nullopt);
+ List->setAlignment(std::nullopt);
Fns.clear();
}