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