From 2503eb4da1a3a0f30c99e47e5e4ed34deba6074d Mon Sep 17 00:00:00 2001 From: Gabriel Corona Date: Tue, 25 Feb 2014 10:16:28 +0100 Subject: [PATCH] [mc] Handle DW_AT_start_scope (for constants) --- src/mc/mc_checkpoint.c | 11 +++++++++++ src/mc/mc_dwarf.c | 20 ++++++++++++++++++++ src/mc/mc_private.h | 2 ++ 3 files changed, 33 insertions(+) diff --git a/src/mc/mc_checkpoint.c b/src/mc/mc_checkpoint.c index 9a923b26c5..604572b2c9 100644 --- a/src/mc/mc_checkpoint.c +++ b/src/mc/mc_checkpoint.c @@ -236,6 +236,14 @@ void MC_find_object_address(memory_map_t maps, mc_object_info_t result) { /************************************* Take Snapshot ************************************/ /****************************************************************************************/ +static bool mc_valid_variable(dw_variable_t var, dw_frame_t frame, const void* ip) { + // The variable is not yet valid: + if((const void*)((const char*) frame->low_pc + var->start_scope) > ip) + return false; + else + return true; +} + static xbt_dynar_t MC_get_local_variables_values(xbt_dynar_t stack_frames){ unsigned cursor1 = 0; @@ -248,6 +256,9 @@ static xbt_dynar_t MC_get_local_variables_values(xbt_dynar_t stack_frames){ dw_variable_t current_variable; xbt_dynar_foreach(stack_frame->frame->variables, cursor2, current_variable){ + if(!mc_valid_variable(current_variable, stack_frame->frame, (void*) stack_frame->ip)) + continue; + int region_type; if((long)stack_frame->ip > (long)mc_libsimgrid_info->start_exec) region_type = 1; diff --git a/src/mc/mc_dwarf.c b/src/mc/mc_dwarf.c index 4927f81455..11e0b32c11 100644 --- a/src/mc/mc_dwarf.c +++ b/src/mc/mc_dwarf.c @@ -953,6 +953,25 @@ static dw_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die* die, D klass, klass, (void*) variable->dwarf_offset, variable->name); } + // Handle start_scope: + if (dwarf_hasattr(die, DW_AT_start_scope)) { + Dwarf_Attribute attr; + dwarf_attr(die, DW_AT_start_scope, &attr); + int form = dwarf_whatform(&attr); + int klass = MC_dwarf_form_get_class(form); + switch(klass) { + case MC_DW_CLASS_CONSTANT: + { + Dwarf_Word value; + variable->start_scope = dwarf_formudata(&attr, &value) == 0 ? (size_t) value : 0; + break; + } + default: + xbt_die("Unhandled form 0x%x, class 0x%X for DW_AT_start_scope of variable %s", + form, klass, name==NULL ? "?" : name); + } + } + if(namespace && variable->global) { char* old_name = variable->name; variable->name = bprintf("%s::%s", namespace, old_name); @@ -1047,6 +1066,7 @@ static void MC_dwarf_handle_die(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die case mc_tag_namespace: mc_dwarf_handle_namespace_die(info, die, unit, frame, namespace); + break; default: break; diff --git a/src/mc/mc_private.h b/src/mc/mc_private.h index f17fad5481..8997755859 100644 --- a/src/mc/mc_private.h +++ b/src/mc/mc_private.h @@ -443,6 +443,8 @@ typedef struct s_dw_variable{ dw_location_t location; void* address; + size_t start_scope; + }s_dw_variable_t, *dw_variable_t; struct s_dw_frame{ -- 2.20.1