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