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