2004-08-29 David Lecomber <david@streamline-computing.com>
[deliverable/binutils-gdb.git] / gdb / f-lang.c
CommitLineData
c906108c 1/* Fortran language support routines for GDB, the GNU debugger.
b368761e 2 Copyright 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004
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"
5f9a71c3 33#include "value.h"
c906108c
SS
34
35/* The built-in types of F77. FIXME: integer*4 is missing, plain
36 logical is missing (builtin_type_logical is logical*4). */
37
38struct type *builtin_type_f_character;
39struct type *builtin_type_f_logical;
40struct type *builtin_type_f_logical_s1;
41struct type *builtin_type_f_logical_s2;
c5aa993b 42struct type *builtin_type_f_integer;
c906108c
SS
43struct type *builtin_type_f_integer_s2;
44struct type *builtin_type_f_real;
45struct type *builtin_type_f_real_s8;
46struct type *builtin_type_f_real_s16;
47struct type *builtin_type_f_complex_s8;
48struct type *builtin_type_f_complex_s16;
49struct type *builtin_type_f_complex_s32;
50struct type *builtin_type_f_void;
51
52/* Following is dubious stuff that had been in the xcoff reader. */
53
54struct saved_fcn
c5aa993b
JM
55 {
56 long line_offset; /* Line offset for function */
57 struct saved_fcn *next;
58 };
c906108c
SS
59
60
c5aa993b
JM
61struct saved_bf_symnum
62 {
63 long symnum_fcn; /* Symnum of function (i.e. .function directive) */
64 long symnum_bf; /* Symnum of .bf for this function */
65 struct saved_bf_symnum *next;
66 };
c906108c 67
c5aa993b
JM
68typedef struct saved_fcn SAVED_FUNCTION, *SAVED_FUNCTION_PTR;
69typedef struct saved_bf_symnum SAVED_BF, *SAVED_BF_PTR;
c906108c
SS
70
71/* Local functions */
72
a14ed312 73extern void _initialize_f_language (void);
c906108c 74#if 0
a14ed312
KB
75static void clear_function_list (void);
76static long get_bf_for_fcn (long);
77static void clear_bf_list (void);
78static void patch_all_commons_by_name (char *, CORE_ADDR, int);
79static SAVED_F77_COMMON_PTR find_first_common_named (char *);
80static void add_common_entry (struct symbol *);
81static void add_common_block (char *, CORE_ADDR, int, char *);
82static SAVED_FUNCTION *allocate_saved_function_node (void);
83static SAVED_BF_PTR allocate_saved_bf_node (void);
84static COMMON_ENTRY_PTR allocate_common_entry_node (void);
85static SAVED_F77_COMMON_PTR allocate_saved_f77_common_node (void);
86static void patch_common_entries (SAVED_F77_COMMON_PTR, CORE_ADDR, int);
c906108c
SS
87#endif
88
a14ed312 89static struct type *f_create_fundamental_type (struct objfile *, int);
d9fcf2fb
JM
90static void f_printstr (struct ui_file * stream, char *string,
91 unsigned int length, int width,
92 int force_ellipses);
93static void f_printchar (int c, struct ui_file * stream);
94static void f_emit_char (int c, struct ui_file * stream, int quoter);
c906108c
SS
95
96/* Print the character C on STREAM as part of the contents of a literal
97 string whose delimiter is QUOTER. Note that that format for printing
98 characters and strings is language specific.
99 FIXME: This is a copy of the same function from c-exp.y. It should
100 be replaced with a true F77 version. */
101
102static void
f86f5ca3 103f_emit_char (int c, struct ui_file *stream, int quoter)
c906108c
SS
104{
105 c &= 0xFF; /* Avoid sign bit follies */
c5aa993b 106
c906108c
SS
107 if (PRINT_LITERAL_FORM (c))
108 {
109 if (c == '\\' || c == quoter)
110 fputs_filtered ("\\", stream);
111 fprintf_filtered (stream, "%c", c);
112 }
113 else
114 {
115 switch (c)
116 {
117 case '\n':
118 fputs_filtered ("\\n", stream);
119 break;
120 case '\b':
121 fputs_filtered ("\\b", stream);
122 break;
123 case '\t':
124 fputs_filtered ("\\t", stream);
125 break;
126 case '\f':
127 fputs_filtered ("\\f", stream);
128 break;
129 case '\r':
130 fputs_filtered ("\\r", stream);
131 break;
132 case '\033':
133 fputs_filtered ("\\e", stream);
134 break;
135 case '\007':
136 fputs_filtered ("\\a", stream);
137 break;
138 default:
139 fprintf_filtered (stream, "\\%.3o", (unsigned int) c);
140 break;
141 }
142 }
143}
144
145/* FIXME: This is a copy of the same function from c-exp.y. It should
146 be replaced with a true F77version. */
147
148static void
fba45db2 149f_printchar (int c, struct ui_file *stream)
c906108c
SS
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
fba45db2
KB
164f_printstr (struct ui_file *stream, char *string, unsigned int length,
165 int width, int force_ellipses)
c906108c 166{
f86f5ca3 167 unsigned int i;
c906108c
SS
168 unsigned int things_printed = 0;
169 int in_quotes = 0;
170 int need_comma = 0;
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 252{
f86f5ca3 253 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,
7ca2d3a3 465 array_column_major,
5f9769d1 466 &exp_descriptor_standard,
c906108c
SS
467 f_parse, /* parser */
468 f_error, /* parser error function */
e85c3284 469 null_post_parser,
c906108c
SS
470 f_printchar, /* Print character constant */
471 f_printstr, /* function to print string constant */
472 f_emit_char, /* Function to print a single character */
473 f_create_fundamental_type, /* Create fundamental type in this language */
c5aa993b 474 f_print_type, /* Print a type using appropriate syntax */
c906108c 475 f_val_print, /* Print a value using appropriate syntax */
c5aa993b 476 c_value_print, /* FIXME */
f636b87d 477 NULL, /* Language specific skip_trampoline */
5f9a71c3
DC
478 value_of_this, /* value_of_this */
479 basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
b368761e 480 basic_lookup_transparent_type,/* lookup_transparent_type */
9a3d7dfd 481 NULL, /* Language specific symbol demangler */
31c27f77 482 NULL, /* Language specific class_name_from_physname */
c5aa993b
JM
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 */
6084f43a 491 default_word_break_characters,
f290d38e 492 NULL, /* FIXME: la_language_arch_info. */
c906108c 493 LANG_MAGIC
c5aa993b 494};
c906108c 495
4e845cd3
MS
496static void
497build_fortran_types (void)
c906108c
SS
498{
499 builtin_type_f_void =
500 init_type (TYPE_CODE_VOID, 1,
501 0,
502 "VOID", (struct objfile *) NULL);
c5aa993b 503
c906108c
SS
504 builtin_type_f_character =
505 init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
506 0,
507 "character", (struct objfile *) NULL);
c5aa993b 508
c906108c
SS
509 builtin_type_f_logical_s1 =
510 init_type (TYPE_CODE_BOOL, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
511 TYPE_FLAG_UNSIGNED,
512 "logical*1", (struct objfile *) NULL);
c5aa993b 513
c906108c
SS
514 builtin_type_f_integer_s2 =
515 init_type (TYPE_CODE_INT, TARGET_SHORT_BIT / TARGET_CHAR_BIT,
516 0,
517 "integer*2", (struct objfile *) NULL);
c5aa993b 518
c906108c
SS
519 builtin_type_f_logical_s2 =
520 init_type (TYPE_CODE_BOOL, TARGET_SHORT_BIT / TARGET_CHAR_BIT,
521 TYPE_FLAG_UNSIGNED,
522 "logical*2", (struct objfile *) NULL);
c5aa993b 523
c906108c
SS
524 builtin_type_f_integer =
525 init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT,
526 0,
527 "integer", (struct objfile *) NULL);
c5aa993b 528
c906108c
SS
529 builtin_type_f_logical =
530 init_type (TYPE_CODE_BOOL, TARGET_INT_BIT / TARGET_CHAR_BIT,
531 TYPE_FLAG_UNSIGNED,
532 "logical*4", (struct objfile *) NULL);
c5aa993b 533
c906108c
SS
534 builtin_type_f_real =
535 init_type (TYPE_CODE_FLT, TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
536 0,
537 "real", (struct objfile *) NULL);
c5aa993b 538
c906108c
SS
539 builtin_type_f_real_s8 =
540 init_type (TYPE_CODE_FLT, TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
541 0,
542 "real*8", (struct objfile *) NULL);
c5aa993b 543
c906108c
SS
544 builtin_type_f_real_s16 =
545 init_type (TYPE_CODE_FLT, TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
546 0,
547 "real*16", (struct objfile *) NULL);
c5aa993b 548
c906108c
SS
549 builtin_type_f_complex_s8 =
550 init_type (TYPE_CODE_COMPLEX, 2 * TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
551 0,
552 "complex*8", (struct objfile *) NULL);
553 TYPE_TARGET_TYPE (builtin_type_f_complex_s8) = builtin_type_f_real;
c5aa993b 554
c906108c
SS
555 builtin_type_f_complex_s16 =
556 init_type (TYPE_CODE_COMPLEX, 2 * TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
557 0,
558 "complex*16", (struct objfile *) NULL);
559 TYPE_TARGET_TYPE (builtin_type_f_complex_s16) = builtin_type_f_real_s8;
c5aa993b 560
c906108c
SS
561 /* We have a new size == 4 double floats for the
562 complex*32 data type */
c5aa993b
JM
563
564 builtin_type_f_complex_s32 =
c906108c
SS
565 init_type (TYPE_CODE_COMPLEX, 2 * TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
566 0,
567 "complex*32", (struct objfile *) NULL);
568 TYPE_TARGET_TYPE (builtin_type_f_complex_s32) = builtin_type_f_real_s16;
4e845cd3
MS
569}
570
571void
572_initialize_f_language (void)
573{
574 build_fortran_types ();
046a4708
AC
575
576 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_character);
577 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_logical);
578 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_logical_s1);
579 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_logical_s2);
580 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_integer);
581 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_integer_s2);
582 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_real);
583 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_real_s8);
584 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_real_s16);
585 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_complex_s8);
586 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_complex_s16);
587 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_complex_s32);
588 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_void);
589 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_string);
590 deprecated_register_gdbarch_swap (NULL, 0, build_fortran_types);
c906108c
SS
591
592 builtin_type_string =
593 init_type (TYPE_CODE_STRING, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
594 0,
c5aa993b
JM
595 "character string", (struct objfile *) NULL);
596
c906108c
SS
597 add_language (&f_language_defn);
598}
599
600#if 0
601static SAVED_BF_PTR
fba45db2 602allocate_saved_bf_node (void)
c906108c
SS
603{
604 SAVED_BF_PTR new;
c5aa993b 605
c906108c 606 new = (SAVED_BF_PTR) xmalloc (sizeof (SAVED_BF));
c5aa993b 607 return (new);
c906108c
SS
608}
609
610static SAVED_FUNCTION *
fba45db2 611allocate_saved_function_node (void)
c906108c
SS
612{
613 SAVED_FUNCTION *new;
c5aa993b 614
c906108c 615 new = (SAVED_FUNCTION *) xmalloc (sizeof (SAVED_FUNCTION));
c5aa993b 616 return (new);
c906108c
SS
617}
618
c5aa993b 619static SAVED_F77_COMMON_PTR
fba45db2 620allocate_saved_f77_common_node (void)
c906108c
SS
621{
622 SAVED_F77_COMMON_PTR new;
c5aa993b 623
c906108c 624 new = (SAVED_F77_COMMON_PTR) xmalloc (sizeof (SAVED_F77_COMMON));
c5aa993b 625 return (new);
c906108c
SS
626}
627
c5aa993b 628static COMMON_ENTRY_PTR
fba45db2 629allocate_common_entry_node (void)
c906108c
SS
630{
631 COMMON_ENTRY_PTR new;
c5aa993b 632
c906108c 633 new = (COMMON_ENTRY_PTR) xmalloc (sizeof (COMMON_ENTRY));
c5aa993b 634 return (new);
c906108c
SS
635}
636#endif
637
c5aa993b
JM
638SAVED_F77_COMMON_PTR head_common_list = NULL; /* Ptr to 1st saved COMMON */
639SAVED_F77_COMMON_PTR tail_common_list = NULL; /* Ptr to last saved COMMON */
640SAVED_F77_COMMON_PTR current_common = NULL; /* Ptr to current COMMON */
c906108c
SS
641
642#if 0
c5aa993b
JM
643static SAVED_BF_PTR saved_bf_list = NULL; /* Ptr to (.bf,function)
644 list */
645static SAVED_BF_PTR saved_bf_list_end = NULL; /* Ptr to above list's end */
646static SAVED_BF_PTR current_head_bf_list = NULL; /* Current head of above list
647 */
c906108c 648
c5aa993b
JM
649static SAVED_BF_PTR tmp_bf_ptr; /* Generic temporary for use
650 in macros */
c906108c
SS
651
652/* The following function simply enters a given common block onto
653 the global common block chain */
654
655static void
fba45db2 656add_common_block (char *name, CORE_ADDR offset, int secnum, char *func_stab)
c906108c
SS
657{
658 SAVED_F77_COMMON_PTR tmp;
c5aa993b
JM
659 char *c, *local_copy_func_stab;
660
c906108c
SS
661 /* If the COMMON block we are trying to add has a blank
662 name (i.e. "#BLNK_COM") then we set it to __BLANK
663 because the darn "#" character makes GDB's input
c5aa993b
JM
664 parser have fits. */
665
666
6314a349
AC
667 if (strcmp (name, BLANK_COMMON_NAME_ORIGINAL) == 0
668 || strcmp (name, BLANK_COMMON_NAME_MF77) == 0)
c906108c 669 {
c5aa993b 670
b8c9b27d 671 xfree (name);
c5aa993b
JM
672 name = alloca (strlen (BLANK_COMMON_NAME_LOCAL) + 1);
673 strcpy (name, BLANK_COMMON_NAME_LOCAL);
c906108c 674 }
c5aa993b
JM
675
676 tmp = allocate_saved_f77_common_node ();
677
678 local_copy_func_stab = xmalloc (strlen (func_stab) + 1);
679 strcpy (local_copy_func_stab, func_stab);
680
681 tmp->name = xmalloc (strlen (name) + 1);
682
c906108c 683 /* local_copy_func_stab is a stabstring, let us first extract the
c5aa993b
JM
684 function name from the stab by NULLing out the ':' character. */
685
686
687 c = NULL;
688 c = strchr (local_copy_func_stab, ':');
689
c906108c
SS
690 if (c)
691 *c = '\0';
692 else
c5aa993b
JM
693 error ("Malformed function STAB found in add_common_block()");
694
695
696 tmp->owning_function = xmalloc (strlen (local_copy_func_stab) + 1);
697
698 strcpy (tmp->owning_function, local_copy_func_stab);
699
700 strcpy (tmp->name, name);
701 tmp->offset = offset;
c906108c
SS
702 tmp->next = NULL;
703 tmp->entries = NULL;
c5aa993b
JM
704 tmp->secnum = secnum;
705
c906108c 706 current_common = tmp;
c5aa993b 707
c906108c
SS
708 if (head_common_list == NULL)
709 {
710 head_common_list = tail_common_list = tmp;
711 }
712 else
713 {
c5aa993b 714 tail_common_list->next = tmp;
c906108c
SS
715 tail_common_list = tmp;
716 }
717}
718#endif
719
720/* The following function simply enters a given common entry onto
c5aa993b 721 the "current_common" block that has been saved away. */
c906108c
SS
722
723#if 0
724static void
fba45db2 725add_common_entry (struct symbol *entry_sym_ptr)
c906108c
SS
726{
727 COMMON_ENTRY_PTR tmp;
c5aa993b
JM
728
729
730
c906108c
SS
731 /* The order of this list is important, since
732 we expect the entries to appear in decl.
c5aa993b
JM
733 order when we later issue "info common" calls */
734
735 tmp = allocate_common_entry_node ();
736
c906108c
SS
737 tmp->next = NULL;
738 tmp->symbol = entry_sym_ptr;
c5aa993b 739
c906108c 740 if (current_common == NULL)
c5aa993b
JM
741 error ("Attempt to add COMMON entry with no block open!");
742 else
c906108c
SS
743 {
744 if (current_common->entries == NULL)
745 {
746 current_common->entries = tmp;
c5aa993b 747 current_common->end_of_entries = tmp;
c906108c
SS
748 }
749 else
750 {
c5aa993b
JM
751 current_common->end_of_entries->next = tmp;
752 current_common->end_of_entries = tmp;
c906108c
SS
753 }
754 }
755}
756#endif
757
c5aa993b 758/* This routine finds the first encountred COMMON block named "name" */
c906108c
SS
759
760#if 0
761static SAVED_F77_COMMON_PTR
fba45db2 762find_first_common_named (char *name)
c906108c 763{
c5aa993b 764
c906108c 765 SAVED_F77_COMMON_PTR tmp;
c5aa993b 766
c906108c 767 tmp = head_common_list;
c5aa993b 768
c906108c
SS
769 while (tmp != NULL)
770 {
6314a349 771 if (strcmp (tmp->name, name) == 0)
c5aa993b 772 return (tmp);
c906108c
SS
773 else
774 tmp = tmp->next;
775 }
c5aa993b 776 return (NULL);
c906108c
SS
777}
778#endif
779
780/* This routine finds the first encountred COMMON block named "name"
c5aa993b 781 that belongs to function funcname */
c906108c 782
c5aa993b 783SAVED_F77_COMMON_PTR
fba45db2 784find_common_for_function (char *name, char *funcname)
c906108c 785{
c5aa993b 786
c906108c 787 SAVED_F77_COMMON_PTR tmp;
c5aa993b 788
c906108c 789 tmp = head_common_list;
c5aa993b 790
c906108c
SS
791 while (tmp != NULL)
792 {
cb137aa5
AC
793 if (DEPRECATED_STREQ (tmp->name, name)
794 && DEPRECATED_STREQ (tmp->owning_function, funcname))
c5aa993b 795 return (tmp);
c906108c
SS
796 else
797 tmp = tmp->next;
798 }
c5aa993b 799 return (NULL);
c906108c
SS
800}
801
802
803#if 0
804
805/* The following function is called to patch up the offsets
806 for the statics contained in the COMMON block named
c5aa993b 807 "name." */
c906108c
SS
808
809static void
fba45db2 810patch_common_entries (SAVED_F77_COMMON_PTR blk, CORE_ADDR offset, int secnum)
c906108c
SS
811{
812 COMMON_ENTRY_PTR entry;
c5aa993b
JM
813
814 blk->offset = offset; /* Keep this around for future use. */
815
c906108c 816 entry = blk->entries;
c5aa993b 817
c906108c
SS
818 while (entry != NULL)
819 {
c5aa993b 820 SYMBOL_VALUE (entry->symbol) += offset;
c906108c 821 SYMBOL_SECTION (entry->symbol) = secnum;
c5aa993b 822
c906108c
SS
823 entry = entry->next;
824 }
c5aa993b 825 blk->secnum = secnum;
c906108c
SS
826}
827
828/* Patch all commons named "name" that need patching.Since COMMON
829 blocks occur with relative infrequency, we simply do a linear scan on
830 the name. Eventually, the best way to do this will be a
831 hashed-lookup. Secnum is the section number for the .bss section
832 (which is where common data lives). */
833
834static void
fba45db2 835patch_all_commons_by_name (char *name, CORE_ADDR offset, int secnum)
c906108c 836{
c5aa993b 837
c906108c 838 SAVED_F77_COMMON_PTR tmp;
c5aa993b 839
c906108c
SS
840 /* For blank common blocks, change the canonical reprsentation
841 of a blank name */
c5aa993b 842
6314a349
AC
843 if (strcmp (name, BLANK_COMMON_NAME_ORIGINAL) == 0
844 || strcmp (name, BLANK_COMMON_NAME_MF77) == 0)
c906108c 845 {
b8c9b27d 846 xfree (name);
c5aa993b
JM
847 name = alloca (strlen (BLANK_COMMON_NAME_LOCAL) + 1);
848 strcpy (name, BLANK_COMMON_NAME_LOCAL);
c906108c 849 }
c5aa993b 850
c906108c 851 tmp = head_common_list;
c5aa993b 852
c906108c
SS
853 while (tmp != NULL)
854 {
c5aa993b 855 if (COMMON_NEEDS_PATCHING (tmp))
6314a349 856 if (strcmp (tmp->name, name) == 0)
c5aa993b
JM
857 patch_common_entries (tmp, offset, secnum);
858
c906108c 859 tmp = tmp->next;
c5aa993b 860 }
c906108c
SS
861}
862#endif
863
864/* This macro adds the symbol-number for the start of the function
865 (the symbol number of the .bf) referenced by symnum_fcn to a
866 list. This list, in reality should be a FIFO queue but since
867 #line pragmas sometimes cause line ranges to get messed up
868 we simply create a linear list. This list can then be searched
869 first by a queueing algorithm and upon failure fall back to
c5aa993b 870 a linear scan. */
c906108c
SS
871
872#if 0
873#define ADD_BF_SYMNUM(bf_sym,fcn_sym) \
874 \
875 if (saved_bf_list == NULL) \
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 current_head_bf_list = saved_bf_list = tmp_bf_ptr; \
884 saved_bf_list_end = tmp_bf_ptr; \
885 } \
886else \
887{ \
888 tmp_bf_ptr = allocate_saved_bf_node(); \
889 \
890 tmp_bf_ptr->symnum_bf = (bf_sym); \
891 tmp_bf_ptr->symnum_fcn = (fcn_sym); \
892 tmp_bf_ptr->next = NULL; \
893 \
894 saved_bf_list_end->next = tmp_bf_ptr; \
895 saved_bf_list_end = tmp_bf_ptr; \
c5aa993b 896 }
c906108c
SS
897#endif
898
c5aa993b 899/* This function frees the entire (.bf,function) list */
c906108c
SS
900
901#if 0
c5aa993b 902static void
fba45db2 903clear_bf_list (void)
c906108c 904{
c5aa993b 905
c906108c 906 SAVED_BF_PTR tmp = saved_bf_list;
c5aa993b
JM
907 SAVED_BF_PTR next = NULL;
908
c906108c
SS
909 while (tmp != NULL)
910 {
911 next = tmp->next;
b8c9b27d 912 xfree (tmp);
c5aa993b 913 tmp = next;
c906108c
SS
914 }
915 saved_bf_list = NULL;
916}
917#endif
918
919int global_remote_debug;
920
921#if 0
922
923static long
fba45db2 924get_bf_for_fcn (long the_function)
c906108c
SS
925{
926 SAVED_BF_PTR tmp;
927 int nprobes = 0;
c5aa993b 928
c906108c
SS
929 /* First use a simple queuing algorithm (i.e. look and see if the
930 item at the head of the queue is the one you want) */
c5aa993b 931
c906108c 932 if (saved_bf_list == NULL)
8e65ff28
AC
933 internal_error (__FILE__, __LINE__,
934 "cannot get .bf node off empty list");
c5aa993b
JM
935
936 if (current_head_bf_list != NULL)
c906108c
SS
937 if (current_head_bf_list->symnum_fcn == the_function)
938 {
c5aa993b 939 if (global_remote_debug)
dac8068e 940 fprintf_unfiltered (gdb_stderr, "*");
c906108c 941
c5aa993b 942 tmp = current_head_bf_list;
c906108c 943 current_head_bf_list = current_head_bf_list->next;
c5aa993b 944 return (tmp->symnum_bf);
c906108c 945 }
c5aa993b 946
c906108c
SS
947 /* If the above did not work (probably because #line directives were
948 used in the sourcefile and they messed up our internal tables) we now do
949 the ugly linear scan */
c5aa993b
JM
950
951 if (global_remote_debug)
dac8068e 952 fprintf_unfiltered (gdb_stderr, "\ndefaulting to linear scan\n");
c5aa993b
JM
953
954 nprobes = 0;
c906108c
SS
955 tmp = saved_bf_list;
956 while (tmp != NULL)
957 {
c5aa993b 958 nprobes++;
c906108c 959 if (tmp->symnum_fcn == the_function)
c5aa993b 960 {
c906108c 961 if (global_remote_debug)
dac8068e 962 fprintf_unfiltered (gdb_stderr, "Found in %d probes\n", nprobes);
c906108c 963 current_head_bf_list = tmp->next;
c5aa993b
JM
964 return (tmp->symnum_bf);
965 }
966 tmp = tmp->next;
c906108c 967 }
c5aa993b
JM
968
969 return (-1);
c906108c
SS
970}
971
c5aa993b
JM
972static SAVED_FUNCTION_PTR saved_function_list = NULL;
973static SAVED_FUNCTION_PTR saved_function_list_end = NULL;
c906108c
SS
974
975static void
fba45db2 976clear_function_list (void)
c906108c
SS
977{
978 SAVED_FUNCTION_PTR tmp = saved_function_list;
c5aa993b
JM
979 SAVED_FUNCTION_PTR next = NULL;
980
c906108c
SS
981 while (tmp != NULL)
982 {
983 next = tmp->next;
b8c9b27d 984 xfree (tmp);
c906108c
SS
985 tmp = next;
986 }
c5aa993b 987
c906108c
SS
988 saved_function_list = NULL;
989}
990#endif
This page took 0.449968 seconds and 4 git commands to generate.