diff options
author | Alex Brachet <abrachet@google.com> | 2022-02-18 19:13:55 +0000 |
---|---|---|
committer | Alex Brachet <abrachet@google.com> | 2022-02-18 19:14:34 +0000 |
commit | 1e116867dbc84ebc6e7165996a8bbef7261c3ccd (patch) | |
tree | d9d29c6a886a9b97c42ae8a46420a5c08bbad2a0 /llvm/lib/InterfaceStub | |
parent | ff2e4c04c46a9173489a6aa7dd70b804105f4d03 (diff) | |
download | llvm-1e116867dbc84ebc6e7165996a8bbef7261c3ccd.zip llvm-1e116867dbc84ebc6e7165996a8bbef7261c3ccd.tar.gz llvm-1e116867dbc84ebc6e7165996a8bbef7261c3ccd.tar.bz2 |
[ifs] Add --exclude flag
Use to remove certain symbols which match the glob pattern. Can be used with --strip-undefined
Reviewed By: haowei, mcgrathr
Differential Revision: https://reviews.llvm.org/D119962
Diffstat (limited to 'llvm/lib/InterfaceStub')
-rw-r--r-- | llvm/lib/InterfaceStub/IFSHandler.cpp | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/llvm/lib/InterfaceStub/IFSHandler.cpp b/llvm/lib/InterfaceStub/IFSHandler.cpp index 4ccbb18..92c8830 100644 --- a/llvm/lib/InterfaceStub/IFSHandler.cpp +++ b/llvm/lib/InterfaceStub/IFSHandler.cpp @@ -7,14 +7,17 @@ //===-----------------------------------------------------------------------===/ #include "llvm/InterfaceStub/IFSHandler.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/ADT/Triple.h" #include "llvm/BinaryFormat/ELF.h" #include "llvm/InterfaceStub/IFSStub.h" #include "llvm/Support/Error.h" +#include "llvm/Support/GlobPattern.h" #include "llvm/Support/LineIterator.h" #include "llvm/Support/YAMLTraits.h" +#include <functional> using namespace llvm; using namespace llvm::ifs; @@ -328,12 +331,28 @@ void ifs::stripIFSTarget(IFSStub &Stub, bool StripTriple, bool StripArch, } } -void ifs::stripIFSUndefinedSymbols(IFSStub &Stub) { - for (auto Iter = Stub.Symbols.begin(); Iter != Stub.Symbols.end();) { - if (Iter->Undefined) { - Iter = Stub.Symbols.erase(Iter); - } else { - Iter++; - } +Error ifs::filterIFSSyms(IFSStub &Stub, bool StripUndefined, + const std::vector<std::string> &Exclude) { + std::function<bool(const IFSSymbol &)> Filter = [](const IFSSymbol &) { + return false; + }; + + if (StripUndefined) { + Filter = [Filter](const IFSSymbol &Sym) { + return Sym.Undefined || Filter(Sym); + }; + } + + for (StringRef Glob : Exclude) { + Expected<llvm::GlobPattern> PatternOrErr = llvm::GlobPattern::create(Glob); + if (!PatternOrErr) + return PatternOrErr.takeError(); + Filter = [Pattern = *PatternOrErr, Filter](const IFSSymbol &Sym) { + return Pattern.match(Sym.Name) || Filter(Sym); + }; } + + llvm::erase_if(Stub.Symbols, Filter); + + return Error::success(); } |