self-review: recompute offsets instead of storing them

This commit is contained in:
Finn Plummer 2025-08-11 21:44:21 +00:00
parent 648d0fc2fc
commit c4b10967ee
3 changed files with 17 additions and 10 deletions

View File

@ -22,13 +22,22 @@ using namespace object;
struct Part {
StringRef Name;
uint32_t Offset;
ArrayRef<uint8_t> Data;
size_t size() const {
return sizeof(dxbc::PartHeader) // base header
+ Data.size(); // contents size
}
};
struct Object {
dxbc::Header Header;
SmallVector<Part> Parts;
size_t headerSize() const {
return sizeof(dxbc::Header) // base header
+ sizeof(uint32_t) * Parts.size(); // part offset values
}
};
} // end namespace dxc

View File

@ -22,13 +22,14 @@ Expected<std::unique_ptr<Object>> DXContainerReader::create() const {
Expected<StringRef> 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<ArrayRef<uint8_t>> 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);
}

View File

@ -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() {