diff options
author | Fangrui Song <i@maskray.me> | 2021-05-05 00:20:41 -0700 |
---|---|---|
committer | Fangrui Song <i@maskray.me> | 2021-05-05 00:20:41 -0700 |
commit | e510860656bb81bd90ae3cf8bb5ef4dc8cd33c18 (patch) | |
tree | 7ae5c6ad6166652f95824af76c1e4c3b87ad6d5b /llvm/tools/llvm-objdump/llvm-objdump.cpp | |
parent | cab3c6c6c48ed0da0f047bdc1a337d991c78ad8c (diff) | |
download | llvm-e510860656bb81bd90ae3cf8bb5ef4dc8cd33c18.zip llvm-e510860656bb81bd90ae3cf8bb5ef4dc8cd33c18.tar.gz llvm-e510860656bb81bd90ae3cf8bb5ef4dc8cd33c18.tar.bz2 |
[llvm-objdump] Add -M {att,intel} & deprecate --x86-asm-syntax={att,intel}
The internal `cl::opt` option --x86-asm-syntax sets the AsmParser and AsmWriter
dialect. The option is used by llc and llvm-mc tests to set the AsmWriter dialect.
This patch adds -M {att,intel} as GNU objdump compatible aliases (PR43413).
Note: the dialect is initialized when the MCAsmInfo is constructed.
`MCInstPrinter::applyTargetSpecificCLOption` is called too late and its MCAsmInfo
reference is const, so changing the `cl::opt` in
`MCInstPrinter::applyTargetSpecificCLOption` is not an option, at least without
large amount of refactoring.
Reviewed By: hoy, jhenderson, thakis
Differential Revision: https://reviews.llvm.org/D101695
Diffstat (limited to 'llvm/tools/llvm-objdump/llvm-objdump.cpp')
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 44 |
1 files changed, 29 insertions, 15 deletions
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index e466364..8dbd88f 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -2419,8 +2419,6 @@ static void parseObjdumpOptions(const llvm::opt::InputArgList &InputArgs) { 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<DIDumpType>(A->getValue()).Case("frames", DIDT_DebugFrame); @@ -2466,24 +2464,40 @@ static void parseObjdumpOptions(const llvm::opt::InputArgList &InputArgs) { 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<const char *> 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<StringRef, 2> 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()); + } + } + if (AsmSyntax) { + const char *Argv[] = {"llvm-objdump", AsmSyntax}; + llvm::cl::ParseCommandLineOptions(2, Argv); } - LLVMArgs.push_back(nullptr); - llvm::cl::ParseCommandLineOptions(LLVMArgs.size() - 1, LLVMArgs.data()); // objdump defaults to a.out if no filenames specified. if (InputFilenames.empty()) |