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