- switch (type->type) {
-
- // Not relevant, do nothing:
- case DW_TAG_unspecified_type:
- return;
-
- // Simple case, hash this has binary:
- case DW_TAG_base_type:
- case DW_TAG_enumeration_type:
- {
- if (mc_ignored(address, 1))
- return;
- mc_hash_binary(hash, address, type->byte_size);
- return;
- }
-
- case DW_TAG_array_type:
- {
- if (mc_ignored(address, type->byte_size))
- return;
-
- long element_count = type->element_count;
- dw_type_t subtype = type->subtype;
- if (subtype == NULL) {
- XBT_DEBUG("Hash array without subtype");
- return;
- }
- int i;
- for (i = 0; i != element_count; ++i) {
- XBT_DEBUG("Hash array element %i", i);
- void *subaddress = ((char *) address) + i * subtype->byte_size;
- mc_hash_value(hash, state, info, subaddress, subtype);
- }
- return;
- }
-
- // Get the raw type:
- case DW_TAG_typedef:
- case DW_TAG_volatile_type:
- case DW_TAG_const_type:
- case DW_TAG_restrict_type:
- {
- type = type->subtype;
- if (type == NULL)
- return;
- else
- goto top;
- }
-
- case DW_TAG_structure_type:
- case DW_TAG_class_type:
- {
- if (mc_ignored(address, type->byte_size))
- return;
-
- unsigned int cursor = 0;
- dw_type_t member;
- xbt_dynar_foreach(type->members, cursor, member) {
- XBT_DEBUG("Hash struct member %s", member->name);
- if (type->subtype == NULL)
- return;
- void *member_variable = mc_member_resolve(address, type, member, NULL);
- mc_hash_value(hash, state, info, member_variable, type->subtype);
- }
- return;
- }
-
- // Pointer, we hash a single value but it might be an array.
- case DW_TAG_pointer_type:
- case DW_TAG_reference_type:
- case DW_TAG_rvalue_reference_type:
- {
- if (mc_ignored(address, 1))
- return;
-
- void *pointed = *(void **) address;
- if (pointed == NULL) {
- XBT_DEBUG("Hashed pinter is NULL");
- return;
- }
- // Avoid loops:
- if (mc_address_test(state->handled_addresses, pointed)) {
- XBT_DEBUG("Hashed pointed data %p already hashed", pointed);
- return;
- }
- mc_address_add(state->handled_addresses, pointed);
-
- // Anything outside the R/W segments and the heap is not hashed:
- bool valid_pointer = (pointed >= (void *) binary_info->start_rw
- && pointed <= (void *) binary_info->end_rw)
- || (pointed >= (void *) libsimgrid_info->start_rw
- && pointed <= (void *) libsimgrid_info->end_rw)
- || (pointed >= process->heap_address
- && pointed < (void *) ((const char *) process->heap_address + STD_HEAP_SIZE));
- if (!valid_pointer) {
- XBT_DEBUG("Hashed pointed data %p is in an ignored range", pointed);
- return;
- }
-
- if (type->subtype == NULL) {
- XBT_DEBUG("Missing type for %p (type=%s)", pointed, type->dw_type_id);
- return;
- }
-
- address = pointed;
- type = type->subtype;
- goto top;
- }
-
- // Skip this:
- case DW_TAG_union_type:
- case DW_TAG_subroutine_type:
- default:
- return;
- }