* defs.h: Include ansidecl.h and PARAMS macro. Use PARAMS

to make prototypes for all functions declared here.
* cplus-dem.c:  Avoid declaring xmalloc and xrealloc.
* c-exp.y:  Rename SIGNED, OR, and AND to avoid conflict.
* environ.c:  Include <stdio.h> before defs.h.  Minor cleanup.
* ieee-float.h:  Use PARAMS for prototypes; make some params const.
* ieee-float.c, valarith.c:  Include <stdio.h>.  Lint.  b*=>mem*.
* m2-exp.y:  Remove unused CONST; Rename OR and AND.
* utils.c:  Avoid declaring malloc and realloc.  Lint.
(request_quit):  Accept signal-number parameter.
This commit is contained in:
John Gilmore 1992-02-20 19:23:42 +00:00
parent 8b87cbae28
commit 088c3a0b74
8 changed files with 126 additions and 89 deletions

View file

@ -1,3 +1,16 @@
Thu Feb 20 09:04:18 1992 John Gilmore (gnu at cygnus.com)
* defs.h: Include ansidecl.h and PARAMS macro. Use PARAMS
to make prototypes for all functions declared here.
* cplus-dem.c: Avoid declaring xmalloc and xrealloc.
* c-exp.y: Rename SIGNED, OR, and AND to avoid conflict.
* environ.c: Include <stdio.h> before defs.h. Minor cleanup.
* ieee-float.h: Use PARAMS for prototypes; make some params const.
* ieee-float.c, valarith.c: Include <stdio.h>. Lint. b*=>mem*.
* m2-exp.y: Remove unused CONST; Rename OR and AND.
* utils.c: Avoid declaring malloc and realloc. Lint.
(request_quit): Accept signal-number parameter.
Mon Feb 17 07:13:27 1992 Fred Fish (fnf at cygnus.com) Mon Feb 17 07:13:27 1992 Fred Fish (fnf at cygnus.com)
* dwarfread.c (process_dies): Add case to handle TAG_pointer_type * dwarfread.c (process_dies): Add case to handle TAG_pointer_type

View file

