home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 9 / FreshFishVol9-CD2.bin / bbs / gnu / gdb-4.14-src.lha / gdb-4.14 / gdb / f-lang.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-02-02  |  24.9 KB  |  953 lines

  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.    (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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  21.  
  22. #include "defs.h"
  23. #include <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.  
  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.  
  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.   f_printchar,            /* Print character constant */
  427.   f_printstr,            /* function to print string constant */
  428.   f_create_fundamental_type,    /* Create fundamental type in this language */
  429.   f_print_type,                /* Print a type using appropriate syntax */
  430.   f_val_print,            /* Print a value using appropriate syntax */
  431.   c_value_print,  /* FIXME */
  432.   {"",      "",   "",   ""},    /* Binary format info */
  433.   {"0%o",  "0",   "o", ""},    /* Octal format info */
  434.   {"%d",   "",    "d", ""},    /* Decimal format info */
  435.   {"0x%x", "0x",  "x", ""},    /* Hex format info */
  436.   f_op_print_tab,        /* expression operators for printing */
  437.   0,                /* arrays are first-class (not c-style) */
  438.   1,                /* String lower bound */
  439.   &builtin_type_f_character,    /* Type of string elements */ 
  440.   LANG_MAGIC
  441.   };
  442.  
  443. void
  444. _initialize_f_language ()
  445. {
  446.   builtin_type_f_void =
  447.     init_type (TYPE_CODE_VOID, 1,
  448.            0,
  449.            "VOID", (struct objfile *) NULL);
  450.   
  451.   builtin_type_f_character =
  452.     init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
  453.            0,
  454.            "character", (struct objfile *) NULL);
  455.   
  456.   builtin_type_f_logical_s1 =
  457.     init_type (TYPE_CODE_BOOL, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
  458.            TYPE_FLAG_UNSIGNED,
  459.            "logical*1", (struct objfile *) NULL);
  460.   
  461.   builtin_type_f_integer_s2 =
  462.     init_type (TYPE_CODE_INT, TARGET_SHORT_BIT / TARGET_CHAR_BIT,
  463.            0,
  464.            "integer*2", (struct objfile *) NULL);
  465.   
  466.   builtin_type_f_logical_s2 =
  467.     init_type (TYPE_CODE_BOOL, TARGET_SHORT_BIT / TARGET_CHAR_BIT,
  468.            TYPE_FLAG_UNSIGNED,
  469.            "logical*2", (struct objfile *) NULL);
  470.   
  471.   builtin_type_f_integer =
  472.     init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT,
  473.            0,
  474.            "integer", (struct objfile *) NULL);
  475.   
  476.   builtin_type_f_logical =
  477.     init_type (TYPE_CODE_BOOL, TARGET_INT_BIT / TARGET_CHAR_BIT,
  478.            TYPE_FLAG_UNSIGNED,
  479.            "logical*4", (struct objfile *) NULL);
  480.   
  481.   builtin_type_f_real =
  482.     init_type (TYPE_CODE_FLT, TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
  483.            0,
  484.            "real", (struct objfile *) NULL);
  485.   
  486.   builtin_type_f_real_s8 =
  487.     init_type (TYPE_CODE_FLT, TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
  488.            0,
  489.            "real*8", (struct objfile *) NULL);
  490.   
  491.   builtin_type_f_real_s16 =
  492.     init_type (TYPE_CODE_FLT, TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
  493.            0,
  494.            "real*16", (struct objfile *) NULL);
  495.   
  496.   builtin_type_f_complex_s8 =
  497.     init_type (TYPE_CODE_COMPLEX, 2 * TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
  498.            0,
  499.            "complex*8", (struct objfile *) NULL);
  500.   TYPE_TARGET_TYPE (builtin_type_f_complex_s8) = builtin_type_f_real;
  501.   
  502.   builtin_type_f_complex_s16 =
  503.     init_type (TYPE_CODE_COMPLEX, 2 * TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
  504.            0,
  505.            "complex*16", (struct objfile *) NULL);
  506.   TYPE_TARGET_TYPE (builtin_type_f_complex_s16) = builtin_type_f_real_s8;
  507.   
  508.   /* We have a new size == 4 double floats for the
  509.      complex*32 data type */
  510.   
  511.   builtin_type_f_complex_s32 = 
  512.     init_type (TYPE_CODE_COMPLEX, 2 * TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
  513.            0,
  514.            "complex*32", (struct objfile *) NULL);
  515.   TYPE_TARGET_TYPE (builtin_type_f_complex_s32) = builtin_type_f_real_s16;
  516.  
  517.   builtin_type_string =
  518.     init_type (TYPE_CODE_STRING, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
  519.            0,
  520.            "character string", (struct objfile *) NULL); 
  521.   
  522.   add_language (&f_language_defn);
  523. }
  524.  
  525. /* Following is dubious stuff that had been in the xcoff reader. */
  526.  
  527. struct saved_fcn
  528. {
  529.   long                         line_offset;  /* Line offset for function */ 
  530.   struct saved_fcn             *next;      
  531. }; 
  532.  
  533.  
  534. struct saved_bf_symnum 
  535. {
  536.   long       symnum_fcn;  /* Symnum of function (i.e. .function directive) */
  537.   long       symnum_bf;   /* Symnum of .bf for this function */ 
  538.   struct saved_bf_symnum *next;  
  539. }; 
  540.  
  541. typedef struct saved_fcn           SAVED_FUNCTION, *SAVED_FUNCTION_PTR; 
  542. typedef struct saved_bf_symnum     SAVED_BF, *SAVED_BF_PTR; 
  543.  
  544.  
  545. SAVED_BF_PTR allocate_saved_bf_node()
  546. {
  547.   SAVED_BF_PTR new;
  548.   
  549.   new = (SAVED_BF_PTR) malloc (sizeof (SAVED_BF));
  550.   
  551.   if (new == NULL)
  552.     fatal("could not allocate enough memory to save one more .bf on save list");
  553.   return(new);
  554. }
  555.  
  556. SAVED_FUNCTION *allocate_saved_function_node()
  557. {
  558.   SAVED_FUNCTION *new;
  559.   
  560.   new = (SAVED_FUNCTION *) malloc (sizeof (SAVED_FUNCTION));
  561.   
  562.   if (new == NULL)
  563.     fatal("could not allocate enough memory to save one more function on save list");
  564.   
  565.   return(new);
  566. }
  567.  
  568. SAVED_F77_COMMON_PTR allocate_saved_f77_common_node()
  569. {
  570.   SAVED_F77_COMMON_PTR new;
  571.   
  572.   new = (SAVED_F77_COMMON_PTR) malloc (sizeof (SAVED_F77_COMMON));
  573.   
  574.   if (new == NULL)
  575.     fatal("could not allocate enough memory to save one more F77 COMMON blk on save list");
  576.   
  577.   return(new);
  578. }
  579.  
  580. COMMON_ENTRY_PTR allocate_common_entry_node()
  581. {
  582.   COMMON_ENTRY_PTR new;
  583.   
  584.   new = (COMMON_ENTRY_PTR) malloc (sizeof (COMMON_ENTRY));
  585.   
  586.   if (new == NULL)
  587.     fatal("could not allocate enough memory to save one more COMMON entry on save list");
  588.   
  589.   return(new);
  590. }
  591.  
  592.  
  593. SAVED_F77_COMMON_PTR head_common_list=NULL;     /* Ptr to 1st saved COMMON  */
  594. SAVED_F77_COMMON_PTR tail_common_list=NULL;     /* Ptr to last saved COMMON  */
  595. SAVED_F77_COMMON_PTR current_common=NULL;       /* Ptr to current COMMON */
  596.  
  597. static SAVED_BF_PTR saved_bf_list=NULL;          /* Ptr to (.bf,function) 
  598.                                                     list*/
  599. static SAVED_BF_PTR saved_bf_list_end=NULL;      /* Ptr to above list's end */
  600. static SAVED_BF_PTR current_head_bf_list=NULL;   /* Current head of above list
  601.                           */
  602.  
  603. static SAVED_BF_PTR tmp_bf_ptr;                  /* Generic temporary for use 
  604.                                                     in macros */ 
  605.  
  606.  
  607. /* The following function simply enters a given common block onto 
  608.    the global common block chain */
  609.  
  610. void add_common_block(name,offset,secnum,func_stab)
  611.      char *name;
  612.      CORE_ADDR offset;
  613.      int secnum;
  614.      char *func_stab;
  615.      
  616. {
  617.   SAVED_F77_COMMON_PTR tmp;
  618.   char *c,*local_copy_func_stab; 
  619.   
  620.   /* If the COMMON block we are trying to add has a blank 
  621.      name (i.e. "#BLNK_COM") then we set it to __BLANK
  622.      because the darn "#" character makes GDB's input 
  623.      parser have fits. */ 
  624.   
  625.   
  626.   if (STREQ(name,BLANK_COMMON_NAME_ORIGINAL) ||
  627.       STREQ(name,BLANK_COMMON_NAME_MF77))
  628.     {
  629.       
  630.       free(name);
  631.       name = alloca(strlen(BLANK_COMMON_NAME_LOCAL) + 1); 
  632.       strcpy(name,BLANK_COMMON_NAME_LOCAL); 
  633.     }
  634.   
  635.   tmp = allocate_saved_f77_common_node();
  636.   
  637.   local_copy_func_stab = malloc (strlen(func_stab) + 1);
  638.   strcpy(local_copy_func_stab,func_stab); 
  639.   
  640.   tmp->name = malloc(strlen(name) + 1);
  641.   
  642.   /* local_copy_func_stab is a stabstring, let us first extract the 
  643.      function name from the stab by NULLing out the ':' character. */ 
  644.   
  645.   
  646.   c = NULL; 
  647.   c = strchr(local_copy_func_stab,':');
  648.   
  649.   if (c)
  650.     *c = '\0';
  651.   else
  652.     error("Malformed function STAB found in add_common_block()");
  653.   
  654.   
  655.   tmp->owning_function = malloc (strlen(local_copy_func_stab) + 1); 
  656.   
  657.   strcpy(tmp->owning_function,local_copy_func_stab); 
  658.   
  659.   strcpy(tmp->name,name);
  660.   tmp->offset = offset; 
  661.   tmp->next = NULL;
  662.   tmp->entries = NULL;
  663.   tmp->secnum = secnum; 
  664.   
  665.   current_common = tmp;
  666.   
  667.   if (head_common_list == NULL)
  668.     {
  669.       head_common_list = tail_common_list = tmp;
  670.     }
  671.   else
  672.     {
  673.       tail_common_list->next = tmp; 
  674.       tail_common_list = tmp;
  675.     }
  676.   
  677. }
  678.  
  679.  
  680. /* The following function simply enters a given common entry onto 
  681.    the "current_common" block that has been saved away. */ 
  682.  
  683. void add_common_entry(entry_sym_ptr)
  684.      struct symbol *entry_sym_ptr; 
  685. {
  686.   COMMON_ENTRY_PTR tmp;
  687.   
  688.   
  689.   
  690.   /* The order of this list is important, since 
  691.      we expect the entries to appear in decl.
  692.      order when we later issue "info common" calls */ 
  693.   
  694.   tmp = allocate_common_entry_node();
  695.   
  696.   tmp->next = NULL;
  697.   tmp->symbol = entry_sym_ptr;
  698.   
  699.   if (current_common == NULL)
  700.     error("Attempt to add COMMON entry with no block open!");
  701.   else         
  702.     {
  703.       if (current_common->entries == NULL)
  704.     {
  705.       current_common->entries = tmp;
  706.       current_common->end_of_entries = tmp; 
  707.     }
  708.       else
  709.     {
  710.       current_common->end_of_entries->next = tmp; 
  711.       current_common->end_of_entries = tmp; 
  712.     }
  713.     }
  714.   
  715.   
  716. }
  717.  
  718. /* This routine finds the first encountred COMMON block named "name" */ 
  719.  
  720. SAVED_F77_COMMON_PTR find_first_common_named(name)
  721.      char *name; 
  722. {
  723.   
  724.   SAVED_F77_COMMON_PTR tmp;
  725.   
  726.   tmp = head_common_list;
  727.   
  728.   while (tmp != NULL)
  729.     {
  730.       if (STREQ(tmp->name,name))
  731.     return(tmp);
  732.       else
  733.     tmp = tmp->next;
  734.     }
  735.   return(NULL); 
  736. }
  737.  
  738. /* This routine finds the first encountred COMMON block named "name" 
  739.    that belongs to function funcname */ 
  740.  
  741. SAVED_F77_COMMON_PTR find_common_for_function(name, funcname)
  742.      char *name;
  743.      char *funcname; 
  744. {
  745.   
  746.   SAVED_F77_COMMON_PTR tmp;
  747.   
  748.   tmp = head_common_list;
  749.   
  750.   while (tmp != NULL)
  751.     {
  752.       if (STREQ(tmp->name,name) && STREQ(tmp->owning_function,funcname))
  753.     return(tmp);
  754.       else
  755.     tmp = tmp->next;
  756.     }
  757.   return(NULL); 
  758. }
  759.  
  760.  
  761.  
  762.  
  763. /* The following function is called to patch up the offsets 
  764.    for the statics contained in the COMMON block named
  765.    "name."  */ 
  766.  
  767.  
  768. void patch_common_entries (blk, offset, secnum)
  769.      SAVED_F77_COMMON_PTR blk;
  770.      CORE_ADDR offset;
  771.      int secnum;
  772. {
  773.   COMMON_ENTRY_PTR entry;
  774.   
  775.   blk->offset = offset;  /* Keep this around for future use. */ 
  776.   
  777.   entry = blk->entries;
  778.   
  779.   while (entry != NULL)
  780.     {
  781.       SYMBOL_VALUE (entry->symbol) += offset; 
  782.       SYMBOL_SECTION (entry->symbol) = secnum;
  783.       
  784.       entry = entry->next;
  785.     }
  786.   blk->secnum = secnum; 
  787. }
  788.  
  789.  
  790. /* Patch all commons named "name" that need patching.Since COMMON
  791.    blocks occur with relative infrequency, we simply do a linear scan on
  792.    the name.  Eventually, the best way to do this will be a
  793.    hashed-lookup.  Secnum is the section number for the .bss section
  794.    (which is where common data lives). */
  795.  
  796.  
  797. void patch_all_commons_by_name (name, offset, secnum)
  798.      char *name;
  799.      CORE_ADDR offset;
  800.      int secnum;
  801. {
  802.   
  803.   SAVED_F77_COMMON_PTR tmp;
  804.   
  805.   /* For blank common blocks, change the canonical reprsentation 
  806.      of a blank name */
  807.   
  808.   if ((STREQ(name,BLANK_COMMON_NAME_ORIGINAL)) ||
  809.       (STREQ(name,BLANK_COMMON_NAME_MF77)))
  810.     {
  811.       free(name);
  812.       name = alloca(strlen(BLANK_COMMON_NAME_LOCAL) + 1); 
  813.       strcpy(name,BLANK_COMMON_NAME_LOCAL); 
  814.     }
  815.   
  816.   tmp = head_common_list;
  817.   
  818.   while (tmp != NULL)
  819.     {
  820.       if (COMMON_NEEDS_PATCHING(tmp))
  821.     if (STREQ(tmp->name,name))
  822.       patch_common_entries(tmp,offset,secnum); 
  823.       
  824.       tmp = tmp->next;
  825.     }   
  826.   
  827. }
  828.  
  829.  
  830.  
  831.  
  832.  
  833. /* This macro adds the symbol-number for the start of the function 
  834.    (the symbol number of the .bf) referenced by symnum_fcn to a 
  835.    list.  This list, in reality should be a FIFO queue but since 
  836.    #line pragmas sometimes cause line ranges to get messed up 
  837.    we simply create a linear list.  This list can then be searched 
  838.    first by a queueing algorithm and upon failure fall back to 
  839.    a linear scan. */ 
  840.  
  841. #define ADD_BF_SYMNUM(bf_sym,fcn_sym) \
  842.   \
  843.   if (saved_bf_list == NULL) \
  844. { \
  845.     tmp_bf_ptr = allocate_saved_bf_node(); \
  846.       \
  847.     tmp_bf_ptr->symnum_bf = (bf_sym); \
  848.       tmp_bf_ptr->symnum_fcn = (fcn_sym);  \
  849.         tmp_bf_ptr->next = NULL; \
  850.           \
  851.         current_head_bf_list = saved_bf_list = tmp_bf_ptr; \
  852.           saved_bf_list_end = tmp_bf_ptr; \
  853.           } \
  854. else \
  855. {  \
  856.      tmp_bf_ptr = allocate_saved_bf_node(); \
  857.        \
  858.          tmp_bf_ptr->symnum_bf = (bf_sym);  \
  859.        tmp_bf_ptr->symnum_fcn = (fcn_sym);  \
  860.          tmp_bf_ptr->next = NULL;  \
  861.            \
  862.          saved_bf_list_end->next = tmp_bf_ptr;  \
  863.            saved_bf_list_end = tmp_bf_ptr; \
  864.            } 
  865.  
  866.  
  867. /* This function frees the entire (.bf,function) list */ 
  868.  
  869. void 
  870.   clear_bf_list()
  871. {
  872.   
  873.   SAVED_BF_PTR tmp = saved_bf_list;
  874.   SAVED_BF_PTR next = NULL; 
  875.   
  876.   while (tmp != NULL)
  877.     {
  878.       next = tmp->next;
  879.       free(tmp);
  880.       tmp=next;
  881.     }
  882.   saved_bf_list = NULL;
  883. }
  884.  
  885. int global_remote_debug;
  886.  
  887. long
  888. get_bf_for_fcn (the_function)
  889.      long the_function;
  890. {
  891.   SAVED_BF_PTR tmp;
  892.   int nprobes = 0;
  893.   
  894.   /* First use a simple queuing algorithm (i.e. look and see if the 
  895.      item at the head of the queue is the one you want)  */
  896.   
  897.   if (saved_bf_list == NULL)
  898.     fatal ("cannot get .bf node off empty list"); 
  899.   
  900.   if (current_head_bf_list != NULL) 
  901.     if (current_head_bf_list->symnum_fcn == the_function)
  902.       {
  903.     if (global_remote_debug) 
  904.       fprintf(stderr,"*"); 
  905.  
  906.     tmp = current_head_bf_list; 
  907.     current_head_bf_list = current_head_bf_list->next;
  908.     return(tmp->symnum_bf); 
  909.       }
  910.   
  911.   /* If the above did not work (probably because #line directives were 
  912.      used in the sourcefile and they messed up our internal tables) we now do
  913.      the ugly linear scan */
  914.   
  915.   if (global_remote_debug) 
  916.     fprintf(stderr,"\ndefaulting to linear scan\n"); 
  917.   
  918.   nprobes = 0; 
  919.   tmp = saved_bf_list;
  920.   while (tmp != NULL)
  921.     {
  922.       nprobes++; 
  923.       if (tmp->symnum_fcn == the_function)
  924.     { 
  925.       if (global_remote_debug)
  926.         fprintf(stderr,"Found in %d probes\n",nprobes);
  927.       current_head_bf_list = tmp->next;
  928.       return(tmp->symnum_bf);
  929.     } 
  930.       tmp= tmp->next; 
  931.     }
  932.   
  933.   return(-1); 
  934. }
  935.  
  936. static SAVED_FUNCTION_PTR saved_function_list=NULL; 
  937. static SAVED_FUNCTION_PTR saved_function_list_end=NULL; 
  938.  
  939. void clear_function_list()
  940. {
  941.   SAVED_FUNCTION_PTR tmp = saved_function_list;
  942.   SAVED_FUNCTION_PTR next = NULL; 
  943.   
  944.   while (tmp != NULL)
  945.     {
  946.       next = tmp->next;
  947.       free(tmp);
  948.       tmp = next;
  949.     }
  950.   
  951.   saved_function_list = NULL;
  952. }
  953.