#define NB_REGIONS 3 /* binary data (data + BSS) (type = 2), libsimgrid data (data + BSS) (type = 1), std_heap (type = 0)*/
typedef struct s_mc_mem_region{
+ // Real address:
void *start_addr;
+ // Copy of the datra:
void *data;
+ // Size of the data region:
size_t size;
} s_mc_mem_region_t, *mc_mem_region_t;
mc_snapshot_t MC_take_snapshot(int num_state);
void MC_restore_snapshot(mc_snapshot_t);
void MC_free_snapshot(mc_snapshot_t);
+void* mc_translate_address(uintptr_t addr, mc_snapshot_t snapshot);
+uintptr_t mc_untranslate_address(void* addr, mc_snapshot_t snapshot);
extern xbt_dynar_t mc_checkpoint_ignore;
xbt_dynar_t subprograms; // xbt_dynar_t<dw_frame_t>
xbt_dynar_t global_variables; // xbt_dynar_t<dw_variable_t>
xbt_dict_t types; // xbt_dict_t<origin as hexadecimal string, dw_type_t>
- xbt_dict_t types_by_name; // xbt_dict_t<name, dw_type_t> (full defined type only)
+ xbt_dict_t full_types_by_name; // xbt_dict_t<name, dw_type_t> (full defined type only)
// Here we sort the minimal information for an efficient (and cache-efficient)
// lookup of a function given an instruction pointer.
extern mc_object_info_t mc_libsimgrid_info;
extern mc_object_info_t mc_binary_info;
+extern mc_object_info_t mc_object_infos[2];
+extern size_t mc_object_infos_size;
void MC_find_object_address(memory_map_t maps, mc_object_info_t result);
void MC_post_process_types(mc_object_info_t info);
mc_expression_t locations;
} s_mc_location_list_t, *mc_location_list_t;
-// ***** Deprecated locations:
+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);
-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;
+void mc_dwarf_expression_clear(mc_expression_t expression);
+void mc_dwarf_expression_init(mc_expression_t expression, size_t len, Dwarf_Op* ops);
+
+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);
// ***** Variables and functions
+struct s_dw_type{
+ e_dw_type_type type;
+ void *id; /* Offset in the section (in hexadecimal form) */
+ char *name; /* Name of the type */
+ int byte_size; /* Size in bytes */
+ int element_count; /* Number of elements for array type */
+ char *dw_type_id; /* DW_AT_type id */
+ xbt_dynar_t members; /* if DW_TAG_structure_type, DW_TAG_class_type, DW_TAG_union_type*/
+ int is_pointer_type;
+
+ // Location (for members) is either of:
+ struct s_mc_expression location;
+ int offset;
+
+ dw_type_t subtype; // DW_AT_type
+ dw_type_t full_type; // The same (but more complete) type in the other object.
+};
+
+void* mc_member_resolve(const void* base, dw_type_t type, dw_type_t member, mc_snapshot_t snapshot);
+void* mc_member_snapshot_resolve(const void* base, dw_type_t type, dw_type_t member, mc_snapshot_t snapshot);
+
typedef struct s_dw_variable{
Dwarf_Off dwarf_offset; /* Global offset of the field. */
int global;
dw_type_t type;
// Use either of:
- dw_location_t location;
+ s_mc_location_list_t locations;
void* address;
size_t start_scope;
char *name;
void *low_pc;
void *high_pc;
- dw_location_t frame_base;
+ s_mc_location_list_t frame_base;
xbt_dynar_t /* <dw_variable_t> */ variables; /* Cannot use dict, there may be several variables with the same name (in different lexical blocks)*/
unsigned long int start; /* DWARF offset of the subprogram */
unsigned long int end; /* Dwarf offset of the next sibling */
/********************************** DWARF **********************************/
-Dwarf_Off MC_dwarf_resolve_location(unw_cursor_t* c, dw_location_t location, void* frame_pointer_address);
-void* mc_find_frame_base(void* ip, dw_frame_t frame, unw_cursor_t* unw_cursor);
-
#define MC_EXPRESSION_STACK_SIZE 64
#define MC_EXPRESSION_OK 0
unw_cursor_t* cursor;
void* frame_base;
+ mc_snapshot_t snapshot;
} 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);
+
/********************************** Miscellaneous **********************************/
typedef struct s_local_variable{