diff options
author | Jayson Yan <jaysonyan@google.com> | 2021-12-10 18:46:55 +0000 |
---|---|---|
committer | Jayson Yan <jaysonyan@google.com> | 2021-12-10 18:57:34 +0000 |
commit | 824eef231a853d7054d55010c16654f6f20e0394 (patch) | |
tree | e60d6d3366fa20c68a06c003122583355c258d94 /llvm/tools/llvm-readobj/llvm-readobj.cpp | |
parent | 928d17254ba214749dbd58f6d5604c11057a60bc (diff) | |
download | llvm-824eef231a853d7054d55010c16654f6f20e0394.zip llvm-824eef231a853d7054d55010c16654f6f20e0394.tar.gz llvm-824eef231a853d7054d55010c16654f6f20e0394.tar.bz2 |
[llvm-readobj] Add JSONScopedPrinter to llvm-readelf
Adds JSONScopedPrinter to llvm-readelf. It includes an empty
JSONELFDumper class which will be used to override any LLVMELFDumper
methods which utilize startLine() which JSONScopedPrinter cannot
provide.
Reviewed By: jhenderson
Differential Revision: https://reviews.llvm.org/D114225
Diffstat (limited to 'llvm/tools/llvm-readobj/llvm-readobj.cpp')
-rw-r--r-- | llvm/tools/llvm-readobj/llvm-readobj.cpp | 49 |
1 files changed, 26 insertions, 23 deletions
diff --git a/llvm/tools/llvm-readobj/llvm-readobj.cpp b/llvm/tools/llvm-readobj/llvm-readobj.cpp index a598e2c..46862bb 100644 --- a/llvm/tools/llvm-readobj/llvm-readobj.cpp +++ b/llvm/tools/llvm-readobj/llvm-readobj.cpp @@ -99,6 +99,7 @@ static bool DynamicSymbols; static bool FileHeaders; static bool Headers; static std::vector<std::string> HexDump; +static bool PrettyPrint; static bool PrintStackMap; static bool PrintStackSizes; static bool Relocations; @@ -230,13 +231,17 @@ static void parseOptions(const opt::InputArgList &Args) { opts::DynamicTable = Args.hasArg(OPT_dynamic_table); opts::ELFLinkerOptions = Args.hasArg(OPT_elf_linker_options); if (Arg *A = Args.getLastArg(OPT_elf_output_style_EQ)) { - StringRef V(A->getValue()); - if (V == "LLVM") - opts::Output = opts::OutputStyleTy::LLVM; - else if (V == "GNU") - opts::Output = opts::OutputStyleTy::GNU; - else - error("--elf-output-style value should be either 'LLVM' or 'GNU'"); + std::string OutputStyleChoice = A->getValue(); + opts::Output = StringSwitch<opts::OutputStyleTy>(OutputStyleChoice) + .Case("LLVM", opts::OutputStyleTy::LLVM) + .Case("GNU", opts::OutputStyleTy::GNU) + .Case("JSON", opts::OutputStyleTy::JSON) + .Default(opts::OutputStyleTy::UNKNOWN); + if (opts::Output == opts::OutputStyleTy::UNKNOWN) { + error("--elf-output-style value should be either 'LLVM', 'GNU', or " + "'JSON', but was '" + + OutputStyleChoice + "'"); + } } opts::GnuHashTable = Args.hasArg(OPT_gnu_hash_table); opts::HashSymbols = Args.hasArg(OPT_hash_symbols); @@ -244,6 +249,7 @@ static void parseOptions(const opt::InputArgList &Args) { opts::HashHistogram = Args.hasArg(OPT_histogram); opts::NeededLibraries = Args.hasArg(OPT_needed_libs); opts::Notes = Args.hasArg(OPT_notes); + opts::PrettyPrint = Args.hasArg(OPT_pretty_print); opts::ProgramHeaders = Args.hasArg(OPT_program_headers); opts::RawRelr = Args.hasArg(OPT_raw_relr); opts::SectionGroups = Args.hasArg(OPT_section_groups); @@ -333,18 +339,7 @@ static void dumpObject(ObjectFile &Obj, ScopedPrinter &Writer, reportError(DumperOrErr.takeError(), FileStr); Dumper = (*DumperOrErr).get(); - if (opts::Output == opts::LLVM || opts::InputFilenames.size() > 1 || A) { - Writer.startLine() << "\n"; - Writer.printString("File", FileStr); - } - if (opts::Output == opts::LLVM) { - Writer.printString("Format", Obj.getFileFormatName()); - Writer.printString("Arch", Triple::getArchTypeName(Obj.getArch())); - Writer.printString( - "AddressSize", - std::string(formatv("{0}bit", 8 * Obj.getBytesInAddress()))); - Dumper->printLoadName(); - } + Dumper->printFileSummary(FileStr, Obj, opts::InputFilenames, A); if (opts::FileHeaders) Dumper->printFileHeaders(); @@ -550,6 +545,13 @@ static void dumpInput(StringRef File, ScopedPrinter &Writer) { OwningBinary<Binary>(std::move(Bin), std::move(Buffer))); } +std::unique_ptr<ScopedPrinter> createWriter() { + if (opts::Output == opts::JSON) + return std::make_unique<JSONScopedPrinter>( + fouts(), opts::PrettyPrint ? 2 : 0, std::make_unique<ListScope>()); + return std::make_unique<ScopedPrinter>(fouts()); +} + int main(int argc, char *argv[]) { InitLLVM X(argc, argv); BumpPtrAllocator A; @@ -610,16 +612,17 @@ int main(int argc, char *argv[]) { opts::SectionHeaders = true; } - ScopedPrinter Writer(fouts()); + std::unique_ptr<ScopedPrinter> Writer = createWriter(); + for (const std::string &I : opts::InputFilenames) - dumpInput(I, Writer); + dumpInput(I, *Writer.get()); if (opts::CodeViewMergedTypes) { if (opts::CodeViewEnableGHash) - dumpCodeViewMergedTypes(Writer, CVTypes.GlobalIDTable.records(), + dumpCodeViewMergedTypes(*Writer.get(), CVTypes.GlobalIDTable.records(), CVTypes.GlobalTypeTable.records()); else - dumpCodeViewMergedTypes(Writer, CVTypes.IDTable.records(), + dumpCodeViewMergedTypes(*Writer.get(), CVTypes.IDTable.records(), CVTypes.TypeTable.records()); } |