LLVM: lib/ObjCopy/XCOFF/XCOFFReader.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
10
11namespace llvm {
14
15using namespace object;
16
17Error XCOFFReader::readSections(Object &Obj) const {
19 for (const XCOFFSectionHeader32 &Sec : Sections) {
21
22 ReadSec.SectionHeader = Sec;
23 DataRefImpl SectionDRI;
24 SectionDRI.p = reinterpret_cast<uintptr_t>(&Sec);
25
26
27 if (Sec.SectionSize) {
28 Expected<ArrayRef<uint8_t>> ContentsRef =
29 XCOFFObj.getSectionContents(SectionDRI);
30 if (!ContentsRef)
31 return ContentsRef.takeError();
32 ReadSec.Contents = ContentsRef.get();
33 }
34
35
36 if (Sec.NumberOfRelocations) {
37 auto Relocations =
38 XCOFFObj.relocations<XCOFFSectionHeader32, XCOFFRelocation32>(Sec);
39 if (!Relocations)
40 return Relocations.takeError();
42 }
43
44 Obj.Sections.push_back(std::move(ReadSec));
45 }
47}
48
49Error XCOFFReader::readSymbols(Object &Obj) const {
50 std::vector Symbols;
51 Symbols.reserve(XCOFFObj.getNumberOfSymbolTableEntries());
52 for (SymbolRef Sym : XCOFFObj.symbols()) {
54 DataRefImpl SymbolDRI = Sym.getRawDataRefImpl();
55 XCOFFSymbolRef SymbolEntRef = XCOFFObj.toSymbolRef(SymbolDRI);
56 ReadSym.Sym = *SymbolEntRef.getSymbol32();
57
58 if (SymbolEntRef.getNumberOfAuxEntries()) {
59 const char *Start = reinterpret_cast<const char *>(
61 Expected RawAuxEntriesOrError = XCOFFObj.getRawData(
62 Start,
64 StringRef("symbol"));
65 if (!RawAuxEntriesOrError)
66 return RawAuxEntriesOrError.takeError();
67 ReadSym.AuxSymbolEntries = RawAuxEntriesOrError.get();
68 }
69 Obj.Symbols.push_back(std::move(ReadSym));
70 }
72}
73
75 auto Obj = std::make_unique();
76
77 if (XCOFFObj.is64Bit())
79 "64-bit XCOFF is not supported yet");
80
81 Obj->FileHeader = *XCOFFObj.fileHeader32();
82
83 if (XCOFFObj.getOptionalHeaderSize())
84 Obj->OptionalFileHeader = *XCOFFObj.auxiliaryHeader32();
85
86 Obj->Sections.reserve(XCOFFObj.getNumberOfSections());
87 if (Error E = readSections(*Obj))
88 return std::move(E);
89
90 Obj->Symbols.reserve(XCOFFObj.getRawNumberOfSymbolTableEntries32());
91 if (Error E = readSymbols(*Obj))
92 return std::move(E);
93
94 Obj->StringTable = XCOFFObj.getStringTable();
95 return std::move(Obj);
96}
97
98}
99}
100}
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Expected< std::unique_ptr< Object > > create() const
Definition XCOFFReader.cpp:74
constexpr size_t SymbolTableEntrySize
This is an optimization pass for GlobalISel generic memory operations.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
ArrayRef(const T &OneElt) -> ArrayRef< T >