diff --git a/llvm/test/Object/Inputs/tapi-invalid-v1.tbd b/llvm/test/Object/Inputs/tapi-invalid-v1.tbd new file mode 100644 --- /dev/null +++ b/llvm/test/Object/Inputs/tapi-invalid-v1.tbd @@ -0,0 +1,21 @@ +--- !tapi-tbd-v1 + +archs: [ armv7, armv7s, arm64 ] + +platform: ios +install-name: /u/l/libfoo.dylib +current-version: 1.2.3 +compatibility-version: 1.0 +swift-version: 0 +objc-constraint: none +expors: + - archs: [ arm64, armv7 ] + allowed-clients: [ client ] + re-exports: [ ] + symbols: [ _sym, _test, _a, _b, ] + objc-classes: [] + objc-ivars: [] + + weak-def-symbols: [] + thread-local-symbols: [] +... diff --git a/llvm/test/Object/Inputs/tapi-invalid-v2.tbd b/llvm/test/Object/Inputs/tapi-invalid-v2.tbd new file mode 100644 --- /dev/null +++ b/llvm/test/Object/Inputs/tapi-invalid-v2.tbd @@ -0,0 +1,29 @@ +--- !tapi-tbd-v2 +uuids: [ "armv7: 00000000-0000-0000-0000-000000000000", + "armv7s: 11111111-1111-1111-1111-111111111111", + "arm64: 22222222-2222-2222-2222-222222222222" ] +platform: ios +flags: [ installapi ] +install-name: /u/l/libfoo.dylib +current-version: 1.2.3 +compatibility-version: 1.0 +swift-version: 0 +objc-constraint: retain_release +parent-umbrella: Umbrella.dylib +exports: + - archs: [ armv7, armv7s, arm64 ] + allowable-clients: [ client ] + re-exports: [ ] + symbols: [ _sym1, _sym2, _sym3 ] + objc-classes: [] + objc-ivars: [] + + weak-def-symbols: [] + thread-local-symbols: [] +undefineds: + - archs: [ arm64 ] + symbols: [ _sym ] + objc-classes: [] + objc-ivars: [] + weak-ref-symbols: [] +... diff --git a/llvm/test/Object/Inputs/tapi-invalid-v3.tbd b/llvm/test/Object/Inputs/tapi-invalid-v3.tbd new file mode 100644 --- /dev/null +++ b/llvm/test/Object/Inputs/tapi-invalid-v3.tbd @@ -0,0 +1,24 @@ +--- !tapi-tbd-v3 +archs: [ i386, armv7, armv7s ] +platform: ios +install-name: /usr/lib/libfoo.dylib +swift-abi-version: 3 +exports: + - archs: [ i386, armv7, armv7s ] + re-exports: [ /usr/lib/external/liba.dylib ] + symbols: [ _sym1, _sym2 ] + objc-classes: [ NSString, NSBlockPredicate ] + objc-eh-types: [ NSString ] + objc-ivars: [ NSBlockPredicate._block ] + - archs: [ i386 ] + symbols: [ _sym3 ] +--- !tapi-tbd-v3 +archs: [ armv7, armv7s ] +platform: ios +install-name: /usr/lib/liba.dylib +swift-version: 3 +exports: + - archs: [ armv7, armv7s ] + re-exports: [ /usr/lib/internal/liba.dylib ] + symbols: [ _sym10, _sym11 ] +... diff --git a/llvm/test/Object/Inputs/tapi-v1.tbd b/llvm/test/Object/Inputs/tapi-v1.tbd new file mode 100644 --- /dev/null +++ b/llvm/test/Object/Inputs/tapi-v1.tbd @@ -0,0 +1,21 @@ +--- !tapi-tbd-v1 + +archs: [ armv7, armv7s ] + +platform: ios +install-name: /u/l/libfoo.dylib +current-version: 1.2.3 +compatibility-version: 1.0 +swift-version: 0 +objc-constraint: none +exports: + - archs: [ armv7 ] + allowed-clients: [ client ] + re-exports: [ ] + symbols: [ _sym, ] + objc-classes: [] + objc-ivars: [] + + weak-def-symbols: [] + thread-local-symbols: [_sym] +... diff --git a/llvm/test/Object/Inputs/tapi-v2.tbd b/llvm/test/Object/Inputs/tapi-v2.tbd new file mode 100644 --- /dev/null +++ b/llvm/test/Object/Inputs/tapi-v2.tbd @@ -0,0 +1,30 @@ +--- !tapi-tbd-v2 +archs: [ armv7, armv7s, arm64 ] +uuids: [ "armv7: 00000000-0000-0000-0000-000000000000", + "armv7s: 11111111-1111-1111-1111-111111111111", + "arm64: 22222222-2222-2222-2222-222222222222" ] +platform: ios +flags: [ installapi ] +install-name: /u/l/libfoo.dylib +current-version: 1.2.3 +compatibility-version: 1.0 +swift-version: 0 +objc-constraint: retain_release +parent-umbrella: Umbrella.dylib +exports: + - archs: [ armv7, armv7s, arm64 ] + allowable-clients: [ client ] + re-exports: [ ] + symbols: [ _sym1, _sym2, _sym3 ] + objc-classes: [] + objc-ivars: [] + + weak-def-symbols: [] + thread-local-symbols: [] +undefineds: + - archs: [ arm64 ] + symbols: [ _sym ] + objc-classes: [] + objc-ivars: [] + weak-ref-symbols: [] +... diff --git a/llvm/test/Object/Inputs/tapi-v3.tbd b/llvm/test/Object/Inputs/tapi-v3.tbd new file mode 100644 --- /dev/null +++ b/llvm/test/Object/Inputs/tapi-v3.tbd @@ -0,0 +1,24 @@ +--- !tapi-tbd-v3 +archs: [ i386, armv7, armv7s ] +platform: ios +install-name: /usr/lib/libfoo.dylib +swift-abi-version: 3 +exports: + - archs: [ i386, armv7, armv7s ] + re-exports: [ /usr/lib/external/liba.dylib ] + symbols: [ _sym1, _sym2 ] + objc-classes: [ NSString, NSBlockPredicate ] + objc-eh-types: [ NSString ] + objc-ivars: [ NSBlockPredicate._block ] + - archs: [ i386 ] + symbols: [ _sym3 ] +--- !tapi-tbd-v3 +archs: [ armv7, armv7s ] +platform: ios +install-name: /usr/lib/liba.dylib +swift-abi-version: 3 +exports: + - archs: [ armv7, armv7s ] + re-exports: [ /usr/lib/internal/liba.dylib ] + symbols: [ _sym10, _sym11 ] +... diff --git a/llvm/test/Object/nm-tapi-invalids.test b/llvm/test/Object/nm-tapi-invalids.test new file mode 100644 --- /dev/null +++ b/llvm/test/Object/nm-tapi-invalids.test @@ -0,0 +1,21 @@ +RUN: not llvm-nm %p/Inputs/tapi-invalid-v1.tbd 2>&1\ +RUN: | Filecheck %s -check-prefix v1 + +RUN: not llvm-nm %p/Inputs/tapi-invalid-v2.tbd 2>&1\ +RUN: | Filecheck %s -check-prefix v2 + +RUN: not llvm-nm %p/Inputs/tapi-invalid-v3.tbd 2>&1\ +RUN: | Filecheck %s -check-prefix v3 + +# Typo Check +v1: tapi-invalid-v1.tbd malformed file +v1: tapi-invalid-v1.tbd:12:2: error: unknown key 'expors' + +# Missing required key +v2: tapi-invalid-v2.tbd malformed file +v2: tapi-invalid-v2.tbd:2:1: error: missing required key 'archs' + +# v2 key in v3 specified file +v3: tapi-invalid-v3.tbd malformed file +v3: tapi-invalid-v3.tbd:19:16: error: unknown key 'swift-version' + diff --git a/llvm/test/Object/nm-tapi.test b/llvm/test/Object/nm-tapi.test new file mode 100644 --- /dev/null +++ b/llvm/test/Object/nm-tapi.test @@ -0,0 +1,56 @@ +RUN: llvm-nm %p/Inputs/tapi-v1.tbd 2>&1\ +RUN: | Filecheck %s -check-prefix v1 + +RUN: llvm-nm %p/Inputs/tapi-v2.tbd \ +RUN: | Filecheck %s -check-prefix v2 + +RUN: llvm-nm %p/Inputs/tapi-v3.tbd \ +RUN: | Filecheck %s -check-prefix v3 + +v1: no symbols +v1: tapi-v1.tbd (for architecture armv7): +v1: 00000000 S _sym +v1: tapi-v1.tbd (for architecture armv7s): + +v2: tapi-v2.tbd (for architecture armv7): +v2: 00000000 S _sym1 +v2: 00000000 S _sym2 +v2: 00000000 S _sym3 +v2: tapi-v2.tbd (for architecture armv7s): +v2: 00000000 S _sym1 +v2: 00000000 S _sym2 +v2: 00000000 S _sym3 +v2: tapi-v2.tbd (for architecture arm64): +v2: U _sym +v2: 00000000 S _sym1 +v2: 00000000 S _sym2 +v2: 00000000 S _sym3 + +v3: tapi-v3.tbd (for architecture i386): +v3: 00000000 S _OBJC_CLASS_$_NSBlockPredicate +v3: 00000000 S _OBJC_CLASS_$_NSString +v3: 00000000 S _OBJC_EHTYPE_$_NSString +v3: 00000000 S _OBJC_IVAR_$_NSBlockPredicate._block +v3: 00000000 S _OBJC_METACLASS_$_NSBlockPredicate +v3: 00000000 S _OBJC_METACLASS_$_NSString +v3: 00000000 S _sym1 +v3: 00000000 S _sym2 +v3: 00000000 S _sym3 +v3: tapi-v3.tbd (for architecture armv7): +v3: 00000000 S _OBJC_CLASS_$_NSBlockPredicate +v3: 00000000 S _OBJC_CLASS_$_NSString +v3: 00000000 S _OBJC_EHTYPE_$_NSString +v3: 00000000 S _OBJC_IVAR_$_NSBlockPredicate._block +v3: 00000000 S _OBJC_METACLASS_$_NSBlockPredicate +v3: 00000000 S _OBJC_METACLASS_$_NSString +v3: 00000000 S _sym1 +v3: 00000000 S _sym2 +v3: tapi-v3.tbd (for architecture armv7s): +v3: 00000000 S _OBJC_CLASS_$_NSBlockPredicate +v3: 00000000 S _OBJC_CLASS_$_NSString +v3: 00000000 S _OBJC_EHTYPE_$_NSString +v3: 00000000 S _OBJC_IVAR_$_NSBlockPredicate._block +v3: 00000000 S _OBJC_METACLASS_$_NSBlockPredicate +v3: 00000000 S _OBJC_METACLASS_$_NSString +v3: 00000000 S _sym1 +v3: 00000000 S _sym2 diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -28,6 +28,8 @@ #include "llvm/Object/MachO.h" #include "llvm/Object/MachOUniversal.h" #include "llvm/Object/ObjectFile.h" +#include "llvm/Object/TapiFile.h" +#include "llvm/Object/TapiUniversal.h" #include "llvm/Object/Wasm.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" @@ -336,6 +338,8 @@ return false; if (isa(Obj)) return false; + if (isa(Obj)) + return false; if (MachOObjectFile *MachO = dyn_cast(&Obj)) return MachO->is64Bit(); return cast(Obj).getBytesInAddress() == 8; @@ -1035,6 +1039,10 @@ return '?'; } +static char getSymbolNMTypeChar(TapiFile &Obj, basic_symbol_iterator I) { + return 's'; +} + static char getSymbolNMTypeChar(WasmObjectFile &Obj, basic_symbol_iterator I) { uint32_t Flags = I->getFlags(); if (Flags & SymbolRef::SF_Executable) @@ -1119,6 +1127,8 @@ Ret = getSymbolNMTypeChar(*MachO, I); else if (WasmObjectFile *Wasm = dyn_cast(&Obj)) Ret = getSymbolNMTypeChar(*Wasm, I); + else if (TapiFile *Tapi = dyn_cast(&Obj)) + Ret = getSymbolNMTypeChar(*Tapi, I); else Ret = getSymbolNMTypeChar(cast(Obj), I); @@ -2040,6 +2050,26 @@ } return; } + + if (TapiUniversal *TU = dyn_cast(&Bin)) { + for (auto &I : TU->objects()) { + auto ObjOrErr = I.getAsObjectFile(); + if (ObjOrErr) { + auto &Obj = *ObjOrErr.get(); + outs() << "\n" + << Obj.getFileName() << " (for architecture " + << I.getArchFlagName() << ")" + << ":\n"; + dumpSymbolNamesFromObject(Obj, false, {}, I.getArchFlagName()); + } else if (auto E = + isNotObjectErrorInvalidFileType(ObjOrErr.takeError())) { + error(std::move(E), Filename, I.getArchFlagName()); + } + } + + return; + } + if (SymbolicFile *O = dyn_cast(&Bin)) { if (!MachOPrintSizeWarning && PrintSize && isa(O)) { WithColor::warning(errs(), ToolName)