Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Do not execute MCer code in MCed mode in MC_remove_ignore_heap()
[simgrid.git] / src / mc / mc_location.h
1 /* Copyright (c) 2004-2014. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 #ifndef MC_OBJECT_LOCATION_H
8 #define MC_OBJECT_LOCATION_H
9
10 #include <stdint.h>
11
12 #include <libunwind.h>
13 #include <dwarf.h>
14 #include <elfutils/libdw.h>
15
16 #include <simgrid_config.h>
17 #include "mc_forward.h"
18 #include "mc_object_info.h"
19 #include "mc_forward.h"
20 #include "mc_address_space.h"
21
22 SG_BEGIN_DECL()
23
24 /** \brief a DWARF expression with optional validity contraints */
25 typedef struct s_mc_expression {
26   size_t size;
27   Dwarf_Op* ops;
28   // Optional validity:
29   void* lowpc, *highpc;
30 } s_mc_expression_t, *mc_expression_t;
31
32 /** A location list (list of location expressions) */
33 typedef struct s_mc_location_list {
34   size_t size;
35   mc_expression_t locations;
36 } s_mc_location_list_t, *mc_location_list_t;
37
38 /** A location is either a location in memory of a register location
39  *
40  *  Usage:
41  *
42  *    * mc_dwarf_resolve_locations or mc_dwarf_resolve_location is used
43  *      to find the location of a given location expression or location list;
44  *
45  *    * mc_get_location_type MUST be used to find the location type;
46  *
47  *    * for MC_LOCATION_TYPE_ADDRESS, memory_address is the resulting address
48  *
49  *    * for MC_LOCATION_TYPE_REGISTER, unw_get_reg(l.cursor, l.register_id, value)
50  *        and unw_get_reg(l.cursor, l.register_id, value) can be used to read/write
51  *        the value.
52  *  </ul>
53  */
54 typedef struct s_mc_location {
55   void* memory_location;
56   unw_cursor_t* cursor;
57   int register_id;
58 } s_mc_location_t, *mc_location_t;
59
60 /** Type of a given location
61  *
62  *  Use `mc_get_location_type(location)` to find the type.
63  * */
64 typedef enum mc_location_type {
65   MC_LOCATION_TYPE_ADDRESS,
66   MC_LOCATION_TYPE_REGISTER
67 } mc_location_type;
68
69 /** Find the type of a location */
70 static inline __attribute__ ((always_inline))
71 enum mc_location_type mc_get_location_type(mc_location_t location) {
72   if (location->cursor) {
73     return MC_LOCATION_TYPE_REGISTER;
74   } else {
75     return MC_LOCATION_TYPE_ADDRESS;
76   }
77 }
78
79 void mc_dwarf_resolve_location(mc_location_t location, mc_expression_t expression, mc_object_info_t object_info, unw_cursor_t* c, void* frame_pointer_address, mc_address_space_t address_space, int process_index);
80 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);
81
82 void mc_dwarf_expression_clear(mc_expression_t expression);
83 void mc_dwarf_expression_init(mc_expression_t expression, size_t len, Dwarf_Op* ops);
84
85 void mc_dwarf_location_list_clear(mc_location_list_t list);
86
87 void mc_dwarf_location_list_init_from_expression(mc_location_list_t target, size_t len, Dwarf_Op* ops);
88 void mc_dwarf_location_list_init(mc_location_list_t target, mc_object_info_t info, Dwarf_Die* die, Dwarf_Attribute* attr);
89
90 #define MC_EXPRESSION_STACK_SIZE 64
91
92 #define MC_EXPRESSION_OK 0
93 #define MC_EXPRESSION_E_UNSUPPORTED_OPERATION 1
94 #define MC_EXPRESSION_E_STACK_OVERFLOW 2
95 #define MC_EXPRESSION_E_STACK_UNDERFLOW 3
96 #define MC_EXPRESSION_E_MISSING_STACK_CONTEXT 4
97 #define MC_EXPRESSION_E_MISSING_FRAME_BASE 5
98 #define MC_EXPRESSION_E_NO_BASE_ADDRESS 6
99
100 typedef struct s_mc_expression_state {
101   uintptr_t stack[MC_EXPRESSION_STACK_SIZE];
102   size_t stack_size;
103
104   unw_cursor_t* cursor;
105   void* frame_base;
106   mc_address_space_t address_space;
107   mc_object_info_t object_info;
108   int process_index;
109 } s_mc_expression_state_t, *mc_expression_state_t;
110
111 int mc_dwarf_execute_expression(size_t n, const Dwarf_Op* ops, mc_expression_state_t state);
112
113 void* mc_find_frame_base(dw_frame_t frame, mc_object_info_t object_info, unw_cursor_t* unw_cursor);
114
115 SG_END_DECL()
116
117 #endif