/* Declarations for Target Values.
- Copyright (C) 1995, 1996 Christian von Roques */
+ Copyright (C) 1995, 1996 Christian von Roques
+*/
+
+/* $Id$ */
+
+/*
+Discussion of new interface, proposals by Prof. Waite:
+(email of 13.6.2001)
+> 1. You say that you plan to replace the tv module. That replacement is
+> absolutely essential for an ANSI C translator: Section 6.1.3.2 of the
+> standard says that the representation of an integer_constant depends
+> upon its value as well as any suffixes that are attached to it. The
+> possible Firm modes for such a constant are i, I, l, and L. The
+> current tv module provides only one integer conversion routine, and
+> that requires conversion by the client. Since the type of the value
+> argument is long, this may preclude the representation of an unsigned
+> long constant.
+>
+> There is a similar problem with floating constants. Floating
+> constants can be suffixed in C, and the mode depends upon the suffix.
+> It can indicate that the constant is of type long double, which your
+> current tv module is incapable of representing.
+>
+> Your tv module interface accepts two kinds of information: modes and
+> values. Values obtained from the program text might be uninterpreted
+> strings, strings interpreted as integers, and strings interpreted as
+> reals. Values provided by the compiler are usually integers. Modes are
+> always Firm modes. It seems to me that the tv module should provide
+> tarval* constructors for three of the four kinds of values. Each of these
+> constructors should have an ir_mode parameter and one or more parameters
+> appropriate for the kind of value. As is currently the case, one
+> constructor should be provided for both compiler-generated integers and
+> source strings interpreted as integers. (This avoids problems of
+> different conversion radices -- the client does the conversion.) For
+> symmetry, the constructor for source strings interpreted as reals should
+> accept a long double parameter and require the client to do the
+> conversion.
+
+*/
#ifndef _TV_H
#define _TV_H
# include "irmode.h"
# include "entity.h"
-# include "label.h"
-# include "xprintf.h"
+# include "bool.h"
+#ifndef _TARVAL_TYPEDEF_
+#define _TARVAL_TYPEDEF_
typedef struct tarval tarval;
+#endif
-#include <gmp.h>
+#include "gmp.h"
#undef __need_size_t /* erroneously defined by 1.3.2's gmp.h */
-/* #include "deftab.h" */
/* how to represent target types on host */
-typedef float tarval_f;
+typedef float tarval_f;
typedef double tarval_d;
-typedef long tarval_chil;
+typedef long tarval_chil;
typedef unsigned long tarval_CHIL;
typedef MP_INT tarval_Z;
typedef struct {
tarval_B B; /* universal bits */
tarval_s s; /* string */
} u;
- label lab; /* value's label in the constant segment */
ir_mode *mode;
- bool used; /* labeled tv is used (default) */
};
extern tarval *tarval_bad;
+/* We should have a tarval_undefined */
extern tarval *tarval_b_false;
extern tarval *tarval_b_true;
extern tarval *tarval_d_NaN;
/* Hash function on tarvals */
unsigned tarval_hash (tarval *);
-/************************* Constructors for tarvals *************************/
+/* ************************ Constructors for tarvals ************************ */
tarval *tarval_Z_from_str (const char *, size_t, int base);
tarval *tarval_B_from_str (const char *, size_t);
tarval *tarval_d_from_str (const char *, size_t);
tarval *tarval_s_from_str (const char *, size_t);
tarval *tarval_S_from_str (const char *, size_t);
-tarval *tarval_from_long (ir_mode *, long);
+tarval *tarval_int_from_str (const char *, size_t, int base, ir_mode *m);
+tarval *tarval_from_long (ir_mode *, long);
+
tarval *tarval_p_from_str (const char *);
+/* The tarval represents the address of the entity. As the address must
+ be constant the entity must have as owner the global type. */
tarval *tarval_p_from_entity (entity *);
tarval *tarval_convert_to (tarval *, ir_mode *);
irpn_notmask = irpn_Leg
} ir_pncmp;
-/********************* Arithmethic operations on tarvals *********************/
+/* ******************** Arithmethic operations on tarvals ******************** */
/* Compare a with b and return an ir_pncmp describing the relation
between a and b. This is either Uo, Lt, Eq, Gt, or False if a or b
are symbolic pointers which can not be compared at all. */
tarval *tarval_quo (tarval *, tarval *);
tarval *tarval_div (tarval *, tarval *);
tarval *tarval_mod (tarval *, tarval *);
+tarval *tarval_abs (tarval *);
tarval *tarval_and (tarval *, tarval *);
tarval *tarval_or (tarval *, tarval *);
tarval *tarval_eor (tarval *, tarval *);
long tarval_classify (tarval *);
long tarval_ord (tarval *, int *fail);
-int tarval_print (XP_PAR1, const xprintf_info *, XP_PARN);
-
-/* Labeling of tarvals */
-label tarval_label (tarval *);
-void tarval_forall_labeled (int (*) (tarval *, void *), void *);
-
+/* moved to tv_t.h
+ int tarval_print (XP_PAR1, const xprintf_info *, XP_PARN); */
/* return a mode-specific value */
tarval_CHIL tv_val_CHIL (tarval *tv);
tarval_Z tv_val_Z (tarval *tv);
tarval_p tv_val_p (tarval *tv);
-bool tv_val_b (tarval *tv);
+bool tv_val_b (tarval *tv);
tarval_B tv_val_B (tarval *tv);
tarval_s tv_val_s (tarval *tv);