]>
Commit | Line | Data |
---|---|---|
9f14eebc | 1 | /* Data structures and functions associated with agent expressions in GDB. |
b811d2c2 | 2 | Copyright (C) 2009-2020 Free Software Foundation, Inc. |
9f14eebc LM |
3 | |
4 | This file is part of GDB. | |
5 | ||
6 | This program is free software; you can redistribute it and/or modify | |
7 | it under the terms of the GNU General Public License as published by | |
8 | the Free Software Foundation; either version 3 of the License, or | |
9 | (at your option) any later version. | |
10 | ||
11 | This program is distributed in the hope that it will be useful, | |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | GNU General Public License for more details. | |
15 | ||
16 | You should have received a copy of the GNU General Public License | |
17 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
18 | ||
1a5c2598 TT |
19 | #ifndef GDBSERVER_AX_H |
20 | #define GDBSERVER_AX_H | |
9f14eebc | 21 | |
9f14eebc LM |
22 | #include "regcache.h" |
23 | ||
24 | #ifdef IN_PROCESS_AGENT | |
f638ed73 | 25 | #include "gdbsupport/agent.h" |
9f14eebc LM |
26 | #define debug_threads debug_agent |
27 | #endif | |
28 | ||
29 | struct traceframe; | |
30 | ||
31 | /* Enumeration of the different kinds of things that can happen during | |
32 | agent expression evaluation. */ | |
33 | ||
34 | enum eval_result_type | |
35 | { | |
36 | expr_eval_no_error, | |
37 | expr_eval_empty_expression, | |
38 | expr_eval_empty_stack, | |
39 | expr_eval_stack_overflow, | |
40 | expr_eval_stack_underflow, | |
41 | expr_eval_unhandled_opcode, | |
42 | expr_eval_unrecognized_opcode, | |
43 | expr_eval_divide_by_zero, | |
44 | expr_eval_invalid_goto | |
45 | }; | |
46 | ||
47 | struct agent_expr | |
48 | { | |
49 | int length; | |
50 | ||
51 | unsigned char *bytes; | |
52 | }; | |
53 | ||
54 | #ifndef IN_PROCESS_AGENT | |
55 | ||
56 | /* The packet form of an agent expression consists of an 'X', number | |
57 | of bytes in expression, a comma, and then the bytes. */ | |
256642e8 | 58 | struct agent_expr *gdb_parse_agent_expr (const char **actparm); |
9f14eebc | 59 | |
0a261ed8 PA |
60 | /* Release an agent expression. */ |
61 | void gdb_free_agent_expr (struct agent_expr *aexpr); | |
62 | ||
9f14eebc LM |
63 | /* Convert the bytes of an agent expression back into hex digits, so |
64 | they can be printed or uploaded. This allocates the buffer, | |
65 | callers should free when they are done with it. */ | |
66 | char *gdb_unparse_agent_expr (struct agent_expr *aexpr); | |
67 | void emit_prologue (void); | |
68 | void emit_epilogue (void); | |
69 | enum eval_result_type compile_bytecodes (struct agent_expr *aexpr); | |
70 | #endif | |
71 | ||
5ae4861a YQ |
72 | /* The context when evaluating agent expression. */ |
73 | ||
74 | struct eval_agent_expr_context | |
75 | { | |
76 | /* The registers when evaluating agent expression. */ | |
77 | struct regcache *regcache; | |
78 | /* The traceframe, if any, when evaluating agent expression. */ | |
79 | struct traceframe *tframe; | |
80 | /* The tracepoint, if any, when evaluating agent expression. */ | |
81 | struct tracepoint *tpoint; | |
82 | }; | |
83 | ||
84 | enum eval_result_type | |
85 | gdb_eval_agent_expr (struct eval_agent_expr_context *ctx, | |
86 | struct agent_expr *aexpr, | |
87 | ULONGEST *rslt); | |
f699aaba PA |
88 | |
89 | /* Bytecode compilation function vector. */ | |
90 | ||
91 | struct emit_ops | |
92 | { | |
93 | void (*emit_prologue) (void); | |
94 | void (*emit_epilogue) (void); | |
95 | void (*emit_add) (void); | |
96 | void (*emit_sub) (void); | |
97 | void (*emit_mul) (void); | |
98 | void (*emit_lsh) (void); | |
99 | void (*emit_rsh_signed) (void); | |
100 | void (*emit_rsh_unsigned) (void); | |
101 | void (*emit_ext) (int arg); | |
102 | void (*emit_log_not) (void); | |
103 | void (*emit_bit_and) (void); | |
104 | void (*emit_bit_or) (void); | |
105 | void (*emit_bit_xor) (void); | |
106 | void (*emit_bit_not) (void); | |
107 | void (*emit_equal) (void); | |
108 | void (*emit_less_signed) (void); | |
109 | void (*emit_less_unsigned) (void); | |
110 | void (*emit_ref) (int size); | |
111 | void (*emit_if_goto) (int *offset_p, int *size_p); | |
112 | void (*emit_goto) (int *offset_p, int *size_p); | |
113 | void (*write_goto_address) (CORE_ADDR from, CORE_ADDR to, int size); | |
114 | void (*emit_const) (LONGEST num); | |
115 | void (*emit_call) (CORE_ADDR fn); | |
116 | void (*emit_reg) (int reg); | |
117 | void (*emit_pop) (void); | |
118 | void (*emit_stack_flush) (void); | |
119 | void (*emit_zero_ext) (int arg); | |
120 | void (*emit_swap) (void); | |
121 | void (*emit_stack_adjust) (int n); | |
122 | ||
123 | /* Emit code for a generic function that takes one fixed integer | |
124 | argument and returns a 64-bit int (for instance, tsv getter). */ | |
125 | void (*emit_int_call_1) (CORE_ADDR fn, int arg1); | |
126 | ||
127 | /* Emit code for a generic function that takes one fixed integer | |
128 | argument and a 64-bit int from the top of the stack, and returns | |
129 | nothing (for instance, tsv setter). */ | |
130 | void (*emit_void_call_2) (CORE_ADDR fn, int arg1); | |
131 | ||
132 | /* Emit code specialized for common combinations of compare followed | |
133 | by a goto. */ | |
134 | void (*emit_eq_goto) (int *offset_p, int *size_p); | |
135 | void (*emit_ne_goto) (int *offset_p, int *size_p); | |
136 | void (*emit_lt_goto) (int *offset_p, int *size_p); | |
137 | void (*emit_le_goto) (int *offset_p, int *size_p); | |
138 | void (*emit_gt_goto) (int *offset_p, int *size_p); | |
139 | void (*emit_ge_goto) (int *offset_p, int *size_p); | |
140 | }; | |
141 | ||
142 | extern CORE_ADDR current_insn_ptr; | |
143 | extern int emit_error; | |
144 | ||
1a5c2598 | 145 | #endif /* GDBSERVER_AX_H */ |