summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/standalone_miri/main.cpp43
-rw-r--r--tools/standalone_miri/module_tree.cpp12
-rw-r--r--tools/standalone_miri/module_tree.hpp17
3 files changed, 50 insertions, 22 deletions
diff --git a/tools/standalone_miri/main.cpp b/tools/standalone_miri/main.cpp
index 86a213dd..e3c7ab50 100644
--- a/tools/standalone_miri/main.cpp
+++ b/tools/standalone_miri/main.cpp
@@ -433,8 +433,9 @@ Value MIRI_Invoke(ModuleTree& modtree, ::HIR::Path path, ::std::vector<Value> ar
return ValueRef(args.at(e.idx), 0, args.at(e.idx).size());
} break;
TU_ARM(lv, Static, e) {
- // TODO: Type!
- return ValueRef(modtree.get_static(e), 0, modtree.get_static(e).size());
+ /*const*/ auto& s = modtree.get_static(e);
+ ty = s.ty;
+ return ValueRef(s.val, 0, s.val.size());
} break;
TU_ARM(lv, Index, e) {
auto idx = get_value_ref(*e.idx).read_usize(0);
@@ -678,7 +679,7 @@ Value MIRI_Invoke(ModuleTree& modtree, ::HIR::Path path, ::std::vector<Value> ar
for(const auto& stmt : bb.statements)
{
- LOG_DEBUG("BB" << bb_idx << "/" << (&stmt - bb.statements.data()) << ": " << stmt);
+ LOG_DEBUG("=== BB" << bb_idx << "/" << (&stmt - bb.statements.data()) << ": " << stmt);
switch(stmt.tag())
{
case ::MIR::Statement::TAGDEAD: throw "";
@@ -1424,7 +1425,7 @@ Value MIRI_Invoke(ModuleTree& modtree, ::HIR::Path path, ::std::vector<Value> ar
}
}
- LOG_DEBUG("BB" << bb_idx << "/TERM: " << bb.terminator);
+ LOG_DEBUG("=== BB" << bb_idx << "/TERM: " << bb.terminator);
switch(bb.terminator.tag())
{
case ::MIR::Terminator::TAGDEAD: throw "";
@@ -1522,7 +1523,8 @@ Value MIRI_Invoke(ModuleTree& modtree, ::HIR::Path path, ::std::vector<Value> ar
auto& alloc_ptr = v.m_alloc ? v.m_alloc : v.m_value->allocation;
LOG_ASSERT(alloc_ptr, "Calling value that can't be a pointer (no allocation)");
const auto& fcn_alloc_ptr = alloc_ptr.alloc().get_relocation(v.m_offset);
- LOG_ASSERT(fcn_alloc_ptr, "Calling value with no relocation");
+ if( !fcn_alloc_ptr )
+ LOG_FATAL("Calling value with no relocation - " << v);
LOG_ASSERT(fcn_alloc_ptr.get_ty() == AllocationPtr::Ty::Function, "Calling value that isn't a function pointer");
fcn_p = &fcn_alloc_ptr.fcn();
}
@@ -1671,6 +1673,30 @@ Value MIRI_Invoke_Extern(const ::std::string& link_name, const ::std::string& ab
rv.write_usize(0, val);
return rv;
}
+ else if( link_name == "pthread_mutex_init" || link_name == "pthread_mutex_lock" || link_name == "pthread_mutex_unlock" )
+ {
+ auto rv = Value(::HIR::TypeRef(RawType::I32));
+ rv.write_i32(0, 0);
+ return rv;
+ }
+ else if( link_name == "pthread_mutexattr_init" || link_name == "pthread_mutexattr_settype" || link_name == "pthread_mutexattr_destroy" )
+ {
+ auto rv = Value(::HIR::TypeRef(RawType::I32));
+ rv.write_i32(0, 0);
+ return rv;
+ }
+ else if( link_name == "pthread_condattr_init" || link_name == "pthread_condattr_destroy" || link_name == "pthread_condattr_setclock" )
+ {
+ auto rv = Value(::HIR::TypeRef(RawType::I32));
+ rv.write_i32(0, 0);
+ return rv;
+ }
+ else if( link_name == "pthread_cond_init" || link_name == "pthread_cond_destroy" )
+ {
+ auto rv = Value(::HIR::TypeRef(RawType::I32));
+ rv.write_i32(0, 0);
+ return rv;
+ }
#endif
// std C
else if( link_name == "signal" )
@@ -1684,15 +1710,12 @@ Value MIRI_Invoke_Extern(const ::std::string& link_name, const ::std::string& ab
else if( link_name == "memchr" )
{
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`
+ const void* ptr = args.at(0).read_pointer_const(0, n);
- void* ret = memchr(ptr, c, n);
+ const void* ret = memchr(ptr, c, n);
auto rv = Value(::HIR::TypeRef(RawType::USize));
rv.create_allocation();
diff --git a/tools/standalone_miri/module_tree.cpp b/tools/standalone_miri/module_tree.cpp
index d62695d1..d6c7dcec 100644
--- a/tools/standalone_miri/module_tree.cpp
+++ b/tools/standalone_miri/module_tree.cpp
@@ -154,10 +154,12 @@ bool Parser::parse_one()
}
lex.check_consume(';');
- Value val = Value(ty);
- val.write_bytes(0, data.data(), data.size());
+ Static s;
+ s.val = Value(ty);
+ s.val.write_bytes(0, data.data(), data.size());
+ s.ty = ty;
- tree.statics.insert(::std::make_pair( ::std::move(p), ::std::move(val) ));
+ tree.statics.insert(::std::make_pair( ::std::move(p), ::std::move(s) ));
}
else if( lex.consume_if("type") )
{
@@ -1311,7 +1313,7 @@ const Function* ModuleTree::get_function_opt(const ::HIR::Path& p) const
}
return &it->second;
}
-Value& ModuleTree::get_static(const ::HIR::Path& p)
+Static& ModuleTree::get_static(const ::HIR::Path& p)
{
auto it = statics.find(p);
if(it == statics.end())
@@ -1321,7 +1323,7 @@ Value& ModuleTree::get_static(const ::HIR::Path& p)
}
return it->second;
}
-Value* ModuleTree::get_static_opt(const ::HIR::Path& p)
+Static* ModuleTree::get_static_opt(const ::HIR::Path& p)
{
auto it = statics.find(p);
if(it == statics.end())
diff --git a/tools/standalone_miri/module_tree.hpp b/tools/standalone_miri/module_tree.hpp
index ca24b06a..5479d9ef 100644
--- a/tools/standalone_miri/module_tree.hpp
+++ b/tools/standalone_miri/module_tree.hpp
@@ -9,15 +9,14 @@
#include "../../src/mir/mir.hpp"
#include "hir_sim.hpp"
-
-struct Value;
+#include "value.hpp"
struct Function
{
::HIR::Path my_path;
::std::vector<::HIR::TypeRef> args;
::HIR::TypeRef ret_ty;
-
+
// If `link_name` is non-empty, then the function is an external
struct {
::std::string link_name;
@@ -25,6 +24,11 @@ struct Function
} external;
::MIR::Function m_mir;
};
+struct Static
+{
+ ::HIR::TypeRef ty;
+ Value val;
+};
/// Container for loaded code and structures
class ModuleTree
@@ -34,8 +38,7 @@ class ModuleTree
::std::set<::std::string> loaded_files;
::std::map<::HIR::Path, Function> functions;
- ::std::map<::HIR::Path, Value> statics;
- // TODO: statics
+ ::std::map<::HIR::Path, Static> statics;
// Hack: Tuples are stored as `::""::<A,B,C,...>`
::std::map<::HIR::GenericPath, ::std::unique_ptr<DataType>> data_types;
@@ -47,8 +50,8 @@ public:
::HIR::SimplePath find_lang_item(const char* name) const;
const Function& get_function(const ::HIR::Path& p) const;
const Function* get_function_opt(const ::HIR::Path& p) const;
- Value& get_static(const ::HIR::Path& p);
- Value* get_static_opt(const ::HIR::Path& p);
+ Static& get_static(const ::HIR::Path& p);
+ Static* get_static_opt(const ::HIR::Path& p);
const DataType& get_composite(const ::HIR::GenericPath& p) const {
return *data_types.at(p);