PR 5646
[deliverable/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;
cad351d1
UW
301}
302
c906108c
SS
303/* This is declared in c-lang.h but it is silly to import that file for what
304 is already just a hack. */
d9fcf2fb
JM
305extern int c_value_print (struct value *, struct ui_file *, int,
306 enum val_prettyprint);
c906108c 307
c5aa993b
JM
308const struct language_defn f_language_defn =
309{
c906108c
SS
310 "fortran",
311 language_fortran,
c906108c
SS
312 range_check_on,
313 type_check_on,
63872f9d 314 case_sensitive_off,
7ca2d3a3 315 array_column_major,
5f9769d1 316 &exp_descriptor_standard,
c906108c
SS
317 f_parse, /* parser */
318 f_error, /* parser error function */
e85c3284 319 null_post_parser,
c906108c
SS
320 f_printchar, /* Print character constant */
321 f_printstr, /* function to print string constant */
322 f_emit_char, /* Function to print a single character */
c5aa993b 323 f_print_type, /* Print a type using appropriate syntax */
c906108c 324 f_val_print, /* Print a value using appropriate syntax */
c5aa993b 325 c_value_print, /* FIXME */
f636b87d 326 NULL, /* Language specific skip_trampoline */
5f9a71c3
DC
327 value_of_this, /* value_of_this */
328 basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
b368761e 329 basic_lookup_transparent_type,/* lookup_transparent_type */
9a3d7dfd 330 NULL, /* Language specific symbol demangler */
31c27f77 331 NULL, /* Language specific class_name_from_physname */
c906108c
SS
332 f_op_print_tab, /* expression operators for printing */
333 0, /* arrays are first-class (not c-style) */
334 1, /* String lower bound */
6084f43a 335 default_word_break_characters,
cad351d1 336 f_language_arch_info,
e79af960 337 default_print_array_index,
41f1b697 338 default_pass_by_reference,
c906108c 339 LANG_MAGIC
c5aa993b 340};
c906108c 341
54ef06c7
UW
342static void *
343build_fortran_types (struct gdbarch *gdbarch)
c906108c 344{
54ef06c7
UW
345 struct builtin_f_type *builtin_f_type
346 = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct builtin_f_type);
347
348 builtin_f_type->builtin_void =
c906108c
SS
349 init_type (TYPE_CODE_VOID, 1,
350 0,
351 "VOID", (struct objfile *) NULL);
c5aa993b 352
54ef06c7 353 builtin_f_type->builtin_character =
c906108c
SS
354 init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
355 0,
356 "character", (struct objfile *) NULL);
c5aa993b 357
54ef06c7 358 builtin_f_type->builtin_logical_s1 =
c906108c
SS
359 init_type (TYPE_CODE_BOOL, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
360 TYPE_FLAG_UNSIGNED,
361 "logical*1", (struct objfile *) NULL);
c5aa993b 362
54ef06c7 363 builtin_f_type->builtin_integer_s2 =
9a76efb6 364 init_type (TYPE_CODE_INT,
bb09620c 365 gdbarch_short_bit (gdbarch) / TARGET_CHAR_BIT,
9a76efb6 366 0, "integer*2", (struct objfile *) NULL);
c5aa993b 367
54ef06c7 368 builtin_f_type->builtin_logical_s2 =
9a76efb6 369 init_type (TYPE_CODE_BOOL,
bb09620c 370 gdbarch_short_bit (gdbarch) / TARGET_CHAR_BIT,
9a76efb6 371 TYPE_FLAG_UNSIGNED, "logical*2", (struct objfile *) NULL);
c5aa993b 372
54ef06c7 373 builtin_f_type->builtin_integer =
9a76efb6 374 init_type (TYPE_CODE_INT,
bb09620c 375 gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT,
9a76efb6 376 0, "integer", (struct objfile *) NULL);
c5aa993b 377
54ef06c7 378 builtin_f_type->builtin_logical =
9a76efb6 379 init_type (TYPE_CODE_BOOL,
bb09620c 380 gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT,
9a76efb6 381 TYPE_FLAG_UNSIGNED, "logical*4", (struct objfile *) NULL);
c5aa993b 382
54ef06c7 383 builtin_f_type->builtin_real =
ea06eb3d 384 init_type (TYPE_CODE_FLT,
bb09620c 385 gdbarch_float_bit (gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
386 0,
387 "real", (struct objfile *) NULL);
c5aa993b 388
54ef06c7 389 builtin_f_type->builtin_real_s8 =
ea06eb3d 390 init_type (TYPE_CODE_FLT,
bb09620c 391 gdbarch_double_bit (gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
392 0,
393 "real*8", (struct objfile *) NULL);
c5aa993b 394
54ef06c7 395 builtin_f_type->builtin_real_s16 =
ea06eb3d 396 init_type (TYPE_CODE_FLT,
bb09620c 397 gdbarch_long_double_bit (gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
398 0,
399 "real*16", (struct objfile *) NULL);
c5aa993b 400
54ef06c7 401 builtin_f_type->builtin_complex_s8 =
ea06eb3d 402 init_type (TYPE_CODE_COMPLEX,
bb09620c 403 2 * gdbarch_float_bit (gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
404 0,
405 "complex*8", (struct objfile *) NULL);
54ef06c7
UW
406 TYPE_TARGET_TYPE (builtin_f_type->builtin_complex_s8)
407 = builtin_f_type->builtin_real;
c5aa993b 408
54ef06c7 409 builtin_f_type->builtin_complex_s16 =
ea06eb3d 410 init_type (TYPE_CODE_COMPLEX,
bb09620c 411 2 * gdbarch_double_bit (gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
412 0,
413 "complex*16", (struct objfile *) NULL);
54ef06c7
UW
414 TYPE_TARGET_TYPE (builtin_f_type->builtin_complex_s16)
415 = builtin_f_type->builtin_real_s8;
c5aa993b 416
c906108c
SS
417 /* We have a new size == 4 double floats for the
418 complex*32 data type */
c5aa993b 419
54ef06c7 420 builtin_f_type->builtin_complex_s32 =
ea06eb3d 421 init_type (TYPE_CODE_COMPLEX,
bb09620c 422 2 * gdbarch_long_double_bit (gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
423 0,
424 "complex*32", (struct objfile *) NULL);
54ef06c7
UW
425 TYPE_TARGET_TYPE (builtin_f_type->builtin_complex_s32)
426 = builtin_f_type->builtin_real_s16;
427
428 return builtin_f_type;
429}
430
431static struct gdbarch_data *f_type_data;
432
433const struct builtin_f_type *
434builtin_f_type (struct gdbarch *gdbarch)
435{
436 return gdbarch_data (gdbarch, f_type_data);
4e845cd3
MS
437}
438
439void
440_initialize_f_language (void)
441{
54ef06c7 442 f_type_data = gdbarch_data_register_post_init (build_fortran_types);
c906108c 443
c906108c
SS
444 add_language (&f_language_defn);
445}
446
447#if 0
448static SAVED_BF_PTR
fba45db2 449allocate_saved_bf_node (void)
c906108c
SS
450{
451 SAVED_BF_PTR new;
c5aa993b 452
c906108c 453 new = (SAVED_BF_PTR) xmalloc (sizeof (SAVED_BF));
c5aa993b 454 return (new);
c906108c
SS
455}
456
457static SAVED_FUNCTION *
fba45db2 458allocate_saved_function_node (void)
c906108c
SS
459{
460 SAVED_FUNCTION *new;
c5aa993b 461
c906108c 462 new = (SAVED_FUNCTION *) xmalloc (sizeof (SAVED_FUNCTION));
c5aa993b 463 return (new);
c906108c
SS
464}
465
c5aa993b 466static SAVED_F77_COMMON_PTR
fba45db2 467allocate_saved_f77_common_node (void)
c906108c
SS
468{
469 SAVED_F77_COMMON_PTR new;
c5aa993b 470
c906108c 471 new = (SAVED_F77_COMMON_PTR) xmalloc (sizeof (SAVED_F77_COMMON));
c5aa993b 472 return (new);
c906108c
SS
473}
474
c5aa993b 475static COMMON_ENTRY_PTR
fba45db2 476allocate_common_entry_node (void)
c906108c
SS
477{
478 COMMON_ENTRY_PTR new;
c5aa993b 479
c906108c 480 new = (COMMON_ENTRY_PTR) xmalloc (sizeof (COMMON_ENTRY));
c5aa993b 481 return (new);
c906108c
SS
482}
483#endif
484
c5aa993b
JM
485SAVED_F77_COMMON_PTR head_common_list = NULL; /* Ptr to 1st saved COMMON */
486SAVED_F77_COMMON_PTR tail_common_list = NULL; /* Ptr to last saved COMMON */
487SAVED_F77_COMMON_PTR current_common = NULL; /* Ptr to current COMMON */
c906108c
SS
488
489#if 0
c5aa993b
JM
490static SAVED_BF_PTR saved_bf_list = NULL; /* Ptr to (.bf,function)
491 list */
492static SAVED_BF_PTR saved_bf_list_end = NULL; /* Ptr to above list's end */
493static SAVED_BF_PTR current_head_bf_list = NULL; /* Current head of above list
494 */
c906108c 495
c5aa993b
JM
496static SAVED_BF_PTR tmp_bf_ptr; /* Generic temporary for use
497 in macros */
c906108c
SS
498
499/* The following function simply enters a given common block onto
500 the global common block chain */
501
502static void
fba45db2 503add_common_block (char *name, CORE_ADDR offset, int secnum, char *func_stab)
c906108c
SS
504{
505 SAVED_F77_COMMON_PTR tmp;
c5aa993b
JM
506 char *c, *local_copy_func_stab;
507
c906108c
SS
508 /* If the COMMON block we are trying to add has a blank
509 name (i.e. "#BLNK_COM") then we set it to __BLANK
510 because the darn "#" character makes GDB's input
c5aa993b
JM
511 parser have fits. */
512
513
6314a349
AC
514 if (strcmp (name, BLANK_COMMON_NAME_ORIGINAL) == 0
515 || strcmp (name, BLANK_COMMON_NAME_MF77) == 0)
c906108c 516 {
c5aa993b 517
b8c9b27d 518 xfree (name);
c5aa993b
JM
519 name = alloca (strlen (BLANK_COMMON_NAME_LOCAL) + 1);
520 strcpy (name, BLANK_COMMON_NAME_LOCAL);
c906108c 521 }
c5aa993b
JM
522
523 tmp = allocate_saved_f77_common_node ();
524
525 local_copy_func_stab = xmalloc (strlen (func_stab) + 1);
526 strcpy (local_copy_func_stab, func_stab);
527
528 tmp->name = xmalloc (strlen (name) + 1);
529
c906108c 530 /* local_copy_func_stab is a stabstring, let us first extract the
c5aa993b
JM
531 function name from the stab by NULLing out the ':' character. */
532
533
534 c = NULL;
535 c = strchr (local_copy_func_stab, ':');
536
c906108c
SS
537 if (c)
538 *c = '\0';
539 else
8a3fe4f8 540 error (_("Malformed function STAB found in add_common_block()"));
c5aa993b
JM
541
542
543 tmp->owning_function = xmalloc (strlen (local_copy_func_stab) + 1);
544
545 strcpy (tmp->owning_function, local_copy_func_stab);
546
547 strcpy (tmp->name, name);
548 tmp->offset = offset;
c906108c
SS
549 tmp->next = NULL;
550 tmp->entries = NULL;
c5aa993b
JM
551 tmp->secnum = secnum;
552
c906108c 553 current_common = tmp;
c5aa993b 554
c906108c
SS
555 if (head_common_list == NULL)
556 {
557 head_common_list = tail_common_list = tmp;
558 }
559 else
560 {
c5aa993b 561 tail_common_list->next = tmp;
c906108c
SS
562 tail_common_list = tmp;
563 }
564}
565#endif
566
567/* The following function simply enters a given common entry onto
c5aa993b 568 the "current_common" block that has been saved away. */
c906108c
SS
569
570#if 0
571static void
fba45db2 572add_common_entry (struct symbol *entry_sym_ptr)
c906108c
SS
573{
574 COMMON_ENTRY_PTR tmp;
c5aa993b
JM
575
576
577
c906108c
SS
578 /* The order of this list is important, since
579 we expect the entries to appear in decl.
c5aa993b
JM
580 order when we later issue "info common" calls */
581
582 tmp = allocate_common_entry_node ();
583
c906108c
SS
584 tmp->next = NULL;
585 tmp->symbol = entry_sym_ptr;
c5aa993b 586
c906108c 587 if (current_common == NULL)
8a3fe4f8 588 error (_("Attempt to add COMMON entry with no block open!"));
c5aa993b 589 else
c906108c
SS
590 {
591 if (current_common->entries == NULL)
592 {
593 current_common->entries = tmp;
c5aa993b 594 current_common->end_of_entries = tmp;
c906108c
SS
595 }
596 else
597 {
c5aa993b
JM
598 current_common->end_of_entries->next = tmp;
599 current_common->end_of_entries = tmp;
c906108c
SS
600 }
601 }
602}
603#endif
604
c5aa993b 605/* This routine finds the first encountred COMMON block named "name" */
c906108c
SS
606
607#if 0
608static SAVED_F77_COMMON_PTR
fba45db2 609find_first_common_named (char *name)
c906108c 610{
c5aa993b 611
c906108c 612 SAVED_F77_COMMON_PTR tmp;
c5aa993b 613
c906108c 614 tmp = head_common_list;
c5aa993b 615
c906108c
SS
616 while (tmp != NULL)
617 {
6314a349 618 if (strcmp (tmp->name, name) == 0)
c5aa993b 619 return (tmp);
c906108c
SS
620 else
621 tmp = tmp->next;
622 }
c5aa993b 623 return (NULL);
c906108c
SS
624}
625#endif
626
627/* This routine finds the first encountred COMMON block named "name"
c5aa993b 628 that belongs to function funcname */
c906108c 629
c5aa993b 630SAVED_F77_COMMON_PTR
fba45db2 631find_common_for_function (char *name, char *funcname)
c906108c 632{
c5aa993b 633
c906108c 634 SAVED_F77_COMMON_PTR tmp;
c5aa993b 635
c906108c 636 tmp = head_common_list;
c5aa993b 637
c906108c
SS
638 while (tmp != NULL)
639 {
7ecb6532
MD
640 if (strcmp (tmp->name, name) == 0
641 && strcmp (tmp->owning_function, funcname) == 0)
c5aa993b 642 return (tmp);
c906108c
SS
643 else
644 tmp = tmp->next;
645 }
c5aa993b 646 return (NULL);
c906108c
SS
647}
648
649
650#if 0
651
652/* The following function is called to patch up the offsets
653 for the statics contained in the COMMON block named
c5aa993b 654 "name." */
c906108c
SS
655
656static void
fba45db2 657patch_common_entries (SAVED_F77_COMMON_PTR blk, CORE_ADDR offset, int secnum)
c906108c
SS
658{
659 COMMON_ENTRY_PTR entry;
c5aa993b
JM
660
661 blk->offset = offset; /* Keep this around for future use. */
662
c906108c 663 entry = blk->entries;
c5aa993b 664
c906108c
SS
665 while (entry != NULL)
666 {
c5aa993b 667 SYMBOL_VALUE (entry->symbol) += offset;
c906108c 668 SYMBOL_SECTION (entry->symbol) = secnum;
c5aa993b 669
c906108c
SS
670 entry = entry->next;
671 }
c5aa993b 672 blk->secnum = secnum;
c906108c
SS
673}
674
675/* Patch all commons named "name" that need patching.Since COMMON
676 blocks occur with relative infrequency, we simply do a linear scan on
677 the name. Eventually, the best way to do this will be a
678 hashed-lookup. Secnum is the section number for the .bss section
679 (which is where common data lives). */
680
681static void
fba45db2 682patch_all_commons_by_name (char *name, CORE_ADDR offset, int secnum)
c906108c 683{
c5aa993b 684
c906108c 685 SAVED_F77_COMMON_PTR tmp;
c5aa993b 686
c906108c
SS
687 /* For blank common blocks, change the canonical reprsentation
688 of a blank name */
c5aa993b 689
6314a349
AC
690 if (strcmp (name, BLANK_COMMON_NAME_ORIGINAL) == 0
691 || strcmp (name, BLANK_COMMON_NAME_MF77) == 0)
c906108c 692 {
b8c9b27d 693 xfree (name);
c5aa993b
JM
694 name = alloca (strlen (BLANK_COMMON_NAME_LOCAL) + 1);
695 strcpy (name, BLANK_COMMON_NAME_LOCAL);
c906108c 696 }
c5aa993b 697
c906108c 698 tmp = head_common_list;
c5aa993b 699
c906108c
SS
700 while (tmp != NULL)
701 {
c5aa993b 702 if (COMMON_NEEDS_PATCHING (tmp))
6314a349 703 if (strcmp (tmp->name, name) == 0)
c5aa993b
JM
704 patch_common_entries (tmp, offset, secnum);
705
c906108c 706 tmp = tmp->next;
c5aa993b 707 }
c906108c
SS
708}
709#endif
710
711/* This macro adds the symbol-number for the start of the function
712 (the symbol number of the .bf) referenced by symnum_fcn to a
713 list. This list, in reality should be a FIFO queue but since
714 #line pragmas sometimes cause line ranges to get messed up
715 we simply create a linear list. This list can then be searched
716 first by a queueing algorithm and upon failure fall back to
c5aa993b 717 a linear scan. */
c906108c
SS
718
719#if 0
720#define ADD_BF_SYMNUM(bf_sym,fcn_sym) \
721 \
722 if (saved_bf_list == NULL) \
723{ \
724 tmp_bf_ptr = allocate_saved_bf_node(); \
725 \
726 tmp_bf_ptr->symnum_bf = (bf_sym); \
727 tmp_bf_ptr->symnum_fcn = (fcn_sym); \
728 tmp_bf_ptr->next = NULL; \
729 \
730 current_head_bf_list = saved_bf_list = tmp_bf_ptr; \
731 saved_bf_list_end = tmp_bf_ptr; \
732 } \
733else \
734{ \
735 tmp_bf_ptr = allocate_saved_bf_node(); \
736 \
737 tmp_bf_ptr->symnum_bf = (bf_sym); \
738 tmp_bf_ptr->symnum_fcn = (fcn_sym); \
739 tmp_bf_ptr->next = NULL; \
740 \
741 saved_bf_list_end->next = tmp_bf_ptr; \
742 saved_bf_list_end = tmp_bf_ptr; \
c5aa993b 743 }
c906108c
SS
744#endif
745
c5aa993b 746/* This function frees the entire (.bf,function) list */
c906108c
SS
747
748#if 0
c5aa993b 749static void
fba45db2 750clear_bf_list (void)
c906108c 751{
c5aa993b 752
c906108c 753 SAVED_BF_PTR tmp = saved_bf_list;
c5aa993b
JM
754 SAVED_BF_PTR next = NULL;
755
c906108c
SS
756 while (tmp != NULL)
757 {
758 next = tmp->next;
b8c9b27d 759 xfree (tmp);
c5aa993b 760 tmp = next;
c906108c
SS
761 }
762 saved_bf_list = NULL;
763}
764#endif
765
766int global_remote_debug;
767
768#if 0
769
770static long
fba45db2 771get_bf_for_fcn (long the_function)
c906108c
SS
772{
773 SAVED_BF_PTR tmp;
774 int nprobes = 0;
c5aa993b 775
c906108c
SS
776 /* First use a simple queuing algorithm (i.e. look and see if the
777 item at the head of the queue is the one you want) */
c5aa993b 778
c906108c 779 if (saved_bf_list == NULL)
8e65ff28 780 internal_error (__FILE__, __LINE__,
e2e0b3e5 781 _("cannot get .bf node off empty list"));
c5aa993b
JM
782
783 if (current_head_bf_list != NULL)
c906108c
SS
784 if (current_head_bf_list->symnum_fcn == the_function)
785 {
c5aa993b 786 if (global_remote_debug)
dac8068e 787 fprintf_unfiltered (gdb_stderr, "*");
c906108c 788
c5aa993b 789 tmp = current_head_bf_list;
c906108c 790 current_head_bf_list = current_head_bf_list->next;
c5aa993b 791 return (tmp->symnum_bf);
c906108c 792 }
c5aa993b 793
c906108c
SS
794 /* If the above did not work (probably because #line directives were
795 used in the sourcefile and they messed up our internal tables) we now do
796 the ugly linear scan */
c5aa993b
JM
797
798 if (global_remote_debug)
dac8068e 799 fprintf_unfiltered (gdb_stderr, "\ndefaulting to linear scan\n");
c5aa993b
JM
800
801 nprobes = 0;
c906108c
SS
802 tmp = saved_bf_list;
803 while (tmp != NULL)
804 {
c5aa993b 805 nprobes++;
c906108c 806 if (tmp->symnum_fcn == the_function)
c5aa993b 807 {
c906108c 808 if (global_remote_debug)
dac8068e 809 fprintf_unfiltered (gdb_stderr, "Found in %d probes\n", nprobes);
c906108c 810 current_head_bf_list = tmp->next;
c5aa993b
JM
811 return (tmp->symnum_bf);
812 }
813 tmp = tmp->next;
c906108c 814 }
c5aa993b
JM
815
816 return (-1);
c906108c
SS
817}
818
c5aa993b
JM
819static SAVED_FUNCTION_PTR saved_function_list = NULL;
820static SAVED_FUNCTION_PTR saved_function_list_end = NULL;
c906108c
SS
821
822static void
fba45db2 823clear_function_list (void)
c906108c
SS
824{
825 SAVED_FUNCTION_PTR tmp = saved_function_list;
c5aa993b
JM
826 SAVED_FUNCTION_PTR next = NULL;
827
c906108c
SS
828 while (tmp != NULL)
829 {
830 next = tmp->next;
b8c9b27d 831 xfree (tmp);
c906108c
SS
832 tmp = next;
833 }
c5aa993b 834
c906108c
SS
835 saved_function_list = NULL;
836}
837#endif
This page took 0.535918 seconds and 4 git commands to generate.