diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2011-02-04 00:01:24 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2011-02-04 00:01:24 +0000 |
commit | f7f04458b3d1499be79d793b13b52cfe74b7d03f (patch) | |
tree | 3b6817de1ee1e4c13f4e4bbb69e75707d304e80c /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | 149239651d33b2787246097daf2326351a85ba77 (diff) | |
download | bcm5719-llvm-f7f04458b3d1499be79d793b13b52cfe74b7d03f.tar.gz bcm5719-llvm-f7f04458b3d1499be79d793b13b52cfe74b7d03f.zip |
-fapple-kext cannot have 'weak' visibility in this
abi.
llvm-svn: 124834
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 47 |
1 files changed, 32 insertions, 15 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index b8f91b464dd..ec3a8bf6583 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -374,7 +374,9 @@ CodeGenModule::getFunctionLinkage(const FunctionDecl *D) { // In C99 mode, 'inline' functions are guaranteed to have a strong // definition somewhere else, so we can use available_externally linkage. if (Linkage == GVA_C99Inline) - return llvm::Function::AvailableExternallyLinkage; + return !Context.getLangOptions().AppleKext + ? llvm::Function::AvailableExternallyLinkage + : llvm::Function::InternalLinkage; // In C++, the compiler has to emit a definition in every translation unit // that references the function. We should use linkonce_odr because @@ -383,14 +385,18 @@ CodeGenModule::getFunctionLinkage(const FunctionDecl *D) { // merged with other definitions. c) C++ has the ODR, so we know the // definition is dependable. if (Linkage == GVA_CXXInline || Linkage == GVA_TemplateInstantiation) - return llvm::Function::LinkOnceODRLinkage; + return !Context.getLangOptions().AppleKext + ? llvm::Function::LinkOnceODRLinkage + : llvm::Function::InternalLinkage; // An explicit instantiation of a template has weak linkage, since // explicit instantiations can occur in multiple translation units // and must all be equivalent. However, we are not allowed to // throw away these explicit instantiations. if (Linkage == GVA_ExplicitTemplateInstantiation) - return llvm::Function::WeakODRLinkage; + return !Context.getLangOptions().AppleKext + ? llvm::Function::WeakODRLinkage + : llvm::Function::InternalLinkage; // Otherwise, we have strong external linkage. assert(Linkage == GVA_StrongExternal); @@ -1089,21 +1095,29 @@ CodeGenModule::getVTableLinkage(const CXXRecordDecl *RD) { return llvm::GlobalVariable::AvailableExternallyLinkage; if (KeyFunction->isInlined()) - return llvm::GlobalVariable::LinkOnceODRLinkage; + return !Context.getLangOptions().AppleKext ? + llvm::GlobalVariable::LinkOnceODRLinkage : + llvm::Function::InternalLinkage; return llvm::GlobalVariable::ExternalLinkage; case TSK_ImplicitInstantiation: - return llvm::GlobalVariable::LinkOnceODRLinkage; + return !Context.getLangOptions().AppleKext ? + llvm::GlobalVariable::LinkOnceODRLinkage : + llvm::Function::InternalLinkage; case TSK_ExplicitInstantiationDefinition: - return llvm::GlobalVariable::WeakODRLinkage; + return !Context.getLangOptions().AppleKext ? + llvm::GlobalVariable::WeakODRLinkage : + llvm::Function::InternalLinkage; case TSK_ExplicitInstantiationDeclaration: // FIXME: Use available_externally linkage. However, this currently // breaks LLVM's build due to undefined symbols. // return llvm::GlobalVariable::AvailableExternallyLinkage; - return llvm::GlobalVariable::LinkOnceODRLinkage; + return !Context.getLangOptions().AppleKext ? + llvm::GlobalVariable::LinkOnceODRLinkage : + llvm::Function::InternalLinkage; } } @@ -1111,20 +1125,23 @@ CodeGenModule::getVTableLinkage(const CXXRecordDecl *RD) { case TSK_Undeclared: case TSK_ExplicitSpecialization: case TSK_ImplicitInstantiation: - return llvm::GlobalVariable::LinkOnceODRLinkage; - - case TSK_ExplicitInstantiationDefinition: - return llvm::GlobalVariable::WeakODRLinkage; - - case TSK_ExplicitInstantiationDeclaration: // FIXME: Use available_externally linkage. However, this currently // breaks LLVM's build due to undefined symbols. // return llvm::GlobalVariable::AvailableExternallyLinkage; - return llvm::GlobalVariable::LinkOnceODRLinkage; + case TSK_ExplicitInstantiationDeclaration: + break; + + case TSK_ExplicitInstantiationDefinition: + return !Context.getLangOptions().AppleKext ? + llvm::GlobalVariable::WeakODRLinkage : + llvm::Function::InternalLinkage; + } // Silence GCC warning. - return llvm::GlobalVariable::LinkOnceODRLinkage; + return !Context.getLangOptions().AppleKext ? + llvm::GlobalVariable::LinkOnceODRLinkage : + llvm::Function::InternalLinkage; } CharUnits CodeGenModule::GetTargetTypeStoreSize(const llvm::Type *Ty) const { |