16using namespace object;
18void XCOFFWriter::finalizeHeaders() {
20 FileSize +=
sizeof(XCOFFFileHeader32);
22 FileSize += Obj.FileHeader.AuxHeaderSize;
24 FileSize +=
sizeof(XCOFFSectionHeader32) * Obj.Sections.size();
27void XCOFFWriter::finalizeSections() {
28 for (
const Section &Sec : Obj.Sections) {
30 FileSize += Sec.Contents.size();
33 Sec.SectionHeader.NumberOfRelocations *
sizeof(XCOFFRelocation32);
37void XCOFFWriter::finalizeSymbolStringTable() {
38 assert(Obj.FileHeader.SymbolTableOffset >= FileSize);
39 FileSize = Obj.FileHeader.SymbolTableOffset;
44 FileSize += Obj.StringTable.size();
47void XCOFFWriter::finalize() {
51 finalizeSymbolStringTable();
54void XCOFFWriter::writeHeaders() {
56 uint8_t *
Ptr =
reinterpret_cast<uint8_t *
>(Buf->getBufferStart());
57 memcpy(
Ptr, &Obj.FileHeader,
sizeof(XCOFFFileHeader32));
58 Ptr +=
sizeof(XCOFFFileHeader32);
61 if (Obj.FileHeader.AuxHeaderSize) {
62 memcpy(
Ptr, &Obj.OptionalFileHeader, Obj.FileHeader.AuxHeaderSize);
63 Ptr += Obj.FileHeader.AuxHeaderSize;
67 for (
const Section &Sec : Obj.Sections) {
68 memcpy(
Ptr, &Sec.SectionHeader,
sizeof(XCOFFSectionHeader32));
69 Ptr +=
sizeof(XCOFFSectionHeader32);
73void XCOFFWriter::writeSections() {
75 for (
const Section &Sec : Obj.Sections) {
76 uint8_t *
Ptr =
reinterpret_cast<uint8_t *
>(Buf->getBufferStart()) +
77 Sec.SectionHeader.FileOffsetToRawData;
82 for (
const Section &Sec : Obj.Sections) {
83 uint8_t *
Ptr =
reinterpret_cast<uint8_t *
>(Buf->getBufferStart()) +
84 Sec.SectionHeader.FileOffsetToRelocationInfo;
85 for (
const XCOFFRelocation32 &Rel : Sec.Relocations) {
86 memcpy(
Ptr, &Rel,
sizeof(XCOFFRelocation32));
87 Ptr +=
sizeof(XCOFFRelocation32);
92void XCOFFWriter::writeSymbolStringTable() {
94 uint8_t *
Ptr =
reinterpret_cast<uint8_t *
>(Buf->getBufferStart()) +
95 Obj.FileHeader.SymbolTableOffset;
96 for (
const Symbol &Sym : Obj.Symbols) {
100 memcpy(
Ptr, Sym.AuxSymbolEntries.data(), Sym.AuxSymbolEntries.size());
101 Ptr += Sym.AuxSymbolEntries.size();
104 memcpy(
Ptr, Obj.StringTable.data(), Obj.StringTable.size());
105 Ptr += Obj.StringTable.size();
113 "failed to allocate memory buffer of " +
118 writeSymbolStringTable();
119 Out.write(Buf->getBufferStart(), Buf->getBufferSize());
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
static Twine utohexstr(uint64_t Val)
static LLVM_ABI std::unique_ptr< WritableMemoryBuffer > getNewMemBuffer(size_t Size, const Twine &BufferName="")
Allocate a new zero-initialized MemoryBuffer of the specified size.
constexpr size_t SymbolTableEntrySize
This is an optimization pass for GlobalISel generic memory operations.
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
OutputIt copy(R &&Range, OutputIt Out)