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