#ifdef HAVE_STRINGS_H
#include <strings.h> /* strings.h also includes bsd only function strcasecmp */
#endif
-#include <stdlib.h>
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
#ifdef HAVE_ALLOCA_H
# include <alloca.h>
#endif
#include "strcalc.h"
#include "fltcalc.h"
#include "irtools.h"
+#include "firm_common.h"
/** Size of hash tables. Should correspond to average number of distinct constant
target values */
return hash;
}
-/* finds tarval with value/mode or creates new tarval */
+/** finds tarval with value/mode or creates new tarval */
static tarval *get_tarval(const void *value, int length, ir_mode *mode)
{
tarval tv;
- tv.mode = mode;
+ tv.kind = k_tarval;
+ tv.mode = mode;
tv.length = length;
if (length > 0) {
/* if there already is such a value, it is returned, else value
return get_mode_null(mode);
}
break;
+
default:
break;
}
/*
* public variables declared in tv.h
*/
-static tarval reserved_tv[5];
+static tarval reserved_tv[4];
tarval *tarval_bad = &reserved_tv[0];
tarval *tarval_undefined = &reserved_tv[1];
tarval *tarval_b_false = &reserved_tv[2];
tarval *tarval_b_true = &reserved_tv[3];
-tarval *tarval_P_void = &reserved_tv[4];
/*
* public functions declared in tv.h
}
return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
+ case irms_reference:
+ /* same as integer modes */
case irms_int_number:
case irms_character:
- sc_val_from_str(str, len, NULL);
+ sc_val_from_str(str, len, NULL, mode);
return get_tarval(sc_get_buffer(), sc_get_buffer_length(), mode);
-
- case irms_reference:
- return get_tarval(str, len, mode);
}
assert(0); /* can't be reached, can it? */
/* XXX C semantics ! */
return l ? tarval_b_true : tarval_b_false ;
+ case irms_reference:
+ /* same as integer modes */
case irms_int_number:
case irms_character:
sc_val_from_long(l, NULL);
case irms_float_number:
return new_tarval_from_double((long double)l, mode);
- case irms_reference:
- return l ? tarval_bad : get_tarval(NULL, 0, mode); /* null pointer or tarval_bad */
-
default:
assert(0 && "unsupported mode sort");
}
return _get_tarval_b_true();
}
-tarval *(get_tarval_P_void)(void) {
- return _get_tarval_P_void();
-}
-
tarval *get_tarval_max(ir_mode *mode)
{
ANNOUNCE();
return tarval_bad;
}
+static long _null_value;
+
tarval *get_tarval_null(ir_mode *mode)
{
ANNOUNCE();
return new_tarval_from_long(0l, mode);
case irms_reference:
- return tarval_P_void;
+ return new_tarval_from_long(_null_value, mode);
}
return tarval_bad;
}
}
return get_tarval(fc_get_buffer(), fc_get_buffer_length(), m);
-#if 0
case irms_reference:
/* allow 0 to be casted */
if (src == get_mode_null(src->mode))
return get_mode_null(m);
break;
-#endif
+
default:
break;
}
break;
case irms_reference:
- if (tv == tarval_P_void) return snprintf(buf, len, "NULL");
+ if (tv == tv->mode->null) return snprintf(buf, len, "NULL");
if (tv->value != NULL){
if (len > tv->length) {
memcpy(buf, tv->value, tv->length);
* Identifying tarvals values for algebraic simplifications.
*
* Returns:
- * - TV_CLASSIFY_NULL for additive neutral,
+ * - TV_CLASSIFY_NULL for additive neutral or the NULL tarval for reference modes,
* - TV_CLASSIFY_ONE for multiplicative neutral,
* - TV_CLASSIFY_ALL_ONE for bitwise-and neutral
* - TV_CLASSIFY_OTHER else
")",
};
-
/*
* Initialization of the tarval module: called before init_mode()
*/
-void init_tarval_1(void)
+void init_tarval_1(long null_value)
{
ANNOUNCE();
+ _null_value = null_value;
+
/* initialize the sets holding the tarvals with a comparison function and
* an initial size, which is the expected number of constants */
tarvals = new_set(memcmp, N_CONSTANTS);
{
ANNOUNCE();
+ tarval_bad->kind = k_tarval;
tarval_bad->mode = mode_BAD;
+
+ tarval_undefined->kind = k_tarval;
tarval_undefined->mode = mode_ANY;
+
+ tarval_b_true->kind = k_tarval;
tarval_b_true->mode = mode_b;
+
+ tarval_b_false->kind = k_tarval;
tarval_b_false->mode = mode_b;
- tarval_P_void->mode = mode_P;
/*
* assign output modes that are compatible with the