2000-12-14 Kazu Hirata <kazu@hxi.com>
[deliverable/binutils-gdb.git] / gdb / f-lang.c
CommitLineData
c906108c 1/* Fortran language support routines for GDB, the GNU debugger.
d9fcf2fb 2 Copyright 1993, 1994, 1996, 2000 Free Software Foundation, Inc.
c906108c
SS
3 Contributed by Motorola. Adapted from the C parser by Farooq Butt
4 (fmbutt@engage.sps.mot.com).
5
c5aa993b 6 This file is part of GDB.
c906108c 7
c5aa993b
JM
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
c906108c 12
c5aa993b
JM
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
c906108c 17
c5aa993b
JM
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
c906108c
SS
22
23#include "defs.h"
24#include "gdb_string.h"
25#include "symtab.h"
26#include "gdbtypes.h"
27#include "expression.h"
28#include "parser-defs.h"
29#include "language.h"
30#include "f-lang.h"
745b8ca0 31#include "valprint.h"
c906108c
SS
32
33/* The built-in types of F77. FIXME: integer*4 is missing, plain
34 logical is missing (builtin_type_logical is logical*4). */
35
36struct type *builtin_type_f_character;
37struct type *builtin_type_f_logical;
38struct type *builtin_type_f_logical_s1;
39struct type *builtin_type_f_logical_s2;
c5aa993b 40struct type *builtin_type_f_integer;
c906108c
SS
41struct type *builtin_type_f_integer_s2;
42struct type *builtin_type_f_real;
43struct type *builtin_type_f_real_s8;
44struct type *builtin_type_f_real_s16;
45struct type *builtin_type_f_complex_s8;
46struct type *builtin_type_f_complex_s16;
47struct type *builtin_type_f_complex_s32;
48struct type *builtin_type_f_void;
49
50/* Following is dubious stuff that had been in the xcoff reader. */
51
52struct saved_fcn
c5aa993b
JM
53 {
54 long line_offset; /* Line offset for function */
55 struct saved_fcn *next;
56 };
c906108c
SS
57
58
c5aa993b
JM
59struct saved_bf_symnum
60 {
61 long symnum_fcn; /* Symnum of function (i.e. .function directive) */
62 long symnum_bf; /* Symnum of .bf for this function */
63 struct saved_bf_symnum *next;
64 };
c906108c 65
c5aa993b
JM
66typedef struct saved_fcn SAVED_FUNCTION, *SAVED_FUNCTION_PTR;
67typedef struct saved_bf_symnum SAVED_BF, *SAVED_BF_PTR;
c906108c
SS
68
69/* Local functions */
70
a14ed312 71extern void _initialize_f_language (void);
c906108c 72#if 0
a14ed312
KB
73static void clear_function_list (void);
74static long get_bf_for_fcn (long);
75static void clear_bf_list (void);
76static void patch_all_commons_by_name (char *, CORE_ADDR, int);
77static SAVED_F77_COMMON_PTR find_first_common_named (char *);
78static void add_common_entry (struct symbol *);
79static void add_common_block (char *, CORE_ADDR, int, char *);
80static SAVED_FUNCTION *allocate_saved_function_node (void);
81static SAVED_BF_PTR allocate_saved_bf_node (void);
82static COMMON_ENTRY_PTR allocate_common_entry_node (void);
83static SAVED_F77_COMMON_PTR allocate_saved_f77_common_node (void);
84static void patch_common_entries (SAVED_F77_COMMON_PTR, CORE_ADDR, int);
c906108c
SS
85#endif
86
a14ed312 87static struct type *f_create_fundamental_type (struct objfile *, int);
d9fcf2fb
JM
88static void f_printstr (struct ui_file * stream, char *string,
89 unsigned int length, int width,
90 int force_ellipses);
91static void f_printchar (int c, struct ui_file * stream);
92static void f_emit_char (int c, struct ui_file * stream, int quoter);
c906108c
SS
93
94/* Print the character C on STREAM as part of the contents of a literal
95 string whose delimiter is QUOTER. Note that that format for printing
96 characters and strings is language specific.
97 FIXME: This is a copy of the same function from c-exp.y. It should
98 be replaced with a true F77 version. */
99
100static void
fba45db2 101f_emit_char (register int c, struct ui_file *stream, int quoter)
c906108c
SS
102{
103 c &= 0xFF; /* Avoid sign bit follies */
c5aa993b 104
c906108c
SS
105 if (PRINT_LITERAL_FORM (c))
106 {
107 if (c == '\\' || c == quoter)
108 fputs_filtered ("\\", stream);
109 fprintf_filtered (stream, "%c", c);
110 }
111 else
112 {
113 switch (c)
114 {
115 case '\n':
116 fputs_filtered ("\\n", stream);
117 break;
118 case '\b':
119 fputs_filtered ("\\b", stream);
120 break;
121 case '\t':
122 fputs_filtered ("\\t", stream);
123 break;
124 case '\f':
125 fputs_filtered ("\\f", stream);
126 break;
127 case '\r':
128 fputs_filtered ("\\r", stream);
129 break;
130 case '\033':
131 fputs_filtered ("\\e", stream);
132 break;
133 case '\007':
134 fputs_filtered ("\\a", stream);
135 break;
136 default:
137 fprintf_filtered (stream, "\\%.3o", (unsigned int) c);
138 break;
139 }
140 }
141}
142
143/* FIXME: This is a copy of the same function from c-exp.y. It should
144 be replaced with a true F77version. */
145
146static void
fba45db2 147f_printchar (int c, struct ui_file *stream)
c906108c
SS
148{
149 fputs_filtered ("'", stream);
150 LA_EMIT_CHAR (c, stream, '\'');
151 fputs_filtered ("'", stream);
152}
153
154/* Print the character string STRING, printing at most LENGTH characters.
155 Printing stops early if the number hits print_max; repeat counts
156 are printed as appropriate. Print ellipses at the end if we
157 had to stop before printing LENGTH characters, or if FORCE_ELLIPSES.
158 FIXME: This is a copy of the same function from c-exp.y. It should
159 be replaced with a true F77 version. */
160
161static void
fba45db2
KB
162f_printstr (struct ui_file *stream, char *string, unsigned int length,
163 int width, int force_ellipses)
c906108c
SS
164{
165 register unsigned int i;
166 unsigned int things_printed = 0;
167 int in_quotes = 0;
168 int need_comma = 0;
169 extern int inspect_it;
c5aa993b 170
c906108c
SS
171 if (length == 0)
172 {
173 fputs_filtered ("''", gdb_stdout);
174 return;
175 }
c5aa993b 176
c906108c
SS
177 for (i = 0; i < length && things_printed < print_max; ++i)
178 {
179 /* Position of the character we are examining
c5aa993b 180 to see whether it is repeated. */
c906108c
SS
181 unsigned int rep1;
182 /* Number of repetitions we have detected so far. */
183 unsigned int reps;
c5aa993b 184
c906108c 185 QUIT;
c5aa993b 186
c906108c
SS
187 if (need_comma)
188 {
189 fputs_filtered (", ", stream);
190 need_comma = 0;
191 }
c5aa993b 192
c906108c
SS
193 rep1 = i + 1;
194 reps = 1;
195 while (rep1 < length && string[rep1] == string[i])
196 {
197 ++rep1;
198 ++reps;
199 }
c5aa993b 200
c906108c
SS
201 if (reps > repeat_count_threshold)
202 {
203 if (in_quotes)
204 {
205 if (inspect_it)
206 fputs_filtered ("\\', ", stream);
207 else
208 fputs_filtered ("', ", stream);
209 in_quotes = 0;
210 }
211 f_printchar (string[i], stream);
212 fprintf_filtered (stream, " <repeats %u times>", reps);
213 i = rep1 - 1;
214 things_printed += repeat_count_threshold;
215 need_comma = 1;
216 }
217 else
218 {
219 if (!in_quotes)
220 {
221 if (inspect_it)
222 fputs_filtered ("\\'", stream);
223 else
224 fputs_filtered ("'", stream);
225 in_quotes = 1;
226 }
227 LA_EMIT_CHAR (string[i], stream, '"');
228 ++things_printed;
229 }
230 }
c5aa993b 231
c906108c
SS
232 /* Terminate the quotes if necessary. */
233 if (in_quotes)
234 {
235 if (inspect_it)
236 fputs_filtered ("\\'", stream);
237 else
238 fputs_filtered ("'", stream);
239 }
c5aa993b 240
c906108c
SS
241 if (force_ellipses || i < length)
242 fputs_filtered ("...", stream);
243}
244
245/* FIXME: This is a copy of c_create_fundamental_type(), before
246 all the non-C types were stripped from it. Needs to be fixed
247 by an experienced F77 programmer. */
248
249static struct type *
fba45db2 250f_create_fundamental_type (struct objfile *objfile, int typeid)
c906108c
SS
251{
252 register struct type *type = NULL;
c5aa993b 253
c906108c
SS
254 switch (typeid)
255 {
256 case FT_VOID:
257 type = init_type (TYPE_CODE_VOID,
258 TARGET_CHAR_BIT / TARGET_CHAR_BIT,
259 0, "VOID", objfile);
260 break;
261 case FT_BOOLEAN:
262 type = init_type (TYPE_CODE_BOOL,
263 TARGET_CHAR_BIT / TARGET_CHAR_BIT,
264 TYPE_FLAG_UNSIGNED, "boolean", objfile);
265 break;
266 case FT_STRING:
267 type = init_type (TYPE_CODE_STRING,
268 TARGET_CHAR_BIT / TARGET_CHAR_BIT,
269 0, "string", objfile);
270 break;
271 case FT_CHAR:
272 type = init_type (TYPE_CODE_INT,
273 TARGET_CHAR_BIT / TARGET_CHAR_BIT,
274 0, "character", objfile);
275 break;
276 case FT_SIGNED_CHAR:
277 type = init_type (TYPE_CODE_INT,
278 TARGET_CHAR_BIT / TARGET_CHAR_BIT,
279 0, "integer*1", objfile);
280 break;
281 case FT_UNSIGNED_CHAR:
282 type = init_type (TYPE_CODE_BOOL,
283 TARGET_CHAR_BIT / TARGET_CHAR_BIT,
284 TYPE_FLAG_UNSIGNED, "logical*1", objfile);
285 break;
286 case FT_SHORT:
287 type = init_type (TYPE_CODE_INT,
288 TARGET_SHORT_BIT / TARGET_CHAR_BIT,
289 0, "integer*2", objfile);
290 break;
291 case FT_SIGNED_SHORT:
292 type = init_type (TYPE_CODE_INT,
293 TARGET_SHORT_BIT / TARGET_CHAR_BIT,
294 0, "short", objfile); /* FIXME-fnf */
295 break;
296 case FT_UNSIGNED_SHORT:
297 type = init_type (TYPE_CODE_BOOL,
298 TARGET_SHORT_BIT / TARGET_CHAR_BIT,
299 TYPE_FLAG_UNSIGNED, "logical*2", objfile);
300 break;
301 case FT_INTEGER:
302 type = init_type (TYPE_CODE_INT,
303 TARGET_INT_BIT / TARGET_CHAR_BIT,
304 0, "integer*4", objfile);
305 break;
306 case FT_SIGNED_INTEGER:
307 type = init_type (TYPE_CODE_INT,
308 TARGET_INT_BIT / TARGET_CHAR_BIT,
c5aa993b 309 0, "integer", objfile); /* FIXME -fnf */
c906108c
SS
310 break;
311 case FT_UNSIGNED_INTEGER:
c5aa993b 312 type = init_type (TYPE_CODE_BOOL,
c906108c
SS
313 TARGET_INT_BIT / TARGET_CHAR_BIT,
314 TYPE_FLAG_UNSIGNED, "logical*4", objfile);
315 break;
316 case FT_FIXED_DECIMAL:
317 type = init_type (TYPE_CODE_INT,
318 TARGET_INT_BIT / TARGET_CHAR_BIT,
319 0, "fixed decimal", objfile);
320 break;
321 case FT_LONG:
322 type = init_type (TYPE_CODE_INT,
323 TARGET_LONG_BIT / TARGET_CHAR_BIT,
324 0, "long", objfile);
325 break;
326 case FT_SIGNED_LONG:
327 type = init_type (TYPE_CODE_INT,
328 TARGET_LONG_BIT / TARGET_CHAR_BIT,
c5aa993b 329 0, "long", objfile); /* FIXME -fnf */
c906108c
SS
330 break;
331 case FT_UNSIGNED_LONG:
332 type = init_type (TYPE_CODE_INT,
333 TARGET_LONG_BIT / TARGET_CHAR_BIT,
334 TYPE_FLAG_UNSIGNED, "unsigned long", objfile);
335 break;
336 case FT_LONG_LONG:
337 type = init_type (TYPE_CODE_INT,
338 TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
339 0, "long long", objfile);
340 break;
341 case FT_SIGNED_LONG_LONG:
342 type = init_type (TYPE_CODE_INT,
343 TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
344 0, "signed long long", objfile);
345 break;
346 case FT_UNSIGNED_LONG_LONG:
347 type = init_type (TYPE_CODE_INT,
348 TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
349 TYPE_FLAG_UNSIGNED, "unsigned long long", objfile);
350 break;
351 case FT_FLOAT:
352 type = init_type (TYPE_CODE_FLT,
353 TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
354 0, "real", objfile);
355 break;
356 case FT_DBL_PREC_FLOAT:
357 type = init_type (TYPE_CODE_FLT,
358 TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
359 0, "real*8", objfile);
360 break;
361 case FT_FLOAT_DECIMAL:
362 type = init_type (TYPE_CODE_FLT,
363 TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
364 0, "floating decimal", objfile);
365 break;
366 case FT_EXT_PREC_FLOAT:
367 type = init_type (TYPE_CODE_FLT,
368 TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
369 0, "real*16", objfile);
370 break;
371 case FT_COMPLEX:
372 type = init_type (TYPE_CODE_COMPLEX,
373 2 * TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
374 0, "complex*8", objfile);
375 TYPE_TARGET_TYPE (type) = builtin_type_f_real;
376 break;
377 case FT_DBL_PREC_COMPLEX:
378 type = init_type (TYPE_CODE_COMPLEX,
379 2 * TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
380 0, "complex*16", objfile);
381 TYPE_TARGET_TYPE (type) = builtin_type_f_real_s8;
382 break;
383 case FT_EXT_PREC_COMPLEX:
384 type = init_type (TYPE_CODE_COMPLEX,
385 2 * TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
386 0, "complex*32", objfile);
387 TYPE_TARGET_TYPE (type) = builtin_type_f_real_s16;
388 break;
389 default:
390 /* FIXME: For now, if we are asked to produce a type not in this
c5aa993b
JM
391 language, create the equivalent of a C integer type with the
392 name "<?type?>". When all the dust settles from the type
393 reconstruction work, this should probably become an error. */
c906108c
SS
394 type = init_type (TYPE_CODE_INT,
395 TARGET_INT_BIT / TARGET_CHAR_BIT,
396 0, "<?type?>", objfile);
397 warning ("internal error: no F77 fundamental type %d", typeid);
398 break;
399 }
400 return (type);
401}
c906108c 402\f
c5aa993b 403
c906108c
SS
404/* Table of operators and their precedences for printing expressions. */
405
c5aa993b
JM
406static const struct op_print f_op_print_tab[] =
407{
408 {"+", BINOP_ADD, PREC_ADD, 0},
409 {"+", UNOP_PLUS, PREC_PREFIX, 0},
410 {"-", BINOP_SUB, PREC_ADD, 0},
411 {"-", UNOP_NEG, PREC_PREFIX, 0},
412 {"*", BINOP_MUL, PREC_MUL, 0},
413 {"/", BINOP_DIV, PREC_MUL, 0},
414 {"DIV", BINOP_INTDIV, PREC_MUL, 0},
415 {"MOD", BINOP_REM, PREC_MUL, 0},
416 {"=", BINOP_ASSIGN, PREC_ASSIGN, 1},
417 {".OR.", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
418 {".AND.", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
419 {".NOT.", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
420 {".EQ.", BINOP_EQUAL, PREC_EQUAL, 0},
421 {".NE.", BINOP_NOTEQUAL, PREC_EQUAL, 0},
422 {".LE.", BINOP_LEQ, PREC_ORDER, 0},
423 {".GE.", BINOP_GEQ, PREC_ORDER, 0},
424 {".GT.", BINOP_GTR, PREC_ORDER, 0},
425 {".LT.", BINOP_LESS, PREC_ORDER, 0},
426 {"**", UNOP_IND, PREC_PREFIX, 0},
427 {"@", BINOP_REPEAT, PREC_REPEAT, 0},
428 {NULL, 0, 0, 0}
c906108c
SS
429};
430\f
c5aa993b 431struct type **CONST_PTR (f_builtin_types[]) =
c906108c
SS
432{
433 &builtin_type_f_character,
c5aa993b
JM
434 &builtin_type_f_logical,
435 &builtin_type_f_logical_s1,
436 &builtin_type_f_logical_s2,
437 &builtin_type_f_integer,
438 &builtin_type_f_integer_s2,
439 &builtin_type_f_real,
440 &builtin_type_f_real_s8,
441 &builtin_type_f_real_s16,
442 &builtin_type_f_complex_s8,
443 &builtin_type_f_complex_s16,
c906108c 444#if 0
c5aa993b 445 &builtin_type_f_complex_s32,
c906108c 446#endif
c5aa993b
JM
447 &builtin_type_f_void,
448 0
c906108c
SS
449};
450
451/* This is declared in c-lang.h but it is silly to import that file for what
452 is already just a hack. */
d9fcf2fb
JM
453extern int c_value_print (struct value *, struct ui_file *, int,
454 enum val_prettyprint);
c906108c 455
c5aa993b
JM
456const struct language_defn f_language_defn =
457{
c906108c
SS
458 "fortran",
459 language_fortran,
460 f_builtin_types,
461 range_check_on,
462 type_check_on,
63872f9d 463 case_sensitive_off,
c906108c
SS
464 f_parse, /* parser */
465 f_error, /* parser error function */
466 evaluate_subexp_standard,
467 f_printchar, /* Print character constant */
468 f_printstr, /* function to print string constant */
469 f_emit_char, /* Function to print a single character */
470 f_create_fundamental_type, /* Create fundamental type in this language */
c5aa993b 471 f_print_type, /* Print a type using appropriate syntax */
c906108c 472 f_val_print, /* Print a value using appropriate syntax */
c5aa993b
JM
473 c_value_print, /* FIXME */
474 {"", "", "", ""}, /* Binary format info */
475 {"0%o", "0", "o", ""}, /* Octal format info */
476 {"%d", "", "d", ""}, /* Decimal format info */
477 {"0x%x", "0x", "x", ""}, /* Hex format info */
c906108c
SS
478 f_op_print_tab, /* expression operators for printing */
479 0, /* arrays are first-class (not c-style) */
480 1, /* String lower bound */
c5aa993b 481 &builtin_type_f_character, /* Type of string elements */
c906108c 482 LANG_MAGIC
c5aa993b 483};
c906108c
SS
484
485void
fba45db2 486_initialize_f_language (void)
c906108c
SS
487{
488 builtin_type_f_void =
489 init_type (TYPE_CODE_VOID, 1,
490 0,
491 "VOID", (struct objfile *) NULL);
c5aa993b 492
c906108c
SS
493 builtin_type_f_character =
494 init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
495 0,
496 "character", (struct objfile *) NULL);
c5aa993b 497
c906108c
SS
498 builtin_type_f_logical_s1 =
499 init_type (TYPE_CODE_BOOL, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
500 TYPE_FLAG_UNSIGNED,
501 "logical*1", (struct objfile *) NULL);
c5aa993b 502
c906108c
SS
503 builtin_type_f_integer_s2 =
504 init_type (TYPE_CODE_INT, TARGET_SHORT_BIT / TARGET_CHAR_BIT,
505 0,
506 "integer*2", (struct objfile *) NULL);
c5aa993b 507
c906108c
SS
508 builtin_type_f_logical_s2 =
509 init_type (TYPE_CODE_BOOL, TARGET_SHORT_BIT / TARGET_CHAR_BIT,
510 TYPE_FLAG_UNSIGNED,
511 "logical*2", (struct objfile *) NULL);
c5aa993b 512
c906108c
SS
513 builtin_type_f_integer =
514 init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT,
515 0,
516 "integer", (struct objfile *) NULL);
c5aa993b 517
c906108c
SS
518 builtin_type_f_logical =
519 init_type (TYPE_CODE_BOOL, TARGET_INT_BIT / TARGET_CHAR_BIT,
520 TYPE_FLAG_UNSIGNED,
521 "logical*4", (struct objfile *) NULL);
c5aa993b 522
c906108c
SS
523 builtin_type_f_real =
524 init_type (TYPE_CODE_FLT, TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
525 0,
526 "real", (struct objfile *) NULL);
c5aa993b 527
c906108c
SS
528 builtin_type_f_real_s8 =
529 init_type (TYPE_CODE_FLT, TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
530 0,
531 "real*8", (struct objfile *) NULL);
c5aa993b 532
c906108c
SS
533 builtin_type_f_real_s16 =
534 init_type (TYPE_CODE_FLT, TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
535 0,
536 "real*16", (struct objfile *) NULL);
c5aa993b 537
c906108c
SS
538 builtin_type_f_complex_s8 =
539 init_type (TYPE_CODE_COMPLEX, 2 * TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
540 0,
541 "complex*8", (struct objfile *) NULL);
542 TYPE_TARGET_TYPE (builtin_type_f_complex_s8) = builtin_type_f_real;
c5aa993b 543
c906108c
SS
544 builtin_type_f_complex_s16 =
545 init_type (TYPE_CODE_COMPLEX, 2 * TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
546 0,
547 "complex*16", (struct objfile *) NULL);
548 TYPE_TARGET_TYPE (builtin_type_f_complex_s16) = builtin_type_f_real_s8;
c5aa993b 549
c906108c
SS
550 /* We have a new size == 4 double floats for the
551 complex*32 data type */
c5aa993b
JM
552
553 builtin_type_f_complex_s32 =
c906108c
SS
554 init_type (TYPE_CODE_COMPLEX, 2 * TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
555 0,
556 "complex*32", (struct objfile *) NULL);
557 TYPE_TARGET_TYPE (builtin_type_f_complex_s32) = builtin_type_f_real_s16;
558
559 builtin_type_string =
560 init_type (TYPE_CODE_STRING, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
561 0,
c5aa993b
JM
562 "character string", (struct objfile *) NULL);
563
c906108c
SS
564 add_language (&f_language_defn);
565}
566
567#if 0
568static SAVED_BF_PTR
fba45db2 569allocate_saved_bf_node (void)
c906108c
SS
570{
571 SAVED_BF_PTR new;
c5aa993b 572
c906108c 573 new = (SAVED_BF_PTR) xmalloc (sizeof (SAVED_BF));
c5aa993b 574 return (new);
c906108c
SS
575}
576
577static SAVED_FUNCTION *
fba45db2 578allocate_saved_function_node (void)
c906108c
SS
579{
580 SAVED_FUNCTION *new;
c5aa993b 581
c906108c 582 new = (SAVED_FUNCTION *) xmalloc (sizeof (SAVED_FUNCTION));
c5aa993b 583 return (new);
c906108c
SS
584}
585
c5aa993b 586static SAVED_F77_COMMON_PTR
fba45db2 587allocate_saved_f77_common_node (void)
c906108c
SS
588{
589 SAVED_F77_COMMON_PTR new;
c5aa993b 590
c906108c 591 new = (SAVED_F77_COMMON_PTR) xmalloc (sizeof (SAVED_F77_COMMON));
c5aa993b 592 return (new);
c906108c
SS
593}
594
c5aa993b 595static COMMON_ENTRY_PTR
fba45db2 596allocate_common_entry_node (void)
c906108c
SS
597{
598 COMMON_ENTRY_PTR new;
c5aa993b 599
c906108c 600 new = (COMMON_ENTRY_PTR) xmalloc (sizeof (COMMON_ENTRY));
c5aa993b 601 return (new);
c906108c
SS
602}
603#endif
604
c5aa993b
JM
605SAVED_F77_COMMON_PTR head_common_list = NULL; /* Ptr to 1st saved COMMON */
606SAVED_F77_COMMON_PTR tail_common_list = NULL; /* Ptr to last saved COMMON */
607SAVED_F77_COMMON_PTR current_common = NULL; /* Ptr to current COMMON */
c906108c
SS
608
609#if 0
c5aa993b
JM
610static SAVED_BF_PTR saved_bf_list = NULL; /* Ptr to (.bf,function)
611 list */
612static SAVED_BF_PTR saved_bf_list_end = NULL; /* Ptr to above list's end */
613static SAVED_BF_PTR current_head_bf_list = NULL; /* Current head of above list
614 */
c906108c 615
c5aa993b
JM
616static SAVED_BF_PTR tmp_bf_ptr; /* Generic temporary for use
617 in macros */
c906108c
SS
618
619/* The following function simply enters a given common block onto
620 the global common block chain */
621
622static void
fba45db2 623add_common_block (char *name, CORE_ADDR offset, int secnum, char *func_stab)
c906108c
SS
624{
625 SAVED_F77_COMMON_PTR tmp;
c5aa993b
JM
626 char *c, *local_copy_func_stab;
627
c906108c
SS
628 /* If the COMMON block we are trying to add has a blank
629 name (i.e. "#BLNK_COM") then we set it to __BLANK
630 because the darn "#" character makes GDB's input
c5aa993b
JM
631 parser have fits. */
632
633
634 if (STREQ (name, BLANK_COMMON_NAME_ORIGINAL) ||
635 STREQ (name, BLANK_COMMON_NAME_MF77))
c906108c 636 {
c5aa993b
JM
637
638 free (name);
639 name = alloca (strlen (BLANK_COMMON_NAME_LOCAL) + 1);
640 strcpy (name, BLANK_COMMON_NAME_LOCAL);
c906108c 641 }
c5aa993b
JM
642
643 tmp = allocate_saved_f77_common_node ();
644
645 local_copy_func_stab = xmalloc (strlen (func_stab) + 1);
646 strcpy (local_copy_func_stab, func_stab);
647
648 tmp->name = xmalloc (strlen (name) + 1);
649
c906108c 650 /* local_copy_func_stab is a stabstring, let us first extract the
c5aa993b
JM
651 function name from the stab by NULLing out the ':' character. */
652
653
654 c = NULL;
655 c = strchr (local_copy_func_stab, ':');
656
c906108c
SS
657 if (c)
658 *c = '\0';
659 else
c5aa993b
JM
660 error ("Malformed function STAB found in add_common_block()");
661
662
663 tmp->owning_function = xmalloc (strlen (local_copy_func_stab) + 1);
664
665 strcpy (tmp->owning_function, local_copy_func_stab);
666
667 strcpy (tmp->name, name);
668 tmp->offset = offset;
c906108c
SS
669 tmp->next = NULL;
670 tmp->entries = NULL;
c5aa993b
JM
671 tmp->secnum = secnum;
672
c906108c 673 current_common = tmp;
c5aa993b 674
c906108c
SS
675 if (head_common_list == NULL)
676 {
677 head_common_list = tail_common_list = tmp;
678 }
679 else
680 {
c5aa993b 681 tail_common_list->next = tmp;
c906108c
SS
682 tail_common_list = tmp;
683 }
684}
685#endif
686
687/* The following function simply enters a given common entry onto
c5aa993b 688 the "current_common" block that has been saved away. */
c906108c
SS
689
690#if 0
691static void
fba45db2 692add_common_entry (struct symbol *entry_sym_ptr)
c906108c
SS
693{
694 COMMON_ENTRY_PTR tmp;
c5aa993b
JM
695
696
697
c906108c
SS
698 /* The order of this list is important, since
699 we expect the entries to appear in decl.
c5aa993b
JM
700 order when we later issue "info common" calls */
701
702 tmp = allocate_common_entry_node ();
703
c906108c
SS
704 tmp->next = NULL;
705 tmp->symbol = entry_sym_ptr;
c5aa993b 706
c906108c 707 if (current_common == NULL)
c5aa993b
JM
708 error ("Attempt to add COMMON entry with no block open!");
709 else
c906108c
SS
710 {
711 if (current_common->entries == NULL)
712 {
713 current_common->entries = tmp;
c5aa993b 714 current_common->end_of_entries = tmp;
c906108c
SS
715 }
716 else
717 {
c5aa993b
JM
718 current_common->end_of_entries->next = tmp;
719 current_common->end_of_entries = tmp;
c906108c
SS
720 }
721 }
722}
723#endif
724
c5aa993b 725/* This routine finds the first encountred COMMON block named "name" */
c906108c
SS
726
727#if 0
728static SAVED_F77_COMMON_PTR
fba45db2 729find_first_common_named (char *name)
c906108c 730{
c5aa993b 731
c906108c 732 SAVED_F77_COMMON_PTR tmp;
c5aa993b 733
c906108c 734 tmp = head_common_list;
c5aa993b 735
c906108c
SS
736 while (tmp != NULL)
737 {
c5aa993b
JM
738 if (STREQ (tmp->name, name))
739 return (tmp);
c906108c
SS
740 else
741 tmp = tmp->next;
742 }
c5aa993b 743 return (NULL);
c906108c
SS
744}
745#endif
746
747/* This routine finds the first encountred COMMON block named "name"
c5aa993b 748 that belongs to function funcname */
c906108c 749
c5aa993b 750SAVED_F77_COMMON_PTR
fba45db2 751find_common_for_function (char *name, char *funcname)
c906108c 752{
c5aa993b 753
c906108c 754 SAVED_F77_COMMON_PTR tmp;
c5aa993b 755
c906108c 756 tmp = head_common_list;
c5aa993b 757
c906108c
SS
758 while (tmp != NULL)
759 {
c5aa993b
JM
760 if (STREQ (tmp->name, name) && STREQ (tmp->owning_function, funcname))
761 return (tmp);
c906108c
SS
762 else
763 tmp = tmp->next;
764 }
c5aa993b 765 return (NULL);
c906108c
SS
766}
767
768
769#if 0
770
771/* The following function is called to patch up the offsets
772 for the statics contained in the COMMON block named
c5aa993b 773 "name." */
c906108c
SS
774
775static void
fba45db2 776patch_common_entries (SAVED_F77_COMMON_PTR blk, CORE_ADDR offset, int secnum)
c906108c
SS
777{
778 COMMON_ENTRY_PTR entry;
c5aa993b
JM
779
780 blk->offset = offset; /* Keep this around for future use. */
781
c906108c 782 entry = blk->entries;
c5aa993b 783
c906108c
SS
784 while (entry != NULL)
785 {
c5aa993b 786 SYMBOL_VALUE (entry->symbol) += offset;
c906108c 787 SYMBOL_SECTION (entry->symbol) = secnum;
c5aa993b 788
c906108c
SS
789 entry = entry->next;
790 }
c5aa993b 791 blk->secnum = secnum;
c906108c
SS
792}
793
794/* Patch all commons named "name" that need patching.Since COMMON
795 blocks occur with relative infrequency, we simply do a linear scan on
796 the name. Eventually, the best way to do this will be a
797 hashed-lookup. Secnum is the section number for the .bss section
798 (which is where common data lives). */
799
800static void
fba45db2 801patch_all_commons_by_name (char *name, CORE_ADDR offset, int secnum)
c906108c 802{
c5aa993b 803
c906108c 804 SAVED_F77_COMMON_PTR tmp;
c5aa993b 805
c906108c
SS
806 /* For blank common blocks, change the canonical reprsentation
807 of a blank name */
c5aa993b
JM
808
809 if ((STREQ (name, BLANK_COMMON_NAME_ORIGINAL)) ||
810 (STREQ (name, BLANK_COMMON_NAME_MF77)))
c906108c 811 {
c5aa993b
JM
812 free (name);
813 name = alloca (strlen (BLANK_COMMON_NAME_LOCAL) + 1);
814 strcpy (name, BLANK_COMMON_NAME_LOCAL);
c906108c 815 }
c5aa993b 816
c906108c 817 tmp = head_common_list;
c5aa993b 818
c906108c
SS
819 while (tmp != NULL)
820 {
c5aa993b
JM
821 if (COMMON_NEEDS_PATCHING (tmp))
822 if (STREQ (tmp->name, name))
823 patch_common_entries (tmp, offset, secnum);
824
c906108c 825 tmp = tmp->next;
c5aa993b 826 }
c906108c
SS
827}
828#endif
829
830/* This macro adds the symbol-number for the start of the function
831 (the symbol number of the .bf) referenced by symnum_fcn to a
832 list. This list, in reality should be a FIFO queue but since
833 #line pragmas sometimes cause line ranges to get messed up
834 we simply create a linear list. This list can then be searched
835 first by a queueing algorithm and upon failure fall back to
c5aa993b 836 a linear scan. */
c906108c
SS
837
838#if 0
839#define ADD_BF_SYMNUM(bf_sym,fcn_sym) \
840 \
841 if (saved_bf_list == NULL) \
842{ \
843 tmp_bf_ptr = allocate_saved_bf_node(); \
844 \
845 tmp_bf_ptr->symnum_bf = (bf_sym); \
846 tmp_bf_ptr->symnum_fcn = (fcn_sym); \
847 tmp_bf_ptr->next = NULL; \
848 \
849 current_head_bf_list = saved_bf_list = tmp_bf_ptr; \
850 saved_bf_list_end = tmp_bf_ptr; \
851 } \
852else \
853{ \
854 tmp_bf_ptr = allocate_saved_bf_node(); \
855 \
856 tmp_bf_ptr->symnum_bf = (bf_sym); \
857 tmp_bf_ptr->symnum_fcn = (fcn_sym); \
858 tmp_bf_ptr->next = NULL; \
859 \
860 saved_bf_list_end->next = tmp_bf_ptr; \
861 saved_bf_list_end = tmp_bf_ptr; \
c5aa993b 862 }
c906108c
SS
863#endif
864
c5aa993b 865/* This function frees the entire (.bf,function) list */
c906108c
SS
866
867#if 0
c5aa993b 868static void
fba45db2 869clear_bf_list (void)
c906108c 870{
c5aa993b 871
c906108c 872 SAVED_BF_PTR tmp = saved_bf_list;
c5aa993b
JM
873 SAVED_BF_PTR next = NULL;
874
c906108c
SS
875 while (tmp != NULL)
876 {
877 next = tmp->next;
c5aa993b
JM
878 free (tmp);
879 tmp = next;
c906108c
SS
880 }
881 saved_bf_list = NULL;
882}
883#endif
884
885int global_remote_debug;
886
887#if 0
888
889static long
fba45db2 890get_bf_for_fcn (long the_function)
c906108c
SS
891{
892 SAVED_BF_PTR tmp;
893 int nprobes = 0;
c5aa993b 894
c906108c
SS
895 /* First use a simple queuing algorithm (i.e. look and see if the
896 item at the head of the queue is the one you want) */
c5aa993b 897
c906108c 898 if (saved_bf_list == NULL)
96baa820 899 internal_error ("cannot get .bf node off empty list");
c5aa993b
JM
900
901 if (current_head_bf_list != NULL)
c906108c
SS
902 if (current_head_bf_list->symnum_fcn == the_function)
903 {
c5aa993b
JM
904 if (global_remote_debug)
905 fprintf (stderr, "*");
c906108c 906
c5aa993b 907 tmp = current_head_bf_list;
c906108c 908 current_head_bf_list = current_head_bf_list->next;
c5aa993b 909 return (tmp->symnum_bf);
c906108c 910 }
c5aa993b 911
c906108c
SS
912 /* If the above did not work (probably because #line directives were
913 used in the sourcefile and they messed up our internal tables) we now do
914 the ugly linear scan */
c5aa993b
JM
915
916 if (global_remote_debug)
917 fprintf (stderr, "\ndefaulting to linear scan\n");
918
919 nprobes = 0;
c906108c
SS
920 tmp = saved_bf_list;
921 while (tmp != NULL)
922 {
c5aa993b 923 nprobes++;
c906108c 924 if (tmp->symnum_fcn == the_function)
c5aa993b 925 {
c906108c 926 if (global_remote_debug)
c5aa993b 927 fprintf (stderr, "Found in %d probes\n", nprobes);
c906108c 928 current_head_bf_list = tmp->next;
c5aa993b
JM
929 return (tmp->symnum_bf);
930 }
931 tmp = tmp->next;
c906108c 932 }
c5aa993b
JM
933
934 return (-1);
c906108c
SS
935}
936
c5aa993b
JM
937static SAVED_FUNCTION_PTR saved_function_list = NULL;
938static SAVED_FUNCTION_PTR saved_function_list_end = NULL;
c906108c
SS
939
940static void
fba45db2 941clear_function_list (void)
c906108c
SS
942{
943 SAVED_FUNCTION_PTR tmp = saved_function_list;
c5aa993b
JM
944 SAVED_FUNCTION_PTR next = NULL;
945
c906108c
SS
946 while (tmp != NULL)
947 {
948 next = tmp->next;
c5aa993b 949 free (tmp);
c906108c
SS
950 tmp = next;
951 }
c5aa993b 952
c906108c
SS
953 saved_function_list = NULL;
954}
955#endif
This page took 0.114205 seconds and 4 git commands to generate.