Index: test/tools/llvm-nm/X86/filename.test =================================================================== --- /dev/null +++ test/tools/llvm-nm/X86/filename.test @@ -0,0 +1,100 @@ +# RUN: llvm-nm -j -no-file-header \ +# RUN: %p/../../../Object/Inputs/macho-universal-archive.x86_64.i386 \ +# RUN: | FileCheck %s + +# RUN: llvm-nm -j \ +# RUN: %p/../../../Object/Inputs/macho-universal-archive.x86_64.i386 \ +# RUN: | FileCheck --check-prefix CHECK-FILE %s + +# RUN: llvm-nm -arch x86_64 -j -no-file-header \ +# RUN: %p/../../../Object/Inputs/macho-universal-archive.x86_64.i386 \ +# RUN: | FileCheck --check-prefix CHECK-X86_64 %s + +# RUN: llvm-nm -arch all -j -no-file-header \ +# RUN: %p/../../../Object/Inputs/macho-universal-archive.x86_64.i386 \ +# RUN: | FileCheck --check-prefix CHECK-ALL %s + +# RUN: llvm-nm -arch i386 -arch x86_64 -j -no-file-header \ +# RUN: %p/../../../Object/Inputs/macho-universal.x86_64.i386 \ +# RUN: | FileCheck --check-prefix CHECK-UNIVERSAL-OBJECTS %s + +# RUN: llvm-nm -arch all -j -no-file-header \ +# RUN: %p/../../../Object/Inputs/macho-universal.x86_64.i386 \ +# RUN: | FileCheck --check-prefix CHECK-ALL-UNIVERSAL-OBJECTS %s + +# RUN: llvm-nm -j -no-file-header \ +# RUN: %p/Inputs/libExample.a.macho-x86_64 \ +# RUN: | FileCheck --check-prefix CHECK-ARCHIVE %s + +# RUN: llvm-nm -j -f posix -no-file-header \ +# RUN: %p/../ARM/Inputs/print-size.macho-armv7m \ +# RUN: %p/../ARM/Inputs/print-size.macho-armv7m \ +# RUN: | FileCheck --check-prefix CHECK-POSIX %s + +# RUN: llvm-nm -j -f bsd -no-file-header \ +# RUN: %p/../ARM/Inputs/print-size.macho-armv7m \ +# RUN: %p/../ARM/Inputs/print-size.macho-armv7m \ +# RUN: | FileCheck --check-prefix CHECK-BSD %s + +# RUN: llvm-nm -f sysv -no-file-header \ +# RUN: %p/../ARM/Inputs/print-size.macho-armv7m \ +# RUN: %p/../ARM/Inputs/print-size.macho-armv7m \ +# RUN: | FileCheck --check-prefix CHECK-SYSV %s + +CHECK-NOT: {{.*}}/macho-universal-archive.x86_64.i386(hello.o): +CHECK: _{{.*}} + +CHECK-FILE: {{.*}}/macho-universal-archive.x86_64.i386(hello.o): +CHECK-FILE: _{{.*}} + +CHECK-X86_64-NOT: {{.*}}/macho-universal-archive.x86_64.i386(hello.o): +CHECK-X86_64: EH_frame0 +CHECK-X86_64: L_.str +CHECK-X86_64: _main +CHECK-X86_64: _main.eh +CHECK-X86_64: _printf + +CHECK-ALL-NOT: {{.*}}/macho-universal-archive.x86_64.i386(hello.o) (for architecture x86_64): +CHECK-ALL: EH_frame0 +CHECK-ALL: L_.str +CHECK-ALL: _main +CHECK-ALL: _main.eh +CHECK-ALL: _printf +CHECK-ALL-NOT: {{.*}}/macho-universal-archive.x86_64.i386(foo.o) (for architecture i386): +CHECK-ALL: _bar +CHECK-ALL: _foo + +CHECK-UNIVERSAL-OBJECTS-NOT: {{.*}}/macho-universal.x86_64.i386 (for architecture i386): +CHECK-UNIVERSAL-OBJECTS: __mh_execute_header +CHECK-UNIVERSAL-OBJECTS: _main +CHECK-UNIVERSAL-OBJECTS: dyld_stub_binder +CHECK-UNIVERSAL-OBJECTS-NOT: {{.*}}/macho-universal.x86_64.i386 (for architecture x86_64): +CHECK-UNIVERSAL-OBJECTS: __mh_execute_header +CHECK-UNIVERSAL-OBJECTS: _main +CHECK-UNIVERSAL-OBJECTS: dyld_stub_binder + +CHECK-ALL-UNIVERSAL-OBJECTS-NOT: {{.*}}/macho-universal.x86_64.i386 (for architecture x86_64): +CHECK-ALL-UNIVERSAL-OBJECTS: __mh_execute_header +CHECK-ALL-UNIVERSAL-OBJECTS: _main +CHECK-ALL-UNIVERSAL-OBJECTS: dyld_stub_binder +CHECK-ALL-UNIVERSAL-OBJECTS-NOT: {{.*}}/macho-universal.x86_64.i386 (for architecture i386): +CHECK-ALL-UNIVERSAL-OBJECTS: __mh_execute_header +CHECK-ALL-UNIVERSAL-OBJECTS: _main +CHECK-ALL-UNIVERSAL-OBJECTS: dyld_stub_binder + +CHECK-ARCHIVE-NOT: {{.*}}/libExample.a.macho-x86_64(example.o): +CHECK-ARCHIVE: EH_frame0 + +CHECK-POSIX-NOT: {{.*}}/print-size.macho-armv7m: +CHECK-POSIX: _some_data +CHECK-POSIX-NOT: {{.*}}/print-size.macho-armv7m: +CHECK-POSIX: _some_data + +CHECK-BSD-NOT: {{.*}}/print-size.macho-armv7m: +CHECK-BSD: _some_data +CHECK-BSD-NOT: {{.*}}/print-size.macho-armv7m: +CHECK-BSD: _some_data + +CHECK-SYSV-NOT: Symbols from {{.*}}/print-size.macho-armv7m: +CHECK-SYSV: Name Value Class Type Size Line Section +CHECK-SYSV: _some_data |00000004| d | |00000000| | Index: tools/llvm-nm/llvm-nm.cpp =================================================================== --- tools/llvm-nm/llvm-nm.cpp +++ tools/llvm-nm/llvm-nm.cpp @@ -107,6 +107,10 @@ cl::alias PrintFileNameo("o", cl::desc("Alias for --print-file-name"), cl::aliasopt(PrintFileName), cl::Grouping); +cl::opt NoFileHeader( + "no-file-header", + cl::desc("Don't show specific object files in output")); + cl::opt DebugSyms("debug-syms", cl::desc("Show all symbols, even debugger only")); cl::alias DebugSymsa("a", cl::desc("Alias for --debug-syms"), @@ -713,12 +717,13 @@ } if (!PrintFileName) { - if (OutputFormat == posix && MultipleFiles && printName) { + if (OutputFormat == posix && MultipleFiles && !NoFileHeader && printName) { outs() << '\n' << CurrentFilename << ":\n"; - } else if (OutputFormat == bsd && MultipleFiles && printName) { + } else if (OutputFormat == bsd && MultipleFiles && !NoFileHeader && printName) { outs() << "\n" << CurrentFilename << ":\n"; } else if (OutputFormat == sysv) { - outs() << "\n\nSymbols from " << CurrentFilename << ":\n\n"; + if (!NoFileHeader) + outs() << "\n\nSymbols from " << CurrentFilename << ":\n\n"; if (isSymbolList64Bit(Obj)) outs() << "Name Value Class Type" << " Size Line Section\n"; @@ -1775,7 +1780,7 @@ } if (!checkMachOAndArchFlags(O, Filename)) return; - if (!PrintFileName) { + if (!PrintFileName && !NoFileHeader) { outs() << "\n"; if (isa(O)) { outs() << Filename << "(" << O->getFileName() << ")"; @@ -1814,7 +1819,7 @@ if (ArchFlags.size() > 1) { if (PrintFileName) ArchitectureName = I->getArchFlagName(); - else + else if (!NoFileHeader) outs() << "\n" << Obj.getFileName() << " (for architecture " << I->getArchFlagName() << ")" << ":\n"; @@ -1847,7 +1852,7 @@ ArchiveName = A->getFileName(); if (ArchFlags.size() > 1) ArchitectureName = I->getArchFlagName(); - } else { + } else if (!NoFileHeader) { outs() << "\n" << A->getFileName(); outs() << "(" << O->getFileName() << ")"; if (ArchFlags.size() > 1) { @@ -1914,7 +1919,7 @@ dyn_cast(&*ChildOrErr.get())) { if (PrintFileName) ArchiveName = A->getFileName(); - else + else if (!NoFileHeader) outs() << "\n" << A->getFileName() << "(" << O->getFileName() << ")" << ":\n"; @@ -1950,7 +1955,7 @@ if (PrintFileName) { if (isa(Obj) && moreThanOneArch) ArchitectureName = I->getArchFlagName(); - } else { + } else if (!NoFileHeader) { if (moreThanOneArch) outs() << "\n"; outs() << Obj.getFileName(); @@ -1983,7 +1988,7 @@ ArchiveName = A->getFileName(); if (isa(O) && moreThanOneArch) ArchitectureName = I->getArchFlagName(); - } else { + } else if (!NoFileHeader) { outs() << "\n" << A->getFileName(); if (isa(O)) { outs() << "(" << O->getFileName() << ")";