diff options
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index e0e8c54434e..0dbf336dccc 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -889,18 +889,17 @@ void CodeGenModule::EmitTentativeDefinition(const VarDecl *D) { llvm::GlobalVariable::LinkageTypes CodeGenModule::getVtableLinkage(const CXXRecordDecl *RD) { - // Get the key function. - const CXXMethodDecl *KeyFunction = getContext().getKeyFunction(RD); - - if (KeyFunction) { + if (RD->isInAnonymousNamespace() || !RD->hasLinkage()) + return llvm::GlobalVariable::InternalLinkage; + + if (const CXXMethodDecl *KeyFunction + = RD->getASTContext().getKeyFunction(RD)) { + // If this class has a key function, use that to determine the linkage of + // the vtable. const FunctionDecl *Def = 0; if (KeyFunction->getBody(Def)) KeyFunction = cast<CXXMethodDecl>(Def); - } - - if (RD->isInAnonymousNamespace() || !RD->hasLinkage()) - return llvm::GlobalVariable::InternalLinkage; - else if (KeyFunction) { + switch (KeyFunction->getTemplateSpecializationKind()) { case TSK_Undeclared: case TSK_ExplicitSpecialization: @@ -919,22 +918,20 @@ CodeGenModule::getVtableLinkage(const CXXRecordDecl *RD) { // return llvm::GlobalVariable::AvailableExternallyLinkage; return llvm::GlobalVariable::WeakODRLinkage; } - } else if (KeyFunction) { + } + + switch (RD->getTemplateSpecializationKind()) { + case TSK_Undeclared: + case TSK_ExplicitSpecialization: + case TSK_ImplicitInstantiation: + 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::WeakODRLinkage; - } else { - switch (RD->getTemplateSpecializationKind()) { - case TSK_Undeclared: - case TSK_ExplicitSpecialization: - case TSK_ImplicitInstantiation: - 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::WeakODRLinkage; - } } // Silence GCC warning. |