Mercurial > hg > CbC > CbC_llvm
diff clang/lib/Basic/ProfileList.cpp @ 236:c4bab56944e8 llvm-original
LLVM 16
author | kono |
---|---|
date | Wed, 09 Nov 2022 17:45:10 +0900 |
parents | 79ff65ed7e25 |
children | 1f2b6ac9f198 |
line wrap: on
line diff
--- a/clang/lib/Basic/ProfileList.cpp Wed Jul 21 10:27:27 2021 +0900 +++ b/clang/lib/Basic/ProfileList.cpp Wed Nov 09 17:45:10 2022 +0900 @@ -58,7 +58,7 @@ std::string Error; if (auto PSCL = create(Paths, VFS, Error)) return PSCL; - llvm::report_fatal_error(Error); + llvm::report_fatal_error(llvm::Twine(Error)); } } @@ -66,8 +66,7 @@ ProfileList::ProfileList(ArrayRef<std::string> Paths, SourceManager &SM) : SCL(ProfileSpecialCaseList::createOrDie( Paths, SM.getFileManager().getVirtualFileSystem())), - Empty(SCL->isEmpty()), - Default(SCL->hasPrefix("fun") || SCL->hasPrefix("src")), SM(SM) {} + Empty(SCL->isEmpty()), SM(SM) {} ProfileList::~ProfileList() = default; @@ -85,30 +84,66 @@ llvm_unreachable("Unhandled CodeGenOptions::ProfileInstrKind enum"); } -llvm::Optional<bool> +ProfileList::ExclusionType +ProfileList::getDefault(CodeGenOptions::ProfileInstrKind Kind) const { + StringRef Section = getSectionName(Kind); + // Check for "default:<type>" + if (SCL->inSection(Section, "default", "allow")) + return Allow; + if (SCL->inSection(Section, "default", "skip")) + return Skip; + if (SCL->inSection(Section, "default", "forbid")) + return Forbid; + // If any cases use "fun" or "src", set the default to FORBID. + if (SCL->hasPrefix("fun") || SCL->hasPrefix("src")) + return Forbid; + return Allow; +} + +llvm::Optional<ProfileList::ExclusionType> +ProfileList::inSection(StringRef Section, StringRef Prefix, + StringRef Query) const { + if (SCL->inSection(Section, Prefix, Query, "allow")) + return Allow; + if (SCL->inSection(Section, Prefix, Query, "skip")) + return Skip; + if (SCL->inSection(Section, Prefix, Query, "forbid")) + return Forbid; + if (SCL->inSection(Section, Prefix, Query)) + return Allow; + return None; +} + +llvm::Optional<ProfileList::ExclusionType> ProfileList::isFunctionExcluded(StringRef FunctionName, CodeGenOptions::ProfileInstrKind Kind) const { StringRef Section = getSectionName(Kind); + // Check for "function:<regex>=<case>" + if (auto V = inSection(Section, "function", FunctionName)) + return V; if (SCL->inSection(Section, "!fun", FunctionName)) - return true; + return Forbid; if (SCL->inSection(Section, "fun", FunctionName)) - return false; + return Allow; return None; } -llvm::Optional<bool> +llvm::Optional<ProfileList::ExclusionType> ProfileList::isLocationExcluded(SourceLocation Loc, CodeGenOptions::ProfileInstrKind Kind) const { return isFileExcluded(SM.getFilename(SM.getFileLoc(Loc)), Kind); } -llvm::Optional<bool> +llvm::Optional<ProfileList::ExclusionType> ProfileList::isFileExcluded(StringRef FileName, CodeGenOptions::ProfileInstrKind Kind) const { StringRef Section = getSectionName(Kind); + // Check for "source:<regex>=<case>" + if (auto V = inSection(Section, "source", FileName)) + return V; if (SCL->inSection(Section, "!src", FileName)) - return true; + return Forbid; if (SCL->inSection(Section, "src", FileName)) - return false; + return Allow; return None; }