diff --git a/llvm/lib/ObjCopy/DXContainer/DXContainerObject.h b/llvm/lib/ObjCopy/DXContainer/DXContainerObject.h index 14f948df0ad9..362210b92dca 100644 --- a/llvm/lib/ObjCopy/DXContainer/DXContainerObject.h +++ b/llvm/lib/ObjCopy/DXContainer/DXContainerObject.h @@ -22,13 +22,22 @@ using namespace object; struct Part { StringRef Name; - uint32_t Offset; ArrayRef Data; + + size_t size() const { + return sizeof(dxbc::PartHeader) // base header + + Data.size(); // contents size + } }; struct Object { dxbc::Header Header; SmallVector Parts; + + size_t headerSize() const { + return sizeof(dxbc::Header) // base header + + sizeof(uint32_t) * Parts.size(); // part offset values + } }; } // end namespace dxc diff --git a/llvm/lib/ObjCopy/DXContainer/DXContainerReader.cpp b/llvm/lib/ObjCopy/DXContainer/DXContainerReader.cpp index d6e7a2a6a200..2a1a202d402e 100644 --- a/llvm/lib/ObjCopy/DXContainer/DXContainerReader.cpp +++ b/llvm/lib/ObjCopy/DXContainer/DXContainerReader.cpp @@ -22,13 +22,14 @@ Expected> DXContainerReader::create() const { Expected Name = DXContainerObj.getSectionName(PartDRI); if (auto E = Name.takeError()) return createStringError(inconvertibleErrorCode(), "Missing Part Name"); - uint32_t Offset = DXContainerObj.getSectionAddress(PartDRI); + assert(Name->size() == 4 && + "Valid DXIL Part name consists of 4 characters"); Expected> Data = DXContainerObj.getSectionContents(PartDRI); if (auto E = Data.takeError()) return createStringError(inconvertibleErrorCode(), "Missing Part Contents"); - Obj->Parts.push_back({*Name, Offset, *Data}); + Obj->Parts.push_back({*Name, *Data}); } return std::move(Obj); } diff --git a/llvm/lib/ObjCopy/DXContainer/DXContainerWriter.cpp b/llvm/lib/ObjCopy/DXContainer/DXContainerWriter.cpp index 8c7759c9ebe1..6dfc6908fe6e 100644 --- a/llvm/lib/ObjCopy/DXContainer/DXContainerWriter.cpp +++ b/llvm/lib/ObjCopy/DXContainer/DXContainerWriter.cpp @@ -15,16 +15,13 @@ namespace dxc { using namespace object; size_t DXContainerWriter::finalize() { - size_t ObjectSize = sizeof(dxbc::Header); - ObjectSize += Obj.Parts.size() * sizeof(uint32_t); Offsets.reserve(Obj.Parts.size()); + size_t Offset = Obj.headerSize(); for (const Part &P : Obj.Parts) { - Offsets.push_back(ObjectSize); - assert(P.Name.size() == 4 && - "Valid DXIL Part name consists of 4 characters"); - ObjectSize += 4 + sizeof(uint32_t) + P.Data.size(); + Offsets.push_back(Offset); + Offset += P.size(); } - return ObjectSize; + return Obj.Header.FileSize; } Error DXContainerWriter::write() {