summaryrefslogtreecommitdiff
path: root/tools/standalone_miri/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/standalone_miri/main.cpp')
-rw-r--r--tools/standalone_miri/main.cpp51
1 files changed, 42 insertions, 9 deletions
diff --git a/tools/standalone_miri/main.cpp b/tools/standalone_miri/main.cpp
index 384bc79e..86a213dd 100644
--- a/tools/standalone_miri/main.cpp
+++ b/tools/standalone_miri/main.cpp
@@ -1266,10 +1266,16 @@ Value MIRI_Invoke(ModuleTree& modtree, ::HIR::Path path, ::std::vector<Value> ar
}
} break;
TU_ARM(se.src, DstMeta, re) {
- LOG_TODO(stmt);
+ auto ptr = state.get_value_ref(re.val);
+
+ ::HIR::TypeRef dst_ty;
+ state.get_value_and_type(se.dst, dst_ty);
+ new_val = ptr.read_value(POINTER_SIZE, dst_ty.get_size());
} break;
TU_ARM(se.src, DstPtr, re) {
- LOG_TODO(stmt);
+ auto ptr = state.get_value_ref(re.val);
+
+ new_val = ptr.read_value(0, POINTER_SIZE);
} break;
TU_ARM(se.src, MakeDst, re) {
// - Get target type, just for some assertions
@@ -1655,6 +1661,17 @@ Value MIRI_Invoke_Extern(const ::std::string& link_name, const ::std::string& ab
}
}
#else
+ // POSIX
+ else if( link_name == "sysconf" )
+ {
+ auto name = args.at(0).read_i32(0);
+ LOG_DEBUG("FFI sysconf(" << name << ")");
+ long val = sysconf(name);
+ auto rv = Value(::HIR::TypeRef(RawType::USize));
+ rv.write_usize(0, val);
+ return rv;
+ }
+#endif
// std C
else if( link_name == "signal" )
{
@@ -1663,17 +1680,33 @@ Value MIRI_Invoke_Extern(const ::std::string& link_name, const ::std::string& ab
rv.write_usize(0, 1);
return rv;
}
- // POSIX
- else if( link_name == "sysconf" )
+ // - `void *memchr(const void *s, int c, size_t n);`
+ else if( link_name == "memchr" )
{
- auto name = args.at(0).read_i32(0);
- LOG_DEBUG("FFI sysconf(" << name << ")");
- long val = sysconf(name);
+ LOG_ASSERT(args.at(0).allocation.is_alloc(), "");
+ //size_t ptr_space;
+ //void* ptr = args.at(0).read_pointer(0, ptr_space);
+ auto ptr_alloc = args.at(0).allocation.alloc().get_relocation(0);
+ void* ptr = ptr_alloc.alloc().data_ptr() + args.at(0).read_usize(0);
+ auto c = args.at(1).read_i32(0);
+ auto n = args.at(2).read_usize(0);
+ // TODO: Check range of `n`
+
+ void* ret = memchr(ptr, c, n);
+
auto rv = Value(::HIR::TypeRef(RawType::USize));
- rv.write_usize(0, val);
+ rv.create_allocation();
+ if( ret )
+ {
+ rv.write_usize(0, args.at(0).read_usize(0) + ( static_cast<const uint8_t*>(ret) - static_cast<const uint8_t*>(ptr) ));
+ rv.allocation.alloc().relocations.push_back({ 0, ptr_alloc });
+ }
+ else
+ {
+ rv.write_usize(0, 0);
+ }
return rv;
}
-#endif
// Allocators!
else
{