blob: 2011edfa24bf544ba7b381ddd7f3b5e7daa12b78 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
//
//
//
#include <iostream>
#include "module_tree.hpp"
#include "value.hpp"
#include <algorithm>
#include <iomanip>
#include "debug.hpp"
#include "miri.hpp"
struct ProgramOptions
{
::std::string infile;
//TODO: Architecture file
//TODO: Loadable FFI descriptions
//TODO: Logfile
int parse(int argc, const char* argv[]);
};
int main(int argc, const char* argv[])
{
ProgramOptions opts;
if( opts.parse(argc, argv) )
{
return 1;
}
auto tree = ModuleTree {};
tree.load_file(opts.infile);
auto val_argc = Value( ::HIR::TypeRef{RawType::ISize} );
::HIR::TypeRef argv_ty { RawType::I8 };
argv_ty.wrappers.push_back(TypeWrapper { TypeWrapper::Ty::Pointer, 0 });
argv_ty.wrappers.push_back(TypeWrapper { TypeWrapper::Ty::Pointer, 0 });
auto val_argv = Value(argv_ty);
val_argc.write_isize(0, 0);
val_argv.write_usize(0, 0);
try
{
InterpreterThread root_thread(tree);
::std::vector<Value> args;
args.push_back(::std::move(val_argc));
args.push_back(::std::move(val_argv));
Value rv;
root_thread.start(tree.find_lang_item("start"), ::std::move(args));
while( !root_thread.step_one(rv) )
{
}
::std::cout << rv << ::std::endl;
}
catch(const DebugExceptionTodo& /*e*/)
{
::std::cerr << "TODO Hit" << ::std::endl;
return 1;
}
catch(const DebugExceptionError& /*e*/)
{
::std::cerr << "Error encountered" << ::std::endl;
return 1;
}
return 0;
}
int ProgramOptions::parse(int argc, const char* argv[])
{
bool all_free = false;
for(int argidx = 1; argidx < argc; argidx ++)
{
const char* arg = argv[argidx];
if( arg[0] != '-' || all_free )
{
// Free
if( this->infile == "" )
{
this->infile = arg;
}
else
{
// TODO: Too many free arguments
}
}
else if( arg[1] != '-' )
{
// Short
}
else if( arg[2] != '\0' )
{
// Long
}
else
{
all_free = true;
}
}
return 0;
}
|