diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2016-04-28 17:09:37 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2016-04-28 17:09:37 +0000 |
commit | 3afb26688656fbdc37d43fc938d89fe936bb579c (patch) | |
tree | e5b515efb2ff87896a2df297607e79d39dea08e6 /clang/lib/CodeGen/CGVTables.cpp | |
parent | f730de619f90706e4bb9dccbc109559ba7585207 (diff) | |
download | bcm5719-llvm-3afb26688656fbdc37d43fc938d89fe936bb579c.tar.gz bcm5719-llvm-3afb26688656fbdc37d43fc938d89fe936bb579c.zip |
Re-apply r267784, r267824 and r267830.
I have updated the compiler-rt tests.
llvm-svn: 267903
Diffstat (limited to 'clang/lib/CodeGen/CGVTables.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGVTables.cpp | 57 |
1 files changed, 31 insertions, 26 deletions
diff --git a/clang/lib/CodeGen/CGVTables.cpp b/clang/lib/CodeGen/CGVTables.cpp index f139e2c8504..478164e273b 100644 --- a/clang/lib/CodeGen/CGVTables.cpp +++ b/clang/lib/CodeGen/CGVTables.cpp @@ -902,34 +902,43 @@ void CodeGenModule::EmitDeferredVTables() { DeferredVTables.clear(); } -bool CodeGenModule::NeedVTableBitSets() { - return getCodeGenOpts().WholeProgramVTables || - getLangOpts().Sanitize.has(SanitizerKind::CFIVCall) || - getLangOpts().Sanitize.has(SanitizerKind::CFINVCall) || - getLangOpts().Sanitize.has(SanitizerKind::CFIDerivedCast) || - getLangOpts().Sanitize.has(SanitizerKind::CFIUnrelatedCast); -} +bool CodeGenModule::HasHiddenLTOVisibility(const CXXRecordDecl *RD) { + LinkageInfo LV = RD->getLinkageAndVisibility(); + if (!isExternallyVisible(LV.getLinkage())) + return true; -bool CodeGenModule::IsBitSetBlacklistedRecord(const CXXRecordDecl *RD) { - std::string TypeName = RD->getQualifiedNameAsString(); - auto isInBlacklist = [&](const SanitizerBlacklist &BL) { - if (RD->hasAttr<UuidAttr>() && BL.isBlacklistedType("attr:uuid")) - return true; + if (RD->hasAttr<LTOVisibilityPublicAttr>() || RD->hasAttr<UuidAttr>()) + return false; - return BL.isBlacklistedType(TypeName); - }; + if (getTriple().isOSBinFormatCOFF()) { + if (RD->hasAttr<DLLExportAttr>() || RD->hasAttr<DLLImportAttr>()) + return false; + } else { + if (LV.getVisibility() != HiddenVisibility) + return false; + } - return isInBlacklist(WholeProgramVTablesBlacklist) || - ((LangOpts.Sanitize.has(SanitizerKind::CFIVCall) || - LangOpts.Sanitize.has(SanitizerKind::CFINVCall) || - LangOpts.Sanitize.has(SanitizerKind::CFIDerivedCast) || - LangOpts.Sanitize.has(SanitizerKind::CFIUnrelatedCast)) && - isInBlacklist(getContext().getSanitizerBlacklist())); + if (getCodeGenOpts().LTOVisibilityPublicStd) { + const DeclContext *DC = RD; + while (1) { + auto *D = cast<Decl>(DC); + DC = DC->getParent(); + if (isa<TranslationUnitDecl>(DC->getRedeclContext())) { + if (auto *ND = dyn_cast<NamespaceDecl>(D)) + if (const IdentifierInfo *II = ND->getIdentifier()) + if (II->isStr("std") || II->isStr("stdext")) + return false; + break; + } + } + } + + return true; } void CodeGenModule::EmitVTableBitSetEntries(llvm::GlobalVariable *VTable, const VTableLayout &VTLayout) { - if (!NeedVTableBitSets()) + if (!getCodeGenOpts().PrepareForLTO) return; CharUnits PointerWidth = @@ -938,12 +947,8 @@ void CodeGenModule::EmitVTableBitSetEntries(llvm::GlobalVariable *VTable, typedef std::pair<const CXXRecordDecl *, unsigned> BSEntry; std::vector<BSEntry> BitsetEntries; // Create a bit set entry for each address point. - for (auto &&AP : VTLayout.getAddressPoints()) { - if (IsBitSetBlacklistedRecord(AP.first.getBase())) - continue; - + for (auto &&AP : VTLayout.getAddressPoints()) BitsetEntries.push_back(std::make_pair(AP.first.getBase(), AP.second)); - } // Sort the bit set entries for determinism. std::sort(BitsetEntries.begin(), BitsetEntries.end(), |