/// This implements the Apple accelerator table format, a precursor of the
/// DWARF 5 accelerator table format.
/// TODO: Factor out a common base class for both formats.
-class DWARFAcceleratorTable {
+class AppleAcceleratorTable {
struct Header {
uint32_t Magic;
uint16_t Version;
/// multiple DWARFFormValues.
class ValueIterator : public std::iterator<std::input_iterator_tag,
ArrayRef<DWARFFormValue>> {
- const DWARFAcceleratorTable *AccelTable = nullptr;
+ const AppleAcceleratorTable *AccelTable = nullptr;
SmallVector<DWARFFormValue, 3> AtomForms; ///< The decoded data entry.
unsigned DataOffset = 0; ///< Offset into the section.
void Next();
public:
/// Construct a new iterator for the entries at \p DataOffset.
- ValueIterator(const DWARFAcceleratorTable &AccelTable, unsigned DataOffset);
+ ValueIterator(const AppleAcceleratorTable &AccelTable, unsigned DataOffset);
/// End marker.
ValueIterator() = default;
};
- DWARFAcceleratorTable(const DWARFDataExtractor &AccelSection,
+ AppleAcceleratorTable(const DWARFDataExtractor &AccelSection,
DataExtractor StringSection)
: AccelSection(AccelSection), StringSection(StringSection) {}
std::unique_ptr<DWARFDebugFrame> DebugFrame;
std::unique_ptr<DWARFDebugFrame> EHFrame;
std::unique_ptr<DWARFDebugMacro> Macro;
- std::unique_ptr<DWARFAcceleratorTable> AppleNames;
- std::unique_ptr<DWARFAcceleratorTable> AppleTypes;
- std::unique_ptr<DWARFAcceleratorTable> AppleNamespaces;
- std::unique_ptr<DWARFAcceleratorTable> AppleObjC;
+ std::unique_ptr<AppleAcceleratorTable> AppleNames;
+ std::unique_ptr<AppleAcceleratorTable> AppleTypes;
+ std::unique_ptr<AppleAcceleratorTable> AppleNamespaces;
+ std::unique_ptr<AppleAcceleratorTable> AppleObjC;
DWARFUnitSection<DWARFCompileUnit> DWOCUs;
std::deque<DWARFUnitSection<DWARFTypeUnit>> DWOTUs;
const DWARFDebugMacro *getDebugMacro();
/// Get a reference to the parsed accelerator table object.
- const DWARFAcceleratorTable &getAppleNames();
+ const AppleAcceleratorTable &getAppleNames();
/// Get a reference to the parsed accelerator table object.
- const DWARFAcceleratorTable &getAppleTypes();
+ const AppleAcceleratorTable &getAppleTypes();
/// Get a reference to the parsed accelerator table object.
- const DWARFAcceleratorTable &getAppleNamespaces();
+ const AppleAcceleratorTable &getAppleNamespaces();
/// Get a reference to the parsed accelerator table object.
- const DWARFAcceleratorTable &getAppleObjC();
+ const AppleAcceleratorTable &getAppleObjC();
/// Get a pointer to a parsed line table corresponding to a compile unit.
const DWARFDebugLine::LineTable *getLineTableForUnit(DWARFUnit *cu);
class DWARFContext;
class DWARFDie;
class DWARFUnit;
-class DWARFAcceleratorTable;
class DWARFDataExtractor;
class DWARFDebugAbbrev;
class DataExtractor;
/// \param SectionName the name of the table we're verifying
///
/// \returns The number of errors occured during verification
- unsigned verifyAccelTable(const DWARFSection *AccelSection,
- DataExtractor *StrData, const char *SectionName);
+ unsigned verifyAppleAccelTable(const DWARFSection *AccelSection,
+ DataExtractor *StrData,
+ const char *SectionName);
public:
DWARFVerifier(raw_ostream &S, DWARFContext &D,
using namespace llvm;
-llvm::Error DWARFAcceleratorTable::extract() {
+llvm::Error AppleAcceleratorTable::extract() {
uint32_t Offset = 0;
// Check that we can at least read the header.
return Error::success();
}
-uint32_t DWARFAcceleratorTable::getNumBuckets() { return Hdr.NumBuckets; }
-uint32_t DWARFAcceleratorTable::getNumHashes() { return Hdr.NumHashes; }
-uint32_t DWARFAcceleratorTable::getSizeHdr() { return sizeof(Hdr); }
-uint32_t DWARFAcceleratorTable::getHeaderDataLength() {
+uint32_t AppleAcceleratorTable::getNumBuckets() { return Hdr.NumBuckets; }
+uint32_t AppleAcceleratorTable::getNumHashes() { return Hdr.NumHashes; }
+uint32_t AppleAcceleratorTable::getSizeHdr() { return sizeof(Hdr); }
+uint32_t AppleAcceleratorTable::getHeaderDataLength() {
return Hdr.HeaderDataLength;
}
-ArrayRef<std::pair<DWARFAcceleratorTable::HeaderData::AtomType,
- DWARFAcceleratorTable::HeaderData::Form>>
-DWARFAcceleratorTable::getAtomsDesc() {
+ArrayRef<std::pair<AppleAcceleratorTable::HeaderData::AtomType,
+ AppleAcceleratorTable::HeaderData::Form>>
+AppleAcceleratorTable::getAtomsDesc() {
return HdrData.Atoms;
}
-bool DWARFAcceleratorTable::validateForms() {
+bool AppleAcceleratorTable::validateForms() {
for (auto Atom : getAtomsDesc()) {
DWARFFormValue FormValue(Atom.second);
switch (Atom.first) {
}
std::pair<uint32_t, dwarf::Tag>
-DWARFAcceleratorTable::readAtoms(uint32_t &HashDataOffset) {
+AppleAcceleratorTable::readAtoms(uint32_t &HashDataOffset) {
uint32_t DieOffset = dwarf::DW_INVALID_OFFSET;
dwarf::Tag DieTag = dwarf::DW_TAG_null;
DWARFFormParams FormParams = {Hdr.Version, 0, dwarf::DwarfFormat::DWARF32};
return {DieOffset, DieTag};
}
-LLVM_DUMP_METHOD void DWARFAcceleratorTable::dump(raw_ostream &OS) const {
+LLVM_DUMP_METHOD void AppleAcceleratorTable::dump(raw_ostream &OS) const {
if (!IsValid)
return;
}
}
-DWARFAcceleratorTable::ValueIterator::ValueIterator(
- const DWARFAcceleratorTable &AccelTable, unsigned Offset)
+AppleAcceleratorTable::ValueIterator::ValueIterator(
+ const AppleAcceleratorTable &AccelTable, unsigned Offset)
: AccelTable(&AccelTable), DataOffset(Offset) {
if (!AccelTable.AccelSection.isValidOffsetForDataOfSize(DataOffset, 4))
return;
Next();
}
-void DWARFAcceleratorTable::ValueIterator::Next() {
+void AppleAcceleratorTable::ValueIterator::Next() {
assert(NumData > 0 && "attempted to increment iterator past the end");
auto &AccelSection = AccelTable->AccelSection;
if (Data >= NumData ||
++Data;
}
-iterator_range<DWARFAcceleratorTable::ValueIterator>
-DWARFAcceleratorTable::equal_range(StringRef Key) const {
+iterator_range<AppleAcceleratorTable::ValueIterator>
+AppleAcceleratorTable::equal_range(StringRef Key) const {
if (!IsValid)
return make_range(ValueIterator(), ValueIterator());
return Macro.get();
}
-static DWARFAcceleratorTable &
-getAccelTable(std::unique_ptr<DWARFAcceleratorTable> &Cache,
+static AppleAcceleratorTable &
+getAccelTable(std::unique_ptr<AppleAcceleratorTable> &Cache,
const DWARFObject &Obj, const DWARFSection &Section,
StringRef StringSection, bool IsLittleEndian) {
if (Cache)
return *Cache;
DWARFDataExtractor AccelSection(Obj, Section, IsLittleEndian, 0);
DataExtractor StrData(StringSection, IsLittleEndian, 0);
- Cache.reset(new DWARFAcceleratorTable(AccelSection, StrData));
+ Cache.reset(new AppleAcceleratorTable(AccelSection, StrData));
if (Error E = Cache->extract())
llvm::consumeError(std::move(E));
return *Cache;
}
-const DWARFAcceleratorTable &DWARFContext::getAppleNames() {
+const AppleAcceleratorTable &DWARFContext::getAppleNames() {
return getAccelTable(AppleNames, *DObj, DObj->getAppleNamesSection(),
DObj->getStringSection(), isLittleEndian());
}
-const DWARFAcceleratorTable &DWARFContext::getAppleTypes() {
+const AppleAcceleratorTable &DWARFContext::getAppleTypes() {
return getAccelTable(AppleTypes, *DObj, DObj->getAppleTypesSection(),
DObj->getStringSection(), isLittleEndian());
}
-const DWARFAcceleratorTable &DWARFContext::getAppleNamespaces() {
+const AppleAcceleratorTable &DWARFContext::getAppleNamespaces() {
return getAccelTable(AppleNamespaces, *DObj,
DObj->getAppleNamespacesSection(),
DObj->getStringSection(), isLittleEndian());
}
-const DWARFAcceleratorTable &DWARFContext::getAppleObjC() {
+const AppleAcceleratorTable &DWARFContext::getAppleObjC() {
return getAccelTable(AppleObjC, *DObj, DObj->getAppleObjCSection(),
DObj->getStringSection(), isLittleEndian());
}
return NumDebugLineErrors == 0;
}
-unsigned DWARFVerifier::verifyAccelTable(const DWARFSection *AccelSection,
- DataExtractor *StrData,
- const char *SectionName) {
+unsigned DWARFVerifier::verifyAppleAccelTable(const DWARFSection *AccelSection,
+ DataExtractor *StrData,
+ const char *SectionName) {
unsigned NumErrors = 0;
DWARFDataExtractor AccelSectionData(DCtx.getDWARFObj(), *AccelSection,
DCtx.isLittleEndian(), 0);
- DWARFAcceleratorTable AccelTable(AccelSectionData, *StrData);
+ AppleAcceleratorTable AccelTable(AccelSectionData, *StrData);
OS << "Verifying " << SectionName << "...\n";
unsigned NumErrors = 0;
if (!D.getAppleNamesSection().Data.empty())
NumErrors +=
- verifyAccelTable(&D.getAppleNamesSection(), &StrData, ".apple_names");
+ verifyAppleAccelTable(&D.getAppleNamesSection(), &StrData, ".apple_names");
if (!D.getAppleTypesSection().Data.empty())
NumErrors +=
- verifyAccelTable(&D.getAppleTypesSection(), &StrData, ".apple_types");
+ verifyAppleAccelTable(&D.getAppleTypesSection(), &StrData, ".apple_types");
if (!D.getAppleNamespacesSection().Data.empty())
- NumErrors += verifyAccelTable(&D.getAppleNamespacesSection(), &StrData,
+ NumErrors += verifyAppleAccelTable(&D.getAppleNamespacesSection(), &StrData,
".apple_namespaces");
if (!D.getAppleObjCSection().Data.empty())
NumErrors +=
- verifyAccelTable(&D.getAppleObjCSection(), &StrData, ".apple_objc");
+ verifyAppleAccelTable(&D.getAppleObjCSection(), &StrData, ".apple_objc");
return NumErrors == 0;
}
if (!Find.empty()) {
DumpOffsets[DIDT_ID_DebugInfo] = [&]() -> llvm::Optional<uint64_t> {
for (auto Name : Find) {
- auto find = [&](const DWARFAcceleratorTable &Accel)
+ auto find = [&](const AppleAcceleratorTable &Accel)
-> llvm::Optional<uint64_t> {
for (auto Entry : Accel.equal_range(Name))
for (auto Atom : Entry)