Index: test/MC/ARM/elf-execute-only-section.ll =================================================================== --- test/MC/ARM/elf-execute-only-section.ll +++ test/MC/ARM/elf-execute-only-section.ll @@ -1,9 +1,9 @@ ; RUN: llc < %s -mtriple=thumbv8m.base-eabi -mattr=+execute-only -filetype=obj %s -o - | \ -; RUN: llvm-readelf -s | FileCheck %s +; RUN: llvm-readelf -S | FileCheck %s ; RUN: llc < %s -mtriple=thumbv8m.main-eabi -mattr=+execute-only -filetype=obj %s -o - | \ -; RUN: llvm-readelf -s | FileCheck %s +; RUN: llvm-readelf -S | FileCheck %s ; RUN: llc < %s -mtriple=thumbv7m-eabi -mattr=+execute-only -filetype=obj %s -o - | \ -; RUN: llvm-readelf -s | FileCheck %s +; RUN: llvm-readelf -S | FileCheck %s ; CHECK-NOT: {{.text[ ]+PROGBITS[ ]+[0-9]+ [0-9]+ [0-9]+ [0-9]+ AX[^p]}} ; CHECK: {{.text[ ]+PROGBITS[ ]+[0-9]+ [0-9]+ [0-9]+ [0-9]+ AXp}} Index: test/tools/llvm-readobj/all.test =================================================================== --- /dev/null +++ test/tools/llvm-readobj/all.test @@ -0,0 +1,14 @@ +RUN: llvm-readobj -a %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix ALL +RUN: llvm-readobj --all %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix ALL + +ALL: Format: ELF32-i386 +ALL: Arch: i386 +ALL: AddressSize: 32bit +ALL: LoadName: +ALL: ElfHeader { +ALL: Sections [ +ALL: Relocations [ +ALL: Symbols [ +ALL: ProgramHeaders [ Index: test/tools/llvm-readobj/dynamic.test =================================================================== --- test/tools/llvm-readobj/dynamic.test +++ test/tools/llvm-readobj/dynamic.test @@ -73,6 +73,10 @@ RUN: llvm-readobj -dynamic-table %p/Inputs/dynamic-table-exe.x86 \ RUN: | FileCheck %s -check-prefix ELF-X86-EXE +RUN: llvm-readobj --dynamic %p/Inputs/dynamic-table-exe.x86 \ +RUN: | FileCheck %s -check-prefix ELF-X86-EXE +RUN: llvm-readobj -d %p/Inputs/dynamic-table-exe.x86 \ +RUN: | FileCheck %s -check-prefix ELF-X86-EXE ELF-X86-EXE: Format: ELF32-i386 ELF-X86-EXE: Arch: i386 Index: test/tools/llvm-readobj/file-headers.test =================================================================== --- test/tools/llvm-readobj/file-headers.test +++ test/tools/llvm-readobj/file-headers.test @@ -31,6 +31,12 @@ RUN: llvm-readobj -h %p/Inputs/trivial.obj.wasm \ RUN: | FileCheck %s -check-prefix WASM +# Check flag aliases. +RUN: llvm-readobj --file-header %p/Inputs/trivial.obj.elf-x86-64 \ +RUN: | FileCheck %s -check-prefix ELF64 +RUN: llvm-readobj --file-headers %p/Inputs/trivial.obj.elf-x86-64 \ +RUN: | FileCheck %s -check-prefix ELF64 + COFF-ARM: File: {{(.*[/\\])?}}trivial.obj.coff-arm COFF-ARM-NEXT: Format: COFF-ARM COFF-ARM-NEXT: Arch: thumb Index: test/tools/llvm-readobj/program-headers.test =================================================================== --- test/tools/llvm-readobj/program-headers.test +++ test/tools/llvm-readobj/program-headers.test @@ -21,6 +21,12 @@ RUN: llvm-readobj -program-headers %p/../../Object/Inputs/openbsd-phdrs.elf-x86-64 \ RUN: | FileCheck %s -check-prefix OPENBSD-X86-64 +# Check flag aliases. +RUN: llvm-readobj --segments %p/../../Object/Inputs/program-headers.elf-x86-64 \ +RUN: | FileCheck %s -check-prefix ELF-X86-64 +RUN: llvm-readobj -l %p/../../Object/Inputs/program-headers.elf-x86-64 \ +RUN: | FileCheck %s -check-prefix ELF-X86-64 + ELF-I386: ProgramHeaders [ ELF-I386-NEXT: ProgramHeader { ELF-I386-NEXT: Type: PT_LOAD (0x1) Index: test/tools/llvm-readobj/readelf-s-alias.test =================================================================== --- /dev/null +++ test/tools/llvm-readobj/readelf-s-alias.test @@ -0,0 +1,49 @@ +# In llvm-readobj, -s is an alias for --sections. +RUN: llvm-readobj -s %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix SEC +RUN: llvm-readobj --sections %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix SEC + +# In llvm-readelf, -s is an alias for --symbols. +RUN: llvm-readelf -s %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix SYM +RUN: llvm-readelf --symbols %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix SYM + +SEC: Sections [ +SEC-NEXT: Section { +SEC-NEXT: Index: 0 +SEC-NEXT: Name: (0) +SEC-NEXT: Type: SHT_NULL (0x0) +SEC-NEXT: Flags [ (0x0) +SEC-NEXT: ] +SEC-NEXT: Address: 0x0 +SEC-NEXT: Offset: 0x0 +SEC-NEXT: Size: 0 +SEC-NEXT: Link: 0 +SEC-NEXT: Info: 0 +SEC-NEXT: AddressAlignment: 0 +SEC-NEXT: EntrySize: 0 +SEC-NEXT: } +SEC-NEXT: Section { +SEC-NEXT: Index: 1 +SEC-NEXT: Name: .text (5) +SEC-NEXT: Type: SHT_PROGBITS (0x1) +SEC-NEXT: Flags [ (0x6) +SEC-NEXT: SHF_ALLOC (0x2) +SEC-NEXT: SHF_EXECINSTR (0x4) +SEC-NEXT: ] +SEC-NEXT: Address: 0x0 +SEC-NEXT: Offset: 0x40 +SEC-NEXT: Size: 42 +SEC-NEXT: Link: 0 +SEC-NEXT: Info: 0 +SEC-NEXT: AddressAlignment: 16 +SEC-NEXT: EntrySize: 0 +SEC-NEXT: } + +SYM: Symbol table '.symtab' contains {{.*}} entries: +SYM-NEXT: Num: Value Size Type Bind Vis Ndx Name +SYM-NEXT: 0: {{.*}} NOTYPE {{.*}} UND +SYM-NEXT: 1: {{.*}} FILE {{.*}} trivial.ll +SYM-NEXT: 2: {{.*}} OBJECT {{.*}} .L.str Index: test/tools/llvm-readobj/relocations.test =================================================================== --- test/tools/llvm-readobj/relocations.test +++ test/tools/llvm-readobj/relocations.test @@ -19,6 +19,12 @@ RUN: llvm-readobj -r --expand-relocs %p/Inputs/trivial.obj.wasm \ RUN: | FileCheck %s -check-prefix WASM +# Check flag aliases. +RUN: llvm-readobj --relocs %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix ELF +RUN: llvm-readobj --relocations %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix ELF + COFF: Relocations [ COFF-NEXT: Section (1) .text { COFF-NEXT: 0x4 IMAGE_REL_I386_DIR32 .data Index: test/tools/llvm-readobj/sections.test =================================================================== --- test/tools/llvm-readobj/sections.test +++ test/tools/llvm-readobj/sections.test @@ -17,6 +17,14 @@ RUN: llvm-readobj -s %p/Inputs/trivial.obj.wasm \ RUN: | FileCheck %s -check-prefix WASM +# Check flag aliases. +RUN: llvm-readobj -S %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix ELF +RUN: llvm-readobj --sections %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix ELF +RUN: llvm-readobj --section-headers %p/Inputs/trivial.obj.elf-i386 \ +RUN: | FileCheck %s -check-prefix ELF + COFF: Sections [ COFF-NEXT: Section { COFF-NEXT: Number: 1 Index: tools/llvm-readobj/llvm-readobj.cpp =================================================================== --- tools/llvm-readobj/llvm-readobj.cpp +++ tools/llvm-readobj/llvm-readobj.cpp @@ -48,6 +48,14 @@ cl::desc(""), cl::ZeroOrMore); + // -all, -a + cl::opt All( + "all", + cl::desc("Equivalent to setting: --file-header, --program-headers, " + "--sections, --symbols, --relocs, --dynamic, --notes, " + "--version-info --unwind, --section-groups and --histogram.")); + cl::alias AllShort("a", cl::desc("Alias for --all"), cl::aliasopt(All)); + // -wide, -W cl::opt WideOutput("wide", cl::desc("Ignored for compatibility with GNU readelf")); @@ -58,17 +66,19 @@ // -file-headers, -h cl::opt FileHeaders("file-headers", cl::desc("Display file headers ")); + cl::alias FileHeadersSingular("file-header", + cl::desc("Alias for --file-headers"), + cl::aliasopt(FileHeaders)); cl::alias FileHeadersShort("h", cl::desc("Alias for --file-headers"), cl::aliasopt(FileHeaders)); - // -sections, -s, -S - // Note: In GNU readelf, -s means --symbols! + // -sections, -section-headers, -S cl::opt Sections("sections", cl::desc("Display all sections.")); - cl::alias SectionsShort("s", - cl::desc("Alias for --sections"), - cl::aliasopt(Sections)); + cl::alias SectionHeadersAlias("section-headers", + cl::desc("Alias for --sections"), + cl::aliasopt(Sections)); cl::alias SectionsShortUpper("S", cl::desc("Alias for --sections"), cl::aliasopt(Sections)); @@ -97,6 +107,8 @@ // -relocations, -r cl::opt Relocations("relocations", cl::desc("Display the relocation entries in the file")); + cl::alias RelocationsMedium("relocs", cl::desc("Alias for --relocations"), + cl::aliasopt(Relocations)); cl::alias RelocationsShort("r", cl::desc("Alias for --relocations"), cl::aliasopt(Relocations)); @@ -109,12 +121,9 @@ cl::opt DynRelocs("dyn-relocations", cl::desc("Display the dynamic relocation entries in the file")); - // -symbols, -t + // -symbols cl::opt Symbols("symbols", cl::desc("Display the symbol table")); - cl::alias SymbolsShort("t", - cl::desc("Alias for --symbols"), - cl::aliasopt(Symbols)); // -dyn-symbols, -dt cl::opt DynamicSymbols("dyn-symbols", @@ -133,6 +142,8 @@ // -dynamic-table cl::opt DynamicTable("dynamic-table", cl::desc("Display the ELF .dynamic section table")); + cl::alias DynamicTableAlias("dynamic", cl::desc("Alias for --dynamic-table"), + cl::aliasopt(DynamicTable)); cl::alias DynamicTableShort("d", cl::desc("Alias for --dynamic-table"), cl::aliasopt(DynamicTable)); @@ -143,6 +154,8 @@ // -program-headers cl::opt ProgramHeaders("program-headers", cl::desc("Display ELF program headers")); + cl::alias SegmentsAlias("segments", cl::desc("Alias for --program-headers"), + cl::aliasopt(ProgramHeaders)); cl::alias ProgramHeadersShort("l", cl::desc("Alias for --program-headers"), cl::aliasopt(ProgramHeaders)); @@ -188,11 +201,9 @@ "codeview-subsection-bytes", cl::desc("Dump raw contents of codeview debug sections and records")); - // -arm-attributes, -a + // -arm-attributes cl::opt ARMAttributes("arm-attributes", cl::desc("Display the ARM attributes section")); - cl::alias ARMAttributesShort("a", cl::desc("Alias for --arm-attributes"), - cl::aliasopt(ARMAttributes)); // -mips-plt-got cl::opt @@ -292,6 +303,9 @@ cl::opt SectionGroups("elf-section-groups", cl::desc("Display ELF section group contents")); + cl::alias SectionGroupsAlias("section-groups", + cl::desc("Alias for -elf-sections-groups"), + cl::aliasopt(SectionGroups)); cl::alias SectionGroupsShort("g", cl::desc("Alias for -elf-sections-groups"), cl::aliasopt(SectionGroups)); cl::opt HashHistogram( @@ -588,6 +602,28 @@ reportError(File, readobj_error::unrecognized_file_format); } +/// Registers aliases that should only be allowed by readobj. +static void registerReadobjAliases() { + // -s has meant --sections for a very long time in llvm-readobj despite + // meaning something else in readelf. + static cl::alias SectionsShort("s", cl::desc("Alias for --sections"), + cl::aliasopt(opts::Sections)); + SectionsShort.setHiddenFlag(cl::NotHidden); + + // Only register -t in llvm-readobj, and readelf reserves it for + // --section-details (not implemented yet) + static cl::alias SymbolsShort("t", cl::desc("Alias for --symbols"), + cl::aliasopt(opts::Symbols)); + SymbolsShort.setHiddenFlag(cl::NotHidden); +} + +/// Registers aliases that should only be allowed by readelf. +static void registerReadelfAliases() { + static cl::alias SymbolsShort("s", cl::desc("Alias for --symbols"), + cl::aliasopt(opts::Symbols)); + SymbolsShort.setHiddenFlag(cl::NotHidden); +} + int main(int argc, const char *argv[]) { InitLLVM X(argc, argv); @@ -599,17 +635,33 @@ opts::FileHeadersShort.setHiddenFlag(cl::NotHidden); opts::ProgramHeadersShort.setHiddenFlag(cl::NotHidden); opts::RelocationsShort.setHiddenFlag(cl::NotHidden); - opts::SectionsShort.setHiddenFlag(cl::NotHidden); opts::SectionsShortUpper.setHiddenFlag(cl::NotHidden); - opts::SymbolsShort.setHiddenFlag(cl::NotHidden); opts::WideOutput.setHiddenFlag(cl::Hidden); - if (sys::path::stem(argv[0]).find("readelf") != StringRef::npos) + if (sys::path::stem(argv[0]).find("readelf") != StringRef::npos) { opts::Output = opts::GNU; + registerReadelfAliases(); + } else { + registerReadobjAliases(); + } cl::ParseCommandLineOptions(argc, argv, "LLVM Object Reader\n"); + if (opts::All) { + opts::FileHeaders = true; + opts::ProgramHeaders = true; + opts::Sections = true; + opts::Symbols = true; + opts::Relocations = true; + opts::DynamicTable = true; + opts::Notes = true; + opts::VersionInfo = true; + opts::UnwindInfo = true; + opts::SectionGroups = true; + opts::HashHistogram = true; + } + // Default to stdin if no filename is specified. if (opts::InputFilenames.size() == 0) opts::InputFilenames.push_back("-");