xref: /onnv-gate/usr/src/cmd/sgs/librtld_db/demo/common/gram.y (revision 12927:a27c46eb192b)
1*12927SRod.Evans@Sun.COM %{
2*12927SRod.Evans@Sun.COM /*
3*12927SRod.Evans@Sun.COM  * CDDL HEADER START
4*12927SRod.Evans@Sun.COM  *
5*12927SRod.Evans@Sun.COM  * The contents of this file are subject to the terms of the
6*12927SRod.Evans@Sun.COM  * Common Development and Distribution License (the "License").
7*12927SRod.Evans@Sun.COM  * You may not use this file except in compliance with the License.
8*12927SRod.Evans@Sun.COM  *
9*12927SRod.Evans@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*12927SRod.Evans@Sun.COM  * or http://www.opensolaris.org/os/licensing.
11*12927SRod.Evans@Sun.COM  * See the License for the specific language governing permissions
12*12927SRod.Evans@Sun.COM  * and limitations under the License.
13*12927SRod.Evans@Sun.COM  *
14*12927SRod.Evans@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
15*12927SRod.Evans@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*12927SRod.Evans@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
17*12927SRod.Evans@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
18*12927SRod.Evans@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
19*12927SRod.Evans@Sun.COM  *
20*12927SRod.Evans@Sun.COM  * CDDL HEADER END
21*12927SRod.Evans@Sun.COM  */
22*12927SRod.Evans@Sun.COM 
23*12927SRod.Evans@Sun.COM /*
24*12927SRod.Evans@Sun.COM  * Copyright (c) 1995, 2010, Oracle and/or its affiliates. All rights reserved.
25*12927SRod.Evans@Sun.COM  */
26*12927SRod.Evans@Sun.COM 
27*12927SRod.Evans@Sun.COM #include <stdio.h>
28*12927SRod.Evans@Sun.COM #include <sys/types.h>
29*12927SRod.Evans@Sun.COM #include <libelf.h>
30*12927SRod.Evans@Sun.COM #include "rdb.h"
31*12927SRod.Evans@Sun.COM 
32*12927SRod.Evans@Sun.COM extern	void	rdb_prompt();
33*12927SRod.Evans@Sun.COM 
34*12927SRod.Evans@Sun.COM %}
35*12927SRod.Evans@Sun.COM 
36*12927SRod.Evans@Sun.COM %token	VALUE STEP HELP NUMBER NEWLINE SYMBOL PLUS BREAK CONT DIS GETMAPS
37*12927SRod.Evans@Sun.COM %token	DELETE MAPS PLTSKIP WHERE PRINT OBJPAD QSTRING VARSTRING ECHO_OUT
38*12927SRod.Evans@Sun.COM %token	EVENT LINKMAPS
39*12927SRod.Evans@Sun.COM 
40*12927SRod.Evans@Sun.COM %union {
41*12927SRod.Evans@Sun.COM 	char	*str;
42*12927SRod.Evans@Sun.COM 	ulong_t	addr;
43*12927SRod.Evans@Sun.COM 	int	num;
44*12927SRod.Evans@Sun.COM }
45*12927SRod.Evans@Sun.COM 
46*12927SRod.Evans@Sun.COM %type <addr> NUMBER address
47*12927SRod.Evans@Sun.COM %type <str> SYMBOL QSTRING VARSTRING
48*12927SRod.Evans@Sun.COM 
49*12927SRod.Evans@Sun.COM %left PLUS
50*12927SRod.Evans@Sun.COM 
51*12927SRod.Evans@Sun.COM %%
52*12927SRod.Evans@Sun.COM start: commands
53*12927SRod.Evans@Sun.COM 	;
54*12927SRod.Evans@Sun.COM 
55*12927SRod.Evans@Sun.COM commands: /* empty */
56*12927SRod.Evans@Sun.COM 	| commands command
57*12927SRod.Evans@Sun.COM 	;
58*12927SRod.Evans@Sun.COM command: BREAK NEWLINE
59*12927SRod.Evans@Sun.COM 	{
60*12927SRod.Evans@Sun.COM 		list_breakpoints(&proch);
61*12927SRod.Evans@Sun.COM 		rdb_prompt();
62*12927SRod.Evans@Sun.COM 	}
63*12927SRod.Evans@Sun.COM 	| BREAK address NEWLINE
64*12927SRod.Evans@Sun.COM 	{
65*12927SRod.Evans@Sun.COM 		if (set_breakpoint(&proch, $2, FLG_BP_USERDEF) == RET_OK)
66*12927SRod.Evans@Sun.COM 			(void) printf("break point set at: 0x%lx\n",
67*12927SRod.Evans@Sun.COM 			    (unsigned long)$2);
68*12927SRod.Evans@Sun.COM 		else
69*12927SRod.Evans@Sun.COM 			(void) printf("unable to set breakpoint.\n");
70*12927SRod.Evans@Sun.COM 		rdb_prompt();
71*12927SRod.Evans@Sun.COM 	}
72*12927SRod.Evans@Sun.COM 	| CONT NEWLINE
73*12927SRod.Evans@Sun.COM 	{
74*12927SRod.Evans@Sun.COM 		(void) continue_to_break(&proch);
75*12927SRod.Evans@Sun.COM 		rdb_prompt();
76*12927SRod.Evans@Sun.COM 	}
77*12927SRod.Evans@Sun.COM 	| DELETE address NEWLINE
78*12927SRod.Evans@Sun.COM 	{
79*12927SRod.Evans@Sun.COM 		if (delete_breakpoint(&proch, $2, FLG_BP_USERDEF) != RET_OK)
80*12927SRod.Evans@Sun.COM 			(void) printf("unable to delete breakpoint at %#lx\n",
81*12927SRod.Evans@Sun.COM 			    (unsigned long)$2);
82*12927SRod.Evans@Sun.COM 		else
83*12927SRod.Evans@Sun.COM 			(void) printf("breakpoint deleted at 0x%lx\n",
84*12927SRod.Evans@Sun.COM 			    (unsigned long)$2);
85*12927SRod.Evans@Sun.COM 
86*12927SRod.Evans@Sun.COM 		rdb_prompt();
87*12927SRod.Evans@Sun.COM 	}
88*12927SRod.Evans@Sun.COM 	| DIS NEWLINE
89*12927SRod.Evans@Sun.COM 	{
90*12927SRod.Evans@Sun.COM 		disasm(&proch, 10);
91*12927SRod.Evans@Sun.COM 		rdb_prompt();
92*12927SRod.Evans@Sun.COM 	}
93*12927SRod.Evans@Sun.COM 	| DIS address NEWLINE
94*12927SRod.Evans@Sun.COM 	{
95*12927SRod.Evans@Sun.COM 		(void) disasm_addr(&proch, (ulong_t)$2, 10);
96*12927SRod.Evans@Sun.COM 		rdb_prompt();
97*12927SRod.Evans@Sun.COM 	}
98*12927SRod.Evans@Sun.COM 	| DIS address NUMBER NEWLINE
99*12927SRod.Evans@Sun.COM 	{
100*12927SRod.Evans@Sun.COM 		(void) disasm_addr(&proch, (ulong_t)$2, (int)$3);
101*12927SRod.Evans@Sun.COM 		rdb_prompt();
102*12927SRod.Evans@Sun.COM 	}
103*12927SRod.Evans@Sun.COM 	| ECHO_OUT QSTRING NEWLINE
104*12927SRod.Evans@Sun.COM 	{
105*12927SRod.Evans@Sun.COM 		(void) puts($2);
106*12927SRod.Evans@Sun.COM 		free($2);
107*12927SRod.Evans@Sun.COM 		rdb_prompt();
108*12927SRod.Evans@Sun.COM 	}
109*12927SRod.Evans@Sun.COM 	| EVENT SYMBOL NEWLINE
110*12927SRod.Evans@Sun.COM 	{
111*12927SRod.Evans@Sun.COM 		if (strcmp($2, "on") == 0) {
112*12927SRod.Evans@Sun.COM 			(void) printf("rdb: event information enabled.\n");
113*12927SRod.Evans@Sun.COM 			rdb_flags |= RDB_FL_EVENTS;
114*12927SRod.Evans@Sun.COM 		} else if (strcmp($2, "off") == 0) {
115*12927SRod.Evans@Sun.COM 			(void) printf("rdb: event information disabled.\n");
116*12927SRod.Evans@Sun.COM 			rdb_flags &= ~RDB_FL_EVENTS;
117*12927SRod.Evans@Sun.COM 		} else {
118*12927SRod.Evans@Sun.COM 			(void) printf("rdb: unknown event command: %s\n", $2);
119*12927SRod.Evans@Sun.COM 		}
120*12927SRod.Evans@Sun.COM 		free($2);
121*12927SRod.Evans@Sun.COM 		rdb_prompt();
122*12927SRod.Evans@Sun.COM 	}
123*12927SRod.Evans@Sun.COM 	| GETMAPS NEWLINE
124*12927SRod.Evans@Sun.COM 	{
125*12927SRod.Evans@Sun.COM 		if (get_linkmaps(&proch) != RET_OK)
126*12927SRod.Evans@Sun.COM 			(void) printf("get_linkmaps failed\n");
127*12927SRod.Evans@Sun.COM 
128*12927SRod.Evans@Sun.COM 		rdb_prompt();
129*12927SRod.Evans@Sun.COM 	}
130*12927SRod.Evans@Sun.COM 	| LINKMAPS NEWLINE
131*12927SRod.Evans@Sun.COM 	{
132*12927SRod.Evans@Sun.COM 		if (display_linkmaps(&proch) != RET_OK)
133*12927SRod.Evans@Sun.COM 			(void) printf("display_linkmaps failed\n");
134*12927SRod.Evans@Sun.COM 		rdb_prompt();
135*12927SRod.Evans@Sun.COM 	}
136*12927SRod.Evans@Sun.COM 	| MAPS NEWLINE
137*12927SRod.Evans@Sun.COM 	{
138*12927SRod.Evans@Sun.COM 		if (display_maps(&proch) != RET_OK)
139*12927SRod.Evans@Sun.COM 			(void) printf("display_maps failed\n");
140*12927SRod.Evans@Sun.COM 		rdb_prompt();
141*12927SRod.Evans@Sun.COM 	}
142*12927SRod.Evans@Sun.COM 	| STEP NEWLINE
143*12927SRod.Evans@Sun.COM 	{
144*12927SRod.Evans@Sun.COM 		sn_flags_e	sf;
145*12927SRod.Evans@Sun.COM 
146*12927SRod.Evans@Sun.COM 		(void) printf("single step\n");
147*12927SRod.Evans@Sun.COM 		sf = FLG_SN_VERBOSE;
148*12927SRod.Evans@Sun.COM 		if (proch.pp_flags & FLG_PP_PLTSKIP)
149*12927SRod.Evans@Sun.COM 			sf |= FLG_SN_PLTSKIP;
150*12927SRod.Evans@Sun.COM 
151*12927SRod.Evans@Sun.COM 		(void) step_n(&proch, 1, sf);
152*12927SRod.Evans@Sun.COM 		rdb_prompt();
153*12927SRod.Evans@Sun.COM 	}
154*12927SRod.Evans@Sun.COM 	| STEP NUMBER NEWLINE
155*12927SRod.Evans@Sun.COM 	{
156*12927SRod.Evans@Sun.COM 		sn_flags_e	sf;
157*12927SRod.Evans@Sun.COM 
158*12927SRod.Evans@Sun.COM 		(void) printf("stepping %d\n", (int)$2);
159*12927SRod.Evans@Sun.COM 		sf = FLG_SN_VERBOSE;
160*12927SRod.Evans@Sun.COM 		if (proch.pp_flags & FLG_PP_PLTSKIP)
161*12927SRod.Evans@Sun.COM 			sf |= FLG_SN_PLTSKIP;
162*12927SRod.Evans@Sun.COM 
163*12927SRod.Evans@Sun.COM 		(void) step_n(&proch, $2, sf);
164*12927SRod.Evans@Sun.COM 		rdb_prompt();
165*12927SRod.Evans@Sun.COM 	}
166*12927SRod.Evans@Sun.COM 	| STEP NUMBER SYMBOL NEWLINE
167*12927SRod.Evans@Sun.COM 	{
168*12927SRod.Evans@Sun.COM 		sn_flags_e	sf;
169*12927SRod.Evans@Sun.COM 
170*12927SRod.Evans@Sun.COM 		sf = FLG_SN_VERBOSE;
171*12927SRod.Evans@Sun.COM 		if (proch.pp_flags & FLG_PP_PLTSKIP)
172*12927SRod.Evans@Sun.COM 			sf |= FLG_SN_PLTSKIP;
173*12927SRod.Evans@Sun.COM 
174*12927SRod.Evans@Sun.COM 		if (strcmp("silent", $3) == 0)
175*12927SRod.Evans@Sun.COM 			(void) step_n(&proch, $2, sf);
176*12927SRod.Evans@Sun.COM 		else
177*12927SRod.Evans@Sun.COM 			(void) printf("error: step <count> [silent]\n");
178*12927SRod.Evans@Sun.COM 
179*12927SRod.Evans@Sun.COM 		free($3);
180*12927SRod.Evans@Sun.COM 		rdb_prompt();
181*12927SRod.Evans@Sun.COM 	}
182*12927SRod.Evans@Sun.COM 	| HELP NEWLINE
183*12927SRod.Evans@Sun.COM 	{
184*12927SRod.Evans@Sun.COM 		rdb_help(0);
185*12927SRod.Evans@Sun.COM 		rdb_prompt();
186*12927SRod.Evans@Sun.COM 	}
187*12927SRod.Evans@Sun.COM 	| HELP SYMBOL NEWLINE
188*12927SRod.Evans@Sun.COM 	{
189*12927SRod.Evans@Sun.COM 		rdb_help($2);
190*12927SRod.Evans@Sun.COM 		free($2);
191*12927SRod.Evans@Sun.COM 		rdb_prompt();
192*12927SRod.Evans@Sun.COM 	}
193*12927SRod.Evans@Sun.COM 	| OBJPAD NUMBER NEWLINE
194*12927SRod.Evans@Sun.COM 	{
195*12927SRod.Evans@Sun.COM 		(void) printf("setting object padding to: %#lx\n", $2);
196*12927SRod.Evans@Sun.COM 		(void) set_objpad(&proch, $2);
197*12927SRod.Evans@Sun.COM 		rdb_prompt();
198*12927SRod.Evans@Sun.COM 	}
199*12927SRod.Evans@Sun.COM 	| PLTSKIP NEWLINE
200*12927SRod.Evans@Sun.COM 	{
201*12927SRod.Evans@Sun.COM 		if (proch.pp_flags & FLG_PP_PLTSKIP) {
202*12927SRod.Evans@Sun.COM 			proch.pp_flags &= ~ FLG_PP_PLTSKIP;
203*12927SRod.Evans@Sun.COM 			(void) printf("plt skipping disabled\n");
204*12927SRod.Evans@Sun.COM 		} else {
205*12927SRod.Evans@Sun.COM 			proch.pp_flags |= FLG_PP_PLTSKIP;
206*12927SRod.Evans@Sun.COM 			(void) printf("plt skipping enabled\n");
207*12927SRod.Evans@Sun.COM 		}
208*12927SRod.Evans@Sun.COM 
209*12927SRod.Evans@Sun.COM 		rdb_prompt();
210*12927SRod.Evans@Sun.COM 	}
211*12927SRod.Evans@Sun.COM 	| PRINT VARSTRING NEWLINE
212*12927SRod.Evans@Sun.COM 	{
213*12927SRod.Evans@Sun.COM 		print_varstring(&proch, $2);
214*12927SRod.Evans@Sun.COM 		free($2);
215*12927SRod.Evans@Sun.COM 		rdb_prompt();
216*12927SRod.Evans@Sun.COM 	}
217*12927SRod.Evans@Sun.COM 	| PRINT address NEWLINE
218*12927SRod.Evans@Sun.COM 	{
219*12927SRod.Evans@Sun.COM 		print_mem(&proch, $2, 4, "X");
220*12927SRod.Evans@Sun.COM 		rdb_prompt();
221*12927SRod.Evans@Sun.COM 	}
222*12927SRod.Evans@Sun.COM 	| PRINT address NUMBER NEWLINE
223*12927SRod.Evans@Sun.COM 	{
224*12927SRod.Evans@Sun.COM 		print_mem(&proch, $2, (int)$3, "X");
225*12927SRod.Evans@Sun.COM 		rdb_prompt();
226*12927SRod.Evans@Sun.COM 	}
227*12927SRod.Evans@Sun.COM 	| PRINT address NUMBER SYMBOL NEWLINE
228*12927SRod.Evans@Sun.COM 	{
229*12927SRod.Evans@Sun.COM 		print_mem(&proch, $2, (int)$3, $4);
230*12927SRod.Evans@Sun.COM 		rdb_prompt();
231*12927SRod.Evans@Sun.COM 	}
232*12927SRod.Evans@Sun.COM 	| VALUE address NEWLINE
233*12927SRod.Evans@Sun.COM 	{
234*12927SRod.Evans@Sun.COM 		(void) printf("value: %#lx\n", (unsigned long)$2);
235*12927SRod.Evans@Sun.COM 		rdb_prompt();
236*12927SRod.Evans@Sun.COM 	}
237*12927SRod.Evans@Sun.COM 	| WHERE NEWLINE
238*12927SRod.Evans@Sun.COM 	{
239*12927SRod.Evans@Sun.COM 		(void) printf("printing stack trace\n");
240*12927SRod.Evans@Sun.COM 		CallStack(&proch);
241*12927SRod.Evans@Sun.COM 		rdb_prompt();
242*12927SRod.Evans@Sun.COM 	}
243*12927SRod.Evans@Sun.COM 	| error NEWLINE
244*12927SRod.Evans@Sun.COM 	{
245*12927SRod.Evans@Sun.COM 		yyerrok;
246*12927SRod.Evans@Sun.COM 		rdb_prompt();
247*12927SRod.Evans@Sun.COM 	}
248*12927SRod.Evans@Sun.COM 	| NEWLINE
249*12927SRod.Evans@Sun.COM 	{
250*12927SRod.Evans@Sun.COM 		disasm(&proch, 1);
251*12927SRod.Evans@Sun.COM 		rdb_prompt();
252*12927SRod.Evans@Sun.COM 	}
253*12927SRod.Evans@Sun.COM 	;
254*12927SRod.Evans@Sun.COM 
255*12927SRod.Evans@Sun.COM address: address PLUS address
256*12927SRod.Evans@Sun.COM 	{
257*12927SRod.Evans@Sun.COM 		$$ = $1 + $3;
258*12927SRod.Evans@Sun.COM 	}
259*12927SRod.Evans@Sun.COM 	| SYMBOL
260*12927SRod.Evans@Sun.COM 	{
261*12927SRod.Evans@Sun.COM 		GElf_Sym	sym;
262*12927SRod.Evans@Sun.COM 		if (str_to_sym(&proch, $1, &sym) == RET_OK)
263*12927SRod.Evans@Sun.COM 			$$ = (ulong_t)sym.st_value;
264*12927SRod.Evans@Sun.COM 		else {
265*12927SRod.Evans@Sun.COM 			(void) printf("unknown symbol: %s\n", $1);
266*12927SRod.Evans@Sun.COM 			$$ = 0;
267*12927SRod.Evans@Sun.COM 		}
268*12927SRod.Evans@Sun.COM 		free($1);
269*12927SRod.Evans@Sun.COM 	}
270*12927SRod.Evans@Sun.COM 	| NUMBER
271*12927SRod.Evans@Sun.COM 	{
272*12927SRod.Evans@Sun.COM 		$$ = $1;
273*12927SRod.Evans@Sun.COM 	}
274*12927SRod.Evans@Sun.COM 	;
275*12927SRod.Evans@Sun.COM %%
276*12927SRod.Evans@Sun.COM 
277*12927SRod.Evans@Sun.COM void
278*12927SRod.Evans@Sun.COM rdb_prompt()
279*12927SRod.Evans@Sun.COM {
280*12927SRod.Evans@Sun.COM 	if (proch.pp_flags & FLG_PP_PROMPT) {
281*12927SRod.Evans@Sun.COM 		(void) fputs("<rdb> ", stdout);
282*12927SRod.Evans@Sun.COM 		(void) fflush(stdout);
283*12927SRod.Evans@Sun.COM 	}
284*12927SRod.Evans@Sun.COM }
285