@@ -1944,37 +1944,81 @@ void CodeGenModule::AddGlobalDtor(llvm::Function *Dtor, int Priority,
19441944void CodeGenModule::EmitCtorList (CtorList &Fns, const char *GlobalName) {
19451945 if (Fns.empty ()) return ;
19461946
1947- // Ctor function type is void()*.
1948- llvm::FunctionType* CtorFTy = llvm::FunctionType::get (VoidTy, false );
1949- llvm::Type *CtorPFTy = llvm::PointerType::get (CtorFTy,
1950- TheModule.getDataLayout ().getProgramAddressSpace ());
1951-
1952- // Get the type of a ctor entry, { i32, void ()*, i8* }.
1953- llvm::StructType *CtorStructTy = llvm::StructType::get (
1954- Int32Ty, CtorPFTy, VoidPtrTy);
1955-
1956- // Construct the constructor and destructor arrays.
1957- ConstantInitBuilder builder (*this );
1958- auto ctors = builder.beginArray (CtorStructTy);
1959- for (const auto &I : Fns) {
1960- auto ctor = ctors.beginStruct (CtorStructTy);
1961- ctor.addInt (Int32Ty, I.Priority );
1962- ctor.add (llvm::ConstantExpr::getBitCast (I.Initializer , CtorPFTy));
1963- if (I.AssociatedData )
1964- ctor.add (llvm::ConstantExpr::getBitCast (I.AssociatedData , VoidPtrTy));
1965- else
1966- ctor.addNullPointer (VoidPtrTy);
1967- ctor.finishAndAddTo (ctors);
1968- }
1947+ const PointerAuthSchema &InitFiniAuthSchema =
1948+ getCodeGenOpts ().PointerAuth .InitFiniPointers ;
1949+ if (InitFiniAuthSchema) {
1950+ // Ctor function type is void()*.
1951+ llvm::FunctionType *CtorFTy = llvm::FunctionType::get (VoidTy, false );
1952+ llvm::Type *CtorPFTy = llvm::PointerType::get (
1953+ CtorFTy, TheModule.getDataLayout ().getProgramAddressSpace ());
1954+
1955+ llvm::StructType *CtorPauthTy =
1956+ llvm::StructType::get (CtorPFTy, Int32Ty, Int64Ty, Int64Ty);
1957+ llvm::Type *CtorPauthPTy = llvm::PointerType::get (
1958+ CtorPauthTy, TheModule.getDataLayout ().getProgramAddressSpace ());
1959+
1960+ // Get the type of a ctor entry, { i32, ptr, i8* }.
1961+ llvm::StructType *CtorStructTy =
1962+ llvm::StructType::get (Int32Ty, CtorPauthPTy, VoidPtrTy);
1963+
1964+ // Construct the constructor and destructor arrays.
1965+ ConstantInitBuilder builder (*this );
1966+ auto ctors = builder.beginArray (CtorStructTy);
1967+ for (const auto &I : Fns) {
1968+ auto ctor = ctors.beginStruct (CtorStructTy);
1969+ ctor.addInt (Int32Ty, I.Priority );
1970+ assert (!InitFiniAuthSchema.isAddressDiscriminated ());
1971+ llvm::Constant *signedCtorAddr = getConstantSignedPointer (
1972+ I.Initializer , InitFiniAuthSchema.getKey (), 0 ,
1973+ llvm::ConstantInt::get (
1974+ SizeTy, InitFiniAuthSchema.getConstantDiscrimination ()));
1975+ ctor.add (llvm::ConstantExpr::getBitCast (signedCtorAddr, CtorPauthPTy));
1976+ if (I.AssociatedData )
1977+ ctor.add (llvm::ConstantExpr::getBitCast (I.AssociatedData , VoidPtrTy));
1978+ else
1979+ ctor.addNullPointer (VoidPtrTy);
1980+ ctor.finishAndAddTo (ctors);
1981+ }
1982+
1983+ auto list = ctors.finishAndCreateGlobal (
1984+ GlobalName, getPointerAlign (),
1985+ /* constant*/ false , llvm::GlobalValue::AppendingLinkage);
19691986
1970- auto list =
1971- ctors.finishAndCreateGlobal (GlobalName, getPointerAlign (),
1972- /* constant*/ false ,
1973- llvm::GlobalValue::AppendingLinkage);
1987+ // The LTO linker doesn't seem to like it when we set an alignment
1988+ // on appending variables. Take it off as a workaround.
1989+ list->setAlignment (std::nullopt );
1990+ } else {
1991+ // Ctor function type is void()*.
1992+ llvm::FunctionType *CtorFTy = llvm::FunctionType::get (VoidTy, false );
1993+ llvm::Type *CtorPFTy = llvm::PointerType::get (
1994+ CtorFTy, TheModule.getDataLayout ().getProgramAddressSpace ());
1995+
1996+ // Get the type of a ctor entry, { i32, void ()*, i8* }.
1997+ llvm::StructType *CtorStructTy =
1998+ llvm::StructType::get (Int32Ty, CtorPFTy, VoidPtrTy);
1999+
2000+ // Construct the constructor and destructor arrays.
2001+ ConstantInitBuilder builder (*this );
2002+ auto ctors = builder.beginArray (CtorStructTy);
2003+ for (const auto &I : Fns) {
2004+ auto ctor = ctors.beginStruct (CtorStructTy);
2005+ ctor.addInt (Int32Ty, I.Priority );
2006+ ctor.add (llvm::ConstantExpr::getBitCast (I.Initializer , CtorPFTy));
2007+ if (I.AssociatedData )
2008+ ctor.add (llvm::ConstantExpr::getBitCast (I.AssociatedData , VoidPtrTy));
2009+ else
2010+ ctor.addNullPointer (VoidPtrTy);
2011+ ctor.finishAndAddTo (ctors);
2012+ }
19742013
1975- // The LTO linker doesn't seem to like it when we set an alignment
1976- // on appending variables. Take it off as a workaround.
1977- list->setAlignment (std::nullopt );
2014+ auto list = ctors.finishAndCreateGlobal (
2015+ GlobalName, getPointerAlign (),
2016+ /* constant*/ false , llvm::GlobalValue::AppendingLinkage);
2017+
2018+ // The LTO linker doesn't seem to like it when we set an alignment
2019+ // on appending variables. Take it off as a workaround.
2020+ list->setAlignment (std::nullopt );
2021+ }
19782022
19792023 Fns.clear ();
19802024}
0 commit comments