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