diff --git a/llvm/docs/CommandGuide/llvm-objdump.rst b/llvm/docs/CommandGuide/llvm-objdump.rst --- a/llvm/docs/CommandGuide/llvm-objdump.rst +++ b/llvm/docs/CommandGuide/llvm-objdump.rst @@ -146,8 +146,14 @@ .. option:: -M, --disassembler-options= - Pass target-specific disassembler options. Currently supported for ARM targets - only. Available options are ``reg-names-std`` and ``reg-names-raw``. + Pass target-specific disassembler options. Available options: + + * ``reg-names-std``: ARM only (default). Print in ARM 's instruction set documentation, with r13/r14/r15 replaced by sp/lr/pc. + * ``reg-names-raw``: ARM only. Use r followed by the register number. + * ``no-aliases``: RISC-V only. Print raw instruction mnemonic instead of pesudo instruction mnemonic. + * ``numeric``: RISC-V only. Print raw register names instead of ABI mnemonic. (e.g. print x1 instead of ra) + * ``att``: x86 only (default). Print in the AT&T syntax. + * ``intel``: x86 only. Print in the intel syntax. .. option:: --mcpu= diff --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst --- a/llvm/docs/ReleaseNotes.rst +++ b/llvm/docs/ReleaseNotes.rst @@ -141,6 +141,10 @@ * Support for in-order processors has been added to ``llvm-mca``. (`D94928 `_) +* llvm-objdump supports ``-M {att,intel}`` now. + ``--x86-asm-syntax`` is a deprecated internal option which will be removed in LLVM 14.0.0. + (`D101695 `_) + Changes to LLDB --------------------------------- diff --git a/llvm/test/tools/llvm-objdump/X86/elf-disassemble-symbololize-operands.yaml b/llvm/test/tools/llvm-objdump/X86/elf-disassemble-symbololize-operands.yaml --- a/llvm/test/tools/llvm-objdump/X86/elf-disassemble-symbololize-operands.yaml +++ b/llvm/test/tools/llvm-objdump/X86/elf-disassemble-symbololize-operands.yaml @@ -1,7 +1,7 @@ # RUN: yaml2obj %s -o %t -# RUN: llvm-objdump %t -d --symbolize-operands --x86-asm-syntax=intel --no-show-raw-insn --no-leading-addr | \ +# RUN: llvm-objdump %t -d --symbolize-operands -M intel --no-show-raw-insn --no-leading-addr | \ # RUN: FileCheck %s --match-full-lines --check-prefix=INTEL -# RUN: llvm-objdump %t -d --symbolize-operands --x86-asm-syntax=att --no-show-raw-insn --no-leading-addr | \ +# RUN: llvm-objdump %t -d --symbolize-operands -M att --no-show-raw-insn --no-leading-addr | \ # RUN: FileCheck %s --match-full-lines --check-prefix=ATT ## Expect to find the branch labels and global variable name. diff --git a/llvm/test/tools/llvm-objdump/X86/syntax-mode.s b/llvm/test/tools/llvm-objdump/X86/syntax-mode.s new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/syntax-mode.s @@ -0,0 +1,24 @@ +## Test att and intel syntax modes. +# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t +# RUN: llvm-objdump -d %t | FileCheck %s --check-prefix=ATT +# RUN: llvm-objdump -d -M att %t | FileCheck %s --check-prefix=ATT +# RUN: llvm-objdump -dMintel %t | FileCheck %s --check-prefix=INTEL + +## The last wins. +# RUN: llvm-objdump -dM att -M att,intel %t | FileCheck %s --check-prefix=INTEL + +## Test discouraged internal cl::opt options. +# RUN: llvm-objdump -d --x86-asm-syntax=att %t | FileCheck %s --check-prefix=ATT +# RUN: llvm-objdump -d --x86-asm-syntax=intel %t | FileCheck %s --check-prefix=INTEL + +# ATT: movw $1, %ax +# ATT: imull %esi, %edi +# ATT: leaq 5(%rsi,%rdi,4), %rax + +# INTEL: mov ax, 1 +# INTEL: imul edi, esi +# INTEL: lea rax, [rsi + 4*rdi + 5] + + movw $1, %ax + imull %esi, %edi + leaq 5(%rsi,%rdi,4), %rax diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -2424,8 +2424,6 @@ DisassembleSymbols = commaSeparatedValues(InputArgs, OBJDUMP_disassemble_symbols_EQ); DisassembleZeroes = InputArgs.hasArg(OBJDUMP_disassemble_zeroes); - DisassemblerOptions = - commaSeparatedValues(InputArgs, OBJDUMP_disassembler_options_EQ); if (const opt::Arg *A = InputArgs.getLastArg(OBJDUMP_dwarf_EQ)) { DwarfDumpType = StringSwitch(A->getValue()).Case("frames", DIDT_DebugFrame); @@ -2471,22 +2469,42 @@ parseMachOOptions(InputArgs); - // Handle options that get forwarded to cl::opt<>s in libraries. - // FIXME: Depending on https://reviews.llvm.org/D84191#inline-946075 , - // hopefully remove this again. - std::vector LLVMArgs; - LLVMArgs.push_back("llvm-objdump (LLVM option parsing)"); - if (const opt::Arg *A = InputArgs.getLastArg(OBJDUMP_x86_asm_syntax_att, - OBJDUMP_x86_asm_syntax_intel)) { + // Parse -M (--disassembler-options and deprecated + // --x86-asm-syntax={att,intel}. + // + // Note, for x86, the asm dialect (AssemblerDialect) is initialized when the + // MCAsmInfo is constructed. MCInstPrinter::applyTargetSpecificCLOption is + // called too late. For now we have to use the internal cl::opt option. + const char *AsmSyntax = nullptr; + for (const auto *A : InputArgs.filtered(OBJDUMP_disassembler_options_EQ, + OBJDUMP_x86_asm_syntax_att, + OBJDUMP_x86_asm_syntax_intel)) { switch (A->getOption().getID()) { case OBJDUMP_x86_asm_syntax_att: - LLVMArgs.push_back("--x86-asm-syntax=att"); - break; + AsmSyntax = "--x86-asm-syntax=att"; + continue; case OBJDUMP_x86_asm_syntax_intel: - LLVMArgs.push_back("--x86-asm-syntax=intel"); - break; + AsmSyntax = "--x86-asm-syntax=intel"; + continue; + } + + SmallVector Values; + llvm::SplitString(A->getValue(), Values, ","); + for (StringRef V : Values) { + if (V == "att") + AsmSyntax = "--x86-asm-syntax=att"; + else if (V == "intel") + AsmSyntax = "--x86-asm-syntax=intel"; + else + DisassemblerOptions.push_back(V.str()); } } + + // Handle options that get forwarded to cl::opt<>s in libraries. + std::vector LLVMArgs; + LLVMArgs.push_back("llvm-objdump (LLVM option parsing)"); + if (AsmSyntax) + LLVMArgs.push_back(AsmSyntax); if (InputArgs.hasArg(OBJDUMP_mhvx)) LLVMArgs.push_back("--mhvx"); if (InputArgs.hasArg(OBJDUMP_mhvx_v66))