From: Daniel Dunbar Date: Tue, 14 Apr 2009 07:19:20 +0000 (+0000) Subject: Split SetGlobalValueAttributes into definition/declaration halves. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=55d6f50b23a1fd0a04b568787a25beb7537e6c9b;p=clang Split SetGlobalValueAttributes into definition/declaration halves. - No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69035 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 096e87d8b7..dad1214b37 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -226,31 +226,10 @@ void CodeGenModule::EmitAnnotations() { /// FIXME: This is currently only done for aliases and functions, but /// not for variables (these details are set in /// EmitGlobalVarDefinition for variables). -void CodeGenModule::SetGlobalValueAttributes(const Decl *D, - GVALinkage Linkage, - llvm::GlobalValue *GV, - bool ForDefinition) { - // FIXME: Set up linkage and many other things. Note, this is a simple - // approximation of what we really want. - if (!ForDefinition) { - // Only a few attributes are set on declarations. - - // The dllimport attribute is overridden by a subsequent declaration as - // dllexport. - if (D->hasAttr() && !D->hasAttr()) { - // dllimport attribute can be applied only to function decls, not to - // definitions. - if (const FunctionDecl *FD = dyn_cast(D)) { - if (!FD->getBody()) - GV->setLinkage(llvm::Function::DLLImportLinkage); - } else - GV->setLinkage(llvm::Function::DLLImportLinkage); - } else if (D->hasAttr() || D->hasAttr()) { - // "extern_weak" is overloaded in LLVM; we probably should have - // separate linkage types for this. - GV->setLinkage(llvm::Function::ExternalWeakLinkage); - } - } else if (Linkage == GVA_Internal) { +void CodeGenModule::SetGVDefinitionAttributes(const Decl *D, + GVALinkage Linkage, + llvm::GlobalValue *GV) { + if (Linkage == GVA_Internal) { GV->setLinkage(llvm::Function::InternalLinkage); } else if (D->hasAttr()) { if (const FunctionDecl *FD = dyn_cast(D)) { @@ -290,14 +269,37 @@ void CodeGenModule::SetGlobalValueAttributes(const Decl *D, } } - if (ForDefinition) { - setGlobalVisibility(GV, D); + setGlobalVisibility(GV, D); + + // Only add to llvm.used when we see a definition, otherwise we + // might add it multiple times or risk the value being replaced by + // a subsequent RAUW. + if (D->hasAttr()) + AddUsedGlobal(GV); + + if (const SectionAttr *SA = D->getAttr()) + GV->setSection(SA->getName()); +} - // Only add to llvm.used when we see a definition, otherwise we - // might add it multiple times or risk the value being replaced by - // a subsequent RAUW. - if (D->hasAttr()) - AddUsedGlobal(GV); +void CodeGenModule::SetGVDeclarationAttributes(const Decl *D, + llvm::GlobalValue *GV) { + // Only a few attributes are set on declarations; these may later be + // overridden by a definition. + + // The dllimport attribute is overridden by a subsequent declaration as + // dllexport. + if (D->hasAttr() && !D->hasAttr()) { + // dllimport attribute can be applied only to function decls, not to + // definitions. + if (const FunctionDecl *FD = dyn_cast(D)) { + if (!FD->getBody()) + GV->setLinkage(llvm::Function::DLLImportLinkage); + } else + GV->setLinkage(llvm::Function::DLLImportLinkage); + } else if (D->hasAttr() || D->hasAttr()) { + // "extern_weak" is overloaded in LLVM; we probably should have + // separate linkage types for this. + GV->setLinkage(llvm::Function::ExternalWeakLinkage); } if (const SectionAttr *SA = D->getAttr()) @@ -346,7 +348,7 @@ GetLinkageForFunctionOrMethodDecl(const Decl *D) { /// specific to a function definition. void CodeGenModule::SetFunctionAttributesForDefinition(const Decl *D, llvm::Function *F) { - SetGlobalValueAttributes(D, GetLinkageForFunctionOrMethodDecl(D), F, true); + SetGVDefinitionAttributes(D, GetLinkageForFunctionOrMethodDecl(D), F); if (!Features.Exceptions && !Features.ObjCNonFragileABI) F->addFnAttr(llvm::Attribute::NoUnwind); @@ -369,7 +371,7 @@ void CodeGenModule::SetFunctionAttributes(const FunctionDecl *FD, llvm::Function *F) { SetLLVMFunctionAttributes(FD, getTypes().getFunctionInfo(FD), F); - SetGlobalValueAttributes(FD, GetLinkageForFunctionOrMethodDecl(FD), F, false); + SetGVDeclarationAttributes(FD, F); } void CodeGenModule::AddUsedGlobal(llvm::GlobalValue *GV) { @@ -967,7 +969,7 @@ void CodeGenModule::EmitAliasDefinition(const ValueDecl *D) { GA->setName(MangledName); // Alias should never be internal or inline. - SetGlobalValueAttributes(D, GVA_Normal, GA, true); + SetGVDefinitionAttributes(D, GVA_Normal, GA); } /// getBuiltinLibFunction - Given a builtin id for a function like diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h index b38633db91..3dada6d1b7 100644 --- a/lib/CodeGen/CodeGenModule.h +++ b/lib/CodeGen/CodeGenModule.h @@ -323,11 +323,14 @@ private: const llvm::PointerType *PTy, const VarDecl *D); - /// SetGlobalValueAttributes - Set attributes for a global decl. - void SetGlobalValueAttributes(const Decl *D, - GVALinkage Linkage, - llvm::GlobalValue *GV, - bool ForDefinition); + /// SetGVDefinitionAttributes - Set attributes for a global definition. + void SetGVDefinitionAttributes(const Decl *D, + GVALinkage Linkage, + llvm::GlobalValue *GV); + + /// SetGVDeclarationAttributes - Set attributes for a global declaration. + void SetGVDeclarationAttributes(const Decl *D, + llvm::GlobalValue *GV); /// SetFunctionAttributesForDefinition - Set function attributes specific to a /// function definition.