mirror of
https://github.com/vtil-project/VTIL-Core
synced 2026-08-17 08:23:03 -04:00
Merge remote-tracking branch 'origin/master' into experimental
This commit is contained in:
commit
8bf3480f1b
7 changed files with 38 additions and 24 deletions
|
|
@ -233,9 +233,9 @@ namespace vtil::symbolic
|
|||
{
|
||||
// If instruction accesses memory:
|
||||
//
|
||||
if ( ( write && it->base->writes_memory() ) ||
|
||||
( read && it->base->reads_memory() ) ||
|
||||
( !read && !write && it->base->accesses_memory() ) )
|
||||
if ( it->base->accesses_memory() &&
|
||||
( !write || it->base->memory_write ) &&
|
||||
( !read || !it->base->memory_write ) )
|
||||
{
|
||||
// Generate an expression for the pointer.
|
||||
//
|
||||
|
|
@ -288,6 +288,19 @@ namespace vtil::symbolic
|
|||
{
|
||||
auto& reg = var.reg();
|
||||
|
||||
// If $sp, indicate read from:
|
||||
//
|
||||
if ( reg.is_stack_pointer() )
|
||||
{
|
||||
if ( write ) return {};
|
||||
return {
|
||||
.bit_offset = 0,
|
||||
.bit_count = reg.bit_count,
|
||||
.read = true,
|
||||
.write = false
|
||||
};
|
||||
}
|
||||
|
||||
// If exiting the virtual machine:
|
||||
//
|
||||
if ( it->base == &ins::vexit )
|
||||
|
|
@ -298,6 +311,7 @@ namespace vtil::symbolic
|
|||
{
|
||||
if ( retval.overlaps( reg ) )
|
||||
{
|
||||
if ( write ) return {};
|
||||
return {
|
||||
.bit_offset = retval.bit_offset - reg.bit_offset,
|
||||
.bit_count = retval.bit_count,
|
||||
|
|
@ -313,10 +327,8 @@ namespace vtil::symbolic
|
|||
{
|
||||
if ( retval.overlaps( reg ) )
|
||||
{
|
||||
if ( !read )
|
||||
return { .bit_offset = 0, .bit_count = reg.bit_count, .read = false, .write = true };
|
||||
else
|
||||
return {};
|
||||
if ( read ) return {};
|
||||
return { .bit_offset = 0, .bit_count = reg.bit_count, .read = false, .write = true };
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -324,14 +336,13 @@ namespace vtil::symbolic
|
|||
//
|
||||
if ( reg.is_virtual() )
|
||||
{
|
||||
if ( !read )
|
||||
return { .bit_offset = 0, .bit_count = reg.bit_count, .read = false, .write = true };
|
||||
else
|
||||
return {};
|
||||
if ( read ) return {};
|
||||
return { .bit_offset = 0, .bit_count = reg.bit_count, .read = false, .write = true };
|
||||
}
|
||||
|
||||
// Otherwise indicate read from.
|
||||
//
|
||||
if ( write ) return {};
|
||||
return {
|
||||
.bit_offset = 0,
|
||||
.bit_count = reg.bit_count,
|
||||
|
|
@ -418,10 +429,8 @@ namespace vtil::symbolic
|
|||
fill_displacement( &details, mem.base, pointer{ limit }, tracer, xblock );
|
||||
if ( !details.is_unknown() && ( details.bit_offset + var.bit_count() ) <= 0 )
|
||||
{
|
||||
if ( !read )
|
||||
return { .bit_offset = 0, .bit_count = var.bit_count(), .read = false, .write = true };
|
||||
else
|
||||
return {};
|
||||
if ( read ) return {};
|
||||
return { .bit_offset = 0, .bit_count = var.bit_count(), .read = false, .write = true };
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -222,7 +222,7 @@ namespace vtil
|
|||
hash_t operator()( const std::optional<T>& value ) const noexcept
|
||||
{
|
||||
if ( value ) return make_hash( *value );
|
||||
else return lt_typeid<T>::get();
|
||||
else return lt_typeid_v<T>;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -57,4 +57,7 @@ namespace vtil
|
|||
//
|
||||
inline static const size_t value = calculate();
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
static const size_t& lt_typeid_v = lt_typeid<std::decay_t<T>>::value;
|
||||
};
|
||||
|
|
@ -76,7 +76,7 @@ namespace vtil
|
|||
const void purge() const
|
||||
{
|
||||
std::lock_guard _g{ mtx };
|
||||
database.erase( lt_typeid<T>::value );
|
||||
database.erase( lt_typeid_v<T> );
|
||||
}
|
||||
|
||||
// Checks if we have the type in the store.
|
||||
|
|
@ -85,7 +85,7 @@ namespace vtil
|
|||
const bool has() const
|
||||
{
|
||||
std::lock_guard _g{ mtx };
|
||||
return database.contains( lt_typeid<T>::value );
|
||||
return database.contains( lt_typeid_v<T> );
|
||||
}
|
||||
|
||||
// Functional getter, if variant is already in the database will return
|
||||
|
|
@ -101,12 +101,12 @@ namespace vtil
|
|||
// default construct it and reference that instead.
|
||||
//
|
||||
std::lock_guard _g{ mtx };
|
||||
variant& var = database[ lt_typeid<T>::value ];
|
||||
variant& var = database[ lt_typeid_v<T> ];
|
||||
if( !var ) var = T{};
|
||||
return var.get<T>();
|
||||
}
|
||||
template<typename T>
|
||||
T& get() { return const_cast< T& >( ( ( const multivariate* ) this )->get<T>() ); }
|
||||
T& get() { return const_cast<T&>( ( ( const multivariate* ) this )->get<T>() ); }
|
||||
|
||||
// Allows for convinient use of the type in the format of:
|
||||
// - block_cache& cache = multivariate;
|
||||
|
|
|
|||
|
|
@ -158,7 +158,7 @@ namespace vtil
|
|||
hash_t operator()( const optional_reference<T>& value ) const noexcept
|
||||
{
|
||||
if ( value ) return make_hash( *value );
|
||||
else return lt_typeid<T>::value;
|
||||
else return lt_typeid_v<T>;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@
|
|||
<ClCompile Include="optimizer\symbolic_rewrite_pass.cpp">
|
||||
<Filter>Optimization Passes</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="optimizer\fast_dead_code_elimination_pass.cpp" />
|
||||
<ClCompile Include="optimizer\fast_propagation_pass.cpp" />
|
||||
<ClCompile Include="validation\test1.cpp">
|
||||
<Filter>Validation</Filter>
|
||||
|
|
@ -39,6 +38,9 @@
|
|||
<ClCompile Include="validation\pass_validation.cpp">
|
||||
<Filter>Validation</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="optimizer\fast_dead_code_elimination_pass.cpp">
|
||||
<Filter>Optimization Passes</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Filter Include="Includes">
|
||||
|
|
|
|||
|
|
@ -66,8 +66,8 @@ namespace vtil::optimizer
|
|||
{
|
||||
// Replace with a stack shift.
|
||||
//
|
||||
it->base = &ins::vpinr;
|
||||
it->operands = { { REG_SP } };
|
||||
it->base = &ins::nop;
|
||||
it->operands = {};
|
||||
blk->shift_sp( *shift_offset, true, it );
|
||||
|
||||
// Flush tracer cache.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue