Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Fix DW_OP_addr to translate address into virtual address space
[simgrid.git] / src / mc / mc_private.h
index 2ae9141..6b2ae33 100644 (file)
@@ -416,8 +416,8 @@ typedef struct s_mc_location_list {
   mc_expression_t locations;
 } s_mc_location_list_t, *mc_location_list_t;
 
-Dwarf_Off mc_dwarf_resolve_location(mc_expression_t expression, unw_cursor_t* c, void* frame_pointer_address, mc_snapshot_t snapshot);
-Dwarf_Off mc_dwarf_resolve_locations(mc_location_list_t locations, unw_cursor_t* c, void* frame_pointer_address, mc_snapshot_t snapshot);
+Dwarf_Off mc_dwarf_resolve_location(mc_expression_t expression, mc_object_info_t object_info, unw_cursor_t* c, void* frame_pointer_address, mc_snapshot_t snapshot);
+Dwarf_Off mc_dwarf_resolve_locations(mc_location_list_t locations, mc_object_info_t object_info, unw_cursor_t* c, void* frame_pointer_address, mc_snapshot_t snapshot);
 
 void mc_dwarf_expression_clear(mc_expression_t expression);
 void mc_dwarf_expression_init(mc_expression_t expression, size_t len, Dwarf_Op* ops);
@@ -462,6 +462,7 @@ typedef struct s_dw_variable{
   void* address;
 
   size_t start_scope;
+  mc_object_info_t object_info;
 
 }s_dw_variable_t, *dw_variable_t;
 
@@ -475,6 +476,7 @@ struct s_dw_frame{
   unsigned long int id; /* DWARF offset of the subprogram */
   xbt_dynar_t /* <dw_frame_t> */ scopes;
   Dwarf_Off abstract_origin_id;
+  mc_object_info_t object_info;
 };
 
 struct s_mc_function_index_item {
@@ -492,6 +494,21 @@ void MC_dwarf_register_global_variable(mc_object_info_t info, dw_variable_t vari
 void MC_register_variable(mc_object_info_t info, dw_frame_t frame, dw_variable_t variable);
 void MC_dwarf_register_non_global_variable(mc_object_info_t info, dw_frame_t frame, dw_variable_t variable);
 void MC_dwarf_register_variable(mc_object_info_t info, dw_frame_t frame, dw_variable_t variable);
+
+/** Find the DWARF offset for this ELF object
+ *
+ *  An offset is applied to address found in DWARF:
+ *
+ *  <ul>
+ *    <li>for an executable obejct, addresses are virtual address
+ *        (there is no offset) i.e. \f$\text{virtual address} = \{dwarf address}\f$;</li>
+ *    <li>for a shared object, the addreses are offset from the begining
+ *        of the shared object (the base address of the mapped shared
+ *        object must be used as offset
+ *        i.e. \f$\text{virtual address} = \text{shared object base address}
+ *             + \text{dwarf address}\f$.</li>
+ *
+ */
 void* MC_object_base_address(mc_object_info_t info);
 
 /********************************** DWARF **********************************/
@@ -504,6 +521,7 @@ void* MC_object_base_address(mc_object_info_t info);
 #define MC_EXPRESSION_E_STACK_UNDERFLOW 3
 #define MC_EXPRESSION_E_MISSING_STACK_CONTEXT 4
 #define MC_EXPRESSION_E_MISSING_FRAME_BASE 5
+#define MC_EXPRESSION_E_NO_BASE_ADDRESS 6
 
 typedef struct s_mc_expression_state {
   uintptr_t stack[MC_EXPRESSION_STACK_SIZE];
@@ -512,11 +530,12 @@ typedef struct s_mc_expression_state {
   unw_cursor_t* cursor;
   void* frame_base;
   mc_snapshot_t snapshot;
+  mc_object_info_t object_info;
 } s_mc_expression_state_t, *mc_expression_state_t;
 
 int mc_dwarf_execute_expression(size_t n, const Dwarf_Op* ops, mc_expression_state_t state);
 
-void* mc_find_frame_base(dw_frame_t frame, unw_cursor_t* unw_cursor);
+void* mc_find_frame_base(dw_frame_t frame, mc_object_info_t object_info, unw_cursor_t* unw_cursor);
 
 /********************************** Miscellaneous **********************************/