]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/f-lang.c
* regcache.c (struct regcache): Add ptid_t member.
[thirdparty/binutils-gdb.git] / gdb / f-lang.c
CommitLineData
c906108c 1/* Fortran language support routines for GDB, the GNU debugger.
ce27fb25 2
6aba47ca
DJ
3 Copyright (C) 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003,
4 2004, 2005, 2007 Free Software Foundation, Inc.
ce27fb25 5
c906108c
SS
6 Contributed by Motorola. Adapted from the C parser by Farooq Butt
7 (fmbutt@engage.sps.mot.com).
8
c5aa993b 9 This file is part of GDB.
c906108c 10
c5aa993b
JM
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 2 of the License, or
14 (at your option) any later version.
c906108c 15
c5aa993b
JM
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
c906108c 20
c5aa993b
JM
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
197e01b6
EZ
23 Foundation, Inc., 51 Franklin Street, Fifth Floor,
24 Boston, MA 02110-1301, USA. */
c906108c
SS
25
26#include "defs.h"
27#include "gdb_string.h"
28#include "symtab.h"
29#include "gdbtypes.h"
30#include "expression.h"
31#include "parser-defs.h"
32#include "language.h"
33#include "f-lang.h"
745b8ca0 34#include "valprint.h"
5f9a71c3 35#include "value.h"
c906108c
SS
36
37/* The built-in types of F77. FIXME: integer*4 is missing, plain
38 logical is missing (builtin_type_logical is logical*4). */
39
40struct type *builtin_type_f_character;
41struct type *builtin_type_f_logical;
42struct type *builtin_type_f_logical_s1;
43struct type *builtin_type_f_logical_s2;
c5aa993b 44struct type *builtin_type_f_integer;
c906108c
SS
45struct type *builtin_type_f_integer_s2;
46struct type *builtin_type_f_real;
47struct type *builtin_type_f_real_s8;
48struct type *builtin_type_f_real_s16;
49struct type *builtin_type_f_complex_s8;
50struct type *builtin_type_f_complex_s16;
51struct type *builtin_type_f_complex_s32;
52struct type *builtin_type_f_void;
53
54/* Following is dubious stuff that had been in the xcoff reader. */
55
56struct saved_fcn
c5aa993b
JM
57 {
58 long line_offset; /* Line offset for function */
59 struct saved_fcn *next;
60 };
c906108c
SS
61
62
c5aa993b
JM
63struct saved_bf_symnum
64 {
65 long symnum_fcn; /* Symnum of function (i.e. .function directive) */
66 long symnum_bf; /* Symnum of .bf for this function */
67 struct saved_bf_symnum *next;
68 };
c906108c 69
c5aa993b
JM
70typedef struct saved_fcn SAVED_FUNCTION, *SAVED_FUNCTION_PTR;
71typedef struct saved_bf_symnum SAVED_BF, *SAVED_BF_PTR;
c906108c
SS
72
73/* Local functions */
74
a14ed312 75extern void _initialize_f_language (void);
c906108c 76#if 0
a14ed312
KB
77static void clear_function_list (void);
78static long get_bf_for_fcn (long);
79static void clear_bf_list (void);
80static void patch_all_commons_by_name (char *, CORE_ADDR, int);
81static SAVED_F77_COMMON_PTR find_first_common_named (char *);
82static void add_common_entry (struct symbol *);
83static void add_common_block (char *, CORE_ADDR, int, char *);
84static SAVED_FUNCTION *allocate_saved_function_node (void);
85static SAVED_BF_PTR allocate_saved_bf_node (void);
86static COMMON_ENTRY_PTR allocate_common_entry_node (void);
87static SAVED_F77_COMMON_PTR allocate_saved_f77_common_node (void);
88static void patch_common_entries (SAVED_F77_COMMON_PTR, CORE_ADDR, int);
c906108c
SS
89#endif
90
a14ed312 91static struct type *f_create_fundamental_type (struct objfile *, int);
d9fcf2fb
JM
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
f86f5ca3 102f_emit_char (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
fc1a4b47 163f_printstr (struct ui_file *stream, const gdb_byte *string,
ce27fb25 164 unsigned int length, int width, int force_ellipses)
c906108c 165{
f86f5ca3 166 unsigned int i;
c906108c
SS
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 251{
f86f5ca3 252 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,
9a76efb6 288 gdbarch_short_bit (current_gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
289 0, "integer*2", objfile);
290 break;
291 case FT_SIGNED_SHORT:
292 type = init_type (TYPE_CODE_INT,
9a76efb6 293 gdbarch_short_bit (current_gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
294 0, "short", objfile); /* FIXME-fnf */
295 break;
296 case FT_UNSIGNED_SHORT:
297 type = init_type (TYPE_CODE_BOOL,
9a76efb6 298 gdbarch_short_bit (current_gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
299 TYPE_FLAG_UNSIGNED, "logical*2", objfile);
300 break;
301 case FT_INTEGER:
302 type = init_type (TYPE_CODE_INT,
9a76efb6 303 gdbarch_int_bit (current_gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
304 0, "integer*4", objfile);
305 break;
306 case FT_SIGNED_INTEGER:
307 type = init_type (TYPE_CODE_INT,
9a76efb6 308 gdbarch_int_bit (current_gdbarch) / 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,
9a76efb6 313 gdbarch_int_bit (current_gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
314 TYPE_FLAG_UNSIGNED, "logical*4", objfile);
315 break;
316 case FT_FIXED_DECIMAL:
317 type = init_type (TYPE_CODE_INT,
9a76efb6 318 gdbarch_int_bit (current_gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
319 0, "fixed decimal", objfile);
320 break;
321 case FT_LONG:
322 type = init_type (TYPE_CODE_INT,
9a76efb6 323 gdbarch_long_bit (current_gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
324 0, "long", objfile);
325 break;
326 case FT_SIGNED_LONG:
327 type = init_type (TYPE_CODE_INT,
9a76efb6 328 gdbarch_long_bit (current_gdbarch) / 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,
9a76efb6 333 gdbarch_long_bit (current_gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
334 TYPE_FLAG_UNSIGNED, "unsigned long", objfile);
335 break;
336 case FT_LONG_LONG:
337 type = init_type (TYPE_CODE_INT,
9a76efb6
UW
338 gdbarch_long_long_bit (current_gdbarch)
339 / TARGET_CHAR_BIT,
c906108c
SS
340 0, "long long", objfile);
341 break;
342 case FT_SIGNED_LONG_LONG:
343 type = init_type (TYPE_CODE_INT,
9a76efb6
UW
344 gdbarch_long_long_bit (current_gdbarch)
345 / TARGET_CHAR_BIT,
c906108c
SS
346 0, "signed long long", objfile);
347 break;
348 case FT_UNSIGNED_LONG_LONG:
349 type = init_type (TYPE_CODE_INT,
9a76efb6
UW
350 gdbarch_long_long_bit (current_gdbarch)
351 / TARGET_CHAR_BIT,
c906108c
SS
352 TYPE_FLAG_UNSIGNED, "unsigned long long", objfile);
353 break;
354 case FT_FLOAT:
355 type = init_type (TYPE_CODE_FLT,
ea06eb3d 356 gdbarch_float_bit (current_gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
357 0, "real", objfile);
358 break;
359 case FT_DBL_PREC_FLOAT:
360 type = init_type (TYPE_CODE_FLT,
ea06eb3d 361 gdbarch_double_bit (current_gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
362 0, "real*8", objfile);
363 break;
364 case FT_FLOAT_DECIMAL:
365 type = init_type (TYPE_CODE_FLT,
ea06eb3d 366 gdbarch_double_bit (current_gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
367 0, "floating decimal", objfile);
368 break;
369 case FT_EXT_PREC_FLOAT:
370 type = init_type (TYPE_CODE_FLT,
ea06eb3d
UW
371 gdbarch_long_double_bit (current_gdbarch)
372 / TARGET_CHAR_BIT,
c906108c
SS
373 0, "real*16", objfile);
374 break;
375 case FT_COMPLEX:
376 type = init_type (TYPE_CODE_COMPLEX,
ea06eb3d 377 2 * gdbarch_float_bit (current_gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
378 0, "complex*8", objfile);
379 TYPE_TARGET_TYPE (type) = builtin_type_f_real;
380 break;
381 case FT_DBL_PREC_COMPLEX:
382 type = init_type (TYPE_CODE_COMPLEX,
ea06eb3d
UW
383 2 * gdbarch_double_bit (current_gdbarch)
384 / TARGET_CHAR_BIT,
c906108c
SS
385 0, "complex*16", objfile);
386 TYPE_TARGET_TYPE (type) = builtin_type_f_real_s8;
387 break;
388 case FT_EXT_PREC_COMPLEX:
389 type = init_type (TYPE_CODE_COMPLEX,
ea06eb3d
UW
390 2 * gdbarch_long_double_bit (current_gdbarch)
391 / TARGET_CHAR_BIT,
c906108c
SS
392 0, "complex*32", objfile);
393 TYPE_TARGET_TYPE (type) = builtin_type_f_real_s16;
394 break;
395 default:
396 /* FIXME: For now, if we are asked to produce a type not in this
c5aa993b
JM
397 language, create the equivalent of a C integer type with the
398 name "<?type?>". When all the dust settles from the type
399 reconstruction work, this should probably become an error. */
c906108c 400 type = init_type (TYPE_CODE_INT,
9a76efb6 401 gdbarch_int_bit (current_gdbarch) / TARGET_CHAR_BIT,
c906108c 402 0, "<?type?>", objfile);
8a3fe4f8 403 warning (_("internal error: no F77 fundamental type %d"), typeid);
c906108c
SS
404 break;
405 }
406 return (type);
407}
c906108c 408\f
c5aa993b 409
c906108c
SS
410/* Table of operators and their precedences for printing expressions. */
411
c5aa993b
JM
412static const struct op_print f_op_print_tab[] =
413{
414 {"+", BINOP_ADD, PREC_ADD, 0},
415 {"+", UNOP_PLUS, PREC_PREFIX, 0},
416 {"-", BINOP_SUB, PREC_ADD, 0},
417 {"-", UNOP_NEG, PREC_PREFIX, 0},
418 {"*", BINOP_MUL, PREC_MUL, 0},
419 {"/", BINOP_DIV, PREC_MUL, 0},
420 {"DIV", BINOP_INTDIV, PREC_MUL, 0},
421 {"MOD", BINOP_REM, PREC_MUL, 0},
422 {"=", BINOP_ASSIGN, PREC_ASSIGN, 1},
423 {".OR.", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
424 {".AND.", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
425 {".NOT.", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
426 {".EQ.", BINOP_EQUAL, PREC_EQUAL, 0},
427 {".NE.", BINOP_NOTEQUAL, PREC_EQUAL, 0},
428 {".LE.", BINOP_LEQ, PREC_ORDER, 0},
429 {".GE.", BINOP_GEQ, PREC_ORDER, 0},
430 {".GT.", BINOP_GTR, PREC_ORDER, 0},
431 {".LT.", BINOP_LESS, PREC_ORDER, 0},
432 {"**", UNOP_IND, PREC_PREFIX, 0},
433 {"@", BINOP_REPEAT, PREC_REPEAT, 0},
434 {NULL, 0, 0, 0}
c906108c
SS
435};
436\f
6c6ea35e 437struct type **const (f_builtin_types[]) =
c906108c
SS
438{
439 &builtin_type_f_character,
c5aa993b
JM
440 &builtin_type_f_logical,
441 &builtin_type_f_logical_s1,
442 &builtin_type_f_logical_s2,
443 &builtin_type_f_integer,
444 &builtin_type_f_integer_s2,
445 &builtin_type_f_real,
446 &builtin_type_f_real_s8,
447 &builtin_type_f_real_s16,
448 &builtin_type_f_complex_s8,
449 &builtin_type_f_complex_s16,
c906108c 450#if 0
c5aa993b 451 &builtin_type_f_complex_s32,
c906108c 452#endif
c5aa993b
JM
453 &builtin_type_f_void,
454 0
c906108c
SS
455};
456
457/* This is declared in c-lang.h but it is silly to import that file for what
458 is already just a hack. */
d9fcf2fb
JM
459extern int c_value_print (struct value *, struct ui_file *, int,
460 enum val_prettyprint);
c906108c 461
c5aa993b
JM
462const struct language_defn f_language_defn =
463{
c906108c
SS
464 "fortran",
465 language_fortran,
466 f_builtin_types,
467 range_check_on,
468 type_check_on,
63872f9d 469 case_sensitive_off,
7ca2d3a3 470 array_column_major,
5f9769d1 471 &exp_descriptor_standard,
c906108c
SS
472 f_parse, /* parser */
473 f_error, /* parser error function */
e85c3284 474 null_post_parser,
c906108c
SS
475 f_printchar, /* Print character constant */
476 f_printstr, /* function to print string constant */
477 f_emit_char, /* Function to print a single character */
478 f_create_fundamental_type, /* Create fundamental type in this language */
c5aa993b 479 f_print_type, /* Print a type using appropriate syntax */
c906108c 480 f_val_print, /* Print a value using appropriate syntax */
c5aa993b 481 c_value_print, /* FIXME */
f636b87d 482 NULL, /* Language specific skip_trampoline */
5f9a71c3
DC
483 value_of_this, /* value_of_this */
484 basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
b368761e 485 basic_lookup_transparent_type,/* lookup_transparent_type */
9a3d7dfd 486 NULL, /* Language specific symbol demangler */
31c27f77 487 NULL, /* Language specific class_name_from_physname */
c906108c
SS
488 f_op_print_tab, /* expression operators for printing */
489 0, /* arrays are first-class (not c-style) */
490 1, /* String lower bound */
c5aa993b 491 &builtin_type_f_character, /* Type of string elements */
6084f43a 492 default_word_break_characters,
f290d38e 493 NULL, /* FIXME: la_language_arch_info. */
e79af960 494 default_print_array_index,
c906108c 495 LANG_MAGIC
c5aa993b 496};
c906108c 497
4e845cd3
MS
498static void
499build_fortran_types (void)
c906108c
SS
500{
501 builtin_type_f_void =
502 init_type (TYPE_CODE_VOID, 1,
503 0,
504 "VOID", (struct objfile *) NULL);
c5aa993b 505
c906108c
SS
506 builtin_type_f_character =
507 init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
508 0,
509 "character", (struct objfile *) NULL);
c5aa993b 510
c906108c
SS
511 builtin_type_f_logical_s1 =
512 init_type (TYPE_CODE_BOOL, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
513 TYPE_FLAG_UNSIGNED,
514 "logical*1", (struct objfile *) NULL);
c5aa993b 515
c906108c 516 builtin_type_f_integer_s2 =
9a76efb6
UW
517 init_type (TYPE_CODE_INT,
518 gdbarch_short_bit (current_gdbarch) / TARGET_CHAR_BIT,
519 0, "integer*2", (struct objfile *) NULL);
c5aa993b 520
c906108c 521 builtin_type_f_logical_s2 =
9a76efb6
UW
522 init_type (TYPE_CODE_BOOL,
523 gdbarch_short_bit (current_gdbarch) / TARGET_CHAR_BIT,
524 TYPE_FLAG_UNSIGNED, "logical*2", (struct objfile *) NULL);
c5aa993b 525
c906108c 526 builtin_type_f_integer =
9a76efb6
UW
527 init_type (TYPE_CODE_INT,
528 gdbarch_int_bit (current_gdbarch) / TARGET_CHAR_BIT,
529 0, "integer", (struct objfile *) NULL);
c5aa993b 530
c906108c 531 builtin_type_f_logical =
9a76efb6
UW
532 init_type (TYPE_CODE_BOOL,
533 gdbarch_int_bit (current_gdbarch) / TARGET_CHAR_BIT,
534 TYPE_FLAG_UNSIGNED, "logical*4", (struct objfile *) NULL);
c5aa993b 535
c906108c 536 builtin_type_f_real =
ea06eb3d
UW
537 init_type (TYPE_CODE_FLT,
538 gdbarch_float_bit (current_gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
539 0,
540 "real", (struct objfile *) NULL);
c5aa993b 541
c906108c 542 builtin_type_f_real_s8 =
ea06eb3d
UW
543 init_type (TYPE_CODE_FLT,
544 gdbarch_double_bit (current_gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
545 0,
546 "real*8", (struct objfile *) NULL);
c5aa993b 547
c906108c 548 builtin_type_f_real_s16 =
ea06eb3d
UW
549 init_type (TYPE_CODE_FLT,
550 gdbarch_long_double_bit (current_gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
551 0,
552 "real*16", (struct objfile *) NULL);
c5aa993b 553
c906108c 554 builtin_type_f_complex_s8 =
ea06eb3d
UW
555 init_type (TYPE_CODE_COMPLEX,
556 2 * gdbarch_float_bit (current_gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
557 0,
558 "complex*8", (struct objfile *) NULL);
559 TYPE_TARGET_TYPE (builtin_type_f_complex_s8) = builtin_type_f_real;
c5aa993b 560
c906108c 561 builtin_type_f_complex_s16 =
ea06eb3d
UW
562 init_type (TYPE_CODE_COMPLEX,
563 2 * gdbarch_double_bit (current_gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
564 0,
565 "complex*16", (struct objfile *) NULL);
566 TYPE_TARGET_TYPE (builtin_type_f_complex_s16) = builtin_type_f_real_s8;
c5aa993b 567
c906108c
SS
568 /* We have a new size == 4 double floats for the
569 complex*32 data type */
c5aa993b
JM
570
571 builtin_type_f_complex_s32 =
ea06eb3d
UW
572 init_type (TYPE_CODE_COMPLEX,
573 2 * gdbarch_long_double_bit (current_gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
574 0,
575 "complex*32", (struct objfile *) NULL);
576 TYPE_TARGET_TYPE (builtin_type_f_complex_s32) = builtin_type_f_real_s16;
4e845cd3
MS
577}
578
579void
580_initialize_f_language (void)
581{
582 build_fortran_types ();
046a4708
AC
583
584 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_character);
585 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_logical);
586 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_logical_s1);
587 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_logical_s2);
588 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_integer);
589 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_integer_s2);
590 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_real);
591 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_real_s8);
592 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_real_s16);
593 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_complex_s8);
594 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_complex_s16);
595 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_complex_s32);
596 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_void);
597 DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_string);
598 deprecated_register_gdbarch_swap (NULL, 0, build_fortran_types);
c906108c
SS
599
600 builtin_type_string =
601 init_type (TYPE_CODE_STRING, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
602 0,
c5aa993b
JM
603 "character string", (struct objfile *) NULL);
604
c906108c
SS
605 add_language (&f_language_defn);
606}
607
608#if 0
609static SAVED_BF_PTR
fba45db2 610allocate_saved_bf_node (void)
c906108c
SS
611{
612 SAVED_BF_PTR new;
c5aa993b 613
c906108c 614 new = (SAVED_BF_PTR) xmalloc (sizeof (SAVED_BF));
c5aa993b 615 return (new);
c906108c
SS
616}
617
618static SAVED_FUNCTION *
fba45db2 619allocate_saved_function_node (void)
c906108c
SS
620{
621 SAVED_FUNCTION *new;
c5aa993b 622
c906108c 623 new = (SAVED_FUNCTION *) xmalloc (sizeof (SAVED_FUNCTION));
c5aa993b 624 return (new);
c906108c
SS
625}
626
c5aa993b 627static SAVED_F77_COMMON_PTR
fba45db2 628allocate_saved_f77_common_node (void)
c906108c
SS
629{
630 SAVED_F77_COMMON_PTR new;
c5aa993b 631
c906108c 632 new = (SAVED_F77_COMMON_PTR) xmalloc (sizeof (SAVED_F77_COMMON));
c5aa993b 633 return (new);
c906108c
SS
634}
635
c5aa993b 636static COMMON_ENTRY_PTR
fba45db2 637allocate_common_entry_node (void)
c906108c
SS
638{
639 COMMON_ENTRY_PTR new;
c5aa993b 640
c906108c 641 new = (COMMON_ENTRY_PTR) xmalloc (sizeof (COMMON_ENTRY));
c5aa993b 642 return (new);
c906108c
SS
643}
644#endif
645
c5aa993b
JM
646SAVED_F77_COMMON_PTR head_common_list = NULL; /* Ptr to 1st saved COMMON */
647SAVED_F77_COMMON_PTR tail_common_list = NULL; /* Ptr to last saved COMMON */
648SAVED_F77_COMMON_PTR current_common = NULL; /* Ptr to current COMMON */
c906108c
SS
649
650#if 0
c5aa993b
JM
651static SAVED_BF_PTR saved_bf_list = NULL; /* Ptr to (.bf,function)
652 list */
653static SAVED_BF_PTR saved_bf_list_end = NULL; /* Ptr to above list's end */
654static SAVED_BF_PTR current_head_bf_list = NULL; /* Current head of above list
655 */
c906108c 656
c5aa993b
JM
657static SAVED_BF_PTR tmp_bf_ptr; /* Generic temporary for use
658 in macros */
c906108c
SS
659
660/* The following function simply enters a given common block onto
661 the global common block chain */
662
663static void
fba45db2 664add_common_block (char *name, CORE_ADDR offset, int secnum, char *func_stab)
c906108c
SS
665{
666 SAVED_F77_COMMON_PTR tmp;
c5aa993b
JM
667 char *c, *local_copy_func_stab;
668
c906108c
SS
669 /* If the COMMON block we are trying to add has a blank
670 name (i.e. "#BLNK_COM") then we set it to __BLANK
671 because the darn "#" character makes GDB's input
c5aa993b
JM
672 parser have fits. */
673
674
6314a349
AC
675 if (strcmp (name, BLANK_COMMON_NAME_ORIGINAL) == 0
676 || strcmp (name, BLANK_COMMON_NAME_MF77) == 0)
c906108c 677 {
c5aa993b 678
b8c9b27d 679 xfree (name);
c5aa993b
JM
680 name = alloca (strlen (BLANK_COMMON_NAME_LOCAL) + 1);
681 strcpy (name, BLANK_COMMON_NAME_LOCAL);
c906108c 682 }
c5aa993b
JM
683
684 tmp = allocate_saved_f77_common_node ();
685
686 local_copy_func_stab = xmalloc (strlen (func_stab) + 1);
687 strcpy (local_copy_func_stab, func_stab);
688
689 tmp->name = xmalloc (strlen (name) + 1);
690
c906108c 691 /* local_copy_func_stab is a stabstring, let us first extract the
c5aa993b
JM
692 function name from the stab by NULLing out the ':' character. */
693
694
695 c = NULL;
696 c = strchr (local_copy_func_stab, ':');
697
c906108c
SS
698 if (c)
699 *c = '\0';
700 else
8a3fe4f8 701 error (_("Malformed function STAB found in add_common_block()"));
c5aa993b
JM
702
703
704 tmp->owning_function = xmalloc (strlen (local_copy_func_stab) + 1);
705
706 strcpy (tmp->owning_function, local_copy_func_stab);
707
708 strcpy (tmp->name, name);
709 tmp->offset = offset;
c906108c
SS
710 tmp->next = NULL;
711 tmp->entries = NULL;
c5aa993b
JM
712 tmp->secnum = secnum;
713
c906108c 714 current_common = tmp;
c5aa993b 715
c906108c
SS
716 if (head_common_list == NULL)
717 {
718 head_common_list = tail_common_list = tmp;
719 }
720 else
721 {
c5aa993b 722 tail_common_list->next = tmp;
c906108c
SS
723 tail_common_list = tmp;
724 }
725}
726#endif
727
728/* The following function simply enters a given common entry onto
c5aa993b 729 the "current_common" block that has been saved away. */
c906108c
SS
730
731#if 0
732static void
fba45db2 733add_common_entry (struct symbol *entry_sym_ptr)
c906108c
SS
734{
735 COMMON_ENTRY_PTR tmp;
c5aa993b
JM
736
737
738
c906108c
SS
739 /* The order of this list is important, since
740 we expect the entries to appear in decl.
c5aa993b
JM
741 order when we later issue "info common" calls */
742
743 tmp = allocate_common_entry_node ();
744
c906108c
SS
745 tmp->next = NULL;
746 tmp->symbol = entry_sym_ptr;
c5aa993b 747
c906108c 748 if (current_common == NULL)
8a3fe4f8 749 error (_("Attempt to add COMMON entry with no block open!"));
c5aa993b 750 else
c906108c
SS
751 {
752 if (current_common->entries == NULL)
753 {
754 current_common->entries = tmp;
c5aa993b 755 current_common->end_of_entries = tmp;
c906108c
SS
756 }
757 else
758 {
c5aa993b
JM
759 current_common->end_of_entries->next = tmp;
760 current_common->end_of_entries = tmp;
c906108c
SS
761 }
762 }
763}
764#endif
765
c5aa993b 766/* This routine finds the first encountred COMMON block named "name" */
c906108c
SS
767
768#if 0
769static SAVED_F77_COMMON_PTR
fba45db2 770find_first_common_named (char *name)
c906108c 771{
c5aa993b 772
c906108c 773 SAVED_F77_COMMON_PTR tmp;
c5aa993b 774
c906108c 775 tmp = head_common_list;
c5aa993b 776
c906108c
SS
777 while (tmp != NULL)
778 {
6314a349 779 if (strcmp (tmp->name, name) == 0)
c5aa993b 780 return (tmp);
c906108c
SS
781 else
782 tmp = tmp->next;
783 }
c5aa993b 784 return (NULL);
c906108c
SS
785}
786#endif
787
788/* This routine finds the first encountred COMMON block named "name"
c5aa993b 789 that belongs to function funcname */
c906108c 790
c5aa993b 791SAVED_F77_COMMON_PTR
fba45db2 792find_common_for_function (char *name, char *funcname)
c906108c 793{
c5aa993b 794
c906108c 795 SAVED_F77_COMMON_PTR tmp;
c5aa993b 796
c906108c 797 tmp = head_common_list;
c5aa993b 798
c906108c
SS
799 while (tmp != NULL)
800 {
cb137aa5
AC
801 if (DEPRECATED_STREQ (tmp->name, name)
802 && DEPRECATED_STREQ (tmp->owning_function, funcname))
c5aa993b 803 return (tmp);
c906108c
SS
804 else
805 tmp = tmp->next;
806 }
c5aa993b 807 return (NULL);
c906108c
SS
808}
809
810
811#if 0
812
813/* The following function is called to patch up the offsets
814 for the statics contained in the COMMON block named
c5aa993b 815 "name." */
c906108c
SS
816
817static void
fba45db2 818patch_common_entries (SAVED_F77_COMMON_PTR blk, CORE_ADDR offset, int secnum)
c906108c
SS
819{
820 COMMON_ENTRY_PTR entry;
c5aa993b
JM
821
822 blk->offset = offset; /* Keep this around for future use. */
823
c906108c 824 entry = blk->entries;
c5aa993b 825
c906108c
SS
826 while (entry != NULL)
827 {
c5aa993b 828 SYMBOL_VALUE (entry->symbol) += offset;
c906108c 829 SYMBOL_SECTION (entry->symbol) = secnum;
c5aa993b 830
c906108c
SS
831 entry = entry->next;
832 }
c5aa993b 833 blk->secnum = secnum;
c906108c
SS
834}
835
836/* Patch all commons named "name" that need patching.Since COMMON
837 blocks occur with relative infrequency, we simply do a linear scan on
838 the name. Eventually, the best way to do this will be a
839 hashed-lookup. Secnum is the section number for the .bss section
840 (which is where common data lives). */
841
842static void
fba45db2 843patch_all_commons_by_name (char *name, CORE_ADDR offset, int secnum)
c906108c 844{
c5aa993b 845
c906108c 846 SAVED_F77_COMMON_PTR tmp;
c5aa993b 847
c906108c
SS
848 /* For blank common blocks, change the canonical reprsentation
849 of a blank name */
c5aa993b 850
6314a349
AC
851 if (strcmp (name, BLANK_COMMON_NAME_ORIGINAL) == 0
852 || strcmp (name, BLANK_COMMON_NAME_MF77) == 0)
c906108c 853 {
b8c9b27d 854 xfree (name);
c5aa993b
JM
855 name = alloca (strlen (BLANK_COMMON_NAME_LOCAL) + 1);
856 strcpy (name, BLANK_COMMON_NAME_LOCAL);
c906108c 857 }
c5aa993b 858
c906108c 859 tmp = head_common_list;
c5aa993b 860
c906108c
SS
861 while (tmp != NULL)
862 {
c5aa993b 863 if (COMMON_NEEDS_PATCHING (tmp))
6314a349 864 if (strcmp (tmp->name, name) == 0)
c5aa993b
JM
865 patch_common_entries (tmp, offset, secnum);
866
c906108c 867 tmp = tmp->next;
c5aa993b 868 }
c906108c
SS
869}
870#endif
871
872/* This macro adds the symbol-number for the start of the function
873 (the symbol number of the .bf) referenced by symnum_fcn to a
874 list. This list, in reality should be a FIFO queue but since
875 #line pragmas sometimes cause line ranges to get messed up
876 we simply create a linear list. This list can then be searched
877 first by a queueing algorithm and upon failure fall back to
c5aa993b 878 a linear scan. */
c906108c
SS
879
880#if 0
881#define ADD_BF_SYMNUM(bf_sym,fcn_sym) \
882 \
883 if (saved_bf_list == NULL) \
884{ \
885 tmp_bf_ptr = allocate_saved_bf_node(); \
886 \
887 tmp_bf_ptr->symnum_bf = (bf_sym); \
888 tmp_bf_ptr->symnum_fcn = (fcn_sym); \
889 tmp_bf_ptr->next = NULL; \
890 \
891 current_head_bf_list = saved_bf_list = tmp_bf_ptr; \
892 saved_bf_list_end = tmp_bf_ptr; \
893 } \
894else \
895{ \
896 tmp_bf_ptr = allocate_saved_bf_node(); \
897 \
898 tmp_bf_ptr->symnum_bf = (bf_sym); \
899 tmp_bf_ptr->symnum_fcn = (fcn_sym); \
900 tmp_bf_ptr->next = NULL; \
901 \
902 saved_bf_list_end->next = tmp_bf_ptr; \
903 saved_bf_list_end = tmp_bf_ptr; \
c5aa993b 904 }
c906108c
SS
905#endif
906
c5aa993b 907/* This function frees the entire (.bf,function) list */
c906108c
SS
908
909#if 0
c5aa993b 910static void
fba45db2 911clear_bf_list (void)
c906108c 912{
c5aa993b 913
c906108c 914 SAVED_BF_PTR tmp = saved_bf_list;
c5aa993b
JM
915 SAVED_BF_PTR next = NULL;
916
c906108c
SS
917 while (tmp != NULL)
918 {
919 next = tmp->next;
b8c9b27d 920 xfree (tmp);
c5aa993b 921 tmp = next;
c906108c
SS
922 }
923 saved_bf_list = NULL;
924}
925#endif
926
927int global_remote_debug;
928
929#if 0
930
931static long
fba45db2 932get_bf_for_fcn (long the_function)
c906108c
SS
933{
934 SAVED_BF_PTR tmp;
935 int nprobes = 0;
c5aa993b 936
c906108c
SS
937 /* First use a simple queuing algorithm (i.e. look and see if the
938 item at the head of the queue is the one you want) */
c5aa993b 939
c906108c 940 if (saved_bf_list == NULL)
8e65ff28 941 internal_error (__FILE__, __LINE__,
e2e0b3e5 942 _("cannot get .bf node off empty list"));
c5aa993b
JM
943
944 if (current_head_bf_list != NULL)
c906108c
SS
945 if (current_head_bf_list->symnum_fcn == the_function)
946 {
c5aa993b 947 if (global_remote_debug)
dac8068e 948 fprintf_unfiltered (gdb_stderr, "*");
c906108c 949
c5aa993b 950 tmp = current_head_bf_list;
c906108c 951 current_head_bf_list = current_head_bf_list->next;
c5aa993b 952 return (tmp->symnum_bf);
c906108c 953 }
c5aa993b 954
c906108c
SS
955 /* If the above did not work (probably because #line directives were
956 used in the sourcefile and they messed up our internal tables) we now do
957 the ugly linear scan */
c5aa993b
JM
958
959 if (global_remote_debug)
dac8068e 960 fprintf_unfiltered (gdb_stderr, "\ndefaulting to linear scan\n");
c5aa993b
JM
961
962 nprobes = 0;
c906108c
SS
963 tmp = saved_bf_list;
964 while (tmp != NULL)
965 {
c5aa993b 966 nprobes++;
c906108c 967 if (tmp->symnum_fcn == the_function)
c5aa993b 968 {
c906108c 969 if (global_remote_debug)
dac8068e 970 fprintf_unfiltered (gdb_stderr, "Found in %d probes\n", nprobes);
c906108c 971 current_head_bf_list = tmp->next;
c5aa993b
JM
972 return (tmp->symnum_bf);
973 }
974 tmp = tmp->next;
c906108c 975 }
c5aa993b
JM
976
977 return (-1);
c906108c
SS
978}
979
c5aa993b
JM
980static SAVED_FUNCTION_PTR saved_function_list = NULL;
981static SAVED_FUNCTION_PTR saved_function_list_end = NULL;
c906108c
SS
982
983static void
fba45db2 984clear_function_list (void)
c906108c
SS
985{
986 SAVED_FUNCTION_PTR tmp = saved_function_list;
c5aa993b
JM
987 SAVED_FUNCTION_PTR next = NULL;
988
c906108c
SS
989 while (tmp != NULL)
990 {
991 next = tmp->next;
b8c9b27d 992 xfree (tmp);
c906108c
SS
993 tmp = next;
994 }
c5aa993b 995
c906108c
SS
996 saved_function_list = NULL;
997}
998#endif