mirror of https://github.com/microsoft/clang.git
[CodeGen] Call SetInternalFunctionAttributes to attach function
attributes to internal functions. This patch fixes CodeGenModule::CreateGlobalInitOrDestructFunction to use SetInternalFunctionAttributes instead of SetLLVMFunctionAttributes to attach function attributes to internal functions. Also, make sure the correct CGFunctionInfo is passed instead of always passing what arrangeNullaryFunction returns. rdar://problem/20828324 Differential Revision: http://reviews.llvm.org/D13610 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@251734 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2970073f29
commit
8c7ab6dd35
|
@ -193,13 +193,15 @@ llvm::Constant *CodeGenFunction::createAtExitStub(const VarDecl &VD,
|
|||
llvm::raw_svector_ostream Out(FnName);
|
||||
CGM.getCXXABI().getMangleContext().mangleDynamicAtExitDestructor(&VD, Out);
|
||||
}
|
||||
|
||||
const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
|
||||
llvm::Function *fn = CGM.CreateGlobalInitOrDestructFunction(ty, FnName.str(),
|
||||
FI,
|
||||
VD.getLocation());
|
||||
|
||||
CodeGenFunction CGF(CGM);
|
||||
|
||||
CGF.StartFunction(&VD, CGM.getContext().VoidTy, fn,
|
||||
CGM.getTypes().arrangeNullaryFunction(), FunctionArgList());
|
||||
CGF.StartFunction(&VD, CGM.getContext().VoidTy, fn, FI, FunctionArgList());
|
||||
|
||||
llvm::CallInst *call = CGF.Builder.CreateCall(dtor, addr);
|
||||
|
||||
|
@ -247,7 +249,8 @@ void CodeGenFunction::EmitCXXGuardedInit(const VarDecl &D,
|
|||
}
|
||||
|
||||
llvm::Function *CodeGenModule::CreateGlobalInitOrDestructFunction(
|
||||
llvm::FunctionType *FTy, const Twine &Name, SourceLocation Loc, bool TLS) {
|
||||
llvm::FunctionType *FTy, const Twine &Name, const CGFunctionInfo &FI,
|
||||
SourceLocation Loc, bool TLS) {
|
||||
llvm::Function *Fn =
|
||||
llvm::Function::Create(FTy, llvm::GlobalValue::InternalLinkage,
|
||||
Name, &getModule());
|
||||
|
@ -257,7 +260,7 @@ llvm::Function *CodeGenModule::CreateGlobalInitOrDestructFunction(
|
|||
Fn->setSection(Section);
|
||||
}
|
||||
|
||||
SetLLVMFunctionAttributes(nullptr, getTypes().arrangeNullaryFunction(), Fn);
|
||||
SetInternalFunctionAttributes(nullptr, Fn, FI);
|
||||
|
||||
Fn->setCallingConv(getRuntimeCC());
|
||||
|
||||
|
@ -315,7 +318,9 @@ CodeGenModule::EmitCXXGlobalVarDeclInitFunc(const VarDecl *D,
|
|||
|
||||
// Create a variable initialization function.
|
||||
llvm::Function *Fn =
|
||||
CreateGlobalInitOrDestructFunction(FTy, FnName.str(), D->getLocation());
|
||||
CreateGlobalInitOrDestructFunction(FTy, FnName.str(),
|
||||
getTypes().arrangeNullaryFunction(),
|
||||
D->getLocation());
|
||||
|
||||
auto *ISA = D->getAttr<InitSegAttr>();
|
||||
CodeGenFunction(*this).GenerateCXXGlobalVarDeclInitFunc(Fn, D, Addr,
|
||||
|
@ -390,7 +395,7 @@ CodeGenModule::EmitCXXGlobalInitFunc() {
|
|||
return;
|
||||
|
||||
llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
|
||||
|
||||
const CGFunctionInfo &FI = getTypes().arrangeNullaryFunction();
|
||||
|
||||
// Create our global initialization function.
|
||||
if (!PrioritizedCXXGlobalInits.empty()) {
|
||||
|
@ -414,7 +419,7 @@ CodeGenModule::EmitCXXGlobalInitFunc() {
|
|||
// Priority is always <= 65535 (enforced by sema).
|
||||
PrioritySuffix = std::string(6-PrioritySuffix.size(), '0')+PrioritySuffix;
|
||||
llvm::Function *Fn = CreateGlobalInitOrDestructFunction(
|
||||
FTy, "_GLOBAL__I_" + PrioritySuffix);
|
||||
FTy, "_GLOBAL__I_" + PrioritySuffix, FI);
|
||||
|
||||
for (; I < PrioE; ++I)
|
||||
LocalCXXGlobalInits.push_back(I->second);
|
||||
|
@ -444,7 +449,7 @@ CodeGenModule::EmitCXXGlobalInitFunc() {
|
|||
}
|
||||
|
||||
llvm::Function *Fn = CreateGlobalInitOrDestructFunction(
|
||||
FTy, llvm::Twine("_GLOBAL__sub_I_", FileName));
|
||||
FTy, llvm::Twine("_GLOBAL__sub_I_", FileName), FI);
|
||||
|
||||
CodeGenFunction(*this).GenerateCXXGlobalInitFunc(Fn, CXXGlobalInits);
|
||||
AddGlobalCtor(Fn);
|
||||
|
@ -459,7 +464,9 @@ void CodeGenModule::EmitCXXGlobalDtorFunc() {
|
|||
llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
|
||||
|
||||
// Create our global destructor function.
|
||||
llvm::Function *Fn = CreateGlobalInitOrDestructFunction(FTy, "_GLOBAL__D_a");
|
||||
const CGFunctionInfo &FI = getTypes().arrangeNullaryFunction();
|
||||
llvm::Function *Fn =
|
||||
CreateGlobalInitOrDestructFunction(FTy, "_GLOBAL__D_a", FI);
|
||||
|
||||
CodeGenFunction(*this).GenerateCXXGlobalDtorsFunc(Fn, CXXGlobalDtors);
|
||||
AddGlobalDtor(Fn);
|
||||
|
@ -584,7 +591,7 @@ llvm::Function *CodeGenFunction::generateDestroyHelper(
|
|||
getContext().VoidTy, args, FunctionType::ExtInfo(), /*variadic=*/false);
|
||||
llvm::FunctionType *FTy = CGM.getTypes().GetFunctionType(FI);
|
||||
llvm::Function *fn = CGM.CreateGlobalInitOrDestructFunction(
|
||||
FTy, "__cxx_global_array_dtor", VD->getLocation());
|
||||
FTy, "__cxx_global_array_dtor", FI, VD->getLocation());
|
||||
|
||||
CurEHLocation = VD->getLocStart();
|
||||
|
||||
|
|
|
@ -1104,7 +1104,7 @@ llvm::Function *CGOpenMPRuntime::emitThreadPrivateVarDefinition(
|
|||
/*isVariadic=*/false);
|
||||
auto FTy = CGM.getTypes().GetFunctionType(FI);
|
||||
auto Fn = CGM.CreateGlobalInitOrDestructFunction(
|
||||
FTy, ".__kmpc_global_ctor_.", Loc);
|
||||
FTy, ".__kmpc_global_ctor_.", FI, Loc);
|
||||
CtorCGF.StartFunction(GlobalDecl(), CGM.getContext().VoidPtrTy, Fn, FI,
|
||||
Args, SourceLocation());
|
||||
auto ArgVal = CtorCGF.EmitLoadOfScalar(
|
||||
|
@ -1136,7 +1136,7 @@ llvm::Function *CGOpenMPRuntime::emitThreadPrivateVarDefinition(
|
|||
/*isVariadic=*/false);
|
||||
auto FTy = CGM.getTypes().GetFunctionType(FI);
|
||||
auto Fn = CGM.CreateGlobalInitOrDestructFunction(
|
||||
FTy, ".__kmpc_global_dtor_.", Loc);
|
||||
FTy, ".__kmpc_global_dtor_.", FI, Loc);
|
||||
DtorCGF.StartFunction(GlobalDecl(), CGM.getContext().VoidTy, Fn, FI, Args,
|
||||
SourceLocation());
|
||||
auto ArgVal = DtorCGF.EmitLoadOfScalar(
|
||||
|
@ -1174,7 +1174,8 @@ llvm::Function *CGOpenMPRuntime::emitThreadPrivateVarDefinition(
|
|||
auto InitFunctionTy =
|
||||
llvm::FunctionType::get(CGM.VoidTy, /*isVarArg*/ false);
|
||||
auto InitFunction = CGM.CreateGlobalInitOrDestructFunction(
|
||||
InitFunctionTy, ".__omp_threadprivate_init_.");
|
||||
InitFunctionTy, ".__omp_threadprivate_init_.",
|
||||
CGM.getTypes().arrangeNullaryFunction());
|
||||
CodeGenFunction InitCGF(CGM);
|
||||
FunctionArgList ArgList;
|
||||
InitCGF.StartFunction(GlobalDecl(), CGM.getContext().VoidTy, InitFunction,
|
||||
|
|
|
@ -686,6 +686,7 @@ public:
|
|||
|
||||
llvm::Function *
|
||||
CreateGlobalInitOrDestructFunction(llvm::FunctionType *ty, const Twine &name,
|
||||
const CGFunctionInfo &FI,
|
||||
SourceLocation Loc = SourceLocation(),
|
||||
bool TLS = false);
|
||||
|
||||
|
|
|
@ -2209,7 +2209,8 @@ void ItaniumCXXABI::EmitThreadLocalInitFuncs(
|
|||
// Generate a guarded initialization function.
|
||||
llvm::FunctionType *FTy =
|
||||
llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
|
||||
InitFunc = CGM.CreateGlobalInitOrDestructFunction(FTy, "__tls_init",
|
||||
const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
|
||||
InitFunc = CGM.CreateGlobalInitOrDestructFunction(FTy, "__tls_init", FI,
|
||||
SourceLocation(),
|
||||
/*TLS=*/true);
|
||||
llvm::GlobalVariable *Guard = new llvm::GlobalVariable(
|
||||
|
|
|
@ -2214,8 +2214,8 @@ void MicrosoftCXXABI::EmitThreadLocalInitFuncs(
|
|||
llvm::FunctionType *FTy =
|
||||
llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
|
||||
llvm::Function *InitFunc = CGM.CreateGlobalInitOrDestructFunction(
|
||||
FTy, "__tls_init", SourceLocation(),
|
||||
/*TLS=*/true);
|
||||
FTy, "__tls_init", CGM.getTypes().arrangeNullaryFunction(),
|
||||
SourceLocation(), /*TLS=*/true);
|
||||
CodeGenFunction(CGM).GenerateCXXGlobalInitFunc(InitFunc, NonComdatInits);
|
||||
|
||||
AddToXDU(InitFunc);
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
// RUN: %clang_cc1 %s -triple x86_64-apple-darwin -S -stack-protector 2 -emit-llvm -o - | FileCheck %s
|
||||
|
||||
class A {
|
||||
public:
|
||||
virtual ~A() {}
|
||||
};
|
||||
|
||||
A g;
|
||||
|
||||
// CHECK: define internal void @__cxx_global_var_init() [[ATTR0:#[0-9]+]]
|
||||
// CHECK: define internal void @_GLOBAL__sub_I_funcattrs_global_ctor_dtor.cpp() [[ATTR0]]
|
||||
// CHECK: attributes [[ATTR0]] = {{{.*}} sspstrong {{.*}}}
|
Loading…
Reference in New Issue