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