]> Git Repo - binutils.git/blame - gdb/ch-lang.c
* Makefile.in (VERSION): Bump to 4.7.4.
[binutils.git] / gdb / ch-lang.c
CommitLineData
22e39759
FF
1/* Chill language support routines for GDB, the GNU debugger.
2 Copyright 1992 Free Software Foundation, Inc.
3
4This file is part of GDB.
5
6This program is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with this program; if not, write to the Free Software
18Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20#include "defs.h"
21#include "symtab.h"
22#include "gdbtypes.h"
23#include "expression.h"
24#include "parser-defs.h"
25#include "language.h"
26#include "ch-lang.h"
27
28static void
29chill_printchar (c, stream)
30 register int c;
31 FILE *stream;
32{
33 c &= 0xFF; /* Avoid sign bit follies */
34
35 if (PRINT_LITERAL_FORM (c))
36 {
37 fprintf_filtered (stream, "'%c'", c);
38 }
39 else
40 {
41 fprintf_filtered (stream, "C'%.2x'", (unsigned int) c);
42 }
43}
44
45/* Print the character string STRING, printing at most LENGTH characters.
46 Printing stops early if the number hits print_max; repeat counts
47 are printed as appropriate. Print ellipses at the end if we
48 had to stop before printing LENGTH characters, or if FORCE_ELLIPSES.
49 Note that gdb maintains the length of strings without counting the
50 terminating null byte, while chill strings are typically written with
51 an explicit null byte. So we always assume an implied null byte
52 until gdb is able to maintain non-null terminated strings as well
53 as null terminated strings (FIXME).
54 */
55
56static void
57chill_printstr (stream, string, length, force_ellipses)
58 FILE *stream;
59 char *string;
60 unsigned int length;
61 int force_ellipses;
62{
63 register unsigned int i;
64 unsigned int things_printed = 0;
65 int in_literal_form = 0;
66 int in_control_form = 0;
67 int need_slashslash = 0;
68 unsigned int c;
69 extern int repeat_count_threshold;
70 extern int print_max;
71
72 if (length == 0)
73 {
74 chill_printchar ('\0', stream);
75 return;
76 }
77
78 for (i = 0; i < length && things_printed < print_max; ++i)
79 {
80 /* Position of the character we are examining
81 to see whether it is repeated. */
82 unsigned int rep1;
83 /* Number of repetitions we have detected so far. */
84 unsigned int reps;
85
86 QUIT;
87
88 if (need_slashslash)
89 {
90 fputs_filtered ("//", stream);
91 need_slashslash = 0;
92 }
93
94 rep1 = i + 1;
95 reps = 1;
96 while (rep1 < length && string[rep1] == string[i])
97 {
98 ++rep1;
99 ++reps;
100 }
101
102 c = string[i];
103 if (reps > repeat_count_threshold)
104 {
105 if (in_control_form || in_literal_form)
106 {
107 fputs_filtered ("'//", stream);
108 in_control_form = in_literal_form = 0;
109 }
110 chill_printchar (c, stream);
111 fprintf_filtered (stream, "<repeats %u times>", reps);
112 i = rep1 - 1;
113 things_printed += repeat_count_threshold;
114 need_slashslash = 1;
115 }
116 else
117 {
118 if (PRINT_LITERAL_FORM (c))
119 {
120 if (!in_literal_form)
121 {
122 if (in_control_form)
123 {
124 fputs_filtered ("'//", stream);
125 in_control_form = 0;
126 }
127 fputs_filtered ("'", stream);
128 in_literal_form = 1;
129 }
130 fprintf_filtered (stream, "%c", c);
131 }
132 else
133 {
134 if (!in_control_form)
135 {
136 if (in_literal_form)
137 {
138 fputs_filtered ("'//", stream);
139 in_literal_form = 0;
140 }
141 fputs_filtered ("c'", stream);
142 in_control_form = 1;
143 }
144 fprintf_filtered (stream, "%.2x", c);
145 }
146 ++things_printed;
147 }
148 }
149
150 /* Terminate the quotes if necessary. */
151 if (in_literal_form || in_control_form)
152 {
153 fputs_filtered ("'", stream);
154 }
155 if (force_ellipses || (i < length))
156 {
157 fputs_filtered ("...", stream);
158 }
159}
160
161static struct type *
162chill_create_fundamental_type (objfile, typeid)
163 struct objfile *objfile;
164 int typeid;
165{
166 register struct type *type = NULL;
22e39759
FF
167
168 switch (typeid)
169 {
170 default:
171 /* FIXME: For now, if we are asked to produce a type not in this
172 language, create the equivalent of a C integer type with the
173 name "<?type?>". When all the dust settles from the type
174 reconstruction work, this should probably become an error. */
a8a69e63 175 type = init_type (TYPE_CODE_INT, 2, 0, "<?type?>", objfile);
22e39759
FF
176 warning ("internal error: no chill fundamental type %d", typeid);
177 break;
a8a69e63
FF
178 case FT_VOID:
179 /* FIXME: Currently the GNU Chill compiler emits some DWARF entries for
180 typedefs, unrelated to anything directly in the code being compiled,
181 that have some FT_VOID types. Just fake it for now. */
182 type = init_type (TYPE_CODE_VOID, 0, 0, "<?VOID?>", objfile);
183 break;
22e39759
FF
184 case FT_BOOLEAN:
185 type = init_type (TYPE_CODE_BOOL, 1, TYPE_FLAG_UNSIGNED, "BOOL", objfile);
186 break;
187 case FT_CHAR:
a8a69e63 188 type = init_type (TYPE_CODE_CHAR, 1, TYPE_FLAG_UNSIGNED, "CHAR", objfile);
22e39759
FF
189 break;
190 case FT_SIGNED_CHAR:
191 type = init_type (TYPE_CODE_INT, 1, TYPE_FLAG_SIGNED, "BYTE", objfile);
192 break;
193 case FT_UNSIGNED_CHAR:
194 type = init_type (TYPE_CODE_INT, 1, TYPE_FLAG_UNSIGNED, "UBYTE", objfile);
195 break;
196 case FT_SHORT: /* Chill ints are 2 bytes */
197 type = init_type (TYPE_CODE_INT, 2, TYPE_FLAG_SIGNED, "INT", objfile);
198 break;
199 case FT_UNSIGNED_SHORT: /* Chill ints are 2 bytes */
200 type = init_type (TYPE_CODE_INT, 2, TYPE_FLAG_UNSIGNED, "UINT", objfile);
201 break;
202 case FT_INTEGER: /* Chill longs are 4 bytes */
203 type = init_type (TYPE_CODE_INT, 4, TYPE_FLAG_SIGNED, "LONG", objfile);
204 break;
205 case FT_UNSIGNED_INTEGER: /* Chill longs are 4 bytes */
206 type = init_type (TYPE_CODE_INT, 4, TYPE_FLAG_UNSIGNED, "ULONG", objfile);
207 break;
208 case FT_FLOAT:
209 type = init_type (TYPE_CODE_FLT, 4, 0, "REAL", objfile);
210 break;
211 case FT_DBL_PREC_FLOAT:
212 type = init_type (TYPE_CODE_FLT, 8, 0, "LONG_REAL", objfile);
213 break;
214 }
215 return (type);
216}
217
218\f
219/* Table of operators and their precedences for printing expressions. */
220
a8a69e63 221static const struct op_print chill_op_print_tab[] = {
22e39759
FF
222 {"AND", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
223 {"OR", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
224 {"NOT", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
225 {"MOD", BINOP_REM, PREC_MUL, 0},
226 {":=", BINOP_ASSIGN, PREC_ASSIGN, 1},
227 {"=", BINOP_EQUAL, PREC_EQUAL, 0},
228 {"/=", BINOP_NOTEQUAL, PREC_EQUAL, 0},
229 {"<=", BINOP_LEQ, PREC_ORDER, 0},
230 {">=", BINOP_GEQ, PREC_ORDER, 0},
231 {">", BINOP_GTR, PREC_ORDER, 0},
232 {"<", BINOP_LESS, PREC_ORDER, 0},
233 {"+", BINOP_ADD, PREC_ADD, 0},
234 {"-", BINOP_SUB, PREC_ADD, 0},
235 {"*", BINOP_MUL, PREC_MUL, 0},
236 {"/", BINOP_DIV, PREC_MUL, 0},
237 {"-", UNOP_NEG, PREC_PREFIX, 0},
238 {NULL, 0, 0, 0}
239};
240
241\f
242/* The built-in types of Chill. */
243
244struct type *builtin_type_chill_bool;
245struct type *builtin_type_chill_char;
246struct type *builtin_type_chill_long;
247struct type *builtin_type_chill_ulong;
248struct type *builtin_type_chill_real;
249
250struct type ** const (chill_builtin_types[]) =
251{
252 &builtin_type_chill_bool,
253 &builtin_type_chill_char,
254 &builtin_type_chill_long,
255 &builtin_type_chill_ulong,
256 &builtin_type_chill_real,
257 0
258};
259
260const struct language_defn chill_language_defn = {
261 "chill",
262 language_chill,
263 chill_builtin_types,
264 range_check_on,
265 type_check_on,
266 chill_parse, /* parser */
267 chill_error, /* parser error function */
268 chill_printchar, /* print a character constant */
269 chill_printstr, /* function to print a string constant */
270 chill_create_fundamental_type,/* Create fundamental type in this language */
a8a69e63
FF
271 chill_print_type, /* Print a type using appropriate syntax */
272 chill_val_print, /* Print a value using appropriate syntax */
22e39759
FF
273 &BUILTIN_TYPE_LONGEST, /* longest signed integral type */
274 &BUILTIN_TYPE_UNSIGNED_LONGEST,/* longest unsigned integral type */
275 &builtin_type_chill_real, /* longest floating point type */
276 {"", "B'", "", ""}, /* Binary format info */
277 {"O'%o", "O'", "o", ""}, /* Octal format info */
278 {"D'%d", "D'", "d", ""}, /* Decimal format info */
279 {"H'%x", "H'", "x", ""}, /* Hex format info */
280 chill_op_print_tab, /* expression operators for printing */
281 LANG_MAGIC
282};
283
284/* Initialization for Chill */
285
286void
d62e7a20 287_initialize_chill_language ()
22e39759
FF
288{
289 builtin_type_chill_bool =
290 init_type (TYPE_CODE_BOOL, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
291 TYPE_FLAG_UNSIGNED,
292 "BOOL", (struct objfile *) NULL);
293 builtin_type_chill_char =
294 init_type (TYPE_CODE_CHAR, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
295 TYPE_FLAG_UNSIGNED,
296 "CHAR", (struct objfile *) NULL);
297 builtin_type_chill_long =
298 init_type (TYPE_CODE_INT, TARGET_LONG_BIT / TARGET_CHAR_BIT,
299 0,
300 "LONG", (struct objfile *) NULL);
301 builtin_type_chill_ulong =
302 init_type (TYPE_CODE_INT, TARGET_LONG_BIT / TARGET_CHAR_BIT,
303 TYPE_FLAG_UNSIGNED,
304 "ULONG", (struct objfile *) NULL);
305 builtin_type_chill_real =
306 init_type (TYPE_CODE_FLT, TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
307 0,
308 "LONG_REAL", (struct objfile *) NULL);
309
310 add_language (&chill_language_defn);
311}
This page took 0.055892 seconds and 4 git commands to generate.