xref: /openbsd-src/gnu/usr.bin/binutils/gdb/f-lang.c (revision 63addd46c1e40ca0f49488ddcdc4ab598023b0c1)
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