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