[llvm] r191025 - DebugInfo: Simplify gnu_pubnames index computation.

David Blaikie dblaikie at gmail.com
Thu Sep 19 11:39:59 PDT 2013


Author: dblaikie
Date: Thu Sep 19 13:39:59 2013
New Revision: 191025

URL: http://llvm.org/viewvc/llvm-project?rev=191025&view=rev
Log:
DebugInfo: Simplify gnu_pubnames index computation.

Names open to bikeshedding. Could switch back to the constants being
unshifted, but this way seems a bit easier to work with.

Modified:
    llvm/trunk/include/llvm/Support/Dwarf.h
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp

Modified: llvm/trunk/include/llvm/Support/Dwarf.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Dwarf.h?rev=191025&r1=191024&r2=191025&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/Dwarf.h (original)
+++ llvm/trunk/include/llvm/Support/Dwarf.h Thu Sep 19 13:39:59 2013
@@ -791,37 +791,34 @@ const char *AtomTypeString(unsigned Atom
 
 // Constants for the GNU pubnames/pubtypes extensions supporting gdb index.
 enum GDBIndex {
-  // The full index looks like this for each symbol:
+  // The gnu_pub* index value looks like:
   //
-  // 0-23   CU index
-  // 24-27  reserved
-  // 28-30  symbol kind
-  // 31     0 == global, 1 == static
-  //
-  // where each entry refers to the CU and some attributes about the symbol.
+  // 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_VARIABLE = 2,
-  GDB_INDEX_SYMBOL_KIND_FUNCTION = 3,
-  GDB_INDEX_SYMBOL_KIND_OTHER = 4,
-  // 3 unused bits.
-  GDB_INDEX_SYMBOL_KIND_UNUSED5 = 5,
-  GDB_INDEX_SYMBOL_KIND_UNUSED6 = 6,
-  GDB_INDEX_SYMBOL_KIND_UNUSED7 = 7,
+  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_SHIFT = 31,
-  GDB_INDEX_SYMBOL_STATIC_MASK = 1,
-  GDB_INDEX_SYMBOL_KIND_SHIFT = 28,
-  GDB_INDEX_SYMBOL_KIND_MASK = 7,
-  GDB_INDEX_CU_BITSIZE = 24,
-  GDB_INDEX_CU_MASK = ((1 << GDB_INDEX_CU_BITSIZE) - 1)
+  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
 };
 
 /// GDBIndexTypeString - Return the string for the specified index type.

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=191025&r1=191024&r2=191025&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Thu Sep 19 13:39:59 2013
@@ -2323,21 +2323,9 @@ void DwarfDebug::emitAccelTypes() {
 
 /// computeIndexValue - Compute the gdb index value for the DIE and CU.
 static uint8_t computeIndexValue(CompileUnit *CU, DIE *Die) {
-#define UPDATE_VALUE(CURRENT, VALUE)                                           \
-  {                                                                            \
-    (CURRENT) |= (((VALUE) & dwarf::GDB_INDEX_SYMBOL_KIND_MASK)                \
-                  << dwarf::GDB_INDEX_SYMBOL_KIND_SHIFT);                      \
-  }
-
-#define UPDATE_STATIC(CURRENT, IS_STATIC)                                      \
-  {                                                                            \
-    (CURRENT) |= (((IS_STATIC) & dwarf::GDB_INDEX_SYMBOL_STATIC_MASK)          \
-                  << dwarf::GDB_INDEX_SYMBOL_STATIC_SHIFT);                    \
-  }
-
-  // Compute the Attributes for the Die.
-  uint32_t Value = dwarf::GDB_INDEX_SYMBOL_KIND_NONE;
-  bool External = Die->findAttribute(dwarf::DW_AT_external);
+  uint8_t IsStatic = Die->findAttribute(dwarf::DW_AT_external)
+                       ? dwarf::GDB_INDEX_SYMBOL_NON_STATIC
+                       : dwarf::GDB_INDEX_SYMBOL_STATIC;
 
   switch (Die->getTag()) {
   case dwarf::DW_TAG_class_type:
@@ -2347,33 +2335,20 @@ static uint8_t computeIndexValue(Compile
   case dwarf::DW_TAG_typedef:
   case dwarf::DW_TAG_base_type:
   case dwarf::DW_TAG_subrange_type:
-    UPDATE_VALUE(Value, dwarf::GDB_INDEX_SYMBOL_KIND_TYPE);
-    UPDATE_STATIC(Value, 1);
-    break;
+    return dwarf::GDB_INDEX_SYMBOL_KIND_TYPE | dwarf::GDB_INDEX_SYMBOL_STATIC;
   case dwarf::DW_TAG_namespace:
-    UPDATE_VALUE(Value, dwarf::GDB_INDEX_SYMBOL_KIND_TYPE);
-    break;
+    return dwarf::GDB_INDEX_SYMBOL_KIND_TYPE;
   case dwarf::DW_TAG_subprogram:
-    UPDATE_VALUE(Value, dwarf::GDB_INDEX_SYMBOL_KIND_FUNCTION);
-    UPDATE_STATIC(Value, !External);
-    break;
+    return dwarf::GDB_INDEX_SYMBOL_KIND_FUNCTION | IsStatic;
   case dwarf::DW_TAG_constant:
   case dwarf::DW_TAG_variable:
-    UPDATE_VALUE(Value, dwarf::GDB_INDEX_SYMBOL_KIND_VARIABLE);
-    UPDATE_STATIC(Value, !External);
-    break;
+    return dwarf::GDB_INDEX_SYMBOL_KIND_VARIABLE | IsStatic;
   case dwarf::DW_TAG_enumerator:
-    UPDATE_VALUE(Value, dwarf::GDB_INDEX_SYMBOL_KIND_VARIABLE);
-    UPDATE_STATIC(Value, 1);
-    break;
+    return dwarf::GDB_INDEX_SYMBOL_KIND_VARIABLE |
+           dwarf::GDB_INDEX_SYMBOL_STATIC;
   default:
-    break;
+    return dwarf::GDB_INDEX_SYMBOL_KIND_NONE;
   }
-  // We don't need to add the CU into the bitmask for two reasons:
-  // a) the pubnames/pubtypes sections are per-cu, and
-  // b) the linker wouldn't understand it anyhow.
-  // so go ahead and make it 1 byte by shifting it down.
-  return Value >> dwarf::GDB_INDEX_CU_BITSIZE;
 }
 
 /// emitDebugPubNames - Emit visible names into a debug pubnames section.





More information about the llvm-commits mailing list