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