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 >