static void setThunkVisibility(CodeGenModule &CGM, const CXXMethodDecl *MD, const ThunkInfo &Thunk, llvm::Function *Fn) { CGM.setGlobalVisibility(Fn, MD); if (!CGM.getCodeGenOpts().HiddenWeakVTables) return; // If the thunk has weak/linkonce linkage, but the function must be // emitted in every translation unit that references it, then we can // emit its thunks with hidden visibility, since its thunks must be // emitted when the function is. // This follows CodeGenModule::setTypeVisibility; see the comments // there for explanation. if ((Fn->getLinkage() != llvm::GlobalVariable::LinkOnceODRLinkage && Fn->getLinkage() != llvm::GlobalVariable::WeakODRLinkage) || Fn->getVisibility() != llvm::GlobalVariable::DefaultVisibility) return; if (MD->getExplicitVisibility()) return; switch (MD->getTemplateSpecializationKind()) { case TSK_ExplicitInstantiationDefinition: case TSK_ExplicitInstantiationDeclaration: return; case TSK_Undeclared: break; case TSK_ExplicitSpecialization: case TSK_ImplicitInstantiation: if (!CGM.getCodeGenOpts().HiddenWeakTemplateVTables) return; break; } // If there's an explicit definition, and that definition is // out-of-line, then we can't assume that all users will have a // definition to emit. const FunctionDecl *Def = 0; if (MD->hasBody(Def) && Def->isOutOfLine()) return; Fn->setVisibility(llvm::GlobalValue::HiddenVisibility); }
static void setThunkVisibility(CodeGenModule &CGM, const CXXMethodDecl *MD, const ThunkInfo &Thunk, llvm::Function *Fn) { CGM.setGlobalVisibility(Fn, MD); }