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