Skip to content

Commit 3fe01f0

Browse files
author
Georgii Rymar
committed
[llvm-readobj] - Simplify the code that creates dumpers. NFCI.
We have a few helper functions like the following: ``` std::error_code create*Dumper(...) ``` In fact we do not need or want to use `std::error_code` and the code can be simpler if we just return `std::unique_ptr<ObjDumper>`. This patch does this change and refines the signature of `createDumper` as well. Differential revision: https://reviews.llvm.org/D86718
1 parent 4cd1425 commit 3fe01f0

File tree

7 files changed

+79
-105
lines changed

7 files changed

+79
-105
lines changed

llvm/tools/llvm-readobj/COFFDumper.cpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -239,15 +239,9 @@ class COFFObjectDumpDelegate : public SymbolDumpDelegate {
239239

240240
namespace llvm {
241241

242-
std::error_code createCOFFDumper(const object::ObjectFile *Obj,
243-
ScopedPrinter &Writer,
244-
std::unique_ptr<ObjDumper> &Result) {
245-
const COFFObjectFile *COFFObj = dyn_cast<COFFObjectFile>(Obj);
246-
if (!COFFObj)
247-
return readobj_error::unsupported_obj_file_format;
248-
249-
Result.reset(new COFFDumper(COFFObj, Writer));
250-
return readobj_error::success;
242+
std::unique_ptr<ObjDumper> createCOFFDumper(const object::COFFObjectFile &Obj,
243+
ScopedPrinter &Writer) {
244+
return std::make_unique<COFFDumper>(&Obj, Writer);
251245
}
252246

253247
} // namespace llvm

llvm/tools/llvm-readobj/ELFDumper.cpp

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -987,33 +987,27 @@ template <typename ELFT> class LLVMStyle : public DumpStyle<ELFT> {
987987
namespace llvm {
988988

989989
template <class ELFT>
990-
static std::error_code createELFDumper(const ELFObjectFile<ELFT> *Obj,
991-
ScopedPrinter &Writer,
992-
std::unique_ptr<ObjDumper> &Result) {
993-
Result.reset(new ELFDumper<ELFT>(Obj, Writer));
994-
return readobj_error::success;
990+
static std::unique_ptr<ObjDumper> createELFDumper(const ELFObjectFile<ELFT> &Obj,
991+
ScopedPrinter &Writer) {
992+
return std::make_unique<ELFDumper<ELFT>>(&Obj, Writer);
995993
}
996994

997-
std::error_code createELFDumper(const object::ObjectFile *Obj,
998-
ScopedPrinter &Writer,
999-
std::unique_ptr<ObjDumper> &Result) {
995+
std::unique_ptr<ObjDumper> createELFDumper(const object::ELFObjectFileBase &Obj,
996+
ScopedPrinter &Writer) {
1000997
// Little-endian 32-bit
1001-
if (const ELF32LEObjectFile *ELFObj = dyn_cast<ELF32LEObjectFile>(Obj))
1002-
return createELFDumper(ELFObj, Writer, Result);
998+
if (const ELF32LEObjectFile *ELFObj = dyn_cast<ELF32LEObjectFile>(&Obj))
999+
return createELFDumper(*ELFObj, Writer);
10031000

10041001
// Big-endian 32-bit
1005-
if (const ELF32BEObjectFile *ELFObj = dyn_cast<ELF32BEObjectFile>(Obj))
1006-
return createELFDumper(ELFObj, Writer, Result);
1002+
if (const ELF32BEObjectFile *ELFObj = dyn_cast<ELF32BEObjectFile>(&Obj))
1003+
return createELFDumper(*ELFObj, Writer);
10071004

10081005
// Little-endian 64-bit
1009-
if (const ELF64LEObjectFile *ELFObj = dyn_cast<ELF64LEObjectFile>(Obj))
1010-
return createELFDumper(ELFObj, Writer, Result);
1006+
if (const ELF64LEObjectFile *ELFObj = dyn_cast<ELF64LEObjectFile>(&Obj))
1007+
return createELFDumper(*ELFObj, Writer);
10111008

10121009
// Big-endian 64-bit
1013-
if (const ELF64BEObjectFile *ELFObj = dyn_cast<ELF64BEObjectFile>(Obj))
1014-
return createELFDumper(ELFObj, Writer, Result);
1015-
1016-
return readobj_error::unsupported_obj_file_format;
1010+
return createELFDumper(*cast<ELF64BEObjectFile>(&Obj), Writer);
10171011
}
10181012

10191013
} // end namespace llvm

llvm/tools/llvm-readobj/MachODumper.cpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,9 @@ class MachODumper : public ObjDumper {
6868

6969
namespace llvm {
7070

71-
std::error_code createMachODumper(const object::ObjectFile *Obj,
72-
ScopedPrinter &Writer,
73-
std::unique_ptr<ObjDumper> &Result) {
74-
const MachOObjectFile *MachOObj = dyn_cast<MachOObjectFile>(Obj);
75-
if (!MachOObj)
76-
return readobj_error::unsupported_obj_file_format;
77-
78-
Result.reset(new MachODumper(MachOObj, Writer));
79-
return readobj_error::success;
71+
std::unique_ptr<ObjDumper> createMachODumper(const object::MachOObjectFile &Obj,
72+
ScopedPrinter &Writer) {
73+
return std::make_unique<MachODumper>(&Obj, Writer);
8074
}
8175

8276
} // namespace llvm

llvm/tools/llvm-readobj/ObjDumper.h

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ namespace llvm {
2020
namespace object {
2121
class COFFImportFile;
2222
class ObjectFile;
23+
class XCOFFObjectFile;
24+
class ELFObjectFileBase;
2325
}
2426
namespace codeview {
2527
class GlobalTypeTableBuilder;
@@ -113,25 +115,20 @@ class ObjDumper {
113115
virtual void printSectionMapping() {}
114116
};
115117

116-
std::error_code createCOFFDumper(const object::ObjectFile *Obj,
117-
ScopedPrinter &Writer,
118-
std::unique_ptr<ObjDumper> &Result);
118+
std::unique_ptr<ObjDumper> createCOFFDumper(const object::COFFObjectFile &Obj,
119+
ScopedPrinter &Writer);
119120

120-
std::error_code createELFDumper(const object::ObjectFile *Obj,
121-
ScopedPrinter &Writer,
122-
std::unique_ptr<ObjDumper> &Result);
121+
std::unique_ptr<ObjDumper> createELFDumper(const object::ELFObjectFileBase &Obj,
122+
ScopedPrinter &Writer);
123123

124-
std::error_code createMachODumper(const object::ObjectFile *Obj,
125-
ScopedPrinter &Writer,
126-
std::unique_ptr<ObjDumper> &Result);
124+
std::unique_ptr<ObjDumper> createMachODumper(const object::MachOObjectFile &Obj,
125+
ScopedPrinter &Writer);
127126

128-
std::error_code createWasmDumper(const object::ObjectFile *Obj,
129-
ScopedPrinter &Writer,
130-
std::unique_ptr<ObjDumper> &Result);
127+
std::unique_ptr<ObjDumper> createWasmDumper(const object::WasmObjectFile &Obj,
128+
ScopedPrinter &Writer);
131129

132-
std::error_code createXCOFFDumper(const object::ObjectFile *Obj,
133-
ScopedPrinter &Writer,
134-
std::unique_ptr<ObjDumper> &Result);
130+
std::unique_ptr<ObjDumper> createXCOFFDumper(const object::XCOFFObjectFile &Obj,
131+
ScopedPrinter &Writer);
135132

136133
void dumpCOFFImportFile(const object::COFFImportFile *File,
137134
ScopedPrinter &Writer);

llvm/tools/llvm-readobj/WasmDumper.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -241,14 +241,9 @@ void WasmDumper::printSymbol(const SymbolRef &Sym) {
241241

242242
namespace llvm {
243243

244-
std::error_code createWasmDumper(const object::ObjectFile *Obj,
245-
ScopedPrinter &Writer,
246-
std::unique_ptr<ObjDumper> &Result) {
247-
const auto *WasmObj = dyn_cast<WasmObjectFile>(Obj);
248-
assert(WasmObj && "createWasmDumper called with non-wasm object");
249-
250-
Result.reset(new WasmDumper(WasmObj, Writer));
251-
return readobj_error::success;
244+
std::unique_ptr<ObjDumper> createWasmDumper(const object::WasmObjectFile &Obj,
245+
ScopedPrinter &Writer) {
246+
return std::make_unique<WasmDumper>(&Obj, Writer);
252247
}
253248

254249
} // namespace llvm

llvm/tools/llvm-readobj/XCOFFDumper.cpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -515,14 +515,8 @@ void XCOFFDumper::printSectionHeaders(ArrayRef<T> Sections) {
515515
}
516516

517517
namespace llvm {
518-
std::error_code createXCOFFDumper(const object::ObjectFile *Obj,
519-
ScopedPrinter &Writer,
520-
std::unique_ptr<ObjDumper> &Result) {
521-
const XCOFFObjectFile *XObj = dyn_cast<XCOFFObjectFile>(Obj);
522-
if (!XObj)
523-
return readobj_error::unsupported_obj_file_format;
524-
525-
Result.reset(new XCOFFDumper(*XObj, Writer));
526-
return readobj_error::success;
518+
std::unique_ptr<ObjDumper>
519+
createXCOFFDumper(const object::XCOFFObjectFile &XObj, ScopedPrinter &Writer) {
520+
return std::make_unique<XCOFFDumper>(XObj, Writer);
527521
}
528522
} // namespace llvm

llvm/tools/llvm-readobj/llvm-readobj.cpp

Lines changed: 43 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,17 @@
2626
#include "llvm/DebugInfo/CodeView/MergingTypeTableBuilder.h"
2727
#include "llvm/Object/Archive.h"
2828
#include "llvm/Object/COFFImportFile.h"
29+
#include "llvm/Object/ELFObjectFile.h"
2930
#include "llvm/Object/MachOUniversal.h"
3031
#include "llvm/Object/ObjectFile.h"
32+
#include "llvm/Object/Wasm.h"
3133
#include "llvm/Object/WindowsResource.h"
34+
#include "llvm/Object/XCOFFObjectFile.h"
3235
#include "llvm/Support/Casting.h"
3336
#include "llvm/Support/CommandLine.h"
3437
#include "llvm/Support/DataTypes.h"
3538
#include "llvm/Support/Debug.h"
39+
#include "llvm/Support/Errc.h"
3640
#include "llvm/Support/FileSystem.h"
3741
#include "llvm/Support/FormatVariadic.h"
3842
#include "llvm/Support/InitLLVM.h"
@@ -424,48 +428,50 @@ struct ReadObjTypeTableBuilder {
424428
static ReadObjTypeTableBuilder CVTypes;
425429

426430
/// Creates an format-specific object file dumper.
427-
static std::error_code createDumper(const ObjectFile *Obj,
428-
ScopedPrinter &Writer,
429-
std::unique_ptr<ObjDumper> &Result) {
430-
if (!Obj)
431-
return readobj_error::unsupported_file_format;
432-
433-
if (Obj->isCOFF())
434-
return createCOFFDumper(Obj, Writer, Result);
435-
if (Obj->isELF())
436-
return createELFDumper(Obj, Writer, Result);
437-
if (Obj->isMachO())
438-
return createMachODumper(Obj, Writer, Result);
439-
if (Obj->isWasm())
440-
return createWasmDumper(Obj, Writer, Result);
441-
if (Obj->isXCOFF())
442-
return createXCOFFDumper(Obj, Writer, Result);
443-
444-
return readobj_error::unsupported_obj_file_format;
431+
static Expected<std::unique_ptr<ObjDumper>>
432+
createDumper(const ObjectFile &Obj, ScopedPrinter &Writer) {
433+
if (const COFFObjectFile *COFFObj = dyn_cast<COFFObjectFile>(&Obj))
434+
return createCOFFDumper(*COFFObj, Writer);
435+
436+
if (const ELFObjectFileBase *ELFObj = dyn_cast<ELFObjectFileBase>(&Obj))
437+
return createELFDumper(*ELFObj, Writer);
438+
439+
if (const MachOObjectFile *MachOObj = dyn_cast<MachOObjectFile>(&Obj))
440+
return createMachODumper(*MachOObj, Writer);
441+
442+
if (const WasmObjectFile *WasmObj = dyn_cast<WasmObjectFile>(&Obj))
443+
return createWasmDumper(*WasmObj, Writer);
444+
445+
if (const XCOFFObjectFile *XObj = dyn_cast<XCOFFObjectFile>(&Obj))
446+
return createXCOFFDumper(*XObj, Writer);
447+
448+
return createStringError(errc::invalid_argument,
449+
"unsupported object file format");
445450
}
446451

447452
/// Dumps the specified object file.
448-
static void dumpObject(const ObjectFile *Obj, ScopedPrinter &Writer,
453+
static void dumpObject(const ObjectFile &Obj, ScopedPrinter &Writer,
449454
const Archive *A = nullptr) {
450455
std::string FileStr =
451-
A ? Twine(A->getFileName() + "(" + Obj->getFileName() + ")").str()
452-
: Obj->getFileName().str();
456+
A ? Twine(A->getFileName() + "(" + Obj.getFileName() + ")").str()
457+
: Obj.getFileName().str();
453458

454-
std::unique_ptr<ObjDumper> Dumper;
455-
if (std::error_code EC = createDumper(Obj, Writer, Dumper))
456-
reportError(errorCodeToError(EC), FileStr);
459+
ObjDumper *Dumper;
460+
Expected<std::unique_ptr<ObjDumper>> DumperOrErr = createDumper(Obj, Writer);
461+
if (!DumperOrErr)
462+
reportError(DumperOrErr.takeError(), FileStr);
463+
Dumper = (*DumperOrErr).get();
457464

458465
if (opts::Output == opts::LLVM || opts::InputFilenames.size() > 1 || A) {
459466
Writer.startLine() << "\n";
460467
Writer.printString("File", FileStr);
461468
}
462469
if (opts::Output == opts::LLVM) {
463-
Writer.printString("Format", Obj->getFileFormatName());
464-
Writer.printString("Arch", Triple::getArchTypeName(
465-
(llvm::Triple::ArchType)Obj->getArch()));
470+
Writer.printString("Format", Obj.getFileFormatName());
471+
Writer.printString("Arch", Triple::getArchTypeName(Obj.getArch()));
466472
Writer.printString(
467473
"AddressSize",
468-
std::string(formatv("{0}bit", 8 * Obj->getBytesInAddress())));
474+
std::string(formatv("{0}bit", 8 * Obj.getBytesInAddress())));
469475
Dumper->printLoadName();
470476
}
471477

@@ -490,16 +496,16 @@ static void dumpObject(const ObjectFile *Obj, ScopedPrinter &Writer,
490496
if (opts::Symbols || opts::DynamicSymbols)
491497
Dumper->printSymbols(opts::Symbols, opts::DynamicSymbols);
492498
if (!opts::StringDump.empty())
493-
Dumper->printSectionsAsString(Obj, opts::StringDump);
499+
Dumper->printSectionsAsString(&Obj, opts::StringDump);
494500
if (!opts::HexDump.empty())
495-
Dumper->printSectionsAsHex(Obj, opts::HexDump);
501+
Dumper->printSectionsAsHex(&Obj, opts::HexDump);
496502
if (opts::HashTable)
497503
Dumper->printHashTable();
498504
if (opts::GnuHashTable)
499-
Dumper->printGnuHashTable(Obj);
505+
Dumper->printGnuHashTable(&Obj);
500506
if (opts::VersionInfo)
501507
Dumper->printVersionInfo();
502-
if (Obj->isELF()) {
508+
if (Obj.isELF()) {
503509
if (opts::DependentLibraries)
504510
Dumper->printDependentLibs();
505511
if (opts::ELFLinkerOptions)
@@ -517,7 +523,7 @@ static void dumpObject(const ObjectFile *Obj, ScopedPrinter &Writer,
517523
if (opts::Notes)
518524
Dumper->printNotes();
519525
}
520-
if (Obj->isCOFF()) {
526+
if (Obj.isCOFF()) {
521527
if (opts::COFFImports)
522528
Dumper->printCOFFImports();
523529
if (opts::COFFExports)
@@ -543,7 +549,7 @@ static void dumpObject(const ObjectFile *Obj, ScopedPrinter &Writer,
543549
CVTypes.GlobalIDTable, CVTypes.GlobalTypeTable,
544550
opts::CodeViewEnableGHash);
545551
}
546-
if (Obj->isMachO()) {
552+
if (Obj.isMachO()) {
547553
if (opts::MachODataInCode)
548554
Dumper->printMachODataInCode();
549555
if (opts::MachOIndirectSymbols)
@@ -574,7 +580,7 @@ static void dumpArchive(const Archive *Arc, ScopedPrinter &Writer) {
574580
continue;
575581
}
576582
if (ObjectFile *Obj = dyn_cast<ObjectFile>(&*ChildOrErr.get()))
577-
dumpObject(Obj, Writer, Arc);
583+
dumpObject(*Obj, Writer, Arc);
578584
else if (COFFImportFile *Imp = dyn_cast<COFFImportFile>(&*ChildOrErr.get()))
579585
dumpCOFFImportFile(Imp, Writer);
580586
else
@@ -591,7 +597,7 @@ static void dumpMachOUniversalBinary(const MachOUniversalBinary *UBinary,
591597
for (const MachOUniversalBinary::ObjectForArch &Obj : UBinary->objects()) {
592598
Expected<std::unique_ptr<MachOObjectFile>> ObjOrErr = Obj.getAsObjectFile();
593599
if (ObjOrErr)
594-
dumpObject(&*ObjOrErr.get(), Writer);
600+
dumpObject(*ObjOrErr.get(), Writer);
595601
else if (auto E = isNotObjectErrorInvalidFileType(ObjOrErr.takeError()))
596602
reportError(ObjOrErr.takeError(), UBinary->getFileName());
597603
else if (Expected<std::unique_ptr<Archive>> AOrErr = Obj.getAsArchive())
@@ -622,7 +628,7 @@ static void dumpInput(StringRef File, ScopedPrinter &Writer) {
622628
dyn_cast<MachOUniversalBinary>(&Binary))
623629
dumpMachOUniversalBinary(UBinary, Writer);
624630
else if (ObjectFile *Obj = dyn_cast<ObjectFile>(&Binary))
625-
dumpObject(Obj, Writer);
631+
dumpObject(*Obj, Writer);
626632
else if (COFFImportFile *Import = dyn_cast<COFFImportFile>(&Binary))
627633
dumpCOFFImportFile(Import, Writer);
628634
else if (WindowsResource *WinRes = dyn_cast<WindowsResource>(&Binary))

0 commit comments

Comments
 (0)