Unshift the GDB index/GNU pubnames constants modified in r191025

Based on code review feedback from Eric Christopher, unshifting these
constants as they can appear in the gdb_index itself, shifted a further
24 bits. This means that keeping them preshifted is a bit inflexible, so
let's not do that.

Given the motivation, wrap up some nicer enums, more type safety, and
some utility functions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191035 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Blaikie
2013-09-19 20:40:26 +00:00
parent f2144ed439
commit 9599f51559
3 changed files with 56 additions and 67 deletions

View File

@@ -790,39 +790,50 @@ enum AcceleratorTable {
const char *AtomTypeString(unsigned Atom);
// Constants for the GNU pubnames/pubtypes extensions supporting gdb index.
enum GDBIndex {
// The gnu_pub* index value looks like:
//
// 0-3 reserved
// 4-6 symbol kind
// 7 0 == global, 1 == static
// Attributes kinds for the index.
GDB_INDEX_SYMBOL_KIND_OFFSET = 4,
GDB_INDEX_SYMBOL_KIND_MASK = 7 << GDB_INDEX_SYMBOL_KIND_OFFSET,
// Special value to indicate no attributes are present.
GDB_INDEX_SYMBOL_KIND_NONE = 0,
GDB_INDEX_SYMBOL_KIND_TYPE = 1 << GDB_INDEX_SYMBOL_KIND_OFFSET,
GDB_INDEX_SYMBOL_KIND_VARIABLE = 2 << GDB_INDEX_SYMBOL_KIND_OFFSET,
GDB_INDEX_SYMBOL_KIND_FUNCTION = 3 << GDB_INDEX_SYMBOL_KIND_OFFSET,
GDB_INDEX_SYMBOL_KIND_OTHER = 4 << GDB_INDEX_SYMBOL_KIND_OFFSET,
// 3 unused values.
GDB_INDEX_SYMBOL_KIND_UNUSED5 = 5 << GDB_INDEX_SYMBOL_KIND_OFFSET,
GDB_INDEX_SYMBOL_KIND_UNUSED6 = 6 << GDB_INDEX_SYMBOL_KIND_OFFSET,
GDB_INDEX_SYMBOL_KIND_UNUSED7 = 7 << GDB_INDEX_SYMBOL_KIND_OFFSET,
// Index values are defined via the set of CUs that define the
// symbol. For the pubnames/pubtypes extensions we need the
// various shifts and masks.
GDB_INDEX_SYMBOL_STATIC_OFFSET = 7,
GDB_INDEX_SYMBOL_STATIC_MASK = 1 << GDB_INDEX_SYMBOL_STATIC_OFFSET,
GDB_INDEX_SYMBOL_STATIC = 1 << GDB_INDEX_SYMBOL_STATIC_OFFSET,
GDB_INDEX_SYMBOL_NON_STATIC = 0
enum GDBIndexEntryKind {
GIEK_NONE,
GIEK_TYPE,
GIEK_VARIABLE,
GIEK_FUNCTION,
GIEK_OTHER,
GIEK_UNUSED5,
GIEK_UNUSED6,
GIEK_UNUSED7,
};
/// GDBIndexTypeString - Return the string for the specified index type.
const char *GDBIndexTypeString(unsigned Kind);
enum GDBIndexEntryLinkage {
GIEL_EXTERNAL,
GIEL_STATIC
};
/// The gnu_pub* kind looks like:
///
/// 0-3 reserved
/// 4-6 symbol kind
/// 7 0 == global, 1 == static
///
/// A gdb_index descriptor includes the above kind, shifted 24 bits up with the
/// offset of the cu within the debug_info section stored in those 24 bits.
struct PubIndexEntryDescriptor {
GDBIndexEntryKind Kind;
bool Static;
PubIndexEntryDescriptor(GDBIndexEntryKind Kind, bool Static)
: Kind(Kind), Static(Static) {}
/* implicit */ PubIndexEntryDescriptor(GDBIndexEntryKind Kind)
: Kind(Kind), Static(false) {}
explicit PubIndexEntryDescriptor(uint8_t Value)
: Kind(static_cast<GDBIndexEntryKind>((Value & KIND_MASK) >>
KIND_OFFSET)),
Static(Value & STATIC_MASK) {}
uint8_t toBits() {
return Kind << KIND_OFFSET | Static << STATIC_OFFSET;
}
private:
const uint8_t KIND_OFFSET = 4;
const uint8_t KIND_MASK = 7 << KIND_OFFSET;
const uint8_t STATIC_OFFSET = 7;
const uint8_t STATIC_MASK = 1 << STATIC_OFFSET;
};
} // End of namespace dwarf