From: Gabriel Corona Date: Fri, 7 Mar 2014 13:48:01 +0000 (+0100) Subject: [mc] Remove old code (mc_location_t) X-Git-Tag: v3_11~199^2~2^2~14 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/4eb93650a8d0e43ef85f23ac0ab014b175c020e3 [mc] Remove old code (mc_location_t) --- diff --git a/src/mc/mc_dwarf.c b/src/mc/mc_dwarf.c index 972d3e9607..4db8355de7 100644 --- a/src/mc/mc_dwarf.c +++ b/src/mc/mc_dwarf.c @@ -74,14 +74,6 @@ static void MC_dwarf_handle_children(mc_object_info_t info, Dwarf_Die* die, Dwar */ static void MC_dwarf_handle_variable_die(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame, const char* namespace); -/** \brief Convert a libdw DWARF expression into a MC representation of the location - * - * \param expr array of DWARf operations - * \param len number of elements - * \return a new MC expression - */ -static dw_location_t MC_dwarf_get_expression(Dwarf_Op* expr, size_t len); - /** \brief Get the DW_TAG_type of the DIE * * \param die DIE @@ -269,112 +261,6 @@ static const char* MC_dwarf_at_linkage_name(Dwarf_Die* die) { return name; } -/** \brief Create a location list from a given attribute - * - * \param die the DIE - * \param attr the attribute - * \return MC specific representation of the location list represented by the given attribute - * of the given die - */ -static dw_location_t MC_dwarf_get_location_list(mc_object_info_t info, Dwarf_Die* die, Dwarf_Attribute* attr) { - - dw_location_t location = xbt_new0(s_dw_location_t, 1); - location->type = e_dw_loclist; - xbt_dynar_t loclist = xbt_dynar_new(sizeof(dw_location_entry_t), NULL); - location->location.loclist = loclist; - - ptrdiff_t offset = 0; - Dwarf_Addr base, start, end; - Dwarf_Op *expr; - size_t len; - - while (1) { - - offset = dwarf_getlocations(attr, offset, &base, &start, &end, &expr, &len); - if (offset==0) - return location; - else if (offset==-1) - xbt_die("Error while loading location list"); - - dw_location_entry_t new_entry = xbt_new0(s_dw_location_entry_t, 1); - - void* base = info->flags & MC_OBJECT_INFO_EXECUTABLE ? 0 : MC_object_base_address(info); - - new_entry->lowpc = (char*) base + start; - new_entry->highpc = (char*) base + end; - new_entry->location = MC_dwarf_get_expression(expr, len); - - xbt_dynar_push(loclist, &new_entry); - - } -} - -/** \brief Get the location expression or location list from an attribute - * - * Processes direct expressions as well as location lists. - * - * \param die the DIE - * \param attr the attribute - * \return MC specific representation of the location represented by the given attribute - * of the given die - */ -static dw_location_t MC_dwarf_get_location(mc_object_info_t info, Dwarf_Die* die, Dwarf_Attribute* attr) { - int form = dwarf_whatform(attr); - switch (form) { - - // The attribute is an DWARF location expression: - case DW_FORM_exprloc: - case DW_FORM_block1: // not in the spec - case DW_FORM_block2: - case DW_FORM_block4: - case DW_FORM_block: - { - Dwarf_Op* expr; - size_t len; - if (dwarf_getlocation(attr, &expr, &len)) - xbt_die("Could not read location expression"); - return MC_dwarf_get_expression(expr, len); - } - - // The attribute is a reference to a location list entry: - case DW_FORM_sec_offset: - case DW_FORM_data1: - case DW_FORM_data2: - case DW_FORM_data4: - case DW_FORM_data8: - { - return MC_dwarf_get_location_list(info, die, attr); - } - break; - - default: - xbt_die("Unexpected form %i list for location in attribute %s of <%p>%s", - form, - MC_dwarf_attrname(attr->code), - (void*) dwarf_dieoffset(die), - MC_dwarf_attr_string(die, DW_AT_name)); - return NULL; - } -} - -/** \brief Get the location expression or location list from an attribute - * - * Processes direct expressions as well as location lists. - * - * \param die the DIE - * \param attribute the attribute code - * \return MC specific representation of the location represented by the given attribute - * of the given die - */ -static dw_location_t MC_dwarf_at_location(mc_object_info_t info, Dwarf_Die* die, int attribute) { - if(!dwarf_hasattr_integrate(die, attribute)) - return xbt_new0(s_dw_location_t, 1); - - Dwarf_Attribute attr; - dwarf_attr_integrate(die, attribute, &attr); - return MC_dwarf_get_location(info, die, &attr); -} - static char* MC_dwarf_at_type(Dwarf_Die* die) { Dwarf_Attribute attr; if (dwarf_hasattr_integrate(die, DW_AT_type)) { @@ -493,35 +379,6 @@ static uint64_t MC_dwarf_array_element_count(Dwarf_Die* die, Dwarf_Die* unit) { return result; } -// ***** Location - -Dwarf_Off MC_dwarf_resolve_location(unw_cursor_t* c, dw_location_t location, void* frame_pointer_address) { - unw_word_t res; - switch (location->type){ - case e_dw_compose: - if (xbt_dynar_length(location->location.compose) > 1){ - return 0; /* TODO : location list with optimizations enabled */ - } - dw_location_t location_entry = xbt_dynar_get_as(location->location.compose, 0, dw_location_t); - switch (location_entry->type){ - case e_dw_bregister_op: - unw_get_reg(c, location_entry->location.breg_op.reg, &res); - return (Dwarf_Off) ((long)res + location_entry->location.breg_op.offset); - break; - case e_dw_fbregister_op: - if (frame_pointer_address != NULL) - return (Dwarf_Off)((char *)frame_pointer_address + location_entry->location.fbreg_op); - else - return 0; - default: - return 0; /* FIXME : implement other cases (with optimizations enabled) */ - } - break; - default: - return 0; - } -} - // ***** dw_type_t static void MC_dwarf_fill_member_location(dw_type_t type, dw_type_t member, Dwarf_Die* child) { @@ -719,165 +576,6 @@ static void MC_dwarf_handle_type_die(mc_object_info_t info, Dwarf_Die* die, Dwar } } -/** \brief Convert libdw location expresion elment into native one (or NULL in some cases) */ -static dw_location_t MC_dwarf_get_expression_element(Dwarf_Op* op) { - dw_location_t element = xbt_new0(s_dw_location_t, 1); - uint8_t atom = op->atom; - if (atom >= DW_OP_reg0 && atom<= DW_OP_reg31) { - element->type = e_dw_register; - element->location.reg = atom - DW_OP_reg0; - } - else if (atom >= DW_OP_breg0 && atom<= DW_OP_breg31) { - element->type = e_dw_bregister_op; - element->location.reg = atom - DW_OP_breg0; - element->location.breg_op.offset = op->number; - } - else if (atom >= DW_OP_lit0 && atom<= DW_OP_lit31) { - element->type = e_dw_lit; - element->location.reg = atom - DW_OP_lit0; - } - else switch (atom) { - case DW_OP_fbreg: - element->type = e_dw_fbregister_op; - element->location.fbreg_op = op->number; - break; - case DW_OP_piece: - element->type = e_dw_piece; - element->location.piece = op->number; - break; - case DW_OP_plus_uconst: - element->type = e_dw_plus_uconst; - element->location.plus_uconst = op->number; - break; - case DW_OP_abs: - element->type = e_dw_arithmetic; - element->location.arithmetic = xbt_strdup("abs"); - break; - case DW_OP_and: - element->type = e_dw_arithmetic; - element->location.arithmetic = xbt_strdup("and"); - break; - case DW_OP_div: - element->type = e_dw_arithmetic; - element->location.arithmetic = xbt_strdup("div"); - break; - case DW_OP_minus: - element->type = e_dw_arithmetic; - element->location.arithmetic = xbt_strdup("minus"); - break; - case DW_OP_mod: - element->type = e_dw_arithmetic; - element->location.arithmetic = xbt_strdup("mod"); - break; - case DW_OP_mul: - element->type = e_dw_arithmetic; - element->location.arithmetic = xbt_strdup("mul"); - break; - case DW_OP_neg: - element->type = e_dw_arithmetic; - element->location.arithmetic = xbt_strdup("neg"); - break; - case DW_OP_not: - element->type = e_dw_arithmetic; - element->location.arithmetic = xbt_strdup("not"); - break; - case DW_OP_or: - element->type = e_dw_arithmetic; - element->location.arithmetic = xbt_strdup("or"); - break; - case DW_OP_plus: - element->type = e_dw_arithmetic; - element->location.arithmetic = xbt_strdup("plus"); - break; - - case DW_OP_stack_value: - // Why nothing here? - xbt_free(element); - return NULL; - - case DW_OP_deref_size: - element->type = e_dw_deref; - element->location.deref_size = (unsigned int short) op->number; - break; - case DW_OP_deref: - element->type = e_dw_deref; - element->location.deref_size = sizeof(void *); - break; - case DW_OP_constu: - element->type = e_dw_uconstant; - element->location.uconstant.bytes = 1; - element->location.uconstant.value = (unsigned long int) op->number; - break; - case DW_OP_consts: - element->type = e_dw_sconstant; - element->location.uconstant.bytes = 1; - element->location.uconstant.value = (unsigned long int) op->number; - break; - - case DW_OP_const1u: - element->type = e_dw_uconstant; - element->location.uconstant.bytes = 1; - element->location.uconstant.value = (unsigned long int) op->number; - break; - case DW_OP_const2u: - element->type = e_dw_uconstant; - element->location.uconstant.bytes = 2; - element->location.uconstant.value = (unsigned long int) op->number; - break; - case DW_OP_const4u: - element->type = e_dw_uconstant; - element->location.uconstant.bytes = 4; - element->location.uconstant.value = (unsigned long int) op->number; - break; - case DW_OP_const8u: - element->type = e_dw_uconstant; - element->location.uconstant.bytes = 8; - element->location.uconstant.value = (unsigned long int) op->number; - break; - - case DW_OP_const1s: - element->type = e_dw_sconstant; - element->location.uconstant.bytes = 1; - element->location.uconstant.value = (unsigned long int) op->number; - break; - case DW_OP_const2s: - element->type = e_dw_sconstant; - element->location.uconstant.bytes = 2; - element->location.uconstant.value = (unsigned long int) op->number; - break; - case DW_OP_const4s: - element->type = e_dw_sconstant; - element->location.uconstant.bytes = 4; - element->location.uconstant.value = (unsigned long int) op->number; - break; - case DW_OP_const8s: - element->type = e_dw_sconstant; - element->location.uconstant.bytes = 8; - element->location.uconstant.value = (unsigned long int) op->number; - break; - default: - element->type = e_dw_unsupported; - break; - } - return element; -} - -/** \brief Convert libdw location expresion into native one */ -static dw_location_t MC_dwarf_get_expression(Dwarf_Op* expr, size_t len) { - dw_location_t loc = xbt_new0(s_dw_location_t, 1); - loc->type = e_dw_compose; - loc->location.compose = xbt_dynar_new(sizeof(dw_location_t), NULL); - - int i; - for (i=0; i!=len; ++i) { - dw_location_t element = MC_dwarf_get_expression_element(expr+i); - if (element) - xbt_dynar_push(loc->location.compose, &element); - } - - return loc; -} - static int mc_anonymous_variable_index = 0; static dw_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame, const char* namespace) { diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index c551c72d95..21176a0479 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -152,24 +152,6 @@ const char* colors[13]; /************************** Free functions *************************/ -static void dw_location_free(dw_location_t l){ - if(l){ - if(l->type == e_dw_loclist) - xbt_dynar_free(&(l->location.loclist)); - else if(l->type == e_dw_compose) - xbt_dynar_free(&(l->location.compose)); - else if(l->type == e_dw_arithmetic) - xbt_free(l->location.arithmetic); - - xbt_free(l); - } -} - -static void dw_location_entry_free(dw_location_entry_t e){ - dw_location_free(e->location); - xbt_free(e); -} - void dw_type_free(dw_type_t t){ xbt_free(t->name); xbt_free(t->dw_type_id); @@ -344,142 +326,6 @@ mc_object_info_t MC_find_object_info(memory_map_t maps, char* name, int executab /*************************************************************************/ -static dw_location_t MC_dwarf_get_location(xbt_dict_t location_list, char *expr){ - - dw_location_t loc = xbt_new0(s_dw_location_t, 1); - - if(location_list != NULL){ - - char *key = bprintf("%lu", strtoul(expr, NULL, 16)); - loc->type = e_dw_loclist; - loc->location.loclist = (xbt_dynar_t)xbt_dict_get_or_null(location_list, key); - if(loc->location.loclist == NULL) - XBT_INFO("Key not found in loclist"); - xbt_free(key); - return loc; - - }else{ - - int cursor = 0; - char *tok = NULL, *tok2 = NULL; - - xbt_dynar_t tokens1 = xbt_str_split(expr, ";"); - xbt_dynar_t tokens2; - - loc->type = e_dw_compose; - loc->location.compose = xbt_dynar_new(sizeof(dw_location_t), NULL); - - while(cursor < xbt_dynar_length(tokens1)){ - - tok = xbt_dynar_get_as(tokens1, cursor, char*); - tokens2 = xbt_str_split(tok, " "); - tok2 = xbt_dynar_get_as(tokens2, 0, char*); - - if(strncmp(tok2, "DW_OP_reg", 9) == 0){ - dw_location_t new_element = xbt_new0(s_dw_location_t, 1); - new_element->type = e_dw_register; - new_element->location.reg = atoi(strtok(tok2, "DW_OP_reg")); - xbt_dynar_push(loc->location.compose, &new_element); - }else if(strcmp(tok2, "DW_OP_fbreg:") == 0){ - dw_location_t new_element = xbt_new0(s_dw_location_t, 1); - new_element->type = e_dw_fbregister_op; - new_element->location.fbreg_op = atoi(xbt_dynar_get_as(tokens2, xbt_dynar_length(tokens2) - 1, char*)); - xbt_dynar_push(loc->location.compose, &new_element); - }else if(strncmp(tok2, "DW_OP_breg", 10) == 0){ - dw_location_t new_element = xbt_new0(s_dw_location_t, 1); - new_element->type = e_dw_bregister_op; - new_element->location.breg_op.reg = atoi(strtok(tok2, "DW_OP_breg")); - new_element->location.breg_op.offset = atoi(xbt_dynar_get_as(tokens2, xbt_dynar_length(tokens2) - 1, char*)); - xbt_dynar_push(loc->location.compose, &new_element); - }else if(strncmp(tok2, "DW_OP_lit", 9) == 0){ - dw_location_t new_element = xbt_new0(s_dw_location_t, 1); - new_element->type = e_dw_lit; - new_element->location.lit = atoi(strtok(tok2, "DW_OP_lit")); - xbt_dynar_push(loc->location.compose, &new_element); - }else if(strcmp(tok2, "DW_OP_piece:") == 0){ - dw_location_t new_element = xbt_new0(s_dw_location_t, 1); - new_element->type = e_dw_piece; - new_element->location.piece = atoi(xbt_dynar_get_as(tokens2, xbt_dynar_length(tokens2) - 1, char*)); - xbt_dynar_push(loc->location.compose, &new_element); - }else if(strcmp(tok2, "DW_OP_plus_uconst:") == 0){ - dw_location_t new_element = xbt_new0(s_dw_location_t, 1); - new_element->type = e_dw_plus_uconst; - new_element->location.plus_uconst = atoi(xbt_dynar_get_as(tokens2, xbt_dynar_length(tokens2) - 1, char *)); - xbt_dynar_push(loc->location.compose, &new_element); - }else if(strcmp(tok, "DW_OP_abs") == 0 || - strcmp(tok, "DW_OP_and") == 0 || - strcmp(tok, "DW_OP_div") == 0 || - strcmp(tok, "DW_OP_minus") == 0 || - strcmp(tok, "DW_OP_mod") == 0 || - strcmp(tok, "DW_OP_mul") == 0 || - strcmp(tok, "DW_OP_neg") == 0 || - strcmp(tok, "DW_OP_not") == 0 || - strcmp(tok, "DW_OP_or") == 0 || - strcmp(tok, "DW_OP_plus") == 0){ - dw_location_t new_element = xbt_new0(s_dw_location_t, 1); - new_element->type = e_dw_arithmetic; - new_element->location.arithmetic = strdup(strtok(tok2, "DW_OP_")); - xbt_dynar_push(loc->location.compose, &new_element); - }else if(strcmp(tok, "DW_OP_stack_value") == 0){ - }else if(strcmp(tok2, "DW_OP_deref_size:") == 0){ - dw_location_t new_element = xbt_new0(s_dw_location_t, 1); - new_element->type = e_dw_deref; - new_element->location.deref_size = (unsigned int short) atoi(xbt_dynar_get_as(tokens2, xbt_dynar_length(tokens2) - 1, char*)); - xbt_dynar_push(loc->location.compose, &new_element); - }else if(strcmp(tok, "DW_OP_deref") == 0){ - dw_location_t new_element = xbt_new0(s_dw_location_t, 1); - new_element->type = e_dw_deref; - new_element->location.deref_size = sizeof(void *); - xbt_dynar_push(loc->location.compose, &new_element); - }else if(strcmp(tok2, "DW_OP_constu:") == 0){ - dw_location_t new_element = xbt_new0(s_dw_location_t, 1); - new_element->type = e_dw_uconstant; - new_element->location.uconstant.bytes = 1; - new_element->location.uconstant.value = (unsigned long int)(atoi(xbt_dynar_get_as(tokens2, xbt_dynar_length(tokens2) - 1, char*))); - xbt_dynar_push(loc->location.compose, &new_element); - }else if(strcmp(tok2, "DW_OP_consts:") == 0){ - dw_location_t new_element = xbt_new0(s_dw_location_t, 1); - new_element->type = e_dw_sconstant; - new_element->location.sconstant.bytes = 1; - new_element->location.sconstant.value = (long int)(atoi(xbt_dynar_get_as(tokens2, xbt_dynar_length(tokens2) - 1, char*))); - xbt_dynar_push(loc->location.compose, &new_element); - }else if(strcmp(tok2, "DW_OP_const1u:") == 0 || - strcmp(tok2, "DW_OP_const2u:") == 0 || - strcmp(tok2, "DW_OP_const4u:") == 0 || - strcmp(tok2, "DW_OP_const8u:") == 0){ - dw_location_t new_element = xbt_new0(s_dw_location_t, 1); - new_element->type = e_dw_uconstant; - new_element->location.uconstant.bytes = tok2[11] - '0'; - new_element->location.uconstant.value = (unsigned long int)(atoi(xbt_dynar_get_as(tokens2, xbt_dynar_length(tokens2) - 1, char*))); - xbt_dynar_push(loc->location.compose, &new_element); - }else if(strcmp(tok, "DW_OP_const1s") == 0 || - strcmp(tok, "DW_OP_const2s") == 0 || - strcmp(tok, "DW_OP_const4s") == 0 || - strcmp(tok, "DW_OP_const8s") == 0){ - dw_location_t new_element = xbt_new0(s_dw_location_t, 1); - new_element->type = e_dw_sconstant; - new_element->location.sconstant.bytes = tok2[11] - '0'; - new_element->location.sconstant.value = (long int)(atoi(xbt_dynar_get_as(tokens2, xbt_dynar_length(tokens2) - 1, char*))); - xbt_dynar_push(loc->location.compose, &new_element); - }else{ - dw_location_t new_element = xbt_new0(s_dw_location_t, 1); - new_element->type = e_dw_unsupported; - xbt_dynar_push(loc->location.compose, &new_element); - } - - cursor++; - xbt_dynar_free(&tokens2); - - } - - xbt_dynar_free(&tokens1); - - return loc; - - } - -} - /** \brief Finds a frame (DW_TAG_subprogram) from an DWARF offset in the rangd of this subprogram * * The offset can be an offset of a child DW_TAG_variable. diff --git a/src/mc/mc_private.h b/src/mc/mc_private.h index 9672142970..6f53d84483 100644 --- a/src/mc/mc_private.h +++ b/src/mc/mc_private.h @@ -394,70 +394,6 @@ void mc_dwarf_location_list_clear(mc_location_list_t list); void mc_dwarf_location_list_init_from_expression(mc_location_list_t target, size_t len, Dwarf_Op* ops); void mc_dwarf_location_list_init(mc_location_list_t target, mc_object_info_t info, Dwarf_Die* die, Dwarf_Attribute* attr); -// ***** Deprecated locations: - -typedef enum { - e_dw_loclist, - e_dw_register, - e_dw_bregister_op, - e_dw_lit, - e_dw_fbregister_op, - e_dw_piece, - e_dw_arithmetic, - e_dw_plus_uconst, - e_dw_compose, - e_dw_deref, - e_dw_uconstant, - e_dw_sconstant, - e_dw_unsupported -} e_dw_location_type; - -typedef struct s_dw_location{ - e_dw_location_type type; - union{ - - xbt_dynar_t loclist; - - int reg; - - struct{ - unsigned int reg; - int offset; - }breg_op; - - unsigned int lit; - - int fbreg_op; - - int piece; - - unsigned short int deref_size; - - xbt_dynar_t compose; - - char *arithmetic; - - struct{ - int bytes; - long unsigned int value; - }uconstant; - - struct{ - int bytes; - long signed int value; - }sconstant; - - unsigned int plus_uconst; - - }location; -}s_dw_location_t, *dw_location_t; - -typedef struct s_dw_location_entry{ - void* lowpc; - void* highpc; - dw_location_t location; -}s_dw_location_entry_t, *dw_location_entry_t; - // ***** Variables and functions typedef struct s_dw_variable{ @@ -502,8 +438,6 @@ void* MC_object_base_address(mc_object_info_t info); /********************************** DWARF **********************************/ -Dwarf_Off MC_dwarf_resolve_location(unw_cursor_t* c, dw_location_t location, void* frame_pointer_address); - #define MC_EXPRESSION_STACK_SIZE 64 #define MC_EXPRESSION_OK 0