Const-correct VM interface.

This commit is contained in:
Can Bölük 2020-08-24 06:08:18 +02:00
parent a25ce864fe
commit 5b6d37e129
5 changed files with 15 additions and 14 deletions

View file

@ -45,7 +45,7 @@ namespace vtil
if ( x->symbolic_operator != math::operator_id::invalid )
tbl[ ( size_t ) x->symbolic_operator ] = x;
return tbl;
}( );
}();
fassert( lookup_table.size() > ( size_t ) op );
const instruction_desc* desc = lookup_table[ ( size_t ) op ];
@ -89,9 +89,7 @@ namespace vtil
// If constant, simply convert into operand type.
//
if ( exp->is_constant() )
{
return { *exp->get(), exp->size() };
}
// Assert validity and get the variable.
//
@ -316,7 +314,7 @@ namespace vtil
// Push [<INS> Lhs 0 Rhs] and return Lhs.
//
force_clobber_register( lhs );
block->push_back( { map_operator( op ),{ lhs, operand{ 0, rhs.bit_count() }, rhs } } );
block->push_back( { map_operator( op ), { lhs, operand{ 0, rhs.bit_count() }, rhs } } );
return lhs;
}
case math::operator_id::max_value:
@ -327,7 +325,11 @@ namespace vtil
// Unpack the expression by forcing re-simplification without
// prettification requested and recurse.
//
return cvt( exp.transform( [ ] ( auto& ) {} ), true );
auto copy = exp;
( +copy )->simplify_hint = false;
( +copy )->is_lazy = false;
( +copy )->simplify();
return cvt( copy, true );
}
case math::operator_id::greater:
case math::operator_id::greater_eq:
@ -353,7 +355,7 @@ namespace vtil
// Push [<INS> Tmp Lhs Rhs] and return Tmp.
//
block->push_back( { map_operator( op ),{ tmp, lhs, rhs } } );
block->push_back( { map_operator( op ), { tmp, lhs, rhs } } );
return tmp;
}
default:

View file

@ -48,11 +48,11 @@ namespace vtil
{
// Reads from the register.
//
virtual symbolic::expression::reference read_register( const register_desc& desc ) { unreachable(); return {}; }
virtual symbolic::expression::reference read_register( const register_desc& desc ) const { unreachable(); return {}; }
// Reads the given number of bytes from the memory, returns null if aliasing fails.
//
virtual symbolic::expression::reference read_memory( const symbolic::expression::reference& pointer, size_t byte_count ) { unreachable(); return {}; }
virtual symbolic::expression::reference read_memory( const symbolic::expression::reference& pointer, size_t byte_count ) const { unreachable(); return {}; }
// Writes to the register.
//
@ -61,7 +61,7 @@ namespace vtil
// Writes the given expression to the memory, returns false if aliasing fails.
//
virtual bool write_memory( const symbolic::expression::reference& pointer, deferred_value<symbolic::expression::reference> value, bitcnt_t size ) { unreachable(); return false; }
bool write_memory_v( const symbolic::expression::reference& pointer, symbolic::expression::reference value ) { return write_memory( pointer, value, value.size() ); }
bool write_memory_v( const symbolic::expression::reference& pointer, symbolic::expression::reference value ) { return write_memory( pointer, std::move( value ), value.size() ); }
// Runs the given instruction, returns whether it was successful.
//

View file

@ -63,13 +63,13 @@ namespace vtil
// Declare the overrides redirecting to the callbacks.
//
symbolic::expression::reference read_register( const register_desc& desc ) override
symbolic::expression::reference read_register( const register_desc& desc ) const override
{
return hooks.read_register
? hooks.read_register( desc )
: vm_base::read_register( desc );
}
symbolic::expression::reference read_memory( const symbolic::expression::reference& pointer, size_t byte_count ) override
symbolic::expression::reference read_memory( const symbolic::expression::reference& pointer, size_t byte_count ) const override
{
return hooks.read_memory
? hooks.read_memory( pointer, byte_count )

View file

@ -49,7 +49,7 @@ namespace vtil
// Reads from the register.
//
symbolic::expression::reference read_register( const register_desc& desc ) override
symbolic::expression::reference read_register( const register_desc& desc ) const override
{
return register_state.read( desc, reference_iterator );
}
@ -64,7 +64,7 @@ namespace vtil
// Reads the given number of bytes from the memory.
//
symbolic::expression::reference read_memory( const symbolic::expression::reference& pointer, size_t byte_count ) override
symbolic::expression::reference read_memory( const symbolic::expression::reference& pointer, size_t byte_count ) const override
{
return memory_state.read( pointer, math::narrow_cast<bitcnt_t>( byte_count * 8 ), reference_iterator );
}

View file

@ -97,7 +97,6 @@ namespace vtil::symbolic
//
using queue_key = typename detached_queue<cache_value>::key;
// Entry itself:
//
expression::reference result = {};