Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Process nested scopes DWARF informations
[simgrid.git] / src / mc / mc_member.c
1 #include "mc_private.h"
2
3 /** Resolve snapshot in the process address space
4  *
5  * @param object   Process address of the struct/class
6  * @param type     Type of the struct/class
7  * @param member   Member description
8  * @param snapshot Snapshot (or NULL)
9  * @return Process address of the given member of the 'object' struct/class
10  */
11 void* mc_member_resolve(const void* base, dw_type_t type, dw_type_t member, mc_snapshot_t snapshot) {
12   if(!member->location.size) {
13     return ((char*) base) + member->offset;
14   }
15
16   s_mc_expression_state_t state;
17   memset(&state, 0, sizeof(s_mc_expression_state_t));
18   state.frame_base = NULL;
19   state.cursor = NULL;
20   state.snapshot = snapshot;
21   state.stack_size = 1;
22   state.stack[0] = (uintptr_t) base;
23
24   if(mc_dwarf_execute_expression(member->location.size, member->location.ops, &state))
25     xbt_die("Error evaluating DWARF expression");
26   if(state.stack_size==0)
27     xbt_die("No value on the stack");
28   else
29     return (void*) state.stack[state.stack_size-1];
30 }
31
32 /** Resolve snapshot in the snapshot address space
33  *
34  * @param  object Snapshot address of the struct/class
35  * @param  type Type of the struct/class
36  * @param  member Member description
37  * @param  snapshot Snapshot (or NULL)
38  * @return Snapshot address of the given member of the 'object' struct/class
39  */
40 void* mc_member_snapshot_resolve(const void* object, dw_type_t type, dw_type_t member, mc_snapshot_t snapshot) {
41   if(!member->location.size) {
42     return (char*) object + member->offset;
43   } else {
44     // Translate the problem in the process address space:
45     void* real_area = (void*) mc_untranslate_address((void *)object, snapshot);
46     // Resolve the member in the process address space:
47     void* real_member = mc_member_resolve(real_area, type, member, snapshot);
48     // Translate back in the snapshot address space:
49     return mc_translate_address((uintptr_t)real_member, snapshot);
50   }
51 }