aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-readobj/llvm-readobj.cpp
diff options
context:
space:
mode:
authorJayson Yan <jaysonyan@google.com>2021-12-10 18:46:55 +0000
committerJayson Yan <jaysonyan@google.com>2021-12-10 18:57:34 +0000
commit824eef231a853d7054d55010c16654f6f20e0394 (patch)
treee60d6d3366fa20c68a06c003122583355c258d94 /llvm/tools/llvm-readobj/llvm-readobj.cpp
parent928d17254ba214749dbd58f6d5604c11057a60bc (diff)
downloadllvm-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.cpp49
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());
}