@ -142,7 +142,7 @@ int yyparse ();
/* Special type cases, put in to allow the parser to distinguish different /* Special type cases, put in to allow the parser to distinguish different
legal basetypes. */ legal basetypes. */
%token SIGNED LONG SHORT INT_KEYWORD %token SIGNED_KEYWORD LONG SHORT INT_KEYWORD
%token <lval> LAST REGNAME %token <lval> LAST REGNAME
@ -157,8 +157,8 @@ int yyparse ();
%left ABOVE_COMMA %left ABOVE_COMMA
%right '=' ASSIGN_MODIFY %right '=' ASSIGN_MODIFY
%right '?' %right '?'
%left OR %left OROR
%left AND %left ANDAND
%left '|' %left '|'
%left '^' %left '^'
%left '&' %left '&'
@ -362,11 +362,11 @@ exp : exp '|' exp
{ write_exp_elt_opcode (BINOP_LOGIOR); } { write_exp_elt_opcode (BINOP_LOGIOR); }
; ;
exp : exp AND exp exp : exp ANDAND exp
{ write_exp_elt_opcode (BINOP_AND); } { write_exp_elt_opcode (BINOP_AND); }
; ;
exp : exp OR exp exp : exp OROR exp
{ write_exp_elt_opcode (BINOP_OR); } { write_exp_elt_opcode (BINOP_OR); }
; ;
@ -830,9 +830,9 @@ typebase
{ $$ = lookup_unsigned_typename (TYPE_NAME($2.type)); } { $$ = lookup_unsigned_typename (TYPE_NAME($2.type)); }
| UNSIGNED | UNSIGNED
{ $$ = builtin_type_unsigned_int; } { $$ = builtin_type_unsigned_int; }
| SIGNED typename | SIGNED_KEYWORD typename
{ $$ = $2.type; } { $$ = $2.type; }
| SIGNED | SIGNED_KEYWORD
{ $$ = builtin_type_int; } { $$ = builtin_type_int; }
| TEMPLATE name '<' type '>' | TEMPLATE name '<' type '>'
{ $$ = lookup_template_type(copy_name($2), $4, { $$ = lookup_template_type(copy_name($2), $4,
@ -1028,8 +1028,8 @@ const static struct token tokentab2[] =
{"++", INCREMENT, BINOP_END}, {"++", INCREMENT, BINOP_END},
{"--", DECREMENT, BINOP_END}, {"--", DECREMENT, BINOP_END},
{"->", ARROW, BINOP_END}, {"->", ARROW, BINOP_END},
{"&&", AND, BINOP_END}, {"&&", ANDAND, BINOP_END},
{"||", OR, BINOP_END}, {"||", OROR, BINOP_END},
{"::", COLONCOLON, BINOP_END}, {"::", COLONCOLON, BINOP_END},
{"<<", LSH, BINOP_END}, {"<<", LSH, BINOP_END},
{">>", RSH, BINOP_END}, {">>", RSH, BINOP_END},
@ -1305,7 +1305,7 @@ yylex ()
if (!strncmp (tokstart, "struct", 6)) if (!strncmp (tokstart, "struct", 6))
return STRUCT; return STRUCT;
if (!strncmp (tokstart, "signed", 6)) if (!strncmp (tokstart, "signed", 6))
return SIGNED; return SIGNED_KEYWORD;
if (!strncmp (tokstart, "sizeof", 6)) if (!strncmp (tokstart, "sizeof", 6))
return SIZEOF; return SIZEOF;
break; break;

View file

@ -86,8 +86,8 @@ extern char *cplus_demangle ();
#ifdef __STDC__ #ifdef __STDC__
/* GDB prototypes these as void* in defs.h, so we better too, at least /* GDB prototypes these as void* in defs.h, so we better too, at least
as long as we're including defs.h. */ as long as we're including defs.h. */
extern void *xmalloc (int); /* FIXME extern void *xmalloc (int);
extern void *xrealloc (char *, int); extern void *xrealloc (char *, int); */
extern void free (void *); extern void free (void *);
#else #else
extern char *xmalloc (); extern char *xmalloc ();

View file

@ -17,6 +17,8 @@ You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <stdio.h>
#include "defs.h" #include "defs.h"
#include "ieee-float.h" #include "ieee-float.h"
#include <math.h> /* ldexp */ #include <math.h> /* ldexp */
@ -27,7 +29,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
void void
ieee_extended_to_double (ext_format, from, to) ieee_extended_to_double (ext_format, from, to)
struct ext_format *ext_format; const struct ext_format *ext_format;
char *from; char *from;
double *to; double *to;
{ {
@ -35,8 +37,8 @@ ieee_extended_to_double (ext_format, from, to)
double dto; double dto;
unsigned long mant0, mant1, exponent; unsigned long mant0, mant1, exponent;
bcopy (&from[MANBYTE_H], &mant0, 4); memcpy (&mant0, &from[MANBYTE_H], 4);
bcopy (&from[MANBYTE_L], &mant1, 4); memcpy (&mant1, &from[MANBYTE_L], 4);
exponent = ((ufrom[EXPBYTE_H] & (unsigned char)~SIGNMASK) << 8) | ufrom[EXPBYTE_L]; exponent = ((ufrom[EXPBYTE_H] & (unsigned char)~SIGNMASK) << 8) | ufrom[EXPBYTE_L];
#if 0 #if 0
@ -68,7 +70,7 @@ ieee_extended_to_double (ext_format, from, to)
void void
double_to_ieee_extended (ext_format, from, to) double_to_ieee_extended (ext_format, from, to)
struct ext_format *ext_format; const struct ext_format *ext_format;
double *from; double *from;
char *to; char *to;
{ {
@ -93,8 +95,8 @@ double_to_ieee_extended (ext_format, from, to)
/* The following code assumes that the host has IEEE doubles. FIXME-someday. /* The following code assumes that the host has IEEE doubles. FIXME-someday.
It also assumes longs are 32 bits! FIXME-someday. */ It also assumes longs are 32 bits! FIXME-someday. */
bcopy (from, twolongs, 8); memcpy (twolongs, from, 8);
bcopy (from, tobytes, 8); memcpy (tobytes, from, 8);
#if HOST_BYTE_ORDER == BIG_ENDIAN #if HOST_BYTE_ORDER == BIG_ENDIAN
exponent = ((tobytes[1] & 0xF0) >> 4) | (tobytes[0] & 0x7F) << 4; exponent = ((tobytes[1] & 0xF0) >> 4) | (tobytes[0] & 0x7F) << 4;
mant0 = (twolongs[0] << 11) | twolongs[1] >> 21; mant0 = (twolongs[0] << 11) | twolongs[1] >> 21;
@ -118,8 +120,8 @@ double_to_ieee_extended (ext_format, from, to)
to[EXPBYTE_H] |= (unsigned char)(exponent >> 8); /* Retain sign */ to[EXPBYTE_H] |= (unsigned char)(exponent >> 8); /* Retain sign */
to[EXPBYTE_L] = (unsigned char) exponent; to[EXPBYTE_L] = (unsigned char) exponent;
bcopy (&mant0, &to[MANBYTE_H], 4); memcpy (&to[MANBYTE_H], &mant0, 4);
bcopy (&mant1, &to[MANBYTE_L], 4); memcpy (&to[MANBYTE_L], &mant1, 4);
} }

View file

@ -17,6 +17,9 @@ You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#if !defined (IEEE_FLOAT_H)
#define IEEE_FLOAT_H 1
/* Parameters for extended float format: */ /* Parameters for extended float format: */
struct ext_format { struct ext_format {
@ -49,18 +52,12 @@ struct ext_format {
Store the double in *TO. */ Store the double in *TO. */
extern void extern void
ieee_extended_to_double ( ieee_extended_to_double PARAMS ((const struct ext_format *, char *, double *));
#ifdef __STDC__
struct ext_format *ext_format, char *from, double *to
#endif
);
/* The converse: convert the double *FROM to an extended float /* The converse: convert the double *FROM to an extended float
and store where TO points. */ and store where TO points. */
void extern void
double_to_ieee_extended ( double_to_ieee_extended PARAMS ((const struct ext_format *, double *, char *));
#ifdef __STDC__
struct ext_format *ext_format, double *from, char *to #endif /* defined (IEEE_FLOAT_H) */
#endif
);

View file

@ -128,7 +128,7 @@ char *make_qualname();
nonterminal "name", which matches either NAME or TYPENAME. */ nonterminal "name", which matches either NAME or TYPENAME. */
%token <sval> STRING %token <sval> STRING
%token <sval> NAME BLOCKNAME IDENT CONST VARNAME %token <sval> NAME BLOCKNAME IDENT VARNAME
%token <sval> TYPENAME %token <sval> TYPENAME
%token SIZE CAP ORD HIGH ABS MIN_FUNC MAX_FUNC FLOAT_FUNC VAL CHR ODD TRUNC %token SIZE CAP ORD HIGH ABS MIN_FUNC MAX_FUNC FLOAT_FUNC VAL CHR ODD TRUNC
@ -146,8 +146,8 @@ char *make_qualname();
%left ABOVE_COMMA %left ABOVE_COMMA
%nonassoc ASSIGN %nonassoc ASSIGN
%left '<' '>' LEQ GEQ '=' NOTEQUAL '#' IN %left '<' '>' LEQ GEQ '=' NOTEQUAL '#' IN
%left OR %left OROR
%left AND '&' %left ANDAND '&'
%left '@' %left '@'
%left '+' '-' %left '+' '-'
%left '*' '/' DIV MOD %left '*' '/' DIV MOD
@ -415,7 +415,7 @@ exp : exp '>' exp
{ write_exp_elt_opcode (BINOP_GTR); } { write_exp_elt_opcode (BINOP_GTR); }
; ;
exp : exp AND exp exp : exp ANDAND exp
{ write_exp_elt_opcode (BINOP_AND); } { write_exp_elt_opcode (BINOP_AND); }
; ;
@ -423,7 +423,7 @@ exp : exp '&' exp
{ write_exp_elt_opcode (BINOP_AND); } { write_exp_elt_opcode (BINOP_AND); }
; ;
exp : exp OR exp exp : exp OROR exp
{ write_exp_elt_opcode (BINOP_OR); } { write_exp_elt_opcode (BINOP_OR); }
; ;
@ -790,9 +790,9 @@ struct keyword {
static struct keyword keytab[] = static struct keyword keytab[] =
{ {
{"OR" , OR }, {"OR" , OROR },
{"IN", IN },/* Note space after IN */ {"IN", IN },/* Note space after IN */
{"AND", AND }, {"AND", ANDAND },
{"ABS", ABS }, {"ABS", ABS },
{"CHR", CHR }, {"CHR", CHR },
{"DEC", DEC }, {"DEC", DEC },

View file

@ -36,8 +36,6 @@ extern volatile void return_to_top_level ();
extern volatile void exit (); extern volatile void exit ();
extern char *gdb_readline (); extern char *gdb_readline ();
extern char *getenv(); extern char *getenv();
extern char *malloc();
extern char *realloc();
/* If this definition isn't overridden by the header files, assume /* If this definition isn't overridden by the header files, assume
that isatty and fileno exist on this system. */ that isatty and fileno exist on this system. */
@ -166,6 +164,21 @@ free_current_contents (location)
{ {
free (*location); free (*location);
} }
/* Provide a known function that does nothing, to use as a base for
for a possibly long chain of cleanups. This is useful where we
use the cleanup chain for handling normal cleanups as well as dealing
with cleanups that need to be done as a result of a call to error().
In such cases, we may not be certain where the first cleanup is, unless
we have a do-nothing one to always use as the base. */
/* ARGSUSED */
void
null_cleanup (arg)
char **arg;
{
}
/* Provide a hook for modules wishing to print their own warning messages /* Provide a hook for modules wishing to print their own warning messages
to set up the terminal state in a compatible way, without them having to set up the terminal state in a compatible way, without them having
@ -417,13 +430,14 @@ quit ()
/* Control C comes here */ /* Control C comes here */
void void
request_quit () request_quit (signo)
int signo;
{ {
quit_flag = 1; quit_flag = 1;
#ifdef USG #ifdef USG
/* Restore the signal handler. */ /* Restore the signal handler. */
signal (SIGINT, request_quit); signal (signo, request_quit);
#endif #endif
if (immediate_quit) if (immediate_quit)
@ -461,7 +475,7 @@ myread (desc, addr, len)
char * char *
savestring (ptr, size) savestring (ptr, size)
char *ptr; const char *ptr;
int size; int size;
{ {
register char *p = (char *) xmalloc (size + 1); register char *p = (char *) xmalloc (size + 1);
@ -619,16 +633,15 @@ parse_escape (string_ptr)
} }
} }
/* Print the character CH on STREAM as part of the contents /* Print the character C on STREAM as part of the contents
of a literal string whose delimiter is QUOTER. */ of a literal string whose delimiter is QUOTER. */
void void
printchar (ch, stream, quoter) printchar (c, stream, quoter)
unsigned char ch; register int c;
FILE *stream; FILE *stream;
int quoter; int quoter;
{ {
register int c = ch;
if (c < 040 || (sevenbit_strings && c >= 0177)) { if (c < 040 || (sevenbit_strings && c >= 0177)) {
switch (c) switch (c)
@ -788,7 +801,7 @@ wrap_here(indent)
void void
fputs_filtered (linebuffer, stream) fputs_filtered (linebuffer, stream)
char *linebuffer; const char *linebuffer;
FILE *stream; FILE *stream;
{ {
char *lineptr; char *lineptr;

View file

@ -1,38 +1,40 @@
/* Perform arithmetic and other operations on values, for GDB. /* Perform arithmetic and other operations on values, for GDB.
Copyright (C) 1986, 1989 Free Software Foundation, Inc. Copyright 1986, 1989, 1991 Free Software Foundation, Inc.
This file is part of GDB. This file is part of GDB.
GDB is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option) the Free Software Foundation; either version 2 of the License, or
any later version. (at your option) any later version.
GDB is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with GDB; see the file COPYING. If not, write to along with this program; if not, write to the Free Software
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <stdio.h>
#include "defs.h" #include "defs.h"
#include "param.h"
#include "value.h" #include "value.h"
#include "symtab.h"
#include "expression.h" #include "expression.h"
#include "target.h" #include "target.h"
#include <string.h> #include <string.h>
static value
value value_x_binop (); value_subscripted_rvalue PARAMS ((value, value));
value value_subscripted_rvalue ();
value value
value_add (arg1, arg2) value_add (arg1, arg2)
value arg1, arg2; value arg1, arg2;
{ {
register value val, valint, valptr; register value valint, valptr;
register int len; register int len;
COERCE_ARRAY (arg1); COERCE_ARRAY (arg1);
@ -57,11 +59,9 @@ value_add (arg1, arg2)
} }
len = TYPE_LENGTH (TYPE_TARGET_TYPE (VALUE_TYPE (valptr))); len = TYPE_LENGTH (TYPE_TARGET_TYPE (VALUE_TYPE (valptr)));
if (len == 0) len = 1; /* For (void *) */ if (len == 0) len = 1; /* For (void *) */
val = value_from_long (builtin_type_long, return value_from_longest (VALUE_TYPE (valptr),
value_as_long (valptr) value_as_long (valptr)
+ (len * value_as_long (valint))); + (len * value_as_long (valint)));
VALUE_TYPE (val) = VALUE_TYPE (valptr);
return val;
} }
return value_binop (arg1, arg2, BINOP_ADD); return value_binop (arg1, arg2, BINOP_ADD);
@ -71,7 +71,6 @@ value
value_sub (arg1, arg2) value_sub (arg1, arg2)
value arg1, arg2; value arg1, arg2;
{ {
register value val;
COERCE_ARRAY (arg1); COERCE_ARRAY (arg1);
COERCE_ARRAY (arg2); COERCE_ARRAY (arg2);
@ -81,22 +80,19 @@ value_sub (arg1, arg2)
if (TYPE_CODE (VALUE_TYPE (arg2)) == TYPE_CODE_INT) if (TYPE_CODE (VALUE_TYPE (arg2)) == TYPE_CODE_INT)
{ {
/* pointer - integer. */ /* pointer - integer. */
val = value_from_long return value_from_longest
(builtin_type_long, (VALUE_TYPE (arg1),
value_as_long (arg1) value_as_long (arg1)
- (TYPE_LENGTH (TYPE_TARGET_TYPE (VALUE_TYPE (arg1))) - (TYPE_LENGTH (TYPE_TARGET_TYPE (VALUE_TYPE (arg1)))
* value_as_long (arg2))); * value_as_long (arg2)));
VALUE_TYPE (val) = VALUE_TYPE (arg1);
return val;
} }
else if (VALUE_TYPE (arg1) == VALUE_TYPE (arg2)) else if (VALUE_TYPE (arg1) == VALUE_TYPE (arg2))
{ {
/* pointer to <type x> - pointer to <type x>. */ /* pointer to <type x> - pointer to <type x>. */
val = value_from_long return value_from_longest
(builtin_type_long, (builtin_type_long, /* FIXME -- should be ptrdiff_t */
(value_as_long (arg1) - value_as_long (arg2)) (value_as_long (arg1) - value_as_long (arg2))
/ TYPE_LENGTH (TYPE_TARGET_TYPE (VALUE_TYPE (arg1)))); / TYPE_LENGTH (TYPE_TARGET_TYPE (VALUE_TYPE (arg1))));
return val;
} }
else else
{ {
@ -126,13 +122,13 @@ value_subscript (array, idx)
(eg, a vector register). This routine used to promote floats (eg, a vector register). This routine used to promote floats
to doubles, but no longer does. */ to doubles, but no longer does. */
value static value
value_subscripted_rvalue (array, idx) value_subscripted_rvalue (array, idx)
value array, idx; value array, idx;
{ {
struct type *elt_type = TYPE_TARGET_TYPE (VALUE_TYPE (array)); struct type *elt_type = TYPE_TARGET_TYPE (VALUE_TYPE (array));
int elt_size = TYPE_LENGTH (elt_type); int elt_size = TYPE_LENGTH (elt_type);
int elt_offs = elt_size * value_as_long (idx); int elt_offs = elt_size * longest_to_int (value_as_long (idx));
value v; value v;
if (elt_offs >= TYPE_LENGTH (VALUE_TYPE (array))) if (elt_offs >= TYPE_LENGTH (VALUE_TYPE (array)))
@ -192,7 +188,11 @@ int unop_user_defined_p (op, arg1)
/* We know either arg1 or arg2 is a structure, so try to find the right /* We know either arg1 or arg2 is a structure, so try to find the right
user defined function. Create an argument vector that calls user defined function. Create an argument vector that calls
arg1.operator @ (arg1,arg2) and return that value (where '@' is any arg1.operator @ (arg1,arg2) and return that value (where '@' is any
binary operator which is legal for GNU C++). */ binary operator which is legal for GNU C++).
OP is the operatore, and if it is BINOP_ASSIGN_MODIFY, then OTHEROP
is the opcode saying how to modify it. Otherwise, OTHEROP is
unused. */
value value
value_x_binop (arg1, arg2, op, otherop) value_x_binop (arg1, arg2, op, otherop)
@ -204,6 +204,8 @@ value_x_binop (arg1, arg2, op, otherop)
char tstr[13]; char tstr[13];
int static_memfuncp; int static_memfuncp;
COERCE_REF (arg1);
COERCE_REF (arg2);
COERCE_ENUM (arg1); COERCE_ENUM (arg1);
COERCE_ENUM (arg2); COERCE_ENUM (arg2);
@ -343,7 +345,7 @@ value_x_unop (arg1, op)
value value
value_binop (arg1, arg2, op) value_binop (arg1, arg2, op)
value arg1, arg2; value arg1, arg2;
int op; enum exp_opcode op;
{ {
register value val; register value val;
@ -595,9 +597,14 @@ value_equal (arg1, arg2)
else if ((code1 == TYPE_CODE_FLT || code1 == TYPE_CODE_INT) else if ((code1 == TYPE_CODE_FLT || code1 == TYPE_CODE_INT)
&& (code2 == TYPE_CODE_FLT || code2 == TYPE_CODE_INT)) && (code2 == TYPE_CODE_FLT || code2 == TYPE_CODE_INT))
return value_as_double (arg1) == value_as_double (arg2); return value_as_double (arg1) == value_as_double (arg2);
else if ((code1 == TYPE_CODE_PTR && code2 == TYPE_CODE_INT)
|| (code2 == TYPE_CODE_PTR && code1 == TYPE_CODE_INT)) /* FIXME: Need to promote to either CORE_ADDR or LONGEST, whichever
return (char *) value_as_long (arg1) == (char *) value_as_long (arg2); is bigger. */
else if (code1 == TYPE_CODE_PTR && code2 == TYPE_CODE_INT)
return value_as_pointer (arg1) == (CORE_ADDR) value_as_long (arg2);
else if (code2 == TYPE_CODE_PTR && code1 == TYPE_CODE_INT)
return (CORE_ADDR) value_as_long (arg1) == value_as_pointer (arg2);
else if (code1 == code2 else if (code1 == code2
&& ((len = TYPE_LENGTH (VALUE_TYPE (arg1))) && ((len = TYPE_LENGTH (VALUE_TYPE (arg1)))
== TYPE_LENGTH (VALUE_TYPE (arg2)))) == TYPE_LENGTH (VALUE_TYPE (arg2))))
@ -638,19 +645,24 @@ value_less (arg1, arg2)
{ {
if (TYPE_UNSIGNED (VALUE_TYPE (arg1)) if (TYPE_UNSIGNED (VALUE_TYPE (arg1))
|| TYPE_UNSIGNED (VALUE_TYPE (arg2))) || TYPE_UNSIGNED (VALUE_TYPE (arg2)))
return (unsigned)value_as_long (arg1) < (unsigned)value_as_long (arg2); return ((unsigned LONGEST) value_as_long (arg1)
< (unsigned LONGEST) value_as_long (arg2));
else else
return value_as_long (arg1) < value_as_long (arg2); return value_as_long (arg1) < value_as_long (arg2);
} }
else if ((code1 == TYPE_CODE_FLT || code1 == TYPE_CODE_INT) else if ((code1 == TYPE_CODE_FLT || code1 == TYPE_CODE_INT)
&& (code2 == TYPE_CODE_FLT || code2 == TYPE_CODE_INT)) && (code2 == TYPE_CODE_FLT || code2 == TYPE_CODE_INT))
return value_as_double (arg1) < value_as_double (arg2); return value_as_double (arg1) < value_as_double (arg2);
else if ((code1 == TYPE_CODE_PTR || code1 == TYPE_CODE_INT) else if (code1 == TYPE_CODE_PTR && code2 == TYPE_CODE_PTR)
&& (code2 == TYPE_CODE_PTR || code2 == TYPE_CODE_INT)) return value_as_pointer (arg1) < value_as_pointer (arg2);
{
/* FIXME, this assumes that host and target char *'s are the same! */ /* FIXME: Need to promote to either CORE_ADDR or LONGEST, whichever
return (char *) value_as_long (arg1) < (char *) value_as_long (arg2); is bigger. */
} else if (code1 == TYPE_CODE_PTR && code2 == TYPE_CODE_INT)
return value_as_pointer (arg1) < (CORE_ADDR) value_as_long (arg2);
else if (code2 == TYPE_CODE_PTR && code1 == TYPE_CODE_INT)
return (CORE_ADDR) value_as_long (arg1) < value_as_pointer (arg2);
else else
{ {
error ("Invalid type combination in ordering comparison."); error ("Invalid type combination in ordering comparison.");
@ -673,7 +685,7 @@ value_neg (arg1)
if (TYPE_CODE (type) == TYPE_CODE_FLT) if (TYPE_CODE (type) == TYPE_CODE_FLT)
return value_from_double (type, - value_as_double (arg1)); return value_from_double (type, - value_as_double (arg1));
else if (TYPE_CODE (type) == TYPE_CODE_INT) else if (TYPE_CODE (type) == TYPE_CODE_INT)
return value_from_long (type, - value_as_long (arg1)); return value_from_longest (type, - value_as_long (arg1));
else { else {
error ("Argument to negate operation not a number."); error ("Argument to negate operation not a number.");
return 0; /* For lint -- never reached */ return 0; /* For lint -- never reached */
@ -689,6 +701,6 @@ value_lognot (arg1)
if (TYPE_CODE (VALUE_TYPE (arg1)) != TYPE_CODE_INT) if (TYPE_CODE (VALUE_TYPE (arg1)) != TYPE_CODE_INT)
error ("Argument to complement operation not an integer."); error ("Argument to complement operation not an integer.");
return value_from_long (VALUE_TYPE (arg1), ~ value_as_long (arg1)); return value_from_longest (VALUE_TYPE (arg1), ~ value_as_long (arg1));
} }