Move emission of the debug string table to early in the debug
[oota-llvm.git] / lib / CodeGen / AsmPrinter / DIEHash.cpp
index 1322743247eea959713259b7eb4594dabb425808..519c8a0068586359d19d60cbc6cc29735ce1c470 100644 (file)
@@ -119,8 +119,146 @@ void DIEHash::collectAttributes(DIE *Die, DIEAttrs &Attrs) {
     case dwarf::DW_AT_name:
       COLLECT_ATTR(DW_AT_name);
       break;
-    case dwarf::DW_AT_language:
-      COLLECT_ATTR(DW_AT_language);
+    case dwarf::DW_AT_accessibility:
+      COLLECT_ATTR(DW_AT_accessibility)
+      break;
+    case dwarf::DW_AT_address_class:
+      COLLECT_ATTR(DW_AT_address_class)
+      break;
+    case dwarf::DW_AT_allocated:
+      COLLECT_ATTR(DW_AT_allocated)
+      break;
+    case dwarf::DW_AT_artificial:
+      COLLECT_ATTR(DW_AT_artificial)
+      break;
+    case dwarf::DW_AT_associated:
+      COLLECT_ATTR(DW_AT_associated)
+      break;
+    case dwarf::DW_AT_binary_scale:
+      COLLECT_ATTR(DW_AT_binary_scale)
+      break;
+    case dwarf::DW_AT_bit_offset:
+      COLLECT_ATTR(DW_AT_bit_offset)
+      break;
+    case dwarf::DW_AT_bit_size:
+      COLLECT_ATTR(DW_AT_bit_size)
+      break;
+    case dwarf::DW_AT_bit_stride:
+      COLLECT_ATTR(DW_AT_bit_stride)
+      break;
+    case dwarf::DW_AT_byte_size:
+      COLLECT_ATTR(DW_AT_byte_size)
+      break;
+    case dwarf::DW_AT_byte_stride:
+      COLLECT_ATTR(DW_AT_byte_stride)
+      break;
+    case dwarf::DW_AT_const_expr:
+      COLLECT_ATTR(DW_AT_const_expr)
+      break;
+    case dwarf::DW_AT_const_value:
+      COLLECT_ATTR(DW_AT_const_value)
+      break;
+    case dwarf::DW_AT_containing_type:
+      COLLECT_ATTR(DW_AT_containing_type)
+      break;
+    case dwarf::DW_AT_count:
+      COLLECT_ATTR(DW_AT_count)
+      break;
+    case dwarf::DW_AT_data_bit_offset:
+      COLLECT_ATTR(DW_AT_data_bit_offset)
+      break;
+    case dwarf::DW_AT_data_location:
+      COLLECT_ATTR(DW_AT_data_location)
+      break;
+    case dwarf::DW_AT_data_member_location:
+      COLLECT_ATTR(DW_AT_data_member_location)
+      break;
+    case dwarf::DW_AT_decimal_scale:
+      COLLECT_ATTR(DW_AT_decimal_scale)
+      break;
+    case dwarf::DW_AT_decimal_sign:
+      COLLECT_ATTR(DW_AT_decimal_sign)
+      break;
+    case dwarf::DW_AT_default_value:
+      COLLECT_ATTR(DW_AT_default_value)
+      break;
+    case dwarf::DW_AT_digit_count:
+      COLLECT_ATTR(DW_AT_digit_count)
+      break;
+    case dwarf::DW_AT_discr:
+      COLLECT_ATTR(DW_AT_discr)
+      break;
+    case dwarf::DW_AT_discr_list:
+      COLLECT_ATTR(DW_AT_discr_list)
+      break;
+    case dwarf::DW_AT_discr_value:
+      COLLECT_ATTR(DW_AT_discr_value)
+      break;
+    case dwarf::DW_AT_encoding:
+      COLLECT_ATTR(DW_AT_encoding)
+      break;
+    case dwarf::DW_AT_enum_class:
+      COLLECT_ATTR(DW_AT_enum_class)
+      break;
+    case dwarf::DW_AT_endianity:
+      COLLECT_ATTR(DW_AT_endianity)
+      break;
+    case dwarf::DW_AT_explicit:
+      COLLECT_ATTR(DW_AT_explicit)
+      break;
+    case dwarf::DW_AT_is_optional:
+      COLLECT_ATTR(DW_AT_is_optional)
+      break;
+    case dwarf::DW_AT_location:
+      COLLECT_ATTR(DW_AT_location)
+      break;
+    case dwarf::DW_AT_lower_bound:
+      COLLECT_ATTR(DW_AT_lower_bound)
+      break;
+    case dwarf::DW_AT_mutable:
+      COLLECT_ATTR(DW_AT_mutable)
+      break;
+    case dwarf::DW_AT_ordering:
+      COLLECT_ATTR(DW_AT_ordering)
+      break;
+    case dwarf::DW_AT_picture_string:
+      COLLECT_ATTR(DW_AT_picture_string)
+      break;
+    case dwarf::DW_AT_prototyped:
+      COLLECT_ATTR(DW_AT_prototyped)
+      break;
+    case dwarf::DW_AT_small:
+      COLLECT_ATTR(DW_AT_small)
+      break;
+    case dwarf::DW_AT_segment:
+      COLLECT_ATTR(DW_AT_segment)
+      break;
+    case dwarf::DW_AT_string_length:
+      COLLECT_ATTR(DW_AT_string_length)
+      break;
+    case dwarf::DW_AT_threads_scaled:
+      COLLECT_ATTR(DW_AT_threads_scaled)
+      break;
+    case dwarf::DW_AT_upper_bound:
+      COLLECT_ATTR(DW_AT_upper_bound)
+      break;
+    case dwarf::DW_AT_use_location:
+      COLLECT_ATTR(DW_AT_use_location)
+      break;
+    case dwarf::DW_AT_use_UTF8:
+      COLLECT_ATTR(DW_AT_use_UTF8)
+      break;
+    case dwarf::DW_AT_variable_parameter:
+      COLLECT_ATTR(DW_AT_variable_parameter)
+      break;
+    case dwarf::DW_AT_virtuality:
+      COLLECT_ATTR(DW_AT_virtuality)
+      break;
+    case dwarf::DW_AT_visibility:
+      COLLECT_ATTR(DW_AT_visibility)
+      break;
+    case dwarf::DW_AT_vtable_elem_location:
+      COLLECT_ATTR(DW_AT_vtable_elem_location)
       break;
     default:
       break;
@@ -145,6 +283,8 @@ void DIEHash::hashAttribute(AttrEntry Attr) {
 
   // TODO: Add support for additional forms.
   switch (Desc->getForm()) {
+  // TODO: We'll want to add DW_FORM_string here if we start emitting them
+  // again.
   case dwarf::DW_FORM_strp:
     addString(cast<DIEString>(Value)->getString());
     break;
@@ -167,9 +307,56 @@ void DIEHash::hashAttributes(const DIEAttrs &Attrs) {
       hashAttribute(ATTR);                                                     \
   }
 
-  // FIXME: Add the rest.
   ADD_ATTR(Attrs.DW_AT_name);
-  ADD_ATTR(Attrs.DW_AT_language);
+  ADD_ATTR(Attrs.DW_AT_accessibility);
+  ADD_ATTR(Attrs.DW_AT_address_class);
+  ADD_ATTR(Attrs.DW_AT_allocated);
+  ADD_ATTR(Attrs.DW_AT_artificial);
+  ADD_ATTR(Attrs.DW_AT_associated);
+  ADD_ATTR(Attrs.DW_AT_binary_scale);
+  ADD_ATTR(Attrs.DW_AT_bit_offset);
+  ADD_ATTR(Attrs.DW_AT_bit_size);
+  ADD_ATTR(Attrs.DW_AT_bit_stride);
+  ADD_ATTR(Attrs.DW_AT_byte_size);
+  ADD_ATTR(Attrs.DW_AT_byte_stride);
+  ADD_ATTR(Attrs.DW_AT_const_expr);
+  ADD_ATTR(Attrs.DW_AT_const_value);
+  ADD_ATTR(Attrs.DW_AT_containing_type);
+  ADD_ATTR(Attrs.DW_AT_count);
+  ADD_ATTR(Attrs.DW_AT_data_bit_offset);
+  ADD_ATTR(Attrs.DW_AT_data_location);
+  ADD_ATTR(Attrs.DW_AT_data_member_location);
+  ADD_ATTR(Attrs.DW_AT_decimal_scale);
+  ADD_ATTR(Attrs.DW_AT_decimal_sign);
+  ADD_ATTR(Attrs.DW_AT_default_value);
+  ADD_ATTR(Attrs.DW_AT_digit_count);
+  ADD_ATTR(Attrs.DW_AT_discr);
+  ADD_ATTR(Attrs.DW_AT_discr_list);
+  ADD_ATTR(Attrs.DW_AT_discr_value);
+  ADD_ATTR(Attrs.DW_AT_encoding);
+  ADD_ATTR(Attrs.DW_AT_enum_class);
+  ADD_ATTR(Attrs.DW_AT_endianity);
+  ADD_ATTR(Attrs.DW_AT_explicit);
+  ADD_ATTR(Attrs.DW_AT_is_optional);
+  ADD_ATTR(Attrs.DW_AT_location);
+  ADD_ATTR(Attrs.DW_AT_lower_bound);
+  ADD_ATTR(Attrs.DW_AT_mutable);
+  ADD_ATTR(Attrs.DW_AT_ordering);
+  ADD_ATTR(Attrs.DW_AT_picture_string);
+  ADD_ATTR(Attrs.DW_AT_prototyped);
+  ADD_ATTR(Attrs.DW_AT_small);
+  ADD_ATTR(Attrs.DW_AT_segment);
+  ADD_ATTR(Attrs.DW_AT_string_length);
+  ADD_ATTR(Attrs.DW_AT_threads_scaled);
+  ADD_ATTR(Attrs.DW_AT_upper_bound);
+  ADD_ATTR(Attrs.DW_AT_use_location);
+  ADD_ATTR(Attrs.DW_AT_use_UTF8);
+  ADD_ATTR(Attrs.DW_AT_variable_parameter);
+  ADD_ATTR(Attrs.DW_AT_virtuality);
+  ADD_ATTR(Attrs.DW_AT_visibility);
+  ADD_ATTR(Attrs.DW_AT_vtable_elem_location);
+
+  // FIXME: Add the extended attributes.
 }
 
 // Add all of the attributes for \param Die to the hash.
@@ -235,6 +422,7 @@ uint64_t DIEHash::computeDIEODRSignature(DIE *Die) {
 /// This is based on the type signature computation given in section 7.27 of the
 /// DWARF4 standard. It is an md5 hash of the flattened description of the DIE
 /// with the inclusion of the full CU and all top level CU entities.
+// TODO: Initialize the type chain at 0 instead of 1 for CU signatures.
 uint64_t DIEHash::computeCUSignature(DIE *Die) {
 
   // Hash the DIE.
@@ -249,3 +437,22 @@ uint64_t DIEHash::computeCUSignature(DIE *Die) {
   // appropriately.
   return *reinterpret_cast<support::ulittle64_t *>(Result + 8);
 }
+
+/// This is based on the type signature computation given in section 7.27 of the
+/// DWARF4 standard. It is an md5 hash of the flattened description of the DIE
+/// with the inclusion of additional forms not specifically called out in the
+/// standard.
+uint64_t DIEHash::computeTypeSignature(DIE *Die) {
+
+  // Hash the DIE.
+  computeHash(Die);
+
+  // Now return the result.
+  MD5::MD5Result Result;
+  Hash.final(Result);
+
+  // ... take the least significant 8 bytes and return those. Our MD5
+  // implementation always returns its results in little endian, swap bytes
+  // appropriately.
+  return *reinterpret_cast<support::ulittle64_t *>(Result + 8);
+}