/* Fortran language support routines for GDB, the GNU debugger.
- Copyright 1993, 1994 Free Software Foundation, Inc.
+ Copyright 1993, 1994, 1996 Free Software Foundation, Inc.
Contributed by Motorola. Adapted from the C parser by Farooq Butt
(fmbutt@engage.sps.mot.com).
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "defs.h"
-#include <string.h>
+#include "gdb_string.h"
#include "symtab.h"
#include "gdbtypes.h"
#include "expression.h"
#include "language.h"
#include "f-lang.h"
+/* The built-in types of F77. FIXME: integer*4 is missing, plain
+ logical is missing (builtin_type_logical is logical*4). */
+
+struct type *builtin_type_f_character;
+struct type *builtin_type_f_logical;
+struct type *builtin_type_f_logical_s1;
+struct type *builtin_type_f_logical_s2;
+struct type *builtin_type_f_integer;
+struct type *builtin_type_f_integer_s2;
+struct type *builtin_type_f_real;
+struct type *builtin_type_f_real_s8;
+struct type *builtin_type_f_real_s16;
+struct type *builtin_type_f_complex_s8;
+struct type *builtin_type_f_complex_s16;
+struct type *builtin_type_f_complex_s32;
+struct type *builtin_type_f_void;
+
/* Print the character C on STREAM as part of the contents of a literal
string whose delimiter is QUOTER. Note that that format for printing
characters and strings is language specific.
0, "real*16", objfile);
break;
case FT_COMPLEX:
- type = init_type (TYPE_CODE_FLT,
- TARGET_COMPLEX_BIT / TARGET_CHAR_BIT,
+ type = init_type (TYPE_CODE_COMPLEX,
+ 2 * TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
0, "complex*8", objfile);
+ TYPE_TARGET_TYPE (type) = builtin_type_f_real;
break;
case FT_DBL_PREC_COMPLEX:
- type = init_type (TYPE_CODE_FLT,
- TARGET_DOUBLE_COMPLEX_BIT / TARGET_CHAR_BIT,
+ type = init_type (TYPE_CODE_COMPLEX,
+ 2 * TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
0, "complex*16", objfile);
+ TYPE_TARGET_TYPE (type) = builtin_type_f_real_s8;
break;
case FT_EXT_PREC_COMPLEX:
- type = init_type (TYPE_CODE_FLT,
- TARGET_DOUBLE_COMPLEX_BIT / TARGET_CHAR_BIT,
+ type = init_type (TYPE_CODE_COMPLEX,
+ 2 * TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
0, "complex*32", objfile);
+ TYPE_TARGET_TYPE (type) = builtin_type_f_real_s16;
break;
default:
/* FIXME: For now, if we are asked to produce a type not in this
{ NULL, 0, 0, 0 }
};
\f
-/* The built-in types of F77. */
-
-struct type *builtin_type_f_character;
-struct type *builtin_type_f_integer;
-struct type *builtin_type_f_logical;
-struct type *builtin_type_f_logical_s1;
-struct type *builtin_type_f_logical_s2;
-struct type *builtin_type_f_integer;
-struct type *builtin_type_f_integer_s2;
-struct type *builtin_type_f_real;
-struct type *builtin_type_f_real_s8;
-struct type *builtin_type_f_real_s16;
-struct type *builtin_type_f_complex_s8;
-struct type *builtin_type_f_complex_s16;
-struct type *builtin_type_f_complex_s32;
-struct type *builtin_type_f_void;
-
struct type ** const (f_builtin_types[]) =
{
&builtin_type_f_character,
- &builtin_type_f_integer,
&builtin_type_f_logical,
&builtin_type_f_logical_s1,
&builtin_type_f_logical_s2,
type_check_on,
f_parse, /* parser */
f_error, /* parser error function */
+ evaluate_subexp_standard,
f_printchar, /* Print character constant */
f_printstr, /* function to print string constant */
f_create_fundamental_type, /* Create fundamental type in this language */
{"%d", "", "d", ""}, /* Decimal format info */
{"0x%x", "0x", "x", ""}, /* Hex format info */
f_op_print_tab, /* expression operators for printing */
+ 0, /* arrays are first-class (not c-style) */
+ 1, /* String lower bound */
+ &builtin_type_f_character, /* Type of string elements */
LANG_MAGIC
};
"real*16", (struct objfile *) NULL);
builtin_type_f_complex_s8 =
- init_type (TYPE_CODE_COMPLEX, TARGET_COMPLEX_BIT / TARGET_CHAR_BIT,
+ init_type (TYPE_CODE_COMPLEX, 2 * TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
0,
"complex*8", (struct objfile *) NULL);
+ TYPE_TARGET_TYPE (builtin_type_f_complex_s8) = builtin_type_f_real;
builtin_type_f_complex_s16 =
- init_type (TYPE_CODE_COMPLEX, TARGET_DOUBLE_COMPLEX_BIT / TARGET_CHAR_BIT,
+ init_type (TYPE_CODE_COMPLEX, 2 * TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
0,
"complex*16", (struct objfile *) NULL);
+ TYPE_TARGET_TYPE (builtin_type_f_complex_s16) = builtin_type_f_real_s8;
-#if 0
/* We have a new size == 4 double floats for the
complex*32 data type */
builtin_type_f_complex_s32 =
- init_type (TYPE_CODE_COMPLEX, TARGET_EXT_COMPLEX_BIT / TARGET_CHAR_BIT,
+ init_type (TYPE_CODE_COMPLEX, 2 * TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
0,
"complex*32", (struct objfile *) NULL);
-#endif
+ TYPE_TARGET_TYPE (builtin_type_f_complex_s32) = builtin_type_f_real_s16;
+
builtin_type_string =
init_type (TYPE_CODE_STRING, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
0,
{
SAVED_BF_PTR new;
- new = (SAVED_BF_PTR) malloc (sizeof (SAVED_BF));
-
- if (new == NULL)
- fatal("could not allocate enough memory to save one more .bf on save list");
+ new = (SAVED_BF_PTR) xmalloc (sizeof (SAVED_BF));
return(new);
}
{
SAVED_FUNCTION *new;
- new = (SAVED_FUNCTION *) malloc (sizeof (SAVED_FUNCTION));
-
- if (new == NULL)
- fatal("could not allocate enough memory to save one more function on save list");
-
+ new = (SAVED_FUNCTION *) xmalloc (sizeof (SAVED_FUNCTION));
return(new);
}
{
SAVED_F77_COMMON_PTR new;
- new = (SAVED_F77_COMMON_PTR) malloc (sizeof (SAVED_F77_COMMON));
-
- if (new == NULL)
- fatal("could not allocate enough memory to save one more F77 COMMON blk on save list");
-
+ new = (SAVED_F77_COMMON_PTR) xmalloc (sizeof (SAVED_F77_COMMON));
return(new);
}
{
COMMON_ENTRY_PTR new;
- new = (COMMON_ENTRY_PTR) malloc (sizeof (COMMON_ENTRY));
-
- if (new == NULL)
- fatal("could not allocate enough memory to save one more COMMON entry on save list");
-
+ new = (COMMON_ENTRY_PTR) xmalloc (sizeof (COMMON_ENTRY));
return(new);
}
static SAVED_BF_PTR saved_bf_list=NULL; /* Ptr to (.bf,function)
list*/
+#if 0
static SAVED_BF_PTR saved_bf_list_end=NULL; /* Ptr to above list's end */
+#endif
static SAVED_BF_PTR current_head_bf_list=NULL; /* Current head of above list
*/
+#if 0
static SAVED_BF_PTR tmp_bf_ptr; /* Generic temporary for use
in macros */
-
+#endif
/* The following function simply enters a given common block onto
the global common block chain */
tmp = allocate_saved_f77_common_node();
- local_copy_func_stab = malloc (strlen(func_stab) + 1);
+ local_copy_func_stab = xmalloc (strlen(func_stab) + 1);
strcpy(local_copy_func_stab,func_stab);
- tmp->name = malloc(strlen(name) + 1);
+ tmp->name = xmalloc(strlen(name) + 1);
/* local_copy_func_stab is a stabstring, let us first extract the
function name from the stab by NULLing out the ':' character. */
error("Malformed function STAB found in add_common_block()");
- tmp->owning_function = malloc (strlen(local_copy_func_stab) + 1);
+ tmp->owning_function = xmalloc (strlen(local_copy_func_stab) + 1);
strcpy(tmp->owning_function,local_copy_func_stab);
first by a queueing algorithm and upon failure fall back to
a linear scan. */
+#if 0
#define ADD_BF_SYMNUM(bf_sym,fcn_sym) \
\
if (saved_bf_list == NULL) \
saved_bf_list_end->next = tmp_bf_ptr; \
saved_bf_list_end = tmp_bf_ptr; \
}
-
+#endif
/* This function frees the entire (.bf,function) list */
}
static SAVED_FUNCTION_PTR saved_function_list=NULL;
+#if 0 /* Currently unused */
static SAVED_FUNCTION_PTR saved_function_list_end=NULL;
+#endif
void clear_function_list()
{