21 if (!AccelSection.
isValidOffset(offsetof(Header, HeaderDataLength)+4))
24 Hdr.Magic = AccelSection.
getU32(&Offset);
25 Hdr.Version = AccelSection.
getU16(&Offset);
26 Hdr.HashFunction = AccelSection.
getU16(&Offset);
27 Hdr.NumBuckets = AccelSection.
getU32(&Offset);
28 Hdr.NumHashes = AccelSection.
getU32(&Offset);
29 Hdr.HeaderDataLength = AccelSection.
getU32(&Offset);
33 if (!AccelSection.
isValidOffset(
sizeof(Hdr) + Hdr.HeaderDataLength +
34 Hdr.NumBuckets*4 + Hdr.NumHashes*8))
37 HdrData.DIEOffsetBase = AccelSection.
getU32(&Offset);
40 for (
unsigned i = 0;
i < NumAtoms; ++
i) {
41 uint16_t AtomType = AccelSection.
getU16(&Offset);
43 HdrData.Atoms.push_back(std::make_pair(AtomType, AtomForm));
51 OS <<
"Magic = " <<
format(
"0x%08x", Hdr.Magic) <<
'\n'
52 <<
"Version = " <<
format(
"0x%04x", Hdr.Version) <<
'\n'
53 <<
"Hash function = " <<
format(
"0x%08x", Hdr.HashFunction) <<
'\n'
54 <<
"Bucket count = " << Hdr.NumBuckets <<
'\n'
55 <<
"Hashes count = " << Hdr.NumHashes <<
'\n'
56 <<
"HeaderData length = " << Hdr.HeaderDataLength <<
'\n'
57 <<
"DIE offset base = " << HdrData.DIEOffsetBase <<
'\n'
58 <<
"Number of atoms = " << HdrData.Atoms.size() <<
'\n';
62 for (
const auto &Atom: HdrData.Atoms) {
63 OS <<
format(
"Atom[%d] Type: ", i++);
65 if (!TypeString.empty())
68 OS <<
format(
"DW_ATOM_Unknown_0x%x", Atom.first);
71 if (!FormString.empty())
74 OS <<
format(
"DW_FORM_Unknown_0x%x", Atom.second);
81 unsigned HashesBase = Offset + Hdr.NumBuckets * 4;
82 unsigned OffsetsBase = HashesBase + Hdr.NumHashes * 4;
84 for (
unsigned Bucket = 0; Bucket < Hdr.NumBuckets; ++Bucket) {
85 unsigned Index = AccelSection.
getU32(&Offset);
87 OS <<
format(
"Bucket[%d]\n", Bucket);
88 if (Index == UINT32_MAX) {
93 for (
unsigned HashIdx = Index; HashIdx < Hdr.NumHashes; ++HashIdx) {
94 unsigned HashOffset = HashesBase + HashIdx*4;
95 unsigned OffsetsOffset = OffsetsBase + HashIdx*4;
98 if (Hash % Hdr.NumBuckets != Bucket)
101 unsigned DataOffset = AccelSection.
getU32(&OffsetsOffset);
102 OS <<
format(
" Hash = 0x%08x Offset = 0x%08x\n", Hash, DataOffset);
104 OS <<
" Invalid section offset\n";
108 unsigned StringOffset = AccelSection.
getU32(&DataOffset);
110 if (Reloc != Relocs.
end())
111 StringOffset += Reloc->second.second;
114 OS <<
format(
" Name: %08x \"%s\"\n", StringOffset,
115 StringSection.
getCStr(&StringOffset));
116 unsigned NumData = AccelSection.
getU32(&DataOffset);
117 for (
unsigned Data = 0; Data < NumData; ++Data) {
118 OS <<
format(
" Data[%d] => ", Data);
120 for (
auto &Atom : AtomForms) {
121 OS <<
format(
"{Atom[%d]: ", i++);
122 if (Atom.extractValue(AccelSection, &DataOffset,
nullptr))
125 OS <<
"Error extracting the value";
void push_back(const T &Elt)
StringRef AtomTypeString(unsigned Atom)
StringRef FormEncodingString(unsigned Encoding)
format_object< Ts...> format(const char *Fmt, const Ts &...Vals)
These are helper functions used to produce formatted output.
* if(!EatIfPresent(lltok::kw_thread_local)) return false
ParseOptionalThreadLocal := /*empty.
for(unsigned i=0, e=MI->getNumOperands();i!=e;++i)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
void dump(raw_ostream &OS) const
iterator find(const KeyT &Val)
This class implements an extremely fast bulk output stream that can only output to a stream...
std::string Hash(const Unit &U)