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;
// 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;
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.
/// 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.
// 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);
+}