37 std::lock_guard<std::mutex> Guard(
Mutex);
38 std::optional<uint64_t> BaseAddr;
50 std::vector<uint64_t> FIRelativeOffsets;
51 for (
const auto &FI :
Funcs) {
52 if (
auto OffOrErr = FI.encode(FIFW))
53 FIRelativeOffsets.push_back(*OffOrErr);
55 return OffOrErr.takeError();
62 const bool HasUUID = !
UUID.empty();
63 const uint32_t NumGlobalDataEntries = 5 + (HasUUID ? 1 : 0) + 1;
65 static_cast<uint64_t>(NumGlobalDataEntries) * 20;
68 uint64_t CurOffset = HeaderSize + GlobalDataArraySize;
71 const uint64_t UUIDOffset = CurOffset;
74 CurOffset += UUIDSectionSize;
78 const uint64_t AddrOffsetsOffset = CurOffset;
80 CurOffset += AddrOffsetsSize;
83 const uint8_t AddrInfoOffSize = 8;
85 const uint64_t AddrInfoOffsetsOffset = CurOffset;
86 const uint64_t AddrInfoOffsetsSize =
Funcs.size() * AddrInfoOffSize;
87 CurOffset += AddrInfoOffsetsSize;
91 const uint64_t FileTableOffset = CurOffset;
94 CurOffset += FileTableSize;
97 const uint64_t StringTableOffset = CurOffset;
98 CurOffset += StringTableSize;
102 const uint64_t FISectionOffset = CurOffset;
103 CurOffset += FISectionSize;
113 if (
auto Err = Hdr.
encode(O))
134 assert(O.tell() == UUIDOffset);
139 O.alignTo(AddrOffSize);
140 assert(O.tell() == AddrOffsetsOffset);
144 O.alignTo(AddrInfoOffSize);
145 assert(O.tell() == AddrInfoOffsetsOffset);
146 for (
uint64_t RelOff : FIRelativeOffsets)
151 assert(O.tell() == FileTableOffset);
156 assert(O.tell() == StringTableOffset);
157 StrTab.write(O.get_stream());
161 assert(O.tell() == FISectionOffset);
static constexpr uint64_t getEncodedSize(uint8_t StringOffsetSize)
Returns the on-disk encoded size of a FileEntry for the given string offset size.