-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;
+// ***** Expressions
+
+/** \brief a DWARF expression with optional validity contraints */
+typedef struct s_mc_expression {
+ size_t size;
+ Dwarf_Op* ops;
+ // Optional validity:
+ void* lowpc, *highpc;
+} s_mc_expression_t, *mc_expression_t;
+
+/** A location list (list of location expressions) */
+typedef struct s_mc_location_list {
+ size_t size;
+ mc_expression_t locations;
+} s_mc_location_list_t, *mc_location_list_t;
+
+uintptr_t 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);
+uintptr_t 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);
+
+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;
+ Dwarf_Off 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
+};
+
+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);