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