Fix linkage for RTTI names by re-using the logic for computing the
linkage of vtables. Before this, we were emitting RTTI names for template instantiations with strong external linkage rather than with weak ODR linkage. llvm-svn: 92857
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user