X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/54dc4437fa893572ced42c3e9174f4a9888b0258..ce81107755533b85687d863b44b9163108ee6c66:/src/mc/mc_dwarf_expression.cpp diff --git a/src/mc/mc_dwarf_expression.cpp b/src/mc/mc_dwarf_expression.cpp index 33a01b9d74..cc9b6a6731 100644 --- a/src/mc/mc_dwarf_expression.cpp +++ b/src/mc/mc_dwarf_expression.cpp @@ -1,17 +1,21 @@ -/* Copyright (c) 2014. The SimGrid Team. +/* Copyright (c) 2014-2015. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include -#include +#include +#include #include #include #include "mc_object_info.h" #include "mc_private.h" +#include "mc_location.h" +#include "mc/AddressSpace.hpp" +#include "mc/Frame.hpp" +#include "mc/ObjectInformation.hpp" using simgrid::mc::remote; @@ -34,10 +38,10 @@ static int mc_dwarf_push_value(mc_expression_state_t state, Dwarf_Off value) */ static int mc_dwarf_register_to_libunwind(int dwarf_register) { -#if defined(UNW_TARGET_X86_64) +#if defined(__x86_64__) // It seems for this arch, DWARF and libunwind agree in the numbering: return dwarf_register; -#elif defined(UNW_TARGET_X86) +#elif defined(__i386__) // Could't find the authoritative source of information for this. // This is inspired from http://source.winehq.org/source/dlls/dbghelp/cpu_i386.c#L517. switch (dwarf_register) { @@ -103,7 +107,7 @@ int mc_dwarf_execute_expression(size_t n, const Dwarf_Op * ops, for (size_t i = 0; i != n; ++i) { int error = 0; const Dwarf_Op *op = ops + i; - uint8_t atom = op->atom; + std::uint8_t atom = op->atom; switch (atom) { @@ -166,7 +170,7 @@ int mc_dwarf_execute_expression(size_t n, const Dwarf_Op * ops, unw_step(&cursor); unw_word_t res; - unw_get_reg(&cursor, UNW_TDEP_SP, &res); + unw_get_reg(&cursor, UNW_REG_SP, &res); error = mc_dwarf_push_value(state, res); break; } @@ -177,7 +181,7 @@ int mc_dwarf_execute_expression(size_t n, const Dwarf_Op * ops, { if (!state->frame_base) return MC_EXPRESSION_E_MISSING_FRAME_BASE; - uintptr_t fb = ((uintptr_t) state->frame_base) + op->number; + std::uintptr_t fb = ((std::uintptr_t) state->frame_base) + op->number; error = mc_dwarf_push_value(state, fb); break; } @@ -229,8 +233,8 @@ int mc_dwarf_execute_expression(size_t n, const Dwarf_Op * ops, return MC_EXPRESSION_E_NO_BASE_ADDRESS; if (state->stack_size == MC_EXPRESSION_STACK_SIZE) return MC_EXPRESSION_E_STACK_OVERFLOW; - Dwarf_Off addr = (Dwarf_Off) (uintptr_t) - MC_object_base_address(state->object_info) + op->number; + Dwarf_Off addr = (Dwarf_Off) (std::uintptr_t) + state->object_info->base_address() + op->number; error = mc_dwarf_push_value(state, addr); break; } @@ -275,7 +279,7 @@ int mc_dwarf_execute_expression(size_t n, const Dwarf_Op * ops, if (state->stack_size < 2) return MC_EXPRESSION_E_STACK_UNDERFLOW; { - uintptr_t temp = state->stack[state->stack_size - 2]; + std::uintptr_t temp = state->stack[state->stack_size - 2]; state->stack[state->stack_size - 2] = state->stack[state->stack_size - 1]; state->stack[state->stack_size - 1] = temp; @@ -298,7 +302,7 @@ int mc_dwarf_execute_expression(size_t n, const Dwarf_Op * ops, if (state->stack_size < 2) return MC_EXPRESSION_E_STACK_UNDERFLOW; { - uintptr_t result = + std::uintptr_t result = state->stack[state->stack_size - 2] + state->stack[state->stack_size - 1]; state->stack[state->stack_size - 2] = result; @@ -310,7 +314,7 @@ int mc_dwarf_execute_expression(size_t n, const Dwarf_Op * ops, if (state->stack_size < 2) return MC_EXPRESSION_E_STACK_UNDERFLOW; { - uintptr_t result = + std::uintptr_t result = state->stack[state->stack_size - 2] - state->stack[state->stack_size - 1]; state->stack[state->stack_size - 2] = result; @@ -346,7 +350,7 @@ int mc_dwarf_execute_expression(size_t n, const Dwarf_Op * ops, if (state->stack_size < 2) return MC_EXPRESSION_E_STACK_UNDERFLOW; { - uintptr_t result = + std::uintptr_t result = state->stack[state->stack_size - 2] - state->stack[state->stack_size - 1]; state->stack[state->stack_size - 2] = result; @@ -358,7 +362,7 @@ int mc_dwarf_execute_expression(size_t n, const Dwarf_Op * ops, if (state->stack_size < 2) return MC_EXPRESSION_E_STACK_UNDERFLOW; { - uintptr_t result = + std::uintptr_t result = state->stack[state->stack_size - 2] & state->stack[state->stack_size - 1]; state->stack[state->stack_size - 2] = result; @@ -370,7 +374,7 @@ int mc_dwarf_execute_expression(size_t n, const Dwarf_Op * ops, if (state->stack_size < 2) return MC_EXPRESSION_E_STACK_UNDERFLOW; { - uintptr_t result = + std::uintptr_t result = state->stack[state->stack_size - 2] | state->stack[state->stack_size - 1]; state->stack[state->stack_size - 2] = result; @@ -382,7 +386,7 @@ int mc_dwarf_execute_expression(size_t n, const Dwarf_Op * ops, if (state->stack_size < 2) return MC_EXPRESSION_E_STACK_UNDERFLOW; { - uintptr_t result = + std::uintptr_t result = state->stack[state->stack_size - 2] ^ state->stack[state->stack_size - 1]; state->stack[state->stack_size - 2] = result; @@ -403,7 +407,7 @@ int mc_dwarf_execute_expression(size_t n, const Dwarf_Op * ops, return MC_EXPRESSION_E_STACK_UNDERFLOW; { // Computed address: - uintptr_t address = (uintptr_t) state->stack[state->stack_size - 1]; + std::uintptr_t address = (std::uintptr_t) state->stack[state->stack_size - 1]; if (!state->address_space) xbt_die("Missing address space"); state->address_space->read_bytes( @@ -429,11 +433,11 @@ int mc_dwarf_execute_expression(size_t n, const Dwarf_Op * ops, * \deprecated Use mc_dwarf_resolve_expression */ void mc_dwarf_resolve_location(mc_location_t location, - mc_expression_t expression, - mc_object_info_t object_info, + simgrid::mc::DwarfExpression* expression, + simgrid::mc::ObjectInformation* object_info, unw_cursor_t * c, void *frame_pointer_address, - mc_address_space_t address_space, int process_index) + simgrid::mc::AddressSpace* address_space, int process_index) { s_mc_expression_state_t state; memset(&state, 0, sizeof(s_mc_expression_state_t)); @@ -443,10 +447,12 @@ void mc_dwarf_resolve_location(mc_location_t location, state.object_info = object_info; state.process_index = process_index; - if (expression->size >= 1 - && expression->ops[0].atom >=DW_OP_reg0 && expression->ops[0].atom <= DW_OP_reg31) { - int dwarf_register = expression->ops[0].atom - DW_OP_reg0; - xbt_assert(c, "Missing frame context for register operation DW_OP_reg%i", + if (expression->size() >= 1 + && (*expression)[0].atom >=DW_OP_reg0 + && (*expression)[0].atom <= DW_OP_reg31) { + int dwarf_register = (*expression)[0].atom - DW_OP_reg0; + xbt_assert(c, + "Missing frame context for register operation DW_OP_reg%i", dwarf_register); location->memory_location = NULL; location->cursor = c; @@ -454,7 +460,8 @@ void mc_dwarf_resolve_location(mc_location_t location, return; } - if (mc_dwarf_execute_expression(expression->size, expression->ops, &state)) + if (mc_dwarf_execute_expression( + expression->size(), expression->data(), &state)) xbt_die("Error evaluating DWARF expression"); if (state.stack_size == 0) xbt_die("No value on the stack"); @@ -465,24 +472,23 @@ void mc_dwarf_resolve_location(mc_location_t location, } } -static mc_expression_t mc_find_expression(mc_location_list_t locations, unw_word_t ip) { - for (size_t i = 0; i != locations->size; ++i) { - mc_expression_t expression = locations->locations + i; - if ((expression->lowpc == NULL && expression->highpc == NULL) - || (ip && ip >= (unw_word_t) expression->lowpc - && ip < (unw_word_t) expression->highpc)) { - return expression; - } - } - return NULL; +// TODO, move this in a method of LocationList +static simgrid::mc::DwarfExpression* mc_find_expression( + simgrid::mc::LocationList* locations, unw_word_t ip) +{ + for (simgrid::mc::LocationListEntry& entry : *locations) + if (entry.valid_for_ip(ip)) + return &entry.expression; + return nullptr; } void mc_dwarf_resolve_locations(mc_location_t location, - mc_location_list_t locations, - mc_object_info_t object_info, - unw_cursor_t * c, - void *frame_pointer_address, - mc_address_space_t address_space, int process_index) + simgrid::mc::LocationList* locations, + simgrid::mc::ObjectInformation* object_info, + unw_cursor_t * c, + void *frame_pointer_address, + simgrid::mc::AddressSpace* address_space, + int process_index) { unw_word_t ip = 0; @@ -491,7 +497,7 @@ void mc_dwarf_resolve_locations(mc_location_t location, xbt_die("Could not resolve IP"); } - mc_expression_t expression = mc_find_expression(locations, ip); + simgrid::mc::DwarfExpression* expression = mc_find_expression(locations, ip); if (expression) { mc_dwarf_resolve_location(location, expression, object_info, c, @@ -506,7 +512,7 @@ void mc_dwarf_resolve_locations(mc_location_t location, * \param frame * \param unw_cursor */ -void *mc_find_frame_base(dw_frame_t frame, mc_object_info_t object_info, +void *mc_find_frame_base(simgrid::mc::Frame* frame, simgrid::mc::ObjectInformation* object_info, unw_cursor_t * unw_cursor) { s_mc_location_t location; @@ -534,55 +540,16 @@ void *mc_find_frame_base(dw_frame_t frame, mc_object_info_t object_info, } } -void mc_dwarf_expression_clear(mc_expression_t expression) -{ - free(expression->ops); - expression->ops = NULL; - expression->size = 0; - expression->lowpc = NULL; - expression->highpc = NULL; -} - -void mc_dwarf_location_list_clear(mc_location_list_t list) +void mc_dwarf_location_list_init( + simgrid::mc::LocationList* list, simgrid::mc::ObjectInformation* info, + Dwarf_Die * die, Dwarf_Attribute * attr) { - for (size_t i = 0; i != list->size; ++i) { - mc_dwarf_expression_clear(list->locations + i); - } - free(list->locations); - list->locations = NULL; - list->size = 0; -} + list->clear(); -void mc_dwarf_expression_init(mc_expression_t expression, size_t len, - Dwarf_Op * ops) -{ - expression->lowpc = NULL; - expression->highpc = NULL; - expression->size = len; - expression->ops = (Dwarf_Op*) xbt_malloc(len * sizeof(Dwarf_Op)); - memcpy(expression->ops, ops, len * sizeof(Dwarf_Op)); -} - -void mc_dwarf_location_list_init_from_expression(mc_location_list_t target, - size_t len, Dwarf_Op * ops) -{ - target->size = 1; - target->locations = (mc_expression_t) xbt_malloc(sizeof(s_mc_expression_t)); - mc_dwarf_expression_init(target->locations, len, ops); -} - -void mc_dwarf_location_list_init(mc_location_list_t list, mc_object_info_t info, - Dwarf_Die * die, Dwarf_Attribute * attr) -{ - if (list->locations) { - mc_dwarf_location_list_clear(list); - } - list->size = 0; - - ptrdiff_t offset = 0; + std::ptrdiff_t offset = 0; Dwarf_Addr base, start, end; Dwarf_Op *ops; - size_t len; + std::size_t len; while (1) { @@ -592,21 +559,15 @@ void mc_dwarf_location_list_init(mc_location_list_t list, mc_object_info_t info, else if (offset == -1) xbt_die("Error while loading location list"); - int i = list->size; - list->size++; - list->locations = - (mc_expression_t) realloc(list->locations, - list->size * sizeof(s_mc_expression_t)); - mc_expression_t expression = list->locations + i; - expression->ops = NULL; - mc_dwarf_expression_init(expression, len, ops); - - void *base = - info-> - flags & MC_OBJECT_INFO_EXECUTABLE ? 0 : MC_object_base_address(info); + simgrid::mc::LocationListEntry entry; + entry.expression = simgrid::mc::DwarfExpression(ops, ops + len); + + void *base = info->base_address(); // If start == 0, this is not a location list: - expression->lowpc = start == 0 ? NULL : (char *) base + start; - expression->highpc = start == 0 ? NULL : (char *) base + end; + entry.lowpc = start == 0 ? NULL : (char *) base + start; + entry.highpc = start == 0 ? NULL : (char *) base + end; + + list->push_back(std::move(entry)); } }