forked from OSchip/llvm-project
Move accelerator table defines and constants to Dwarf.h since
we're proposing it for DWARF5. No functional change intended. llvm-svn: 190074
This commit is contained in:
parent
8f60cdd54b
commit
cf7289f6d9
|
@ -763,6 +763,32 @@ const char *MacinfoString(unsigned Encoding);
|
||||||
/// CallFrameString - Return the string for the specified call frame instruction
|
/// CallFrameString - Return the string for the specified call frame instruction
|
||||||
/// encodings.
|
/// encodings.
|
||||||
const char *CallFrameString(unsigned Encoding);
|
const char *CallFrameString(unsigned Encoding);
|
||||||
|
|
||||||
|
// Constants for the DWARF5 Accelerator Table Proposal
|
||||||
|
enum AcceleratorTable {
|
||||||
|
// Data layout descriptors.
|
||||||
|
DW_ATOM_null = 0u, // Marker as the end of a list of atoms.
|
||||||
|
DW_ATOM_die_offset = 1u, // DIE offset in the debug_info section.
|
||||||
|
DW_ATOM_cu_offset = 2u, // Offset of the compile unit header that contains the
|
||||||
|
// item in question.
|
||||||
|
DW_ATOM_die_tag = 3u, // A tag entry.
|
||||||
|
DW_ATOM_type_flags = 4u, // Set of flags for a type.
|
||||||
|
|
||||||
|
// DW_ATOM_type_flags values.
|
||||||
|
|
||||||
|
// Always set for C++, only set for ObjC if this is the @implementation for a
|
||||||
|
// class.
|
||||||
|
DW_FLAG_type_implementation = 2u,
|
||||||
|
|
||||||
|
// Hash functions.
|
||||||
|
|
||||||
|
// Daniel J. Bernstein hash.
|
||||||
|
DW_hash_function_djb = 0u
|
||||||
|
};
|
||||||
|
|
||||||
|
/// AtomTypeString - Return the string for the specified Atom type.
|
||||||
|
const char *AtomTypeString(unsigned Atom);
|
||||||
|
|
||||||
} // End of namespace dwarf
|
} // End of namespace dwarf
|
||||||
|
|
||||||
} // End of namespace llvm
|
} // End of namespace llvm
|
||||||
|
|
|
@ -24,24 +24,6 @@
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
const char *DwarfAccelTable::Atom::AtomTypeString(enum AtomType AT) {
|
|
||||||
switch (AT) {
|
|
||||||
case eAtomTypeNULL:
|
|
||||||
return "eAtomTypeNULL";
|
|
||||||
case eAtomTypeDIEOffset:
|
|
||||||
return "eAtomTypeDIEOffset";
|
|
||||||
case eAtomTypeCUOffset:
|
|
||||||
return "eAtomTypeCUOffset";
|
|
||||||
case eAtomTypeTag:
|
|
||||||
return "eAtomTypeTag";
|
|
||||||
case eAtomTypeNameFlags:
|
|
||||||
return "eAtomTypeNameFlags";
|
|
||||||
case eAtomTypeTypeFlags:
|
|
||||||
return "eAtomTypeTypeFlags";
|
|
||||||
}
|
|
||||||
llvm_unreachable("invalid AtomType!");
|
|
||||||
}
|
|
||||||
|
|
||||||
// The length of the header data is always going to be 4 + 4 + 4*NumAtoms.
|
// The length of the header data is always going to be 4 + 4 + 4*NumAtoms.
|
||||||
DwarfAccelTable::DwarfAccelTable(ArrayRef<DwarfAccelTable::Atom> atomList)
|
DwarfAccelTable::DwarfAccelTable(ArrayRef<DwarfAccelTable::Atom> atomList)
|
||||||
: Header(8 + (atomList.size() * 4)), HeaderData(atomList),
|
: Header(8 + (atomList.size() * 4)), HeaderData(atomList),
|
||||||
|
@ -134,7 +116,7 @@ void DwarfAccelTable::EmitHeader(AsmPrinter *Asm) {
|
||||||
Asm->EmitInt32(HeaderData.Atoms.size());
|
Asm->EmitInt32(HeaderData.Atoms.size());
|
||||||
for (size_t i = 0; i < HeaderData.Atoms.size(); i++) {
|
for (size_t i = 0; i < HeaderData.Atoms.size(); i++) {
|
||||||
Atom A = HeaderData.Atoms[i];
|
Atom A = HeaderData.Atoms[i];
|
||||||
Asm->OutStreamer.AddComment(Atom::AtomTypeString(A.type));
|
Asm->OutStreamer.AddComment(dwarf::AtomTypeString(A.type));
|
||||||
Asm->EmitInt16(A.type);
|
Asm->EmitInt16(A.type);
|
||||||
Asm->OutStreamer.AddComment(dwarf::FormEncodingString(A.form));
|
Asm->OutStreamer.AddComment(dwarf::FormEncodingString(A.form));
|
||||||
Asm->EmitInt16(A.form);
|
Asm->EmitInt16(A.form);
|
||||||
|
|
|
@ -67,10 +67,6 @@ class DwarfUnits;
|
||||||
|
|
||||||
class DwarfAccelTable {
|
class DwarfAccelTable {
|
||||||
|
|
||||||
enum HashFunctionType {
|
|
||||||
eHashFunctionDJB = 0u
|
|
||||||
};
|
|
||||||
|
|
||||||
static uint32_t HashDJB(StringRef Str) {
|
static uint32_t HashDJB(StringRef Str) {
|
||||||
uint32_t h = 5381;
|
uint32_t h = 5381;
|
||||||
for (unsigned i = 0, e = Str.size(); i != e; ++i)
|
for (unsigned i = 0, e = Str.size(); i != e; ++i)
|
||||||
|
@ -96,8 +92,9 @@ class DwarfAccelTable {
|
||||||
static const uint32_t MagicHash = 0x48415348;
|
static const uint32_t MagicHash = 0x48415348;
|
||||||
|
|
||||||
TableHeader(uint32_t data_len)
|
TableHeader(uint32_t data_len)
|
||||||
: magic(MagicHash), version(1), hash_function(eHashFunctionDJB),
|
: magic(MagicHash), version(1),
|
||||||
bucket_count(0), hashes_count(0), header_data_len(data_len) {}
|
hash_function(dwarf::DW_hash_function_djb), bucket_count(0),
|
||||||
|
hashes_count(0), header_data_len(data_len) {}
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
void print(raw_ostream &O) {
|
void print(raw_ostream &O) {
|
||||||
|
@ -123,37 +120,17 @@ public:
|
||||||
// uint32_t die_offset_base
|
// uint32_t die_offset_base
|
||||||
// uint32_t atom_count
|
// uint32_t atom_count
|
||||||
// atom_count Atoms
|
// atom_count Atoms
|
||||||
enum AtomType {
|
|
||||||
eAtomTypeNULL = 0u,
|
|
||||||
eAtomTypeDIEOffset = 1u, // DIE offset, check form for encoding
|
|
||||||
eAtomTypeCUOffset = 2u, // DIE offset of the compiler unit header that
|
|
||||||
// contains the item in question
|
|
||||||
eAtomTypeTag = 3u, // DW_TAG_xxx value, should be encoded as
|
|
||||||
// DW_FORM_data1 (if no tags exceed 255) or
|
|
||||||
// DW_FORM_data2.
|
|
||||||
eAtomTypeNameFlags = 4u, // Flags from enum NameFlags
|
|
||||||
eAtomTypeTypeFlags = 5u // Flags from enum TypeFlags
|
|
||||||
};
|
|
||||||
|
|
||||||
enum TypeFlags {
|
|
||||||
eTypeFlagClassMask = 0x0000000fu,
|
|
||||||
|
|
||||||
// Always set for C++, only set for ObjC if this is the
|
|
||||||
// @implementation for a class.
|
|
||||||
eTypeFlagClassIsImplementation = (1u << 1)
|
|
||||||
};
|
|
||||||
|
|
||||||
// Make these public so that they can be used as a general interface to
|
// Make these public so that they can be used as a general interface to
|
||||||
// the class.
|
// the class.
|
||||||
struct Atom {
|
struct Atom {
|
||||||
AtomType type; // enum AtomType
|
uint16_t type; // enum AtomType
|
||||||
uint16_t form; // DWARF DW_FORM_ defines
|
uint16_t form; // DWARF DW_FORM_ defines
|
||||||
|
|
||||||
Atom(AtomType type, uint16_t form) : type(type), form(form) {}
|
Atom(uint16_t type, uint16_t form) : type(type), form(form) {}
|
||||||
static const char *AtomTypeString(enum AtomType);
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
void print(raw_ostream &O) {
|
void print(raw_ostream &O) {
|
||||||
O << "Type: " << AtomTypeString(type) << "\n"
|
O << "Type: " << dwarf::AtomTypeString(type) << "\n"
|
||||||
<< "Form: " << dwarf::FormEncodingString(form) << "\n";
|
<< "Form: " << dwarf::FormEncodingString(form) << "\n";
|
||||||
}
|
}
|
||||||
void dump() { print(dbgs()); }
|
void dump() { print(dbgs()); }
|
||||||
|
|
|
@ -796,8 +796,7 @@ DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
|
||||||
IsImplementation = (CT.getRunTimeLang() == 0) ||
|
IsImplementation = (CT.getRunTimeLang() == 0) ||
|
||||||
CT.isObjcClassComplete();
|
CT.isObjcClassComplete();
|
||||||
}
|
}
|
||||||
unsigned Flags = IsImplementation ?
|
unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0;
|
||||||
DwarfAccelTable::eTypeFlagClassIsImplementation : 0;
|
|
||||||
addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
|
addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2120,7 +2120,7 @@ void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) {
|
||||||
|
|
||||||
// Emit visible names into a hashed accelerator table section.
|
// Emit visible names into a hashed accelerator table section.
|
||||||
void DwarfDebug::emitAccelNames() {
|
void DwarfDebug::emitAccelNames() {
|
||||||
DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
|
DwarfAccelTable AT(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
|
||||||
dwarf::DW_FORM_data4));
|
dwarf::DW_FORM_data4));
|
||||||
for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
|
for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
|
||||||
E = CUMap.end(); I != E; ++I) {
|
E = CUMap.end(); I != E; ++I) {
|
||||||
|
@ -2149,7 +2149,7 @@ void DwarfDebug::emitAccelNames() {
|
||||||
// Emit objective C classes and categories into a hashed accelerator table
|
// Emit objective C classes and categories into a hashed accelerator table
|
||||||
// section.
|
// section.
|
||||||
void DwarfDebug::emitAccelObjC() {
|
void DwarfDebug::emitAccelObjC() {
|
||||||
DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
|
DwarfAccelTable AT(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
|
||||||
dwarf::DW_FORM_data4));
|
dwarf::DW_FORM_data4));
|
||||||
for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
|
for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
|
||||||
E = CUMap.end(); I != E; ++I) {
|
E = CUMap.end(); I != E; ++I) {
|
||||||
|
@ -2177,7 +2177,7 @@ void DwarfDebug::emitAccelObjC() {
|
||||||
|
|
||||||
// Emit namespace dies into a hashed accelerator table.
|
// Emit namespace dies into a hashed accelerator table.
|
||||||
void DwarfDebug::emitAccelNamespaces() {
|
void DwarfDebug::emitAccelNamespaces() {
|
||||||
DwarfAccelTable AT(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
|
DwarfAccelTable AT(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
|
||||||
dwarf::DW_FORM_data4));
|
dwarf::DW_FORM_data4));
|
||||||
for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
|
for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
|
||||||
E = CUMap.end(); I != E; ++I) {
|
E = CUMap.end(); I != E; ++I) {
|
||||||
|
@ -2206,11 +2206,11 @@ void DwarfDebug::emitAccelNamespaces() {
|
||||||
// Emit type dies into a hashed accelerator table.
|
// Emit type dies into a hashed accelerator table.
|
||||||
void DwarfDebug::emitAccelTypes() {
|
void DwarfDebug::emitAccelTypes() {
|
||||||
std::vector<DwarfAccelTable::Atom> Atoms;
|
std::vector<DwarfAccelTable::Atom> Atoms;
|
||||||
Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeDIEOffset,
|
Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
|
||||||
dwarf::DW_FORM_data4));
|
dwarf::DW_FORM_data4));
|
||||||
Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTag,
|
Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag,
|
||||||
dwarf::DW_FORM_data2));
|
dwarf::DW_FORM_data2));
|
||||||
Atoms.push_back(DwarfAccelTable::Atom(DwarfAccelTable::eAtomTypeTypeFlags,
|
Atoms.push_back(DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags,
|
||||||
dwarf::DW_FORM_data1));
|
dwarf::DW_FORM_data1));
|
||||||
DwarfAccelTable AT(Atoms);
|
DwarfAccelTable AT(Atoms);
|
||||||
for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
|
for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
|
||||||
|
|
|
@ -723,3 +723,19 @@ const char *llvm::dwarf::CallFrameString(unsigned Encoding) {
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *llvm::dwarf::AtomTypeString(unsigned AT) {
|
||||||
|
switch (AT) {
|
||||||
|
case dwarf::DW_ATOM_null:
|
||||||
|
return "DW_ATOM_null";
|
||||||
|
case dwarf::DW_ATOM_die_offset:
|
||||||
|
return "DW_ATOM_die_offset";
|
||||||
|
case DW_ATOM_cu_offset:
|
||||||
|
return "DW_ATOM_cu_offset";
|
||||||
|
case DW_ATOM_die_tag:
|
||||||
|
return "DW_ATOM_die_tag";
|
||||||
|
case DW_ATOM_type_flags:
|
||||||
|
return "DW_ATOM_type_flags";
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue