diff --git a/llvm/include/llvm/InterfaceStub/IFSHandler.h b/llvm/include/llvm/InterfaceStub/IFSHandler.h --- a/llvm/include/llvm/InterfaceStub/IFSHandler.h +++ b/llvm/include/llvm/InterfaceStub/IFSHandler.h @@ -51,6 +51,10 @@ void stripIFSTarget(IFSStub &Stub, bool StripTriple, bool StripArch, bool StripEndianness, bool StripBitWidth); +/// Strips symbols from IFS symbol table based on the type and attributes. +void stripIFSSymbols(IFSStub &Stub, IFSSymbolType Type, bool Undefined, + bool Weak); + /// Parse llvm triple string into a IFSTarget struct. IFSTarget parseTriple(StringRef TripleStr); diff --git a/llvm/lib/InterfaceStub/IFSHandler.cpp b/llvm/lib/InterfaceStub/IFSHandler.cpp --- a/llvm/lib/InterfaceStub/IFSHandler.cpp +++ b/llvm/lib/InterfaceStub/IFSHandler.cpp @@ -327,3 +327,16 @@ Stub.Target.ObjectFormat.reset(); } } + +void ifs::stripIFSSymbols(IFSStub &Stub, IFSSymbolType Type, bool Undefined, + bool Weak) { + std::vector::iterator it = Stub.Symbols.begin(); + while (it != Stub.Symbols.end()) { + if ((Type != IFSSymbolType::Unknown && Type == it->Type) || + (Undefined && it->Undefined) || (Weak && it->Weak)) { + Stub.Symbols.erase(it); + } else { + it++; + } + } +} diff --git a/llvm/tools/llvm-ifs/llvm-ifs.cpp b/llvm/tools/llvm-ifs/llvm-ifs.cpp --- a/llvm/tools/llvm-ifs/llvm-ifs.cpp +++ b/llvm/tools/llvm-ifs/llvm-ifs.cpp @@ -87,6 +87,9 @@ cl::opt StripIFSTarget( "strip-ifs-target", cl::desc("Strip all target information away from IFS output")); +cl::opt + StripUndefinedSymbol("strip-undefined-symbol", + cl::desc("Strip undefined symbols from IFS output")); cl::opt SoName("soname", cl::desc("Manually set the DT_SONAME entry of any emitted files"), @@ -428,6 +431,9 @@ stripIFSTarget(Stub, StripIFSTarget, StripIFSArch, StripIFSEndiannessWidth, StripIFSBitWidth); } + if (StripUndefinedSymbol) { + stripIFSSymbols(Stub, IFSSymbolType::Unknown, true, false); + } Error IFSWriteError = writeIFS(OutputFilePath.getValue(), Stub); if (IFSWriteError) fatalError(std::move(IFSWriteError));