* i386-linux-tdep.c (I386_LINUX_RECORD_SIZE_*,
[deliverable/binutils-gdb.git] / gdb / f-lang.c
CommitLineData
c906108c 1/* Fortran language support routines for GDB, the GNU debugger.
ce27fb25 2
6aba47ca 3 Copyright (C) 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003,
0fb0cc75 4 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
ce27fb25 5
c906108c
SS
6 Contributed by Motorola. Adapted from the C parser by Farooq Butt
7 (fmbutt@engage.sps.mot.com).
8
c5aa993b 9 This file is part of GDB.
c906108c 10
c5aa993b
JM
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
a9762ec7 13 the Free Software Foundation; either version 3 of the License, or
c5aa993b 14 (at your option) any later version.
c906108c 15
c5aa993b
JM
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
c906108c 20
c5aa993b 21 You should have received a copy of the GNU General Public License
a9762ec7 22 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
23
24#include "defs.h"
25#include "gdb_string.h"
26#include "symtab.h"
27#include "gdbtypes.h"
28#include "expression.h"
29#include "parser-defs.h"
30#include "language.h"
31#include "f-lang.h"
745b8ca0 32#include "valprint.h"
5f9a71c3 33#include "value.h"
c906108c 34
c906108c
SS
35
36/* Following is dubious stuff that had been in the xcoff reader. */
37
38struct saved_fcn
c5aa993b
JM
39 {
40 long line_offset; /* Line offset for function */
41 struct saved_fcn *next;
42 };
c906108c
SS
43
44
c5aa993b
JM
45struct saved_bf_symnum
46 {
47 long symnum_fcn; /* Symnum of function (i.e. .function directive) */
48 long symnum_bf; /* Symnum of .bf for this function */
49 struct saved_bf_symnum *next;
50 };
c906108c 51
c5aa993b
JM
52typedef struct saved_fcn SAVED_FUNCTION, *SAVED_FUNCTION_PTR;
53typedef struct saved_bf_symnum SAVED_BF, *SAVED_BF_PTR;
c906108c
SS
54
55/* Local functions */
56
a14ed312 57extern void _initialize_f_language (void);
c906108c 58#if 0
a14ed312
KB
59static void clear_function_list (void);
60static long get_bf_for_fcn (long);
61static void clear_bf_list (void);
62static void patch_all_commons_by_name (char *, CORE_ADDR, int);
63static SAVED_F77_COMMON_PTR find_first_common_named (char *);
64static void add_common_entry (struct symbol *);
65static void add_common_block (char *, CORE_ADDR, int, char *);
66static SAVED_FUNCTION *allocate_saved_function_node (void);
67static SAVED_BF_PTR allocate_saved_bf_node (void);
68static COMMON_ENTRY_PTR allocate_common_entry_node (void);
69static SAVED_F77_COMMON_PTR allocate_saved_f77_common_node (void);
70static void patch_common_entries (SAVED_F77_COMMON_PTR, CORE_ADDR, int);
c906108c
SS
71#endif
72
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
TT
145f_printstr (struct ui_file *stream, struct type *type, const gdb_byte *string,
146 unsigned int length, 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,
262 f_primitive_type_integer,
263 f_primitive_type_integer_s2,
264 f_primitive_type_real,
265 f_primitive_type_real_s8,
266 f_primitive_type_real_s16,
267 f_primitive_type_complex_s8,
268 f_primitive_type_complex_s16,
269 f_primitive_type_void,
270 nr_f_primitive_types
c906108c
SS
271};
272
cad351d1
UW
273static void
274f_language_arch_info (struct gdbarch *gdbarch,
275 struct language_arch_info *lai)
276{
54ef06c7
UW
277 const struct builtin_f_type *builtin = builtin_f_type (gdbarch);
278
279 lai->string_char_type = builtin->builtin_character;
cad351d1
UW
280 lai->primitive_type_vector
281 = GDBARCH_OBSTACK_CALLOC (gdbarch, nr_f_primitive_types + 1,
282 struct type *);
283
284 lai->primitive_type_vector [f_primitive_type_character]
54ef06c7 285 = builtin->builtin_character;
cad351d1 286 lai->primitive_type_vector [f_primitive_type_logical]
54ef06c7 287 = builtin->builtin_logical;
cad351d1 288 lai->primitive_type_vector [f_primitive_type_logical_s1]
54ef06c7 289 = builtin->builtin_logical_s1;
cad351d1 290 lai->primitive_type_vector [f_primitive_type_logical_s2]
54ef06c7 291 = builtin->builtin_logical_s2;
cad351d1 292 lai->primitive_type_vector [f_primitive_type_real]
54ef06c7 293 = builtin->builtin_real;
cad351d1 294 lai->primitive_type_vector [f_primitive_type_real_s8]
54ef06c7 295 = builtin->builtin_real_s8;
cad351d1 296 lai->primitive_type_vector [f_primitive_type_real_s16]
54ef06c7 297 = builtin->builtin_real_s16;
cad351d1 298 lai->primitive_type_vector [f_primitive_type_complex_s8]
54ef06c7 299 = builtin->builtin_complex_s8;
cad351d1 300 lai->primitive_type_vector [f_primitive_type_complex_s16]
54ef06c7 301 = builtin->builtin_complex_s16;
cad351d1 302 lai->primitive_type_vector [f_primitive_type_void]
54ef06c7 303 = builtin->builtin_void;
fbb06eb1
UW
304
305 lai->bool_type_symbol = "logical";
306 lai->bool_type_default = builtin->builtin_logical_s2;
cad351d1
UW
307}
308
c906108c
SS
309/* This is declared in c-lang.h but it is silly to import that file for what
310 is already just a hack. */
79a45b7d
TT
311extern int c_value_print (struct value *, struct ui_file *,
312 const struct value_print_options *);
c906108c 313
c5aa993b
JM
314const struct language_defn f_language_defn =
315{
c906108c
SS
316 "fortran",
317 language_fortran,
c906108c
SS
318 range_check_on,
319 type_check_on,
63872f9d 320 case_sensitive_off,
7ca2d3a3 321 array_column_major,
9a044a89 322 macro_expansion_no,
5f9769d1 323 &exp_descriptor_standard,
c906108c
SS
324 f_parse, /* parser */
325 f_error, /* parser error function */
e85c3284 326 null_post_parser,
c906108c
SS
327 f_printchar, /* Print character constant */
328 f_printstr, /* function to print string constant */
329 f_emit_char, /* Function to print a single character */
c5aa993b 330 f_print_type, /* Print a type using appropriate syntax */
5c6ce71d 331 default_print_typedef, /* Print a typedef using appropriate syntax */
c906108c 332 f_val_print, /* Print a value using appropriate syntax */
c5aa993b 333 c_value_print, /* FIXME */
f636b87d 334 NULL, /* Language specific skip_trampoline */
2b2d9e11 335 NULL, /* name_of_this */
5f9a71c3 336 basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
b368761e 337 basic_lookup_transparent_type,/* lookup_transparent_type */
9a3d7dfd 338 NULL, /* Language specific symbol demangler */
31c27f77 339 NULL, /* Language specific class_name_from_physname */
c906108c
SS
340 f_op_print_tab, /* expression operators for printing */
341 0, /* arrays are first-class (not c-style) */
342 1, /* String lower bound */
6084f43a 343 default_word_break_characters,
41d27058 344 default_make_symbol_completion_list,
cad351d1 345 f_language_arch_info,
e79af960 346 default_print_array_index,
41f1b697 347 default_pass_by_reference,
ae6a3a4c 348 default_get_string,
c906108c 349 LANG_MAGIC
c5aa993b 350};
c906108c 351
54ef06c7
UW
352static void *
353build_fortran_types (struct gdbarch *gdbarch)
c906108c 354{
54ef06c7
UW
355 struct builtin_f_type *builtin_f_type
356 = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct builtin_f_type);
357
358 builtin_f_type->builtin_void =
c906108c
SS
359 init_type (TYPE_CODE_VOID, 1,
360 0,
361 "VOID", (struct objfile *) NULL);
c5aa993b 362
54ef06c7 363 builtin_f_type->builtin_character =
c906108c
SS
364 init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
365 0,
366 "character", (struct objfile *) NULL);
c5aa993b 367
54ef06c7 368 builtin_f_type->builtin_logical_s1 =
c906108c
SS
369 init_type (TYPE_CODE_BOOL, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
370 TYPE_FLAG_UNSIGNED,
371 "logical*1", (struct objfile *) NULL);
c5aa993b 372
54ef06c7 373 builtin_f_type->builtin_integer_s2 =
9a76efb6 374 init_type (TYPE_CODE_INT,
bb09620c 375 gdbarch_short_bit (gdbarch) / TARGET_CHAR_BIT,
9a76efb6 376 0, "integer*2", (struct objfile *) NULL);
c5aa993b 377
54ef06c7 378 builtin_f_type->builtin_logical_s2 =
9a76efb6 379 init_type (TYPE_CODE_BOOL,
bb09620c 380 gdbarch_short_bit (gdbarch) / TARGET_CHAR_BIT,
9a76efb6 381 TYPE_FLAG_UNSIGNED, "logical*2", (struct objfile *) NULL);
c5aa993b 382
54ef06c7 383 builtin_f_type->builtin_integer =
9a76efb6 384 init_type (TYPE_CODE_INT,
bb09620c 385 gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT,
9a76efb6 386 0, "integer", (struct objfile *) NULL);
c5aa993b 387
54ef06c7 388 builtin_f_type->builtin_logical =
9a76efb6 389 init_type (TYPE_CODE_BOOL,
bb09620c 390 gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT,
9a76efb6 391 TYPE_FLAG_UNSIGNED, "logical*4", (struct objfile *) NULL);
c5aa993b 392
54ef06c7 393 builtin_f_type->builtin_real =
ea06eb3d 394 init_type (TYPE_CODE_FLT,
bb09620c 395 gdbarch_float_bit (gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
396 0,
397 "real", (struct objfile *) NULL);
c5aa993b 398
54ef06c7 399 builtin_f_type->builtin_real_s8 =
ea06eb3d 400 init_type (TYPE_CODE_FLT,
bb09620c 401 gdbarch_double_bit (gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
402 0,
403 "real*8", (struct objfile *) NULL);
c5aa993b 404
54ef06c7 405 builtin_f_type->builtin_real_s16 =
ea06eb3d 406 init_type (TYPE_CODE_FLT,
bb09620c 407 gdbarch_long_double_bit (gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
408 0,
409 "real*16", (struct objfile *) NULL);
c5aa993b 410
54ef06c7 411 builtin_f_type->builtin_complex_s8 =
ea06eb3d 412 init_type (TYPE_CODE_COMPLEX,
bb09620c 413 2 * gdbarch_float_bit (gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
414 0,
415 "complex*8", (struct objfile *) NULL);
54ef06c7
UW
416 TYPE_TARGET_TYPE (builtin_f_type->builtin_complex_s8)
417 = builtin_f_type->builtin_real;
c5aa993b 418
54ef06c7 419 builtin_f_type->builtin_complex_s16 =
ea06eb3d 420 init_type (TYPE_CODE_COMPLEX,
bb09620c 421 2 * gdbarch_double_bit (gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
422 0,
423 "complex*16", (struct objfile *) NULL);
54ef06c7
UW
424 TYPE_TARGET_TYPE (builtin_f_type->builtin_complex_s16)
425 = builtin_f_type->builtin_real_s8;
c5aa993b 426
c906108c
SS
427 /* We have a new size == 4 double floats for the
428 complex*32 data type */
c5aa993b 429
54ef06c7 430 builtin_f_type->builtin_complex_s32 =
ea06eb3d 431 init_type (TYPE_CODE_COMPLEX,
bb09620c 432 2 * gdbarch_long_double_bit (gdbarch) / TARGET_CHAR_BIT,
c906108c
SS
433 0,
434 "complex*32", (struct objfile *) NULL);
54ef06c7
UW
435 TYPE_TARGET_TYPE (builtin_f_type->builtin_complex_s32)
436 = builtin_f_type->builtin_real_s16;
437
438 return builtin_f_type;
439}
440
441static struct gdbarch_data *f_type_data;
442
443const struct builtin_f_type *
444builtin_f_type (struct gdbarch *gdbarch)
445{
446 return gdbarch_data (gdbarch, f_type_data);
4e845cd3
MS
447}
448
449void
450_initialize_f_language (void)
451{
54ef06c7 452 f_type_data = gdbarch_data_register_post_init (build_fortran_types);
c906108c 453
c906108c
SS
454 add_language (&f_language_defn);
455}
456
457#if 0
458static SAVED_BF_PTR
fba45db2 459allocate_saved_bf_node (void)
c906108c
SS
460{
461 SAVED_BF_PTR new;
c5aa993b 462
c906108c 463 new = (SAVED_BF_PTR) xmalloc (sizeof (SAVED_BF));
c5aa993b 464 return (new);
c906108c
SS
465}
466
467static SAVED_FUNCTION *
fba45db2 468allocate_saved_function_node (void)
c906108c
SS
469{
470 SAVED_FUNCTION *new;
c5aa993b 471
c906108c 472 new = (SAVED_FUNCTION *) xmalloc (sizeof (SAVED_FUNCTION));
c5aa993b 473 return (new);
c906108c
SS
474}
475
c5aa993b 476static SAVED_F77_COMMON_PTR
fba45db2 477allocate_saved_f77_common_node (void)
c906108c
SS
478{
479 SAVED_F77_COMMON_PTR new;
c5aa993b 480
c906108c 481 new = (SAVED_F77_COMMON_PTR) xmalloc (sizeof (SAVED_F77_COMMON));
c5aa993b 482 return (new);
c906108c
SS
483}
484
c5aa993b 485static COMMON_ENTRY_PTR
fba45db2 486allocate_common_entry_node (void)
c906108c
SS
487{
488 COMMON_ENTRY_PTR new;
c5aa993b 489
c906108c 490 new = (COMMON_ENTRY_PTR) xmalloc (sizeof (COMMON_ENTRY));
c5aa993b 491 return (new);
c906108c
SS
492}
493#endif
494
c5aa993b
JM
495SAVED_F77_COMMON_PTR head_common_list = NULL; /* Ptr to 1st saved COMMON */
496SAVED_F77_COMMON_PTR tail_common_list = NULL; /* Ptr to last saved COMMON */
497SAVED_F77_COMMON_PTR current_common = NULL; /* Ptr to current COMMON */
c906108c
SS
498
499#if 0
c5aa993b
JM
500static SAVED_BF_PTR saved_bf_list = NULL; /* Ptr to (.bf,function)
501 list */
502static SAVED_BF_PTR saved_bf_list_end = NULL; /* Ptr to above list's end */
503static SAVED_BF_PTR current_head_bf_list = NULL; /* Current head of above list
504 */
c906108c 505
c5aa993b
JM
506static SAVED_BF_PTR tmp_bf_ptr; /* Generic temporary for use
507 in macros */
c906108c
SS
508
509/* The following function simply enters a given common block onto
510 the global common block chain */
511
512static void
fba45db2 513add_common_block (char *name, CORE_ADDR offset, int secnum, char *func_stab)
c906108c
SS
514{
515 SAVED_F77_COMMON_PTR tmp;
c5aa993b
JM
516 char *c, *local_copy_func_stab;
517
c906108c
SS
518 /* If the COMMON block we are trying to add has a blank
519 name (i.e. "#BLNK_COM") then we set it to __BLANK
520 because the darn "#" character makes GDB's input
c5aa993b
JM
521 parser have fits. */
522
523
6314a349
AC
524 if (strcmp (name, BLANK_COMMON_NAME_ORIGINAL) == 0
525 || strcmp (name, BLANK_COMMON_NAME_MF77) == 0)
c906108c 526 {
c5aa993b 527
b8c9b27d 528 xfree (name);
c5aa993b
JM
529 name = alloca (strlen (BLANK_COMMON_NAME_LOCAL) + 1);
530 strcpy (name, BLANK_COMMON_NAME_LOCAL);
c906108c 531 }
c5aa993b
JM
532
533 tmp = allocate_saved_f77_common_node ();
534
535 local_copy_func_stab = xmalloc (strlen (func_stab) + 1);
536 strcpy (local_copy_func_stab, func_stab);
537
538 tmp->name = xmalloc (strlen (name) + 1);
539
c906108c 540 /* local_copy_func_stab is a stabstring, let us first extract the
c5aa993b
JM
541 function name from the stab by NULLing out the ':' character. */
542
543
544 c = NULL;
545 c = strchr (local_copy_func_stab, ':');
546
c906108c
SS
547 if (c)
548 *c = '\0';
549 else
8a3fe4f8 550 error (_("Malformed function STAB found in add_common_block()"));
c5aa993b
JM
551
552
553 tmp->owning_function = xmalloc (strlen (local_copy_func_stab) + 1);
554
555 strcpy (tmp->owning_function, local_copy_func_stab);
556
557 strcpy (tmp->name, name);
558 tmp->offset = offset;
c906108c
SS
559 tmp->next = NULL;
560 tmp->entries = NULL;
c5aa993b
JM
561 tmp->secnum = secnum;
562
c906108c 563 current_common = tmp;
c5aa993b 564
c906108c
SS
565 if (head_common_list == NULL)
566 {
567 head_common_list = tail_common_list = tmp;
568 }
569 else
570 {
c5aa993b 571 tail_common_list->next = tmp;
c906108c
SS
572 tail_common_list = tmp;
573 }
574}
575#endif
576
577/* The following function simply enters a given common entry onto
c5aa993b 578 the "current_common" block that has been saved away. */
c906108c
SS
579
580#if 0
581static void
fba45db2 582add_common_entry (struct symbol *entry_sym_ptr)
c906108c
SS
583{
584 COMMON_ENTRY_PTR tmp;
c5aa993b
JM
585
586
587
c906108c
SS
588 /* The order of this list is important, since
589 we expect the entries to appear in decl.
c5aa993b
JM
590 order when we later issue "info common" calls */
591
592 tmp = allocate_common_entry_node ();
593
c906108c
SS
594 tmp->next = NULL;
595 tmp->symbol = entry_sym_ptr;
c5aa993b 596
c906108c 597 if (current_common == NULL)
8a3fe4f8 598 error (_("Attempt to add COMMON entry with no block open!"));
c5aa993b 599 else
c906108c
SS
600 {
601 if (current_common->entries == NULL)
602 {
603 current_common->entries = tmp;
c5aa993b 604 current_common->end_of_entries = tmp;
c906108c
SS
605 }
606 else
607 {
c5aa993b
JM
608 current_common->end_of_entries->next = tmp;
609 current_common->end_of_entries = tmp;
c906108c
SS
610 }
611 }
612}
613#endif
614
c5aa993b 615/* This routine finds the first encountred COMMON block named "name" */
c906108c
SS
616
617#if 0
618static SAVED_F77_COMMON_PTR
fba45db2 619find_first_common_named (char *name)
c906108c 620{
c5aa993b 621
c906108c 622 SAVED_F77_COMMON_PTR tmp;
c5aa993b 623
c906108c 624 tmp = head_common_list;
c5aa993b 625
c906108c
SS
626 while (tmp != NULL)
627 {
6314a349 628 if (strcmp (tmp->name, name) == 0)
c5aa993b 629 return (tmp);
c906108c
SS
630 else
631 tmp = tmp->next;
632 }
c5aa993b 633 return (NULL);
c906108c
SS
634}
635#endif
636
637/* This routine finds the first encountred COMMON block named "name"
c5aa993b 638 that belongs to function funcname */
c906108c 639
c5aa993b 640SAVED_F77_COMMON_PTR
fba45db2 641find_common_for_function (char *name, char *funcname)
c906108c 642{
c5aa993b 643
c906108c 644 SAVED_F77_COMMON_PTR tmp;
c5aa993b 645
c906108c 646 tmp = head_common_list;
c5aa993b 647
c906108c
SS
648 while (tmp != NULL)
649 {
7ecb6532
MD
650 if (strcmp (tmp->name, name) == 0
651 && strcmp (tmp->owning_function, funcname) == 0)
c5aa993b 652 return (tmp);
c906108c
SS
653 else
654 tmp = tmp->next;
655 }
c5aa993b 656 return (NULL);
c906108c
SS
657}
658
659
660#if 0
661
662/* The following function is called to patch up the offsets
663 for the statics contained in the COMMON block named
c5aa993b 664 "name." */
c906108c
SS
665
666static void
fba45db2 667patch_common_entries (SAVED_F77_COMMON_PTR blk, CORE_ADDR offset, int secnum)
c906108c
SS
668{
669 COMMON_ENTRY_PTR entry;
c5aa993b
JM
670
671 blk->offset = offset; /* Keep this around for future use. */
672
c906108c 673 entry = blk->entries;
c5aa993b 674
c906108c
SS
675 while (entry != NULL)
676 {
c5aa993b 677 SYMBOL_VALUE (entry->symbol) += offset;
c906108c 678 SYMBOL_SECTION (entry->symbol) = secnum;
c5aa993b 679
c906108c
SS
680 entry = entry->next;
681 }
c5aa993b 682 blk->secnum = secnum;
c906108c
SS
683}
684
685/* Patch all commons named "name" that need patching.Since COMMON
686 blocks occur with relative infrequency, we simply do a linear scan on
687 the name. Eventually, the best way to do this will be a
688 hashed-lookup. Secnum is the section number for the .bss section
689 (which is where common data lives). */
690
691static void
fba45db2 692patch_all_commons_by_name (char *name, CORE_ADDR offset, int secnum)
c906108c 693{
c5aa993b 694
c906108c 695 SAVED_F77_COMMON_PTR tmp;
c5aa993b 696
c906108c
SS
697 /* For blank common blocks, change the canonical reprsentation
698 of a blank name */
c5aa993b 699
6314a349
AC
700 if (strcmp (name, BLANK_COMMON_NAME_ORIGINAL) == 0
701 || strcmp (name, BLANK_COMMON_NAME_MF77) == 0)
c906108c 702 {
b8c9b27d 703 xfree (name);
c5aa993b
JM
704 name = alloca (strlen (BLANK_COMMON_NAME_LOCAL) + 1);
705 strcpy (name, BLANK_COMMON_NAME_LOCAL);
c906108c 706 }
c5aa993b 707
c906108c 708 tmp = head_common_list;
c5aa993b 709
c906108c
SS
710 while (tmp != NULL)
711 {
c5aa993b 712 if (COMMON_NEEDS_PATCHING (tmp))
6314a349 713 if (strcmp (tmp->name, name) == 0)
c5aa993b
JM
714 patch_common_entries (tmp, offset, secnum);
715
c906108c 716 tmp = tmp->next;
c5aa993b 717 }
c906108c
SS
718}
719#endif
720
721/* This macro adds the symbol-number for the start of the function
722 (the symbol number of the .bf) referenced by symnum_fcn to a
723 list. This list, in reality should be a FIFO queue but since
724 #line pragmas sometimes cause line ranges to get messed up
725 we simply create a linear list. This list can then be searched
726 first by a queueing algorithm and upon failure fall back to
c5aa993b 727 a linear scan. */
c906108c
SS
728
729#if 0
730#define ADD_BF_SYMNUM(bf_sym,fcn_sym) \
731 \
732 if (saved_bf_list == NULL) \
733{ \
734 tmp_bf_ptr = allocate_saved_bf_node(); \
735 \
736 tmp_bf_ptr->symnum_bf = (bf_sym); \
737 tmp_bf_ptr->symnum_fcn = (fcn_sym); \
738 tmp_bf_ptr->next = NULL; \
739 \
740 current_head_bf_list = saved_bf_list = tmp_bf_ptr; \
741 saved_bf_list_end = tmp_bf_ptr; \
742 } \
743else \
744{ \
745 tmp_bf_ptr = allocate_saved_bf_node(); \
746 \
747 tmp_bf_ptr->symnum_bf = (bf_sym); \
748 tmp_bf_ptr->symnum_fcn = (fcn_sym); \
749 tmp_bf_ptr->next = NULL; \
750 \
751 saved_bf_list_end->next = tmp_bf_ptr; \
752 saved_bf_list_end = tmp_bf_ptr; \
c5aa993b 753 }
c906108c
SS
754#endif
755
c5aa993b 756/* This function frees the entire (.bf,function) list */
c906108c
SS
757
758#if 0
c5aa993b 759static void
fba45db2 760clear_bf_list (void)
c906108c 761{
c5aa993b 762
c906108c 763 SAVED_BF_PTR tmp = saved_bf_list;
c5aa993b
JM
764 SAVED_BF_PTR next = NULL;
765
c906108c
SS
766 while (tmp != NULL)
767 {
768 next = tmp->next;
b8c9b27d 769 xfree (tmp);
c5aa993b 770 tmp = next;
c906108c
SS
771 }
772 saved_bf_list = NULL;
773}
774#endif
775
776int global_remote_debug;
777
778#if 0
779
780static long
fba45db2 781get_bf_for_fcn (long the_function)
c906108c
SS
782{
783 SAVED_BF_PTR tmp;
784 int nprobes = 0;
c5aa993b 785
c906108c
SS
786 /* First use a simple queuing algorithm (i.e. look and see if the
787 item at the head of the queue is the one you want) */
c5aa993b 788
c906108c 789 if (saved_bf_list == NULL)
8e65ff28 790 internal_error (__FILE__, __LINE__,
e2e0b3e5 791 _("cannot get .bf node off empty list"));
c5aa993b
JM
792
793 if (current_head_bf_list != NULL)
c906108c
SS
794 if (current_head_bf_list->symnum_fcn == the_function)
795 {
c5aa993b 796 if (global_remote_debug)
dac8068e 797 fprintf_unfiltered (gdb_stderr, "*");
c906108c 798
c5aa993b 799 tmp = current_head_bf_list;
c906108c 800 current_head_bf_list = current_head_bf_list->next;
c5aa993b 801 return (tmp->symnum_bf);
c906108c 802 }
c5aa993b 803
c906108c
SS
804 /* If the above did not work (probably because #line directives were
805 used in the sourcefile and they messed up our internal tables) we now do
806 the ugly linear scan */
c5aa993b
JM
807
808 if (global_remote_debug)
dac8068e 809 fprintf_unfiltered (gdb_stderr, "\ndefaulting to linear scan\n");
c5aa993b
JM
810
811 nprobes = 0;
c906108c
SS
812 tmp = saved_bf_list;
813 while (tmp != NULL)
814 {
c5aa993b 815 nprobes++;
c906108c 816 if (tmp->symnum_fcn == the_function)
c5aa993b 817 {
c906108c 818 if (global_remote_debug)
dac8068e 819 fprintf_unfiltered (gdb_stderr, "Found in %d probes\n", nprobes);
c906108c 820 current_head_bf_list = tmp->next;
c5aa993b
JM
821 return (tmp->symnum_bf);
822 }
823 tmp = tmp->next;
c906108c 824 }
c5aa993b
JM
825
826 return (-1);
c906108c
SS
827}
828
c5aa993b
JM
829static SAVED_FUNCTION_PTR saved_function_list = NULL;
830static SAVED_FUNCTION_PTR saved_function_list_end = NULL;
c906108c
SS
831
832static void
fba45db2 833clear_function_list (void)
c906108c
SS
834{
835 SAVED_FUNCTION_PTR tmp = saved_function_list;
c5aa993b
JM
836 SAVED_FUNCTION_PTR next = NULL;
837
c906108c
SS
838 while (tmp != NULL)
839 {
840 next = tmp->next;
b8c9b27d 841 xfree (tmp);
c906108c
SS
842 tmp = next;
843 }
c5aa993b 844
c906108c
SS
845 saved_function_list = NULL;
846}
847#endif
This page took 0.641228 seconds and 4 git commands to generate.