aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/InterfaceStub/IFSHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/InterfaceStub/IFSHandler.cpp')
-rw-r--r--llvm/lib/InterfaceStub/IFSHandler.cpp48
1 files changed, 34 insertions, 14 deletions
diff --git a/llvm/lib/InterfaceStub/IFSHandler.cpp b/llvm/lib/InterfaceStub/IFSHandler.cpp
index 4ccbb18ca04a..71189e79360e 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;
@@ -115,11 +118,12 @@ template <> struct MappingTraits<IFSSymbol> {
IO.mapRequired("Type", Symbol.Type);
// The need for symbol size depends on the symbol type.
if (Symbol.Type == IFSSymbolType::NoType) {
- IO.mapOptional("Size", Symbol.Size, (uint64_t)0);
- } else if (Symbol.Type == IFSSymbolType::Func) {
- Symbol.Size = 0;
- } else {
- IO.mapRequired("Size", Symbol.Size);
+ // Size is None, so we are reading it in, or it is non 0 so we
+ // should emit it.
+ if (!Symbol.Size || *Symbol.Size)
+ IO.mapOptional("Size", Symbol.Size);
+ } else if (Symbol.Type != IFSSymbolType::Func) {
+ IO.mapOptional("Size", Symbol.Size);
}
IO.mapOptional("Undefined", Symbol.Undefined, false);
IO.mapOptional("Weak", Symbol.Weak, false);
@@ -189,7 +193,7 @@ Expected<std::unique_ptr<IFSStub>> ifs::readIFSFromBuffer(StringRef Buf) {
std::make_error_code(std::errc::invalid_argument));
if (Stub->Target.ArchString) {
Stub->Target.Arch =
- ELF::convertArchNameToEMachine(Stub->Target.ArchString.getValue());
+ ELF::convertArchNameToEMachine(*Stub->Target.ArchString);
}
return std::move(Stub);
}
@@ -262,7 +266,7 @@ Error ifs::validateIFSTarget(IFSStub &Stub, bool ParseTriple) {
ValidationEC);
}
if (ParseTriple) {
- IFSTarget TargetFromTriple = parseTriple(Stub.Target.Triple.getValue());
+ IFSTarget TargetFromTriple = parseTriple(*Stub.Target.Triple);
Stub.Target.Arch = TargetFromTriple.Arch;
Stub.Target.BitWidth = TargetFromTriple.BitWidth;
Stub.Target.Endianness = TargetFromTriple.Endianness;
@@ -328,12 +332,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();
}