diff --git a/llvm/docs/CommandGuide/llvm-nm.rst b/llvm/docs/CommandGuide/llvm-nm.rst --- a/llvm/docs/CommandGuide/llvm-nm.rst +++ b/llvm/docs/CommandGuide/llvm-nm.rst @@ -126,6 +126,16 @@ Use BSD output format. Alias for ``--format=bsd``. +.. option:: --bit-mode, -X + + Specifies the type of object file llvm-nm should examine. The mode must be one of the following: + 32 + Processes only 32-bit object files. + 64 + Processes only 64-bit object files. + any + Processes all of the supported object files. + .. option:: --debug-syms, -a Show all symbols, even those usually suppressed. diff --git a/llvm/test/tools/llvm-nm/XCOFF/option-bit-mode.test b/llvm/test/tools/llvm-nm/XCOFF/option-bit-mode.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-nm/XCOFF/option-bit-mode.test @@ -0,0 +1,77 @@ +## Test the option "--bit-mode" and "-X" of llvm-nm. +## The option specifies the type of object file llvm-nm should examine. + +# RUN: yaml2obj --docnum=1 %s -o %t32.o +# RUN: yaml2obj --docnum=2 %s -o %t64.o + +# RUN: llvm-nm --bit-mode=32 %t32.o | FileCheck --check-prefixes=BIT32 %s --implicit-check-not={{.}} +# RUN: llvm-nm -X32 %t32.o | FileCheck --check-prefixes=BIT32 %s --implicit-check-not={{.}} +# BIT32: 00000000 D var32 + +# RUN: llvm-nm --bit-mode=64 %t64.o | FileCheck --check-prefixes=BIT64 %s --implicit-check-not={{.}} +# RUN: llvm-nm -X64 %t64.o | FileCheck --check-prefixes=BIT64 %s --implicit-check-not={{.}} +# BIT64: 0000000000000000 D var64 + +# RUN: llvm-nm %t32.o %t64.o | FileCheck --check-prefixes=ANY %s -DFILE32=%t32.o -DFILE64=%t64.o +# RUN: llvm-nm -Xany %t32.o %t64.o | FileCheck --check-prefixes=ANY %s -DFILE32=%t32.o -DFILE64=%t64.o +# RUN: llvm-nm --bit-mode=any %t32.o %t64.o | FileCheck --check-prefixes=ANY %s -DFILE32=%t32.o -DFILE64=%t64.o + +# ANY: [[FILE32]]: +# ANY-NEXT: 00000000 D var32 +# ANY: [[FILE64]]: +# ANY-NEXT: 0000000000000000 D var64 + +# RUN: llvm-nm --bit-mode=64 %t32.o | FileCheck %s --implicit-check-not={{.*}}} --allow-empty +# RUN: llvm-nm -X64 %t32.o | FileCheck %s --implicit-check-not={{.*}}} --allow-empty +# RUN: llvm-nm --bit-mode=32 %t32.o | FileCheck %s --implicit-check-not={{.*}}} --allow-empty +# RUN: llvm-nm -X32 %t32.o | FileCheck %s --implicit-check-not={{.*}}} --allow-empty + + +--- !XCOFF +FileHeader: + MagicNumber: 0x1DF + Flags: 0x0002 +AuxiliaryHeader: + Magic: 0x10B + Version: 0x2 + TextSectionSize: 0x280 + DataSectionSize: 0x90 +Sections: + - Name: .text + Flags: [ STYP_TEXT ] + - Name: .data + Flags: [ STYP_DATA ] +Symbols: + - Name: var32 + Section: .data + Type: 0x4000 + StorageClass: C_EXT + AuxEntries: + - Type: AUX_CSECT + SymbolAlignmentAndType: 0x09 + StorageMappingClass: XMC_RW + + +--- !XCOFF +FileHeader: + MagicNumber: 0x1F7 + Flags: 0x0002 +AuxiliaryHeader: + Magic: 0x10B + Version: 0x2 + TextSectionSize: 0x280 + DataSectionSize: 0x90 +Sections: + - Name: .text + Flags: [ STYP_TEXT ] + - Name: .data + Flags: [ STYP_DATA ] +Symbols: + - Name: var64 + Section: .data + Type: 0x3000 + StorageClass: C_EXT + AuxEntries: + - Type: AUX_CSECT + SymbolAlignmentAndType: 0x09 + StorageMappingClass: XMC_RW diff --git a/llvm/tools/llvm-nm/Opts.td b/llvm/tools/llvm-nm/Opts.td --- a/llvm/tools/llvm-nm/Opts.td +++ b/llvm/tools/llvm-nm/Opts.td @@ -13,6 +13,7 @@ def : Separate<["--"], name>, Alias(NAME #_EQ)>; } +defm bit_mode : Eq<"bit-mode", "Specifies the type of object file llvm-nm should examine. The bit-mode must be one of : 32, 64 ,any(default)">; def debug_syms : FF<"debug-syms", "Show all symbols, even debugger only">; def defined_only : FF<"defined-only", "Show only defined symbols">; defm demangle : BB<"demangle", "Demangle C++ symbol names", "Don't demangle symbol names">; @@ -81,3 +82,4 @@ def : F<"v", "Alias for --numeric-sort">, Alias; def : F<"V", "Alias for --version">, Alias; def : F<"W", "Deprecated alias for --no-weak">, Alias, Flags<[HelpHidden]>; +def : JoinedOrSeparate<["-"], "X">, HelpText<"Alias for --bit-mode">, Alias; 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 @@ -85,9 +85,11 @@ }; enum OutputFormatTy { bsd, sysv, posix, darwin, just_symbols }; +enum BitModeTy { Bit32, Bit64, Any }; } // namespace static bool ArchiveMap; +static BitModeTy BitMode = Any; static bool DebugSyms; static bool DefinedOnly; static bool Demangle; @@ -1781,9 +1783,17 @@ } } +static bool doesNeedToDump(SymbolicFile &Obj) { + if ((isSymbolList64Bit(Obj) && BitMode == Bit32) || + (!isSymbolList64Bit(Obj) && BitMode == Bit64)) + return false; + return true; +} static void dumpSymbolNamesFromObject(SymbolicFile &Obj, bool printName, StringRef ArchiveName = {}, StringRef ArchitectureName = {}) { + if (!doesNeedToDump(Obj)) + return; auto Symbols = Obj.symbols(); std::vector SymbolVersions; if (DynamicSyms) { @@ -2309,6 +2319,18 @@ else error("--format value should be one of: bsd, posix, sysv, darwin, " "just-symbols"); + + StringRef Mode = Args.getLastArgValue(OPT_bit_mode_EQ, "any"); + if (Mode == "32") + BitMode = Bit32; + else if (Mode == "64") + BitMode = Bit64; + else if (Mode == "any") + BitMode = Any; + else + error( + "--bitmode value should be one of: 32,64,any, using default(any) now"); + NoLLVMBitcode = Args.hasArg(OPT_no_llvm_bc); NoSort = Args.hasArg(OPT_no_sort); NoWeakSymbols = Args.hasArg(OPT_no_weak);