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,9 @@ void stripIFSTarget(IFSStub &Stub, bool StripTriple, bool StripArch, bool StripEndianness, bool StripBitWidth); +/// Strips symbols from IFS symbol table that are undefined. +void stripIFSUndefinedSymbols(IFSStub &Stub); + /// 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,13 @@ Stub.Target.ObjectFormat.reset(); } } + +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++; + } + } +} diff --git a/llvm/test/tools/llvm-ifs/strip-undefined-symbols.test b/llvm/test/tools/llvm-ifs/strip-undefined-symbols.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-ifs/strip-undefined-symbols.test @@ -0,0 +1,17 @@ +# RUN: llvm-ifs --input-format=ELF --strip-undefined --output-format=IFS --output=- %p/Inputs/gnu_hash.so | FileCheck %s + +# CHECK: --- !ifs-v1 +# CHECK-NEXT: IfsVersion: 3.0 +# CHECK-NEXT: SoName: libsomething.so +# CHECK-NEXT: Target: { ObjectFormat: ELF, Arch: x86_64, Endianness: little, BitWidth: 64 } +# CHECK-NEXT: NeededLibs: +# CHECK-NEXT: - libm.so.6 +# CHECK-NEXT: - libc.so.6 +# CHECK-NEXT: - ld-linux-x86-64.so.2 +# CHECK-NEXT: Symbols: +# CHECK-NEXT: - { Name: AGlobalInteger, Type: Object, Size: 4 } +# CHECK-NEXT: - { Name: AThreadLocalLongInteger, Type: TLS, Size: 8 } +# CHECK-NEXT: - { Name: _Z11rotateArrayPii, Type: Func } +# CHECK-NEXT: - { Name: _fini, Type: Func } +# CHECK-NEXT: - { Name: _init, Type: Func } +# CHECK-NEXT: ... 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 @@ -99,6 +99,11 @@ "strip-ifs-target", cl::desc("Strip all target information away from IFS output"), cl::cat(IfsCategory)); +cl::opt + StripUndefined("strip-undefined", + cl::desc("Strip undefined symbols from IFS output"), + cl::cat(IfsCategory)); + cl::opt SoName("soname", cl::desc("Manually set the DT_SONAME entry of any emitted files"), @@ -443,6 +448,8 @@ stripIFSTarget(Stub, StripIFSTarget, StripIFSArch, StripIFSEndiannessWidth, StripIFSBitWidth); } + if (StripUndefined) + stripIFSUndefinedSymbols(Stub); Error IFSWriteError = writeIFS(OutputFilePath.getValue(), Stub); if (IFSWriteError) fatalError(std::move(IFSWriteError));