2003-05-19 David Carlton <carlton@bactrian.org>
[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;
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
6c6ea35e 431struct type **const (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 473 c_value_print, /* FIXME */
f636b87d 474 NULL, /* Language specific skip_trampoline */
9a3d7dfd 475 NULL, /* Language specific symbol demangler */
c5aa993b
JM
476 {"", "", "", ""}, /* Binary format info */
477 {"0%o", "0", "o", ""}, /* Octal format info */
478 {"%d", "", "d", ""}, /* Decimal format info */
479 {"0x%x", "0x", "x", ""}, /* Hex format info */
c906108c
SS
480 f_op_print_tab, /* expression operators for printing */
481 0, /* arrays are first-class (not c-style) */
482 1, /* String lower bound */
c5aa993b 483 &builtin_type_f_character, /* Type of string elements */
c906108c 484 LANG_MAGIC
c5aa993b 485};
c906108c 486
4e845cd3
MS
487static void
488build_fortran_types (void)
c906108c
SS
489{
490 builtin_type_f_void =
491 init_type (TYPE_CODE_VOID, 1,
492 0,
493 "VOID", (struct objfile *) NULL);
c5aa993b 494
c906108c
SS
495 builtin_type_f_character =
496 init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
497 0,
498 "character", (struct objfile *) NULL);
c5aa993b 499
c906108c
SS
500 builtin_type_f_logical_s1 =
501 init_type (TYPE_CODE_BOOL, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
502 TYPE_FLAG_UNSIGNED,
503 "logical*1", (struct objfile *) NULL);
c5aa993b 504
c906108c
SS
505 builtin_type_f_integer_s2 =
506 init_type (TYPE_CODE_INT, TARGET_SHORT_BIT / TARGET_CHAR_BIT,
507 0,
508 "integer*2", (struct objfile *) NULL);
c5aa993b 509
c906108c
SS
510 builtin_type_f_logical_s2 =
511 init_type (TYPE_CODE_BOOL, TARGET_SHORT_BIT / TARGET_CHAR_BIT,
512 TYPE_FLAG_UNSIGNED,
513 "logical*2", (struct objfile *) NULL);
c5aa993b 514
c906108c
SS
515 builtin_type_f_integer =
516 init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT,
517 0,
518 "integer", (struct objfile *) NULL);
c5aa993b 519
c906108c
SS
520 builtin_type_f_logical =
521 init_type (TYPE_CODE_BOOL, TARGET_INT_BIT / TARGET_CHAR_BIT,
522 TYPE_FLAG_UNSIGNED,
523 "logical*4", (struct objfile *) NULL);
c5aa993b 524
c906108c
SS
525 builtin_type_f_real =
526 init_type (TYPE_CODE_FLT, TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
527 0,
528 "real", (struct objfile *) NULL);
c5aa993b 529
c906108c
SS
530 builtin_type_f_real_s8 =
531 init_type (TYPE_CODE_FLT, TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
532 0,
533 "real*8", (struct objfile *) NULL);
c5aa993b 534
c906108c
SS
535 builtin_type_f_real_s16 =
536 init_type (TYPE_CODE_FLT, TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
537 0,
538 "real*16", (struct objfile *) NULL);
c5aa993b 539
c906108c
SS
540 builtin_type_f_complex_s8 =
541 init_type (TYPE_CODE_COMPLEX, 2 * TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
542 0,
543 "complex*8", (struct objfile *) NULL);
544 TYPE_TARGET_TYPE (builtin_type_f_complex_s8) = builtin_type_f_real;
c5aa993b 545
c906108c
SS
546 builtin_type_f_complex_s16 =
547 init_type (TYPE_CODE_COMPLEX, 2 * TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
548 0,
549 "complex*16", (struct objfile *) NULL);
550 TYPE_TARGET_TYPE (builtin_type_f_complex_s16) = builtin_type_f_real_s8;
c5aa993b 551
c906108c
SS
552 /* We have a new size == 4 double floats for the
553 complex*32 data type */
c5aa993b
JM
554
555 builtin_type_f_complex_s32 =
c906108c
SS
556 init_type (TYPE_CODE_COMPLEX, 2 * TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
557 0,
558 "complex*32", (struct objfile *) NULL);
559 TYPE_TARGET_TYPE (builtin_type_f_complex_s32) = builtin_type_f_real_s16;
4e845cd3
MS
560}
561
562void
563_initialize_f_language (void)
564{
565 build_fortran_types ();
566 register_gdbarch_swap (&builtin_type_f_character,
567 sizeof (struct type *), NULL);
568 register_gdbarch_swap (&builtin_type_f_logical,
569 sizeof (struct type *), NULL);
570 register_gdbarch_swap (&builtin_type_f_logical_s1,
571 sizeof (struct type *), NULL);
572 register_gdbarch_swap (&builtin_type_f_logical_s2,
573 sizeof (struct type *), NULL);
574 register_gdbarch_swap (&builtin_type_f_integer,
575 sizeof (struct type *), NULL);
576 register_gdbarch_swap (&builtin_type_f_integer_s2,
577 sizeof (struct type *), NULL);
578 register_gdbarch_swap (&builtin_type_f_real,
579 sizeof (struct type *), NULL);
580 register_gdbarch_swap (&builtin_type_f_real_s8,
581 sizeof (struct type *), NULL);
582 register_gdbarch_swap (&builtin_type_f_real_s16,
583 sizeof (struct type *), NULL);
584 register_gdbarch_swap (&builtin_type_f_complex_s8,
585 sizeof (struct type *), NULL);
586 register_gdbarch_swap (&builtin_type_f_complex_s16,
587 sizeof (struct type *), NULL);
588 register_gdbarch_swap (&builtin_type_f_complex_s32,
589 sizeof (struct type *), NULL);
590 register_gdbarch_swap (&builtin_type_f_void,
591 sizeof (struct type *), NULL);
592 register_gdbarch_swap (&builtin_type_string,
593 sizeof (struct type *), NULL);
594
595 register_gdbarch_swap (NULL, 0, build_fortran_types);
c906108c
SS
596
597 builtin_type_string =
598 init_type (TYPE_CODE_STRING, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
599 0,
c5aa993b
JM
600 "character string", (struct objfile *) NULL);
601
c906108c
SS
602 add_language (&f_language_defn);
603}
604
605#if 0
606static SAVED_BF_PTR
fba45db2 607allocate_saved_bf_node (void)
c906108c
SS
608{
609 SAVED_BF_PTR new;
c5aa993b 610
c906108c 611 new = (SAVED_BF_PTR) xmalloc (sizeof (SAVED_BF));
c5aa993b 612 return (new);
c906108c
SS
613}
614
615static SAVED_FUNCTION *
fba45db2 616allocate_saved_function_node (void)
c906108c
SS
617{
618 SAVED_FUNCTION *new;
c5aa993b 619
c906108c 620 new = (SAVED_FUNCTION *) xmalloc (sizeof (SAVED_FUNCTION));
c5aa993b 621 return (new);
c906108c
SS
622}
623
c5aa993b 624static SAVED_F77_COMMON_PTR
fba45db2 625allocate_saved_f77_common_node (void)
c906108c
SS
626{
627 SAVED_F77_COMMON_PTR new;
c5aa993b 628
c906108c 629 new = (SAVED_F77_COMMON_PTR) xmalloc (sizeof (SAVED_F77_COMMON));
c5aa993b 630 return (new);
c906108c
SS
631}
632
c5aa993b 633static COMMON_ENTRY_PTR
fba45db2 634allocate_common_entry_node (void)
c906108c
SS
635{
636 COMMON_ENTRY_PTR new;
c5aa993b 637
c906108c 638 new = (COMMON_ENTRY_PTR) xmalloc (sizeof (COMMON_ENTRY));
c5aa993b 639 return (new);
c906108c
SS
640}
641#endif
642
c5aa993b
JM
643SAVED_F77_COMMON_PTR head_common_list = NULL; /* Ptr to 1st saved COMMON */
644SAVED_F77_COMMON_PTR tail_common_list = NULL; /* Ptr to last saved COMMON */
645SAVED_F77_COMMON_PTR current_common = NULL; /* Ptr to current COMMON */
c906108c
SS
646
647#if 0
c5aa993b
JM
648static SAVED_BF_PTR saved_bf_list = NULL; /* Ptr to (.bf,function)
649 list */
650static SAVED_BF_PTR saved_bf_list_end = NULL; /* Ptr to above list's end */
651static SAVED_BF_PTR current_head_bf_list = NULL; /* Current head of above list
652 */
c906108c 653
c5aa993b
JM
654static SAVED_BF_PTR tmp_bf_ptr; /* Generic temporary for use
655 in macros */
c906108c
SS
656
657/* The following function simply enters a given common block onto
658 the global common block chain */
659
660static void
fba45db2 661add_common_block (char *name, CORE_ADDR offset, int secnum, char *func_stab)
c906108c
SS
662{
663 SAVED_F77_COMMON_PTR tmp;
c5aa993b
JM
664 char *c, *local_copy_func_stab;
665
c906108c
SS
666 /* If the COMMON block we are trying to add has a blank
667 name (i.e. "#BLNK_COM") then we set it to __BLANK
668 because the darn "#" character makes GDB's input
c5aa993b
JM
669 parser have fits. */
670
671
672 if (STREQ (name, BLANK_COMMON_NAME_ORIGINAL) ||
673 STREQ (name, BLANK_COMMON_NAME_MF77))
c906108c 674 {
c5aa993b 675
b8c9b27d 676 xfree (name);
c5aa993b
JM
677 name = alloca (strlen (BLANK_COMMON_NAME_LOCAL) + 1);
678 strcpy (name, BLANK_COMMON_NAME_LOCAL);
c906108c 679 }
c5aa993b
JM
680
681 tmp = allocate_saved_f77_common_node ();
682
683 local_copy_func_stab = xmalloc (strlen (func_stab) + 1);
684 strcpy (local_copy_func_stab, func_stab);
685
686 tmp->name = xmalloc (strlen (name) + 1);
687
c906108c 688 /* local_copy_func_stab is a stabstring, let us first extract the
c5aa993b
JM
689 function name from the stab by NULLing out the ':' character. */
690
691
692 c = NULL;
693 c = strchr (local_copy_func_stab, ':');
694
c906108c
SS
695 if (c)
696 *c = '\0';
697 else
c5aa993b
JM
698 error ("Malformed function STAB found in add_common_block()");
699
700
701 tmp->owning_function = xmalloc (strlen (local_copy_func_stab) + 1);
702
703 strcpy (tmp->owning_function, local_copy_func_stab);
704
705 strcpy (tmp->name, name);
706 tmp->offset = offset;
c906108c
SS
707 tmp->next = NULL;
708 tmp->entries = NULL;
c5aa993b
JM
709 tmp->secnum = secnum;
710
c906108c 711 current_common = tmp;
c5aa993b 712
c906108c
SS
713 if (head_common_list == NULL)
714 {
715 head_common_list = tail_common_list = tmp;
716 }
717 else
718 {
c5aa993b 719 tail_common_list->next = tmp;
c906108c
SS
720 tail_common_list = tmp;
721 }
722}
723#endif
724
725/* The following function simply enters a given common entry onto
c5aa993b 726 the "current_common" block that has been saved away. */
c906108c
SS
727
728#if 0
729static void
fba45db2 730add_common_entry (struct symbol *entry_sym_ptr)
c906108c
SS
731{
732 COMMON_ENTRY_PTR tmp;
c5aa993b
JM
733
734
735
c906108c
SS
736 /* The order of this list is important, since
737 we expect the entries to appear in decl.
c5aa993b
JM
738 order when we later issue "info common" calls */
739
740 tmp = allocate_common_entry_node ();
741
c906108c
SS
742 tmp->next = NULL;
743 tmp->symbol = entry_sym_ptr;
c5aa993b 744
c906108c 745 if (current_common == NULL)
c5aa993b
JM
746 error ("Attempt to add COMMON entry with no block open!");
747 else
c906108c
SS
748 {
749 if (current_common->entries == NULL)
750 {
751 current_common->entries = tmp;
c5aa993b 752 current_common->end_of_entries = tmp;
c906108c
SS
753 }
754 else
755 {
c5aa993b
JM
756 current_common->end_of_entries->next = tmp;
757 current_common->end_of_entries = tmp;
c906108c
SS
758 }
759 }
760}
761#endif
762
c5aa993b 763/* This routine finds the first encountred COMMON block named "name" */
c906108c
SS
764
765#if 0
766static SAVED_F77_COMMON_PTR
fba45db2 767find_first_common_named (char *name)
c906108c 768{
c5aa993b 769
c906108c 770 SAVED_F77_COMMON_PTR tmp;
c5aa993b 771
c906108c 772 tmp = head_common_list;
c5aa993b 773
c906108c
SS
774 while (tmp != NULL)
775 {
c5aa993b
JM
776 if (STREQ (tmp->name, name))
777 return (tmp);
c906108c
SS
778 else
779 tmp = tmp->next;
780 }
c5aa993b 781 return (NULL);
c906108c
SS
782}
783#endif
784
785/* This routine finds the first encountred COMMON block named "name"
c5aa993b 786 that belongs to function funcname */
c906108c 787
c5aa993b 788SAVED_F77_COMMON_PTR
fba45db2 789find_common_for_function (char *name, char *funcname)
c906108c 790{
c5aa993b 791
c906108c 792 SAVED_F77_COMMON_PTR tmp;
c5aa993b 793
c906108c 794 tmp = head_common_list;
c5aa993b 795
c906108c
SS
796 while (tmp != NULL)
797 {
c5aa993b
JM
798 if (STREQ (tmp->name, name) && STREQ (tmp->owning_function, funcname))
799 return (tmp);
c906108c
SS
800 else
801 tmp = tmp->next;
802 }
c5aa993b 803 return (NULL);
c906108c
SS
804}
805
806
807#if 0
808
809/* The following function is called to patch up the offsets
810 for the statics contained in the COMMON block named
c5aa993b 811 "name." */
c906108c
SS
812
813static void
fba45db2 814patch_common_entries (SAVED_F77_COMMON_PTR blk, CORE_ADDR offset, int secnum)
c906108c
SS
815{
816 COMMON_ENTRY_PTR entry;
c5aa993b
JM
817
818 blk->offset = offset; /* Keep this around for future use. */
819
c906108c 820 entry = blk->entries;
c5aa993b 821
c906108c
SS
822 while (entry != NULL)
823 {
c5aa993b 824 SYMBOL_VALUE (entry->symbol) += offset;
c906108c 825 SYMBOL_SECTION (entry->symbol) = secnum;
c5aa993b 826
c906108c
SS
827 entry = entry->next;
828 }
c5aa993b 829 blk->secnum = secnum;
c906108c
SS
830}
831
832/* Patch all commons named "name" that need patching.Since COMMON
833 blocks occur with relative infrequency, we simply do a linear scan on
834 the name. Eventually, the best way to do this will be a
835 hashed-lookup. Secnum is the section number for the .bss section
836 (which is where common data lives). */
837
838static void
fba45db2 839patch_all_commons_by_name (char *name, CORE_ADDR offset, int secnum)
c906108c 840{
c5aa993b 841
c906108c 842 SAVED_F77_COMMON_PTR tmp;
c5aa993b 843
c906108c
SS
844 /* For blank common blocks, change the canonical reprsentation
845 of a blank name */
c5aa993b
JM
846
847 if ((STREQ (name, BLANK_COMMON_NAME_ORIGINAL)) ||
848 (STREQ (name, BLANK_COMMON_NAME_MF77)))
c906108c 849 {
b8c9b27d 850 xfree (name);
c5aa993b
JM
851 name = alloca (strlen (BLANK_COMMON_NAME_LOCAL) + 1);
852 strcpy (name, BLANK_COMMON_NAME_LOCAL);
c906108c 853 }
c5aa993b 854
c906108c 855 tmp = head_common_list;
c5aa993b 856
c906108c
SS
857 while (tmp != NULL)
858 {
c5aa993b
JM
859 if (COMMON_NEEDS_PATCHING (tmp))
860 if (STREQ (tmp->name, name))
861 patch_common_entries (tmp, offset, secnum);
862
c906108c 863 tmp = tmp->next;
c5aa993b 864 }
c906108c
SS
865}
866#endif
867
868/* This macro adds the symbol-number for the start of the function
869 (the symbol number of the .bf) referenced by symnum_fcn to a
870 list. This list, in reality should be a FIFO queue but since
871 #line pragmas sometimes cause line ranges to get messed up
872 we simply create a linear list. This list can then be searched
873 first by a queueing algorithm and upon failure fall back to
c5aa993b 874 a linear scan. */
c906108c
SS
875
876#if 0
877#define ADD_BF_SYMNUM(bf_sym,fcn_sym) \
878 \
879 if (saved_bf_list == NULL) \
880{ \
881 tmp_bf_ptr = allocate_saved_bf_node(); \
882 \
883 tmp_bf_ptr->symnum_bf = (bf_sym); \
884 tmp_bf_ptr->symnum_fcn = (fcn_sym); \
885 tmp_bf_ptr->next = NULL; \
886 \
887 current_head_bf_list = saved_bf_list = tmp_bf_ptr; \
888 saved_bf_list_end = tmp_bf_ptr; \
889 } \
890else \
891{ \
892 tmp_bf_ptr = allocate_saved_bf_node(); \
893 \
894 tmp_bf_ptr->symnum_bf = (bf_sym); \
895 tmp_bf_ptr->symnum_fcn = (fcn_sym); \
896 tmp_bf_ptr->next = NULL; \
897 \
898 saved_bf_list_end->next = tmp_bf_ptr; \
899 saved_bf_list_end = tmp_bf_ptr; \
c5aa993b 900 }
c906108c
SS
901#endif
902
c5aa993b 903/* This function frees the entire (.bf,function) list */
c906108c
SS
904
905#if 0
c5aa993b 906static void
fba45db2 907clear_bf_list (void)
c906108c 908{
c5aa993b 909
c906108c 910 SAVED_BF_PTR tmp = saved_bf_list;
c5aa993b
JM
911 SAVED_BF_PTR next = NULL;
912
c906108c
SS
913 while (tmp != NULL)
914 {
915 next = tmp->next;
b8c9b27d 916 xfree (tmp);
c5aa993b 917 tmp = next;
c906108c
SS
918 }
919 saved_bf_list = NULL;
920}
921#endif
922
923int global_remote_debug;
924
925#if 0
926
927static long
fba45db2 928get_bf_for_fcn (long the_function)
c906108c
SS
929{
930 SAVED_BF_PTR tmp;
931 int nprobes = 0;
c5aa993b 932
c906108c
SS
933 /* First use a simple queuing algorithm (i.e. look and see if the
934 item at the head of the queue is the one you want) */
c5aa993b 935
c906108c 936 if (saved_bf_list == NULL)
8e65ff28
AC
937 internal_error (__FILE__, __LINE__,
938 "cannot get .bf node off empty list");
c5aa993b
JM
939
940 if (current_head_bf_list != NULL)
c906108c
SS
941 if (current_head_bf_list->symnum_fcn == the_function)
942 {
c5aa993b 943 if (global_remote_debug)
dac8068e 944 fprintf_unfiltered (gdb_stderr, "*");
c906108c 945
c5aa993b 946 tmp = current_head_bf_list;
c906108c 947 current_head_bf_list = current_head_bf_list->next;
c5aa993b 948 return (tmp->symnum_bf);
c906108c 949 }
c5aa993b 950
c906108c
SS
951 /* If the above did not work (probably because #line directives were
952 used in the sourcefile and they messed up our internal tables) we now do
953 the ugly linear scan */
c5aa993b
JM
954
955 if (global_remote_debug)
dac8068e 956 fprintf_unfiltered (gdb_stderr, "\ndefaulting to linear scan\n");
c5aa993b
JM
957
958 nprobes = 0;
c906108c
SS
959 tmp = saved_bf_list;
960 while (tmp != NULL)
961 {
c5aa993b 962 nprobes++;
c906108c 963 if (tmp->symnum_fcn == the_function)
c5aa993b 964 {
c906108c 965 if (global_remote_debug)
dac8068e 966 fprintf_unfiltered (gdb_stderr, "Found in %d probes\n", nprobes);
c906108c 967 current_head_bf_list = tmp->next;
c5aa993b
JM
968 return (tmp->symnum_bf);
969 }
970 tmp = tmp->next;
c906108c 971 }
c5aa993b
JM
972
973 return (-1);
c906108c
SS
974}
975
c5aa993b
JM
976static SAVED_FUNCTION_PTR saved_function_list = NULL;
977static SAVED_FUNCTION_PTR saved_function_list_end = NULL;
c906108c
SS
978
979static void
fba45db2 980clear_function_list (void)
c906108c
SS
981{
982 SAVED_FUNCTION_PTR tmp = saved_function_list;
c5aa993b
JM
983 SAVED_FUNCTION_PTR next = NULL;
984
c906108c
SS
985 while (tmp != NULL)
986 {
987 next = tmp->next;
b8c9b27d 988 xfree (tmp);
c906108c
SS
989 tmp = next;
990 }
c5aa993b 991
c906108c
SS
992 saved_function_list = NULL;
993}
994#endif
This page took 0.305766 seconds and 4 git commands to generate.