aboutsummaryrefslogtreecommitdiff
path: root/gcc/sym-exec/state.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/sym-exec/state.h')
-rw-r--r--gcc/sym-exec/state.h125
1 files changed, 97 insertions, 28 deletions
diff --git a/gcc/sym-exec/state.h b/gcc/sym-exec/state.h
index 3a9808c..f074a9a 100644
--- a/gcc/sym-exec/state.h
+++ b/gcc/sym-exec/state.h
@@ -36,19 +36,50 @@ class state {
typedef void (state::*binary_func) (vec<value*> * arg1_bits,
vec<value*> * arg2_bits, tree dest);
+ typedef void (state::*binary_cond_func) (vec<value*> * arg1_bits,
+ vec<value*> * arg2_bits);
+
private:
/* Here is stored values of bit of each variable. */
hash_map<tree, vec < value * >> var_states;
hash_set<bit_expression *> conditions;
+ /* Performs AND operation on two bits. */
+ value * and_two_bits (value *var1, value* var2) const;
+
vec<value*> create_bits_for_const (tree var, size_t size) const;
void free_bits (vec<value*> * bits) const;
- void check_args_compatibility (tree arg1, tree arg2, tree dest);
+ bool check_args_compatibility (tree arg1, tree arg2, tree dest);
+
+ void add_equal_cond (vec<value*> * arg1_bits, vec<value*> * arg2_bits);
+
+ void add_not_equal_cond (vec<value*> * arg1_bits, vec<value*> * arg2_bits);
+
+ void add_greater_than_cond (vec<value*> * arg1_bits, vec<value*> * arg2_bits);
+
+ void add_less_than_cond (vec<value*> * arg1_bits, vec<value*> * arg2_bits);
+
+ void add_greater_or_equal_cond (vec<value*> * arg1_bits,
+ vec<value*> * arg2_bits);
+
+ void add_less_or_equal_cond (vec<value*> * arg1_bits,
+ vec<value*> * arg2_bits);
+
+ bool add_binary_cond (tree arg1, tree arg2, binary_cond_func cond_func);
- void do_binary_operation (tree arg1, tree arg2, tree dest,
+ bit_expression* construct_great_than_cond (vec<value*> * arg1_bits,
+ vec<value*> * arg2_bits);
+
+ bit_expression* construct_less_than_cond (vec<value*> * arg1_bits,
+ vec<value*> * arg2_bits);
+
+ bit_expression* construct_equal_cond (vec<value*> * arg1_bits,
+ vec<value*> * arg2_bits);
+
+ bool do_binary_operation (tree arg1, tree arg2, tree dest,
binary_func bin_func);
void do_and (vec<value*> * arg1_bits, vec<value*> * arg2_bits, tree dest);
@@ -67,6 +98,8 @@ class state {
void do_sub (vec<value*> * arg1_bits, vec<value*> * arg2_bits, tree dest);
+ void do_mul (vec<value*> * arg1_bits, vec<value*> * arg2_bits, tree dest);
+
/* Performs AND operation for 2 symbolic_bit operands. */
value *and_sym_bits (const value * var1, const value * var2) const;
@@ -76,6 +109,9 @@ class state {
/* Performs AND operation for 2 constant bit operands. */
bit *and_const_bits (const bit * const_bit1, const bit * const_bit2) const;
+ /* Performs OR operation on two bits. */
+ value * or_two_bits (value *var1, value* var2) const;
+
/* Performs OR operation for 2 symbolic_bit operands. */
value *or_sym_bits (const value * var1, const value * var2) const;
@@ -85,12 +121,18 @@ class state {
/* Performs OR operation for 2 constant bit operands. */
bit *or_const_bits (const bit * const_bit1, const bit * const_bit2) const;
+ /* Performs complement operation on a bit. */
+ value * complement_a_bit (value *var) const;
+
/* Performs NOT operation for constant bit. */
bit *complement_const_bit (const bit * const_bit) const;
/* Performs NOT operation for symbolic_bit. */
value *complement_sym_bit (const value * var) const;
+ /* Performs XOR operation on two bits. */
+ value * xor_two_bits (value *var1, value* var2) const;
+
/* Performs XOR operation for 2 symbolic_bit operands. */
value *xor_sym_bits (const value * var1, const value * var2) const;
@@ -123,6 +165,31 @@ class state {
exists or not. */
bool is_declared (tree var);
+ void declare_if_needed (tree var, size_t size);
+
+ /* Shifts value_vector left by shift_value bits. */
+ vec <value *> *shift_left_by_const (const vec <value *> *arg_vector,
+ size_t shift_value);
+
+ /* Checks if all vector elements are const_bit_expressions. */
+ bool is_bit_vector (const vec <value *> *value_vector);
+
+ /* returns the value of the number represented as a bit vector. */
+ size_t get_value (const vec <value *> *bit_vector);
+
+ /* Adds two bits and carry value.
+ Resturn result and stores new carry bit in "carry". */
+ value* full_adder (value* var1, value* var2, value*& carry);
+
+ /* Returns the additive inverse of the number stored in number verctor. */
+ vec <value *> * additive_inverse (const vec <value *> *number);
+
+ /* ANDs every bit of the vector with var_bit, stroes the result in var1. */
+ void and_number_bit (vec<value *> *var1, value *var_bit);
+
+ /* Adds two vectors, stores the result in the first one. */
+ void add_numbers (vec< value * > *var1, const vec< value * > *var2);
+
public:
state ();
@@ -155,54 +222,56 @@ class state {
unsigned get_var_size (tree var);
/* Does bit-level XOR operation for given variables. */
- void do_xor (tree arg1, tree arg2, tree dest);
+ bool do_xor (tree arg1, tree arg2, tree dest);
/* Does bit-level AND operation for given variables. */
- void do_and (tree arg1, tree arg2, tree dest);
+ bool do_and (tree arg1, tree arg2, tree dest);
/* Does bit-level OR operation for given variables. */
- void do_or (tree arg1, tree arg2, tree dest);
+ bool do_or (tree arg1, tree arg2, tree dest);
- void do_assign (tree arg, tree dest);
-
- /* Shifts value_vector left by shift_value bits. */
- vec <value *> shift_left_by_const (const vec <value *> * value_vector,
- size_t shift_value);
-
- /* Checks if all vector elements are const_bit_expressions. */
- bool is_bit_vector (vec <value *> * value_vector);
-
- /* Returns the value of the number represented as a bit vector. */
- size_t get_value (vec <value *> * bit_vector);
+ bool do_assign (tree arg, tree dest);
/* Does shift_left operation for given variables. */
- void do_shift_left (tree arg1, tree arg2, tree dest);
+ bool do_shift_left (tree arg1, tree arg2, tree dest);
/* Does shift_right operation for given variables. */
- void do_shift_right (tree arg1, tree arg2, tree dest);
+ bool do_shift_right (tree arg1, tree arg2, tree dest);
/* Adds two variables. */
- void do_add (tree arg1, tree arg2, tree dest);
+ bool do_add (tree arg1, tree arg2, tree dest);
/* Does subtraction. */
- void do_sub (tree arg1, tree arg2, tree dest);
+ bool do_sub (tree arg1, tree arg2, tree dest);
+
+ /* Multiplies two variables, stores result in dest. */
+ bool do_mul (tree arg1, tree arg2, tree dest);
/* Negates given variable. */
- void do_complement (tree arg, tree dest);
+ bool do_complement (tree arg, tree dest);
+
+ bool add_equal_cond (tree arg1, tree arg2);
+
+ /* Gets the value of *arg1 and stores it in dest. */
+ bool do_mem_ref (tree arg1, tree dest);
+
+ /* Performs addition on arg1 pointer. */
+ bool do_pointer_plus (tree arg1, tree arg2, tree dest);
- void add_equal_cond (tree arg1, tree arg2);
+ /* Perform subtractions on arg1 pointer. */
+ bool do_pointer_diff (tree arg1, tree arg2, tree dest);
- void add_not_equal_cond (tree arg1, tree arg2);
+ bool add_not_equal_cond (tree arg1, tree arg2);
- void add_greater_than_cond (tree arg1, tree arg2);
+ bool add_greater_than_cond (tree arg1, tree arg2);
- void add_less_than_cond (tree arg1, tree arg2);
+ bool add_less_than_cond (tree arg1, tree arg2);
- void add_greater_or_equal_cond (tree arg1, tree arg2);
+ bool add_greater_or_equal_cond (tree arg1, tree arg2);
- void add_less_or_equal_cond (tree arg1, tree arg2);
+ bool add_less_or_equal_cond (tree arg1, tree arg2);
- void add_bool_cond (tree arg);
+ bool add_bool_cond (tree arg);
bool check_const_bit_equality (vec<value *> * arg1_bits,
vec<value *> * arg2_bits) const;