]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/ax-gdb.h
[gdb/python] Make gdb.UnwindInfo.add_saved_register more robust (fixup)
[thirdparty/binutils-gdb.git] / gdb / ax-gdb.h
CommitLineData
c906108c 1/* GDB-specific functions for operating on agent expressions
1d506c26 2 Copyright (C) 1998-2024 Free Software Foundation, Inc.
c906108c 3
c5aa993b 4 This file is part of GDB.
c906108c 5
c5aa993b
JM
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
a9762ec7 8 the Free Software Foundation; either version 3 of the License, or
c5aa993b 9 (at your option) any later version.
c906108c 10
c5aa993b
JM
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.
c906108c 15
c5aa993b 16 You should have received a copy of the GNU General Public License
a9762ec7 17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c 18
c906108c
SS
19#ifndef AX_GDB_H
20#define AX_GDB_H
da3331ec 21
ef0f16cc 22#include "ax.h"
c0b8369c 23
da3331ec 24struct expression;
c5aa993b 25
c906108c
SS
26/* Types and enums */
27
28/* GDB stores expressions in the form of a flattened tree (struct
29 expression), so we just walk that tree and generate agent bytecodes
30 as we go along.
31
32 GDB's normal evaluation uses struct value, which contains the
33 expression's value as well as its address or the register it came
34 from. The `+' operator uses the value, whereas the unary `&'
35 operator will use the address portion. The `=' operator will use
36 the address or register number of its left hand side.
37
38 The issues are different when generating agent bytecode. Given a
39 variable reference expression, we should not necessarily generate
40 code to fetch its value, because the next operator may be `=' or
41 unary `&'. Instead, when we recurse on a subexpression, we
42 indicate whether we want that expression to produce an lvalue or an
43 rvalue. If we requested an lvalue, then the recursive call tells
44 us whether it generated code to compute an address on the stack, or
45 whether the lvalue lives in a register.
46
47 The `axs' prefix here means `agent expression, static', because
48 this is all static analysis of the expression, i.e. analysis which
49 doesn't depend on the contents of memory and registers. */
50
51
52/* Different kinds of agent expression static values. */
c5aa993b
JM
53enum axs_lvalue_kind
54 {
55 /* We generated code to compute the subexpression's value.
56 Constants and arithmetic operators yield this. */
57 axs_rvalue,
58
59 /* We generated code to yield the subexpression's value's address on
60 the top of the stack. If the caller needs an rvalue, it should
61 call require_rvalue to produce the rvalue from this address. */
62 axs_lvalue_memory,
63
64 /* We didn't generate any code, and the stack is undisturbed,
65 because the subexpression's value lives in a register; u.reg is
66 the register number. If the caller needs an rvalue, it should
67 call require_rvalue to produce the rvalue from this register
68 number. */
69 axs_lvalue_register
70 };
c906108c
SS
71
72/* Structure describing what we got from a subexpression. Think of
73 this as parallel to value.h's enum lval_type, except that we're
74 describing a value which will exist when the expression is
75 evaluated in the future, not a value we have in our hand. */
c5aa993b
JM
76struct axs_value
77 {
78 enum axs_lvalue_kind kind; /* see above */
79
80 /* The type of the subexpression. Even if lvalue == axs_lvalue_memory,
81 this is the type of the value itself; the value on the stack is a
0e2de366 82 "pointer to" an object of this type. */
c5aa993b
JM
83 struct type *type;
84
400c6af0
SS
85 /* If nonzero, this is a variable which does not actually exist in
86 the program. */
87 char optimized_out;
88
c5aa993b
JM
89 union
90 {
91 /* if kind == axs_lvalue_register, this is the register number */
92 int reg;
93 }
94 u;
95 };
c906108c 96\f
c5aa993b 97
c906108c
SS
98/* Translating GDB expressions into agent expressions. */
99
c906108c
SS
100/* Given a GDB expression EXPR, return bytecode to trace its value.
101 The result will use the `trace' and `trace_quick' bytecodes to
102 record the value of all memory touched by the expression, and leave
103 no values on the stack. The caller can then use the ax_reqs
104 function to discover which registers the expression uses. */
833177a4
PA
105extern agent_expr_up gen_trace_for_expr (CORE_ADDR, struct expression *,
106 int);
c906108c 107
833177a4
PA
108extern agent_expr_up gen_trace_for_var (CORE_ADDR, struct gdbarch *,
109 struct symbol *, int);
0936ad1d 110
833177a4
PA
111extern agent_expr_up gen_trace_for_return_address (CORE_ADDR,
112 struct gdbarch *,
113 int);
6710bf39 114
833177a4 115extern agent_expr_up gen_eval_for_expr (CORE_ADDR, struct expression *);
782b2b07 116
55aa24fb
SDJ
117extern void gen_expr (struct expression *exp, union exp_element **pc,
118 struct agent_expr *ax, struct axs_value *value);
119
120extern void require_rvalue (struct agent_expr *ax, struct axs_value *value);
121
833177a4
PA
122extern agent_expr_up gen_printf (CORE_ADDR, struct gdbarch *,
123 CORE_ADDR, LONGEST, const char *, int,
833177a4 124 int, struct expression **);
d3ce09f5 125
c906108c 126#endif /* AX_GDB_H */