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