diff options
author | woruyu <99597449+woruyu@users.noreply.github.com> | 2025-07-25 22:20:30 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-07-25 10:20:30 -0400 |
commit | 9d3dd8efe07180a6b261ae617ffc1ee5e26419c9 (patch) | |
tree | c392f3f8f1c182527a433bd4ff2027debf454f79 /clang/lib | |
parent | c1545b68bcba16c3d21fd3d0ee3bc4c92aa8d98f (diff) | |
download | llvm-9d3dd8efe07180a6b261ae617ffc1ee5e26419c9.zip llvm-9d3dd8efe07180a6b261ae617ffc1ee5e26419c9.tar.gz llvm-9d3dd8efe07180a6b261ae617ffc1ee5e26419c9.tar.bz2 |
fix: replace report_fatal_error with Diags and exit (#147959)
report_fatal_error is not a good way to report diagnostics to the users, so this switches to using actual diagnostic reporting mechanisms instead.
Fixes #147187
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/AST/ASTContext.cpp | 12 | ||||
-rw-r--r-- | clang/lib/Basic/NoSanitizeList.cpp | 13 | ||||
-rw-r--r-- | clang/lib/Basic/ProfileList.cpp | 10 | ||||
-rw-r--r-- | clang/lib/Basic/SanitizerSpecialCaseList.cpp | 11 | ||||
-rw-r--r-- | clang/lib/Driver/SanitizerArgs.cpp | 4 | ||||
-rw-r--r-- | clang/lib/Frontend/CompilerInstance.cpp | 1 |
6 files changed, 29 insertions, 22 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 6b6275f..c451c87 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -50,6 +50,7 @@ #include "clang/Basic/AddressSpaces.h" #include "clang/Basic/Builtins.h" #include "clang/Basic/CommentOptions.h" +#include "clang/Basic/DiagnosticFrontend.h" #include "clang/Basic/ExceptionSpecificationType.h" #include "clang/Basic/IdentifierTable.h" #include "clang/Basic/LLVM.h" @@ -944,7 +945,7 @@ ASTContext::ASTContext(LangOptions &LOpts, SourceManager &SM, DependentBitIntTypes(this_()), SubstTemplateTemplateParmPacks(this_()), DeducedTemplates(this_()), ArrayParameterTypes(this_()), CanonTemplateTemplateParms(this_()), SourceMgr(SM), LangOpts(LOpts), - NoSanitizeL(new NoSanitizeList(LangOpts.NoSanitizeFiles, SM)), + NoSanitizeL(new NoSanitizeList(SM)), XRayFilter(new XRayFunctionFilter(LangOpts.XRayAlwaysInstrumentFiles, LangOpts.XRayNeverInstrumentFiles, LangOpts.XRayAttrListFiles, SM)), @@ -1697,6 +1698,15 @@ ASTContext::getRelocationInfoForCXXRecord(const CXXRecordDecl *RD) const { return std::nullopt; } +void ASTContext::initSanitizers(const LangOptions &LangOpts, + SourceManager &SM) { + std::pair<unsigned, std::string> Error; + if (!NoSanitizeL->init(LangOpts.NoSanitizeFiles, Error)) { + SM.getDiagnostics().Report(diag::err_sanitize_ignorelist_failure) + << Error.first << Error.second; + } +} + void ASTContext::setRelocationInfoForCXXRecord( const CXXRecordDecl *RD, CXXRecordDeclRelocationInfo Info) { assert(RD); diff --git a/clang/lib/Basic/NoSanitizeList.cpp b/clang/lib/Basic/NoSanitizeList.cpp index 96f79fb..dc9ab83 100644 --- a/clang/lib/Basic/NoSanitizeList.cpp +++ b/clang/lib/Basic/NoSanitizeList.cpp @@ -19,11 +19,7 @@ using namespace clang; -NoSanitizeList::NoSanitizeList(const std::vector<std::string> &NoSanitizePaths, - SourceManager &SM) - : SSCL(SanitizerSpecialCaseList::createOrDie( - NoSanitizePaths, SM.getFileManager().getVirtualFileSystem())), - SM(SM) {} +NoSanitizeList::NoSanitizeList(SourceManager &SM) : SM(SM) {} NoSanitizeList::~NoSanitizeList() = default; @@ -42,6 +38,13 @@ bool NoSanitizeList::containsPrefix(SanitizerMask Mask, StringRef Prefix, return San == llvm::SpecialCaseList::NotFound || NoSan > San; } +bool NoSanitizeList::init(const std::vector<std::string> &Paths, + std::pair<unsigned, std::string> &Error) { + SSCL = SanitizerSpecialCaseList::create( + Paths, SM.getFileManager().getVirtualFileSystem(), Error); + return SSCL != nullptr; +} + bool NoSanitizeList::containsGlobal(SanitizerMask Mask, StringRef GlobalName, StringRef Category) const { return containsPrefix(Mask, "global", GlobalName, Category); diff --git a/clang/lib/Basic/ProfileList.cpp b/clang/lib/Basic/ProfileList.cpp index 8481def..2b9f88eb 100644 --- a/clang/lib/Basic/ProfileList.cpp +++ b/clang/lib/Basic/ProfileList.cpp @@ -26,7 +26,7 @@ class ProfileSpecialCaseList : public llvm::SpecialCaseList { public: static std::unique_ptr<ProfileSpecialCaseList> create(const std::vector<std::string> &Paths, llvm::vfs::FileSystem &VFS, - std::string &Error); + std::pair<unsigned, std::string> &Error); static std::unique_ptr<ProfileSpecialCaseList> createOrDie(const std::vector<std::string> &Paths, @@ -44,7 +44,8 @@ public: std::unique_ptr<ProfileSpecialCaseList> ProfileSpecialCaseList::create(const std::vector<std::string> &Paths, - llvm::vfs::FileSystem &VFS, std::string &Error) { + llvm::vfs::FileSystem &VFS, + std::pair<unsigned, std::string> &Error) { auto PSCL = std::make_unique<ProfileSpecialCaseList>(); if (PSCL->createInternal(Paths, VFS, Error)) return PSCL; @@ -54,10 +55,11 @@ ProfileSpecialCaseList::create(const std::vector<std::string> &Paths, std::unique_ptr<ProfileSpecialCaseList> ProfileSpecialCaseList::createOrDie(const std::vector<std::string> &Paths, llvm::vfs::FileSystem &VFS) { - std::string Error; + std::pair<unsigned, std::string> Error; if (auto PSCL = create(Paths, VFS, Error)) return PSCL; - llvm::report_fatal_error(llvm::Twine(Error)); + // TODO: add init function and use diagnose instead fo report_fatal_error + llvm::report_fatal_error(llvm::Twine(Error.second)); } } // namespace clang diff --git a/clang/lib/Basic/SanitizerSpecialCaseList.cpp b/clang/lib/Basic/SanitizerSpecialCaseList.cpp index f7bc1d5..c3729e9 100644 --- a/clang/lib/Basic/SanitizerSpecialCaseList.cpp +++ b/clang/lib/Basic/SanitizerSpecialCaseList.cpp @@ -18,7 +18,7 @@ using namespace clang; std::unique_ptr<SanitizerSpecialCaseList> SanitizerSpecialCaseList::create(const std::vector<std::string> &Paths, llvm::vfs::FileSystem &VFS, - std::string &Error) { + std::pair<unsigned, std::string> &Error) { std::unique_ptr<clang::SanitizerSpecialCaseList> SSCL( new SanitizerSpecialCaseList()); if (SSCL->createInternal(Paths, VFS, Error)) { @@ -28,15 +28,6 @@ SanitizerSpecialCaseList::create(const std::vector<std::string> &Paths, return nullptr; } -std::unique_ptr<SanitizerSpecialCaseList> -SanitizerSpecialCaseList::createOrDie(const std::vector<std::string> &Paths, - llvm::vfs::FileSystem &VFS) { - std::string Error; - if (auto SSCL = create(Paths, VFS, Error)) - return SSCL; - llvm::report_fatal_error(StringRef(Error)); -} - void SanitizerSpecialCaseList::createSanitizerSections() { for (auto &S : Sections) { SanitizerMask Mask; diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp index 21e4cff..aa767ae3 100644 --- a/clang/lib/Driver/SanitizerArgs.cpp +++ b/clang/lib/Driver/SanitizerArgs.cpp @@ -181,11 +181,11 @@ static void validateSpecialCaseListFormat(const Driver &D, if (SCLFiles.empty()) return; - std::string BLError; + std::pair<unsigned, std::string> BLError; std::unique_ptr<llvm::SpecialCaseList> SCL( llvm::SpecialCaseList::create(SCLFiles, D.getVFS(), BLError)); if (!SCL && DiagnoseErrors) - D.Diag(MalformedSCLErrorDiagID) << BLError; + D.Diag(MalformedSCLErrorDiagID) << BLError.first << BLError.second; } static void addDefaultIgnorelists(const Driver &D, SanitizerMask Kinds, diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp index c7b82db..bbb856b 100644 --- a/clang/lib/Frontend/CompilerInstance.cpp +++ b/clang/lib/Frontend/CompilerInstance.cpp @@ -554,6 +554,7 @@ void CompilerInstance::createASTContext() { PP.getBuiltinInfo(), PP.TUKind); Context->InitBuiltinTypes(getTarget(), getAuxTarget()); setASTContext(Context); + Context->initSanitizers(getLangOpts(), PP.getSourceManager()); } // ExternalASTSource |