Changeset View
Changeset View
Standalone View
Standalone View
clang/lib/CodeGen/CGVTables.cpp
Show First 20 Lines • Show All 1,005 Lines • ▼ Show 20 Lines | for (const CXXRecordDecl *RD : DeferredVTables) | ||||
else if (shouldOpportunisticallyEmitVTables()) | else if (shouldOpportunisticallyEmitVTables()) | ||||
OpportunisticVTables.push_back(RD); | OpportunisticVTables.push_back(RD); | ||||
assert(savedSize == DeferredVTables.size() && | assert(savedSize == DeferredVTables.size() && | ||||
"deferred extra vtables during vtable emission?"); | "deferred extra vtables during vtable emission?"); | ||||
DeferredVTables.clear(); | DeferredVTables.clear(); | ||||
} | } | ||||
bool CodeGenModule::HasHiddenLTOVisibility(const CXXRecordDecl *RD) { | bool CodeGenModule::HasLTOVisibilityPublicStd(const CXXRecordDecl *RD) { | ||||
LinkageInfo LV = RD->getLinkageAndVisibility(); | if (!getCodeGenOpts().LTOVisibilityPublicStd) | ||||
if (!isExternallyVisible(LV.getLinkage())) | |||||
return true; | |||||
if (RD->hasAttr<LTOVisibilityPublicAttr>() || RD->hasAttr<UuidAttr>()) | |||||
return false; | return false; | ||||
if (getTriple().isOSBinFormatCOFF()) { | |||||
if (RD->hasAttr<DLLExportAttr>() || RD->hasAttr<DLLImportAttr>()) | |||||
return false; | |||||
} else { | |||||
if (LV.getVisibility() != HiddenVisibility) | |||||
return false; | |||||
} | |||||
if (getCodeGenOpts().LTOVisibilityPublicStd) { | |||||
const DeclContext *DC = RD; | const DeclContext *DC = RD; | ||||
while (1) { | while (1) { | ||||
auto *D = cast<Decl>(DC); | auto *D = cast<Decl>(DC); | ||||
DC = DC->getParent(); | DC = DC->getParent(); | ||||
if (isa<TranslationUnitDecl>(DC->getRedeclContext())) { | if (isa<TranslationUnitDecl>(DC->getRedeclContext())) { | ||||
if (auto *ND = dyn_cast<NamespaceDecl>(D)) | if (auto *ND = dyn_cast<NamespaceDecl>(D)) | ||||
if (const IdentifierInfo *II = ND->getIdentifier()) | if (const IdentifierInfo *II = ND->getIdentifier()) | ||||
if (II->isStr("std") || II->isStr("stdext")) | if (II->isStr("std") || II->isStr("stdext")) | ||||
return false; | return true; | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
return false; | |||||
} | } | ||||
bool CodeGenModule::HasHiddenLTOVisibility(const CXXRecordDecl *RD) { | |||||
LinkageInfo LV = RD->getLinkageAndVisibility(); | |||||
if (!isExternallyVisible(LV.getLinkage())) | |||||
return true; | return true; | ||||
if (RD->hasAttr<LTOVisibilityPublicAttr>() || RD->hasAttr<UuidAttr>()) | |||||
return false; | |||||
if (getTriple().isOSBinFormatCOFF()) { | |||||
if (RD->hasAttr<DLLExportAttr>() || RD->hasAttr<DLLImportAttr>()) | |||||
return false; | |||||
} else { | |||||
if (LV.getVisibility() != HiddenVisibility) | |||||
return false; | |||||
} | |||||
return !HasLTOVisibilityPublicStd(RD); | |||||
evgeny777: nit: return !HasLTOVisibilityPublicStd(RD) | |||||
} | } | ||||
llvm::GlobalObject::VCallVisibility | llvm::GlobalObject::VCallVisibility | ||||
CodeGenModule::GetVCallVisibilityLevel(const CXXRecordDecl *RD) { | CodeGenModule::GetVCallVisibilityLevel(const CXXRecordDecl *RD) { | ||||
LinkageInfo LV = RD->getLinkageAndVisibility(); | LinkageInfo LV = RD->getLinkageAndVisibility(); | ||||
llvm::GlobalObject::VCallVisibility TypeVis; | llvm::GlobalObject::VCallVisibility TypeVis; | ||||
if (!isExternallyVisible(LV.getLinkage())) | if (!isExternallyVisible(LV.getLinkage())) | ||||
TypeVis = llvm::GlobalObject::VCallVisibilityTranslationUnit; | TypeVis = llvm::GlobalObject::VCallVisibilityTranslationUnit; | ||||
▲ Show 20 Lines • Show All 87 Lines • Show Last 20 Lines |
nit: return !HasLTOVisibilityPublicStd(RD)