1e93f7393Sniklas /* Fortran language support routines for GDB, the GNU debugger.
2b725ae77Skettenis Copyright 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004
3b725ae77Skettenis Free Software Foundation, Inc.
4e93f7393Sniklas Contributed by Motorola. Adapted from the C parser by Farooq Butt
5e93f7393Sniklas (fmbutt@engage.sps.mot.com).
6e93f7393Sniklas
7e93f7393Sniklas This file is part of GDB.
8e93f7393Sniklas
9e93f7393Sniklas This program is free software; you can redistribute it and/or modify
10e93f7393Sniklas it under the terms of the GNU General Public License as published by
11e93f7393Sniklas the Free Software Foundation; either version 2 of the License, or
12e93f7393Sniklas (at your option) any later version.
13e93f7393Sniklas
14e93f7393Sniklas This program is distributed in the hope that it will be useful,
15e93f7393Sniklas but WITHOUT ANY WARRANTY; without even the implied warranty of
16e93f7393Sniklas MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17e93f7393Sniklas GNU General Public License for more details.
18e93f7393Sniklas
19e93f7393Sniklas You should have received a copy of the GNU General Public License
20e93f7393Sniklas along with this program; if not, write to the Free Software
21b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
22b725ae77Skettenis Boston, MA 02111-1307, USA. */
23e93f7393Sniklas
24e93f7393Sniklas #include "defs.h"
25e93f7393Sniklas #include "gdb_string.h"
26e93f7393Sniklas #include "symtab.h"
27e93f7393Sniklas #include "gdbtypes.h"
28e93f7393Sniklas #include "expression.h"
29e93f7393Sniklas #include "parser-defs.h"
30e93f7393Sniklas #include "language.h"
31e93f7393Sniklas #include "f-lang.h"
32b725ae77Skettenis #include "valprint.h"
33b725ae77Skettenis #include "value.h"
34e93f7393Sniklas
35e93f7393Sniklas /* The built-in types of F77. FIXME: integer*4 is missing, plain
36e93f7393Sniklas logical is missing (builtin_type_logical is logical*4). */
37e93f7393Sniklas
38e93f7393Sniklas struct type *builtin_type_f_character;
39e93f7393Sniklas struct type *builtin_type_f_logical;
40e93f7393Sniklas struct type *builtin_type_f_logical_s1;
41e93f7393Sniklas struct type *builtin_type_f_logical_s2;
42e93f7393Sniklas struct type *builtin_type_f_integer;
43e93f7393Sniklas struct type *builtin_type_f_integer_s2;
44e93f7393Sniklas struct type *builtin_type_f_real;
45e93f7393Sniklas struct type *builtin_type_f_real_s8;
46e93f7393Sniklas struct type *builtin_type_f_real_s16;
47e93f7393Sniklas struct type *builtin_type_f_complex_s8;
48e93f7393Sniklas struct type *builtin_type_f_complex_s16;
49e93f7393Sniklas struct type *builtin_type_f_complex_s32;
50e93f7393Sniklas struct type *builtin_type_f_void;
51e93f7393Sniklas
52e93f7393Sniklas /* Following is dubious stuff that had been in the xcoff reader. */
53e93f7393Sniklas
54e93f7393Sniklas struct saved_fcn
55e93f7393Sniklas {
56e93f7393Sniklas long line_offset; /* Line offset for function */
57e93f7393Sniklas struct saved_fcn *next;
58e93f7393Sniklas };
59e93f7393Sniklas
60e93f7393Sniklas
61e93f7393Sniklas struct saved_bf_symnum
62e93f7393Sniklas {
63e93f7393Sniklas long symnum_fcn; /* Symnum of function (i.e. .function directive) */
64e93f7393Sniklas long symnum_bf; /* Symnum of .bf for this function */
65e93f7393Sniklas struct saved_bf_symnum *next;
66e93f7393Sniklas };
67e93f7393Sniklas
68e93f7393Sniklas typedef struct saved_fcn SAVED_FUNCTION, *SAVED_FUNCTION_PTR;
69e93f7393Sniklas typedef struct saved_bf_symnum SAVED_BF, *SAVED_BF_PTR;
70e93f7393Sniklas
71e93f7393Sniklas /* Local functions */
72e93f7393Sniklas
73b725ae77Skettenis extern void _initialize_f_language (void);
74e93f7393Sniklas #if 0
75b725ae77Skettenis static void clear_function_list (void);
76b725ae77Skettenis static long get_bf_for_fcn (long);
77b725ae77Skettenis static void clear_bf_list (void);
78b725ae77Skettenis static void patch_all_commons_by_name (char *, CORE_ADDR, int);
79b725ae77Skettenis static SAVED_F77_COMMON_PTR find_first_common_named (char *);
80b725ae77Skettenis static void add_common_entry (struct symbol *);
81b725ae77Skettenis static void add_common_block (char *, CORE_ADDR, int, char *);
82b725ae77Skettenis static SAVED_FUNCTION *allocate_saved_function_node (void);
83b725ae77Skettenis static SAVED_BF_PTR allocate_saved_bf_node (void);
84b725ae77Skettenis static COMMON_ENTRY_PTR allocate_common_entry_node (void);
85b725ae77Skettenis static SAVED_F77_COMMON_PTR allocate_saved_f77_common_node (void);
86b725ae77Skettenis static void patch_common_entries (SAVED_F77_COMMON_PTR, CORE_ADDR, int);
87e93f7393Sniklas #endif
88e93f7393Sniklas
89b725ae77Skettenis static struct type *f_create_fundamental_type (struct objfile *, int);
90b725ae77Skettenis static void f_printstr (struct ui_file * stream, char *string,
91b725ae77Skettenis unsigned int length, int width,
92b725ae77Skettenis int force_ellipses);
93b725ae77Skettenis static void f_printchar (int c, struct ui_file * stream);
94b725ae77Skettenis static void f_emit_char (int c, struct ui_file * stream, int quoter);
95e93f7393Sniklas
96e93f7393Sniklas /* Print the character C on STREAM as part of the contents of a literal
97e93f7393Sniklas string whose delimiter is QUOTER. Note that that format for printing
98e93f7393Sniklas characters and strings is language specific.
99e93f7393Sniklas FIXME: This is a copy of the same function from c-exp.y. It should
100e93f7393Sniklas be replaced with a true F77 version. */
101e93f7393Sniklas
102e93f7393Sniklas static void
f_emit_char(int c,struct ui_file * stream,int quoter)103b725ae77Skettenis f_emit_char (int c, struct ui_file *stream, int quoter)
104e93f7393Sniklas {
105e93f7393Sniklas c &= 0xFF; /* Avoid sign bit follies */
106e93f7393Sniklas
107e93f7393Sniklas if (PRINT_LITERAL_FORM (c))
108e93f7393Sniklas {
109e93f7393Sniklas if (c == '\\' || c == quoter)
110e93f7393Sniklas fputs_filtered ("\\", stream);
111e93f7393Sniklas fprintf_filtered (stream, "%c", c);
112e93f7393Sniklas }
113e93f7393Sniklas else
114e93f7393Sniklas {
115e93f7393Sniklas switch (c)
116e93f7393Sniklas {
117e93f7393Sniklas case '\n':
118e93f7393Sniklas fputs_filtered ("\\n", stream);
119e93f7393Sniklas break;
120e93f7393Sniklas case '\b':
121e93f7393Sniklas fputs_filtered ("\\b", stream);
122e93f7393Sniklas break;
123e93f7393Sniklas case '\t':
124e93f7393Sniklas fputs_filtered ("\\t", stream);
125e93f7393Sniklas break;
126e93f7393Sniklas case '\f':
127e93f7393Sniklas fputs_filtered ("\\f", stream);
128e93f7393Sniklas break;
129e93f7393Sniklas case '\r':
130e93f7393Sniklas fputs_filtered ("\\r", stream);
131e93f7393Sniklas break;
132e93f7393Sniklas case '\033':
133e93f7393Sniklas fputs_filtered ("\\e", stream);
134e93f7393Sniklas break;
135e93f7393Sniklas case '\007':
136e93f7393Sniklas fputs_filtered ("\\a", stream);
137e93f7393Sniklas break;
138e93f7393Sniklas default:
139e93f7393Sniklas fprintf_filtered (stream, "\\%.3o", (unsigned int) c);
140e93f7393Sniklas break;
141e93f7393Sniklas }
142e93f7393Sniklas }
143e93f7393Sniklas }
144e93f7393Sniklas
145e93f7393Sniklas /* FIXME: This is a copy of the same function from c-exp.y. It should
146e93f7393Sniklas be replaced with a true F77version. */
147e93f7393Sniklas
148e93f7393Sniklas static void
f_printchar(int c,struct ui_file * stream)149b725ae77Skettenis f_printchar (int c, struct ui_file *stream)
150e93f7393Sniklas {
151e93f7393Sniklas fputs_filtered ("'", stream);
152b725ae77Skettenis LA_EMIT_CHAR (c, stream, '\'');
153e93f7393Sniklas fputs_filtered ("'", stream);
154e93f7393Sniklas }
155e93f7393Sniklas
156e93f7393Sniklas /* Print the character string STRING, printing at most LENGTH characters.
157e93f7393Sniklas Printing stops early if the number hits print_max; repeat counts
158e93f7393Sniklas are printed as appropriate. Print ellipses at the end if we
159e93f7393Sniklas had to stop before printing LENGTH characters, or if FORCE_ELLIPSES.
160e93f7393Sniklas FIXME: This is a copy of the same function from c-exp.y. It should
161e93f7393Sniklas be replaced with a true F77 version. */
162e93f7393Sniklas
163e93f7393Sniklas static void
f_printstr(struct ui_file * stream,char * string,unsigned int length,int width,int force_ellipses)164b725ae77Skettenis f_printstr (struct ui_file *stream, char *string, unsigned int length,
165b725ae77Skettenis int width, int force_ellipses)
166e93f7393Sniklas {
167b725ae77Skettenis unsigned int i;
168e93f7393Sniklas unsigned int things_printed = 0;
169e93f7393Sniklas int in_quotes = 0;
170e93f7393Sniklas int need_comma = 0;
171e93f7393Sniklas
172e93f7393Sniklas if (length == 0)
173e93f7393Sniklas {
174b725ae77Skettenis fputs_filtered ("''", gdb_stdout);
175e93f7393Sniklas return;
176e93f7393Sniklas }
177e93f7393Sniklas
178e93f7393Sniklas for (i = 0; i < length && things_printed < print_max; ++i)
179e93f7393Sniklas {
180e93f7393Sniklas /* Position of the character we are examining
181e93f7393Sniklas to see whether it is repeated. */
182e93f7393Sniklas unsigned int rep1;
183e93f7393Sniklas /* Number of repetitions we have detected so far. */
184e93f7393Sniklas unsigned int reps;
185e93f7393Sniklas
186e93f7393Sniklas QUIT;
187e93f7393Sniklas
188e93f7393Sniklas if (need_comma)
189e93f7393Sniklas {
190e93f7393Sniklas fputs_filtered (", ", stream);
191e93f7393Sniklas need_comma = 0;
192e93f7393Sniklas }
193e93f7393Sniklas
194e93f7393Sniklas rep1 = i + 1;
195e93f7393Sniklas reps = 1;
196e93f7393Sniklas while (rep1 < length && string[rep1] == string[i])
197e93f7393Sniklas {
198e93f7393Sniklas ++rep1;
199e93f7393Sniklas ++reps;
200e93f7393Sniklas }
201e93f7393Sniklas
202e93f7393Sniklas if (reps > repeat_count_threshold)
203e93f7393Sniklas {
204e93f7393Sniklas if (in_quotes)
205e93f7393Sniklas {
206e93f7393Sniklas if (inspect_it)
207e93f7393Sniklas fputs_filtered ("\\', ", stream);
208e93f7393Sniklas else
209e93f7393Sniklas fputs_filtered ("', ", stream);
210e93f7393Sniklas in_quotes = 0;
211e93f7393Sniklas }
212e93f7393Sniklas f_printchar (string[i], stream);
213e93f7393Sniklas fprintf_filtered (stream, " <repeats %u times>", reps);
214e93f7393Sniklas i = rep1 - 1;
215e93f7393Sniklas things_printed += repeat_count_threshold;
216e93f7393Sniklas need_comma = 1;
217e93f7393Sniklas }
218e93f7393Sniklas else
219e93f7393Sniklas {
220e93f7393Sniklas if (!in_quotes)
221e93f7393Sniklas {
222e93f7393Sniklas if (inspect_it)
223e93f7393Sniklas fputs_filtered ("\\'", stream);
224e93f7393Sniklas else
225e93f7393Sniklas fputs_filtered ("'", stream);
226e93f7393Sniklas in_quotes = 1;
227e93f7393Sniklas }
228b725ae77Skettenis LA_EMIT_CHAR (string[i], stream, '"');
229e93f7393Sniklas ++things_printed;
230e93f7393Sniklas }
231e93f7393Sniklas }
232e93f7393Sniklas
233e93f7393Sniklas /* Terminate the quotes if necessary. */
234e93f7393Sniklas if (in_quotes)
235e93f7393Sniklas {
236e93f7393Sniklas if (inspect_it)
237e93f7393Sniklas fputs_filtered ("\\'", stream);
238e93f7393Sniklas else
239e93f7393Sniklas fputs_filtered ("'", stream);
240e93f7393Sniklas }
241e93f7393Sniklas
242e93f7393Sniklas if (force_ellipses || i < length)
243e93f7393Sniklas fputs_filtered ("...", stream);
244e93f7393Sniklas }
245e93f7393Sniklas
246e93f7393Sniklas /* FIXME: This is a copy of c_create_fundamental_type(), before
247e93f7393Sniklas all the non-C types were stripped from it. Needs to be fixed
248e93f7393Sniklas by an experienced F77 programmer. */
249e93f7393Sniklas
250e93f7393Sniklas static struct type *
f_create_fundamental_type(struct objfile * objfile,int typeid)251b725ae77Skettenis f_create_fundamental_type (struct objfile *objfile, int typeid)
252e93f7393Sniklas {
253b725ae77Skettenis struct type *type = NULL;
254e93f7393Sniklas
255e93f7393Sniklas switch (typeid)
256e93f7393Sniklas {
257e93f7393Sniklas case FT_VOID:
258e93f7393Sniklas type = init_type (TYPE_CODE_VOID,
259e93f7393Sniklas TARGET_CHAR_BIT / TARGET_CHAR_BIT,
260e93f7393Sniklas 0, "VOID", objfile);
261e93f7393Sniklas break;
262e93f7393Sniklas case FT_BOOLEAN:
263e93f7393Sniklas type = init_type (TYPE_CODE_BOOL,
264e93f7393Sniklas TARGET_CHAR_BIT / TARGET_CHAR_BIT,
265e93f7393Sniklas TYPE_FLAG_UNSIGNED, "boolean", objfile);
266e93f7393Sniklas break;
267e93f7393Sniklas case FT_STRING:
268e93f7393Sniklas type = init_type (TYPE_CODE_STRING,
269e93f7393Sniklas TARGET_CHAR_BIT / TARGET_CHAR_BIT,
270e93f7393Sniklas 0, "string", objfile);
271e93f7393Sniklas break;
272e93f7393Sniklas case FT_CHAR:
273e93f7393Sniklas type = init_type (TYPE_CODE_INT,
274e93f7393Sniklas TARGET_CHAR_BIT / TARGET_CHAR_BIT,
275e93f7393Sniklas 0, "character", objfile);
276e93f7393Sniklas break;
277e93f7393Sniklas case FT_SIGNED_CHAR:
278e93f7393Sniklas type = init_type (TYPE_CODE_INT,
279e93f7393Sniklas TARGET_CHAR_BIT / TARGET_CHAR_BIT,
280e93f7393Sniklas 0, "integer*1", objfile);
281e93f7393Sniklas break;
282e93f7393Sniklas case FT_UNSIGNED_CHAR:
283e93f7393Sniklas type = init_type (TYPE_CODE_BOOL,
284e93f7393Sniklas TARGET_CHAR_BIT / TARGET_CHAR_BIT,
285e93f7393Sniklas TYPE_FLAG_UNSIGNED, "logical*1", objfile);
286e93f7393Sniklas break;
287e93f7393Sniklas case FT_SHORT:
288e93f7393Sniklas type = init_type (TYPE_CODE_INT,
289e93f7393Sniklas TARGET_SHORT_BIT / TARGET_CHAR_BIT,
290e93f7393Sniklas 0, "integer*2", objfile);
291e93f7393Sniklas break;
292e93f7393Sniklas case FT_SIGNED_SHORT:
293e93f7393Sniklas type = init_type (TYPE_CODE_INT,
294e93f7393Sniklas TARGET_SHORT_BIT / TARGET_CHAR_BIT,
295e93f7393Sniklas 0, "short", objfile); /* FIXME-fnf */
296e93f7393Sniklas break;
297e93f7393Sniklas case FT_UNSIGNED_SHORT:
298e93f7393Sniklas type = init_type (TYPE_CODE_BOOL,
299e93f7393Sniklas TARGET_SHORT_BIT / TARGET_CHAR_BIT,
300e93f7393Sniklas TYPE_FLAG_UNSIGNED, "logical*2", objfile);
301e93f7393Sniklas break;
302e93f7393Sniklas case FT_INTEGER:
303e93f7393Sniklas type = init_type (TYPE_CODE_INT,
304e93f7393Sniklas TARGET_INT_BIT / TARGET_CHAR_BIT,
305e93f7393Sniklas 0, "integer*4", objfile);
306e93f7393Sniklas break;
307e93f7393Sniklas case FT_SIGNED_INTEGER:
308e93f7393Sniklas type = init_type (TYPE_CODE_INT,
309e93f7393Sniklas TARGET_INT_BIT / TARGET_CHAR_BIT,
310e93f7393Sniklas 0, "integer", objfile); /* FIXME -fnf */
311e93f7393Sniklas break;
312e93f7393Sniklas case FT_UNSIGNED_INTEGER:
313e93f7393Sniklas type = init_type (TYPE_CODE_BOOL,
314e93f7393Sniklas TARGET_INT_BIT / TARGET_CHAR_BIT,
315e93f7393Sniklas TYPE_FLAG_UNSIGNED, "logical*4", objfile);
316e93f7393Sniklas break;
317e93f7393Sniklas case FT_FIXED_DECIMAL:
318e93f7393Sniklas type = init_type (TYPE_CODE_INT,
319e93f7393Sniklas TARGET_INT_BIT / TARGET_CHAR_BIT,
320e93f7393Sniklas 0, "fixed decimal", objfile);
321e93f7393Sniklas break;
322e93f7393Sniklas case FT_LONG:
323e93f7393Sniklas type = init_type (TYPE_CODE_INT,
324e93f7393Sniklas TARGET_LONG_BIT / TARGET_CHAR_BIT,
325e93f7393Sniklas 0, "long", objfile);
326e93f7393Sniklas break;
327e93f7393Sniklas case FT_SIGNED_LONG:
328e93f7393Sniklas type = init_type (TYPE_CODE_INT,
329e93f7393Sniklas TARGET_LONG_BIT / TARGET_CHAR_BIT,
330e93f7393Sniklas 0, "long", objfile); /* FIXME -fnf */
331e93f7393Sniklas break;
332e93f7393Sniklas case FT_UNSIGNED_LONG:
333e93f7393Sniklas type = init_type (TYPE_CODE_INT,
334e93f7393Sniklas TARGET_LONG_BIT / TARGET_CHAR_BIT,
335e93f7393Sniklas TYPE_FLAG_UNSIGNED, "unsigned long", objfile);
336e93f7393Sniklas break;
337e93f7393Sniklas case FT_LONG_LONG:
338e93f7393Sniklas type = init_type (TYPE_CODE_INT,
339e93f7393Sniklas TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
340e93f7393Sniklas 0, "long long", objfile);
341e93f7393Sniklas break;
342e93f7393Sniklas case FT_SIGNED_LONG_LONG:
343e93f7393Sniklas type = init_type (TYPE_CODE_INT,
344e93f7393Sniklas TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
345e93f7393Sniklas 0, "signed long long", objfile);
346e93f7393Sniklas break;
347e93f7393Sniklas case FT_UNSIGNED_LONG_LONG:
348e93f7393Sniklas type = init_type (TYPE_CODE_INT,
349e93f7393Sniklas TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
350e93f7393Sniklas TYPE_FLAG_UNSIGNED, "unsigned long long", objfile);
351e93f7393Sniklas break;
352e93f7393Sniklas case FT_FLOAT:
353e93f7393Sniklas type = init_type (TYPE_CODE_FLT,
354e93f7393Sniklas TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
355e93f7393Sniklas 0, "real", objfile);
356e93f7393Sniklas break;
357e93f7393Sniklas case FT_DBL_PREC_FLOAT:
358e93f7393Sniklas type = init_type (TYPE_CODE_FLT,
359e93f7393Sniklas TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
360e93f7393Sniklas 0, "real*8", objfile);
361e93f7393Sniklas break;
362e93f7393Sniklas case FT_FLOAT_DECIMAL:
363e93f7393Sniklas type = init_type (TYPE_CODE_FLT,
364e93f7393Sniklas TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
365e93f7393Sniklas 0, "floating decimal", objfile);
366e93f7393Sniklas break;
367e93f7393Sniklas case FT_EXT_PREC_FLOAT:
368e93f7393Sniklas type = init_type (TYPE_CODE_FLT,
369e93f7393Sniklas TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
370e93f7393Sniklas 0, "real*16", objfile);
371e93f7393Sniklas break;
372e93f7393Sniklas case FT_COMPLEX:
373e93f7393Sniklas type = init_type (TYPE_CODE_COMPLEX,
374e93f7393Sniklas 2 * TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
375e93f7393Sniklas 0, "complex*8", objfile);
376e93f7393Sniklas TYPE_TARGET_TYPE (type) = builtin_type_f_real;
377e93f7393Sniklas break;
378e93f7393Sniklas case FT_DBL_PREC_COMPLEX:
379e93f7393Sniklas type = init_type (TYPE_CODE_COMPLEX,
380e93f7393Sniklas 2 * TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
381e93f7393Sniklas 0, "complex*16", objfile);
382e93f7393Sniklas TYPE_TARGET_TYPE (type) = builtin_type_f_real_s8;
383e93f7393Sniklas break;
384e93f7393Sniklas case FT_EXT_PREC_COMPLEX:
385e93f7393Sniklas type = init_type (TYPE_CODE_COMPLEX,
386e93f7393Sniklas 2 * TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
387e93f7393Sniklas 0, "complex*32", objfile);
388e93f7393Sniklas TYPE_TARGET_TYPE (type) = builtin_type_f_real_s16;
389e93f7393Sniklas break;
390e93f7393Sniklas default:
391e93f7393Sniklas /* FIXME: For now, if we are asked to produce a type not in this
392e93f7393Sniklas language, create the equivalent of a C integer type with the
393e93f7393Sniklas name "<?type?>". When all the dust settles from the type
394e93f7393Sniklas reconstruction work, this should probably become an error. */
395e93f7393Sniklas type = init_type (TYPE_CODE_INT,
396e93f7393Sniklas TARGET_INT_BIT / TARGET_CHAR_BIT,
397e93f7393Sniklas 0, "<?type?>", objfile);
398e93f7393Sniklas warning ("internal error: no F77 fundamental type %d", typeid);
399e93f7393Sniklas break;
400e93f7393Sniklas }
401e93f7393Sniklas return (type);
402e93f7393Sniklas }
403e93f7393Sniklas
404b725ae77Skettenis
405e93f7393Sniklas /* Table of operators and their precedences for printing expressions. */
406e93f7393Sniklas
407b725ae77Skettenis static const struct op_print f_op_print_tab[] =
408b725ae77Skettenis {
409e93f7393Sniklas {"+", BINOP_ADD, PREC_ADD, 0},
410e93f7393Sniklas {"+", UNOP_PLUS, PREC_PREFIX, 0},
411e93f7393Sniklas {"-", BINOP_SUB, PREC_ADD, 0},
412e93f7393Sniklas {"-", UNOP_NEG, PREC_PREFIX, 0},
413e93f7393Sniklas {"*", BINOP_MUL, PREC_MUL, 0},
414e93f7393Sniklas {"/", BINOP_DIV, PREC_MUL, 0},
415e93f7393Sniklas {"DIV", BINOP_INTDIV, PREC_MUL, 0},
416e93f7393Sniklas {"MOD", BINOP_REM, PREC_MUL, 0},
417e93f7393Sniklas {"=", BINOP_ASSIGN, PREC_ASSIGN, 1},
418e93f7393Sniklas {".OR.", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
419e93f7393Sniklas {".AND.", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
420e93f7393Sniklas {".NOT.", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
421e93f7393Sniklas {".EQ.", BINOP_EQUAL, PREC_EQUAL, 0},
422e93f7393Sniklas {".NE.", BINOP_NOTEQUAL, PREC_EQUAL, 0},
423e93f7393Sniklas {".LE.", BINOP_LEQ, PREC_ORDER, 0},
424e93f7393Sniklas {".GE.", BINOP_GEQ, PREC_ORDER, 0},
425e93f7393Sniklas {".GT.", BINOP_GTR, PREC_ORDER, 0},
426e93f7393Sniklas {".LT.", BINOP_LESS, PREC_ORDER, 0},
427e93f7393Sniklas {"**", UNOP_IND, PREC_PREFIX, 0},
428e93f7393Sniklas {"@", BINOP_REPEAT, PREC_REPEAT, 0},
429e93f7393Sniklas {NULL, 0, 0, 0}
430e93f7393Sniklas };
431e93f7393Sniklas
432b725ae77Skettenis struct type **const (f_builtin_types[]) =
433e93f7393Sniklas {
434e93f7393Sniklas &builtin_type_f_character,
435e93f7393Sniklas &builtin_type_f_logical,
436e93f7393Sniklas &builtin_type_f_logical_s1,
437e93f7393Sniklas &builtin_type_f_logical_s2,
438e93f7393Sniklas &builtin_type_f_integer,
439e93f7393Sniklas &builtin_type_f_integer_s2,
440e93f7393Sniklas &builtin_type_f_real,
441e93f7393Sniklas &builtin_type_f_real_s8,
442e93f7393Sniklas &builtin_type_f_real_s16,
443e93f7393Sniklas &builtin_type_f_complex_s8,
444e93f7393Sniklas &builtin_type_f_complex_s16,
445e93f7393Sniklas #if 0
446e93f7393Sniklas &builtin_type_f_complex_s32,
447e93f7393Sniklas #endif
448e93f7393Sniklas &builtin_type_f_void,
449e93f7393Sniklas 0
450e93f7393Sniklas };
451e93f7393Sniklas
452e93f7393Sniklas /* This is declared in c-lang.h but it is silly to import that file for what
453e93f7393Sniklas is already just a hack. */
454b725ae77Skettenis extern int c_value_print (struct value *, struct ui_file *, int,
455b725ae77Skettenis enum val_prettyprint);
456e93f7393Sniklas
457b725ae77Skettenis const struct language_defn f_language_defn =
458b725ae77Skettenis {
459e93f7393Sniklas "fortran",
460e93f7393Sniklas language_fortran,
461e93f7393Sniklas f_builtin_types,
462e93f7393Sniklas range_check_on,
463e93f7393Sniklas type_check_on,
464b725ae77Skettenis case_sensitive_off,
465*63addd46Skettenis array_column_major,
466b725ae77Skettenis &exp_descriptor_standard,
467e93f7393Sniklas f_parse, /* parser */
468e93f7393Sniklas f_error, /* parser error function */
469*63addd46Skettenis null_post_parser,
470e93f7393Sniklas f_printchar, /* Print character constant */
471e93f7393Sniklas f_printstr, /* function to print string constant */
472b725ae77Skettenis f_emit_char, /* Function to print a single character */
473e93f7393Sniklas f_create_fundamental_type, /* Create fundamental type in this language */
474e93f7393Sniklas f_print_type, /* Print a type using appropriate syntax */
475e93f7393Sniklas f_val_print, /* Print a value using appropriate syntax */
476e93f7393Sniklas c_value_print, /* FIXME */
477b725ae77Skettenis NULL, /* Language specific skip_trampoline */
478b725ae77Skettenis value_of_this, /* value_of_this */
479b725ae77Skettenis basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
480b725ae77Skettenis basic_lookup_transparent_type,/* lookup_transparent_type */
481b725ae77Skettenis NULL, /* Language specific symbol demangler */
482*63addd46Skettenis NULL, /* Language specific class_name_from_physname */
483e93f7393Sniklas f_op_print_tab, /* expression operators for printing */
484e93f7393Sniklas 0, /* arrays are first-class (not c-style) */
485e93f7393Sniklas 1, /* String lower bound */
486e93f7393Sniklas &builtin_type_f_character, /* Type of string elements */
487b725ae77Skettenis default_word_break_characters,
488*63addd46Skettenis NULL, /* FIXME: la_language_arch_info. */
489e93f7393Sniklas LANG_MAGIC
490e93f7393Sniklas };
491e93f7393Sniklas
492b725ae77Skettenis static void
build_fortran_types(void)493b725ae77Skettenis build_fortran_types (void)
494e93f7393Sniklas {
495e93f7393Sniklas builtin_type_f_void =
496e93f7393Sniklas init_type (TYPE_CODE_VOID, 1,
497e93f7393Sniklas 0,
498e93f7393Sniklas "VOID", (struct objfile *) NULL);
499e93f7393Sniklas
500e93f7393Sniklas builtin_type_f_character =
501e93f7393Sniklas init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
502e93f7393Sniklas 0,
503e93f7393Sniklas "character", (struct objfile *) NULL);
504e93f7393Sniklas
505e93f7393Sniklas builtin_type_f_logical_s1 =
506e93f7393Sniklas init_type (TYPE_CODE_BOOL, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
507e93f7393Sniklas TYPE_FLAG_UNSIGNED,
508e93f7393Sniklas "logical*1", (struct objfile *) NULL);
509e93f7393Sniklas
510e93f7393Sniklas builtin_type_f_integer_s2 =
511e93f7393Sniklas init_type (TYPE_CODE_INT, TARGET_SHORT_BIT / TARGET_CHAR_BIT,
512e93f7393Sniklas 0,
513e93f7393Sniklas "integer*2", (struct objfile *) NULL);
514e93f7393Sniklas
515e93f7393Sniklas builtin_type_f_logical_s2 =
516e93f7393Sniklas init_type (TYPE_CODE_BOOL, TARGET_SHORT_BIT / TARGET_CHAR_BIT,
517e93f7393Sniklas TYPE_FLAG_UNSIGNED,
518e93f7393Sniklas "logical*2", (struct objfile *) NULL);
519e93f7393Sniklas
520e93f7393Sniklas builtin_type_f_integer =
521e93f7393Sniklas init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT,
522e93f7393Sniklas 0,
523e93f7393Sniklas "integer", (struct objfile *) NULL);
524e93f7393Sniklas
525e93f7393Sniklas builtin_type_f_logical =
526e93f7393Sniklas init_type (TYPE_CODE_BOOL, TARGET_INT_BIT / TARGET_CHAR_BIT,
527e93f7393Sniklas TYPE_FLAG_UNSIGNED,
528e93f7393Sniklas "logical*4", (struct objfile *) NULL);
529e93f7393Sniklas
530e93f7393Sniklas builtin_type_f_real =
531e93f7393Sniklas init_type (TYPE_CODE_FLT, TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
532e93f7393Sniklas 0,
533e93f7393Sniklas "real", (struct objfile *) NULL);
534e93f7393Sniklas
535e93f7393Sniklas builtin_type_f_real_s8 =
536e93f7393Sniklas init_type (TYPE_CODE_FLT, TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
537e93f7393Sniklas 0,
538e93f7393Sniklas "real*8", (struct objfile *) NULL);
539e93f7393Sniklas
540e93f7393Sniklas builtin_type_f_real_s16 =
541e93f7393Sniklas init_type (TYPE_CODE_FLT, TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
542e93f7393Sniklas 0,
543e93f7393Sniklas "real*16", (struct objfile *) NULL);
544e93f7393Sniklas
545e93f7393Sniklas builtin_type_f_complex_s8 =
546e93f7393Sniklas init_type (TYPE_CODE_COMPLEX, 2 * TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
547e93f7393Sniklas 0,
548e93f7393Sniklas "complex*8", (struct objfile *) NULL);
549e93f7393Sniklas TYPE_TARGET_TYPE (builtin_type_f_complex_s8) = builtin_type_f_real;
550e93f7393Sniklas
551e93f7393Sniklas builtin_type_f_complex_s16 =
552e93f7393Sniklas init_type (TYPE_CODE_COMPLEX, 2 * TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
553e93f7393Sniklas 0,
554e93f7393Sniklas "complex*16", (struct objfile *) NULL);
555e93f7393Sniklas TYPE_TARGET_TYPE (builtin_type_f_complex_s16) = builtin_type_f_real_s8;
556e93f7393Sniklas
557e93f7393Sniklas /* We have a new size == 4 double floats for the
558e93f7393Sniklas complex*32 data type */
559e93f7393Sniklas
560e93f7393Sniklas builtin_type_f_complex_s32 =
561e93f7393Sniklas init_type (TYPE_CODE_COMPLEX, 2 * TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
562e93f7393Sniklas 0,
563e93f7393Sniklas "complex*32", (struct objfile *) NULL);
564e93f7393Sniklas TYPE_TARGET_TYPE (builtin_type_f_complex_s32) = builtin_type_f_real_s16;
565b725ae77Skettenis }
566b725ae77Skettenis
567b725ae77Skettenis void
_initialize_f_language(void)568b725ae77Skettenis _initialize_f_language (void)
569b725ae77Skettenis {
570b725ae77Skettenis build_fortran_types ();
571b725ae77Skettenis
572b725ae77Skettenis DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_character);
573b725ae77Skettenis DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_logical);
574b725ae77Skettenis DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_logical_s1);
575b725ae77Skettenis DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_logical_s2);
576b725ae77Skettenis DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_integer);
577b725ae77Skettenis DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_integer_s2);
578b725ae77Skettenis DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_real);
579b725ae77Skettenis DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_real_s8);
580b725ae77Skettenis DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_real_s16);
581b725ae77Skettenis DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_complex_s8);
582b725ae77Skettenis DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_complex_s16);
583b725ae77Skettenis DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_complex_s32);
584b725ae77Skettenis DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_void);
585b725ae77Skettenis DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_string);
586b725ae77Skettenis deprecated_register_gdbarch_swap (NULL, 0, build_fortran_types);
587e93f7393Sniklas
588e93f7393Sniklas builtin_type_string =
589e93f7393Sniklas init_type (TYPE_CODE_STRING, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
590e93f7393Sniklas 0,
591e93f7393Sniklas "character string", (struct objfile *) NULL);
592e93f7393Sniklas
593e93f7393Sniklas add_language (&f_language_defn);
594e93f7393Sniklas }
595e93f7393Sniklas
596e93f7393Sniklas #if 0
597e93f7393Sniklas static SAVED_BF_PTR
598b725ae77Skettenis allocate_saved_bf_node (void)
599e93f7393Sniklas {
600e93f7393Sniklas SAVED_BF_PTR new;
601e93f7393Sniklas
602e93f7393Sniklas new = (SAVED_BF_PTR) xmalloc (sizeof (SAVED_BF));
603e93f7393Sniklas return (new);
604e93f7393Sniklas }
605e93f7393Sniklas
606e93f7393Sniklas static SAVED_FUNCTION *
607b725ae77Skettenis allocate_saved_function_node (void)
608e93f7393Sniklas {
609e93f7393Sniklas SAVED_FUNCTION *new;
610e93f7393Sniklas
611e93f7393Sniklas new = (SAVED_FUNCTION *) xmalloc (sizeof (SAVED_FUNCTION));
612e93f7393Sniklas return (new);
613e93f7393Sniklas }
614e93f7393Sniklas
615b725ae77Skettenis static SAVED_F77_COMMON_PTR
616b725ae77Skettenis allocate_saved_f77_common_node (void)
617e93f7393Sniklas {
618e93f7393Sniklas SAVED_F77_COMMON_PTR new;
619e93f7393Sniklas
620e93f7393Sniklas new = (SAVED_F77_COMMON_PTR) xmalloc (sizeof (SAVED_F77_COMMON));
621e93f7393Sniklas return (new);
622e93f7393Sniklas }
623e93f7393Sniklas
624b725ae77Skettenis static COMMON_ENTRY_PTR
625b725ae77Skettenis allocate_common_entry_node (void)
626e93f7393Sniklas {
627e93f7393Sniklas COMMON_ENTRY_PTR new;
628e93f7393Sniklas
629e93f7393Sniklas new = (COMMON_ENTRY_PTR) xmalloc (sizeof (COMMON_ENTRY));
630e93f7393Sniklas return (new);
631e93f7393Sniklas }
632e93f7393Sniklas #endif
633e93f7393Sniklas
634e93f7393Sniklas SAVED_F77_COMMON_PTR head_common_list = NULL; /* Ptr to 1st saved COMMON */
635e93f7393Sniklas SAVED_F77_COMMON_PTR tail_common_list = NULL; /* Ptr to last saved COMMON */
636e93f7393Sniklas SAVED_F77_COMMON_PTR current_common = NULL; /* Ptr to current COMMON */
637e93f7393Sniklas
638e93f7393Sniklas #if 0
639e93f7393Sniklas static SAVED_BF_PTR saved_bf_list = NULL; /* Ptr to (.bf,function)
640e93f7393Sniklas list */
641e93f7393Sniklas static SAVED_BF_PTR saved_bf_list_end = NULL; /* Ptr to above list's end */
642e93f7393Sniklas static SAVED_BF_PTR current_head_bf_list = NULL; /* Current head of above list
643e93f7393Sniklas */
644e93f7393Sniklas
645e93f7393Sniklas static SAVED_BF_PTR tmp_bf_ptr; /* Generic temporary for use
646e93f7393Sniklas in macros */
647e93f7393Sniklas
648e93f7393Sniklas /* The following function simply enters a given common block onto
649e93f7393Sniklas the global common block chain */
650e93f7393Sniklas
651e93f7393Sniklas static void
652b725ae77Skettenis add_common_block (char *name, CORE_ADDR offset, int secnum, char *func_stab)
653e93f7393Sniklas {
654e93f7393Sniklas SAVED_F77_COMMON_PTR tmp;
655e93f7393Sniklas char *c, *local_copy_func_stab;
656e93f7393Sniklas
657e93f7393Sniklas /* If the COMMON block we are trying to add has a blank
658e93f7393Sniklas name (i.e. "#BLNK_COM") then we set it to __BLANK
659e93f7393Sniklas because the darn "#" character makes GDB's input
660e93f7393Sniklas parser have fits. */
661e93f7393Sniklas
662e93f7393Sniklas
663b725ae77Skettenis if (strcmp (name, BLANK_COMMON_NAME_ORIGINAL) == 0
664b725ae77Skettenis || strcmp (name, BLANK_COMMON_NAME_MF77) == 0)
665e93f7393Sniklas {
666e93f7393Sniklas
667b725ae77Skettenis xfree (name);
668e93f7393Sniklas name = alloca (strlen (BLANK_COMMON_NAME_LOCAL) + 1);
669e93f7393Sniklas strcpy (name, BLANK_COMMON_NAME_LOCAL);
670e93f7393Sniklas }
671e93f7393Sniklas
672e93f7393Sniklas tmp = allocate_saved_f77_common_node ();
673e93f7393Sniklas
674e93f7393Sniklas local_copy_func_stab = xmalloc (strlen (func_stab) + 1);
675e93f7393Sniklas strcpy (local_copy_func_stab, func_stab);
676e93f7393Sniklas
677e93f7393Sniklas tmp->name = xmalloc (strlen (name) + 1);
678e93f7393Sniklas
679e93f7393Sniklas /* local_copy_func_stab is a stabstring, let us first extract the
680e93f7393Sniklas function name from the stab by NULLing out the ':' character. */
681e93f7393Sniklas
682e93f7393Sniklas
683e93f7393Sniklas c = NULL;
684e93f7393Sniklas c = strchr (local_copy_func_stab, ':');
685e93f7393Sniklas
686e93f7393Sniklas if (c)
687e93f7393Sniklas *c = '\0';
688e93f7393Sniklas else
689e93f7393Sniklas error ("Malformed function STAB found in add_common_block()");
690e93f7393Sniklas
691e93f7393Sniklas
692e93f7393Sniklas tmp->owning_function = xmalloc (strlen (local_copy_func_stab) + 1);
693e93f7393Sniklas
694e93f7393Sniklas strcpy (tmp->owning_function, local_copy_func_stab);
695e93f7393Sniklas
696e93f7393Sniklas strcpy (tmp->name, name);
697e93f7393Sniklas tmp->offset = offset;
698e93f7393Sniklas tmp->next = NULL;
699e93f7393Sniklas tmp->entries = NULL;
700e93f7393Sniklas tmp->secnum = secnum;
701e93f7393Sniklas
702e93f7393Sniklas current_common = tmp;
703e93f7393Sniklas
704e93f7393Sniklas if (head_common_list == NULL)
705e93f7393Sniklas {
706e93f7393Sniklas head_common_list = tail_common_list = tmp;
707e93f7393Sniklas }
708e93f7393Sniklas else
709e93f7393Sniklas {
710e93f7393Sniklas tail_common_list->next = tmp;
711e93f7393Sniklas tail_common_list = tmp;
712e93f7393Sniklas }
713e93f7393Sniklas }
714e93f7393Sniklas #endif
715e93f7393Sniklas
716e93f7393Sniklas /* The following function simply enters a given common entry onto
717e93f7393Sniklas the "current_common" block that has been saved away. */
718e93f7393Sniklas
719e93f7393Sniklas #if 0
720e93f7393Sniklas static void
721b725ae77Skettenis add_common_entry (struct symbol *entry_sym_ptr)
722e93f7393Sniklas {
723e93f7393Sniklas COMMON_ENTRY_PTR tmp;
724e93f7393Sniklas
725e93f7393Sniklas
726e93f7393Sniklas
727e93f7393Sniklas /* The order of this list is important, since
728e93f7393Sniklas we expect the entries to appear in decl.
729e93f7393Sniklas order when we later issue "info common" calls */
730e93f7393Sniklas
731e93f7393Sniklas tmp = allocate_common_entry_node ();
732e93f7393Sniklas
733e93f7393Sniklas tmp->next = NULL;
734e93f7393Sniklas tmp->symbol = entry_sym_ptr;
735e93f7393Sniklas
736e93f7393Sniklas if (current_common == NULL)
737e93f7393Sniklas error ("Attempt to add COMMON entry with no block open!");
738e93f7393Sniklas else
739e93f7393Sniklas {
740e93f7393Sniklas if (current_common->entries == NULL)
741e93f7393Sniklas {
742e93f7393Sniklas current_common->entries = tmp;
743e93f7393Sniklas current_common->end_of_entries = tmp;
744e93f7393Sniklas }
745e93f7393Sniklas else
746e93f7393Sniklas {
747e93f7393Sniklas current_common->end_of_entries->next = tmp;
748e93f7393Sniklas current_common->end_of_entries = tmp;
749e93f7393Sniklas }
750e93f7393Sniklas }
751e93f7393Sniklas }
752e93f7393Sniklas #endif
753e93f7393Sniklas
754e93f7393Sniklas /* This routine finds the first encountred COMMON block named "name" */
755e93f7393Sniklas
756e93f7393Sniklas #if 0
757e93f7393Sniklas static SAVED_F77_COMMON_PTR
758b725ae77Skettenis find_first_common_named (char *name)
759e93f7393Sniklas {
760e93f7393Sniklas
761e93f7393Sniklas SAVED_F77_COMMON_PTR tmp;
762e93f7393Sniklas
763e93f7393Sniklas tmp = head_common_list;
764e93f7393Sniklas
765e93f7393Sniklas while (tmp != NULL)
766e93f7393Sniklas {
767b725ae77Skettenis if (strcmp (tmp->name, name) == 0)
768e93f7393Sniklas return (tmp);
769e93f7393Sniklas else
770e93f7393Sniklas tmp = tmp->next;
771e93f7393Sniklas }
772e93f7393Sniklas return (NULL);
773e93f7393Sniklas }
774e93f7393Sniklas #endif
775e93f7393Sniklas
776e93f7393Sniklas /* This routine finds the first encountred COMMON block named "name"
777e93f7393Sniklas that belongs to function funcname */
778e93f7393Sniklas
779b725ae77Skettenis SAVED_F77_COMMON_PTR
find_common_for_function(char * name,char * funcname)780b725ae77Skettenis find_common_for_function (char *name, char *funcname)
781e93f7393Sniklas {
782e93f7393Sniklas
783e93f7393Sniklas SAVED_F77_COMMON_PTR tmp;
784e93f7393Sniklas
785e93f7393Sniklas tmp = head_common_list;
786e93f7393Sniklas
787e93f7393Sniklas while (tmp != NULL)
788e93f7393Sniklas {
789b725ae77Skettenis if (DEPRECATED_STREQ (tmp->name, name)
790b725ae77Skettenis && DEPRECATED_STREQ (tmp->owning_function, funcname))
791e93f7393Sniklas return (tmp);
792e93f7393Sniklas else
793e93f7393Sniklas tmp = tmp->next;
794e93f7393Sniklas }
795e93f7393Sniklas return (NULL);
796e93f7393Sniklas }
797e93f7393Sniklas
798e93f7393Sniklas
799e93f7393Sniklas #if 0
800e93f7393Sniklas
801e93f7393Sniklas /* The following function is called to patch up the offsets
802e93f7393Sniklas for the statics contained in the COMMON block named
803e93f7393Sniklas "name." */
804e93f7393Sniklas
805e93f7393Sniklas static void
806b725ae77Skettenis patch_common_entries (SAVED_F77_COMMON_PTR blk, CORE_ADDR offset, int secnum)
807e93f7393Sniklas {
808e93f7393Sniklas COMMON_ENTRY_PTR entry;
809e93f7393Sniklas
810e93f7393Sniklas blk->offset = offset; /* Keep this around for future use. */
811e93f7393Sniklas
812e93f7393Sniklas entry = blk->entries;
813e93f7393Sniklas
814e93f7393Sniklas while (entry != NULL)
815e93f7393Sniklas {
816e93f7393Sniklas SYMBOL_VALUE (entry->symbol) += offset;
817e93f7393Sniklas SYMBOL_SECTION (entry->symbol) = secnum;
818e93f7393Sniklas
819e93f7393Sniklas entry = entry->next;
820e93f7393Sniklas }
821e93f7393Sniklas blk->secnum = secnum;
822e93f7393Sniklas }
823e93f7393Sniklas
824e93f7393Sniklas /* Patch all commons named "name" that need patching.Since COMMON
825e93f7393Sniklas blocks occur with relative infrequency, we simply do a linear scan on
826e93f7393Sniklas the name. Eventually, the best way to do this will be a
827e93f7393Sniklas hashed-lookup. Secnum is the section number for the .bss section
828e93f7393Sniklas (which is where common data lives). */
829e93f7393Sniklas
830e93f7393Sniklas static void
831b725ae77Skettenis patch_all_commons_by_name (char *name, CORE_ADDR offset, int secnum)
832e93f7393Sniklas {
833e93f7393Sniklas
834e93f7393Sniklas SAVED_F77_COMMON_PTR tmp;
835e93f7393Sniklas
836e93f7393Sniklas /* For blank common blocks, change the canonical reprsentation
837e93f7393Sniklas of a blank name */
838e93f7393Sniklas
839b725ae77Skettenis if (strcmp (name, BLANK_COMMON_NAME_ORIGINAL) == 0
840b725ae77Skettenis || strcmp (name, BLANK_COMMON_NAME_MF77) == 0)
841e93f7393Sniklas {
842b725ae77Skettenis xfree (name);
843e93f7393Sniklas name = alloca (strlen (BLANK_COMMON_NAME_LOCAL) + 1);
844e93f7393Sniklas strcpy (name, BLANK_COMMON_NAME_LOCAL);
845e93f7393Sniklas }
846e93f7393Sniklas
847e93f7393Sniklas tmp = head_common_list;
848e93f7393Sniklas
849e93f7393Sniklas while (tmp != NULL)
850e93f7393Sniklas {
851e93f7393Sniklas if (COMMON_NEEDS_PATCHING (tmp))
852b725ae77Skettenis if (strcmp (tmp->name, name) == 0)
853e93f7393Sniklas patch_common_entries (tmp, offset, secnum);
854e93f7393Sniklas
855e93f7393Sniklas tmp = tmp->next;
856e93f7393Sniklas }
857e93f7393Sniklas }
858e93f7393Sniklas #endif
859e93f7393Sniklas
860e93f7393Sniklas /* This macro adds the symbol-number for the start of the function
861e93f7393Sniklas (the symbol number of the .bf) referenced by symnum_fcn to a
862e93f7393Sniklas list. This list, in reality should be a FIFO queue but since
863e93f7393Sniklas #line pragmas sometimes cause line ranges to get messed up
864e93f7393Sniklas we simply create a linear list. This list can then be searched
865e93f7393Sniklas first by a queueing algorithm and upon failure fall back to
866e93f7393Sniklas a linear scan. */
867e93f7393Sniklas
868e93f7393Sniklas #if 0
869e93f7393Sniklas #define ADD_BF_SYMNUM(bf_sym,fcn_sym) \
870e93f7393Sniklas \
871e93f7393Sniklas if (saved_bf_list == NULL) \
872e93f7393Sniklas { \
873e93f7393Sniklas tmp_bf_ptr = allocate_saved_bf_node(); \
874e93f7393Sniklas \
875e93f7393Sniklas tmp_bf_ptr->symnum_bf = (bf_sym); \
876e93f7393Sniklas tmp_bf_ptr->symnum_fcn = (fcn_sym); \
877e93f7393Sniklas tmp_bf_ptr->next = NULL; \
878e93f7393Sniklas \
879e93f7393Sniklas current_head_bf_list = saved_bf_list = tmp_bf_ptr; \
880e93f7393Sniklas saved_bf_list_end = tmp_bf_ptr; \
881e93f7393Sniklas } \
882e93f7393Sniklas else \
883e93f7393Sniklas { \
884e93f7393Sniklas tmp_bf_ptr = allocate_saved_bf_node(); \
885e93f7393Sniklas \
886e93f7393Sniklas tmp_bf_ptr->symnum_bf = (bf_sym); \
887e93f7393Sniklas tmp_bf_ptr->symnum_fcn = (fcn_sym); \
888e93f7393Sniklas tmp_bf_ptr->next = NULL; \
889e93f7393Sniklas \
890e93f7393Sniklas saved_bf_list_end->next = tmp_bf_ptr; \
891e93f7393Sniklas saved_bf_list_end = tmp_bf_ptr; \
892e93f7393Sniklas }
893e93f7393Sniklas #endif
894e93f7393Sniklas
895e93f7393Sniklas /* This function frees the entire (.bf,function) list */
896e93f7393Sniklas
897e93f7393Sniklas #if 0
898e93f7393Sniklas static void
899b725ae77Skettenis clear_bf_list (void)
900e93f7393Sniklas {
901e93f7393Sniklas
902e93f7393Sniklas SAVED_BF_PTR tmp = saved_bf_list;
903e93f7393Sniklas SAVED_BF_PTR next = NULL;
904e93f7393Sniklas
905e93f7393Sniklas while (tmp != NULL)
906e93f7393Sniklas {
907e93f7393Sniklas next = tmp->next;
908b725ae77Skettenis xfree (tmp);
909e93f7393Sniklas tmp = next;
910e93f7393Sniklas }
911e93f7393Sniklas saved_bf_list = NULL;
912e93f7393Sniklas }
913e93f7393Sniklas #endif
914e93f7393Sniklas
915e93f7393Sniklas int global_remote_debug;
916e93f7393Sniklas
917e93f7393Sniklas #if 0
918e93f7393Sniklas
919e93f7393Sniklas static long
920b725ae77Skettenis get_bf_for_fcn (long the_function)
921e93f7393Sniklas {
922e93f7393Sniklas SAVED_BF_PTR tmp;
923e93f7393Sniklas int nprobes = 0;
924e93f7393Sniklas
925e93f7393Sniklas /* First use a simple queuing algorithm (i.e. look and see if the
926e93f7393Sniklas item at the head of the queue is the one you want) */
927e93f7393Sniklas
928e93f7393Sniklas if (saved_bf_list == NULL)
929b725ae77Skettenis internal_error (__FILE__, __LINE__,
930b725ae77Skettenis "cannot get .bf node off empty list");
931e93f7393Sniklas
932e93f7393Sniklas if (current_head_bf_list != NULL)
933e93f7393Sniklas if (current_head_bf_list->symnum_fcn == the_function)
934e93f7393Sniklas {
935e93f7393Sniklas if (global_remote_debug)
936b725ae77Skettenis fprintf_unfiltered (gdb_stderr, "*");
937e93f7393Sniklas
938e93f7393Sniklas tmp = current_head_bf_list;
939e93f7393Sniklas current_head_bf_list = current_head_bf_list->next;
940e93f7393Sniklas return (tmp->symnum_bf);
941e93f7393Sniklas }
942e93f7393Sniklas
943e93f7393Sniklas /* If the above did not work (probably because #line directives were
944e93f7393Sniklas used in the sourcefile and they messed up our internal tables) we now do
945e93f7393Sniklas the ugly linear scan */
946e93f7393Sniklas
947e93f7393Sniklas if (global_remote_debug)
948b725ae77Skettenis fprintf_unfiltered (gdb_stderr, "\ndefaulting to linear scan\n");
949e93f7393Sniklas
950e93f7393Sniklas nprobes = 0;
951e93f7393Sniklas tmp = saved_bf_list;
952e93f7393Sniklas while (tmp != NULL)
953e93f7393Sniklas {
954e93f7393Sniklas nprobes++;
955e93f7393Sniklas if (tmp->symnum_fcn == the_function)
956e93f7393Sniklas {
957e93f7393Sniklas if (global_remote_debug)
958b725ae77Skettenis fprintf_unfiltered (gdb_stderr, "Found in %d probes\n", nprobes);
959e93f7393Sniklas current_head_bf_list = tmp->next;
960e93f7393Sniklas return (tmp->symnum_bf);
961e93f7393Sniklas }
962e93f7393Sniklas tmp = tmp->next;
963e93f7393Sniklas }
964e93f7393Sniklas
965e93f7393Sniklas return (-1);
966e93f7393Sniklas }
967e93f7393Sniklas
968e93f7393Sniklas static SAVED_FUNCTION_PTR saved_function_list = NULL;
969e93f7393Sniklas static SAVED_FUNCTION_PTR saved_function_list_end = NULL;
970e93f7393Sniklas
971e93f7393Sniklas static void
972b725ae77Skettenis clear_function_list (void)
973e93f7393Sniklas {
974e93f7393Sniklas SAVED_FUNCTION_PTR tmp = saved_function_list;
975e93f7393Sniklas SAVED_FUNCTION_PTR next = NULL;
976e93f7393Sniklas
977e93f7393Sniklas while (tmp != NULL)
978e93f7393Sniklas {
979e93f7393Sniklas next = tmp->next;
980b725ae77Skettenis xfree (tmp);
981e93f7393Sniklas tmp = next;
982e93f7393Sniklas }
983e93f7393Sniklas
984e93f7393Sniklas saved_function_list = NULL;
985e93f7393Sniklas }
986e93f7393Sniklas #endif
987