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