aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xmain.py85
-rw-r--r--resources/wasm.xml5
-rw-r--r--test/autowasm.c1
3 files changed, 64 insertions, 27 deletions
diff --git a/main.py b/main.py
index 7ba7c31..5b17271 100755
--- a/main.py
+++ b/main.py
@@ -135,7 +135,7 @@ def get_full_path(path, name):
if path[-1] == "/": return path + name
else: return path + "/" + name
-def get_elem_count(elem, elems):
+def get_elem_count(elem):
if "count" in elem.attrib:
try:
if str(int(elem.attrib["count"])) == elem.attrib["count"]:
@@ -146,7 +146,7 @@ def get_elem_count(elem, elems):
else:
return 1
-def get_elem_size(elem, elems):
+def get_elem_size(elem):
if "size" in elem.attrib:
try:
if str(int(elem.attrib["size"])) == elem.attrib["size"]:
@@ -203,6 +203,8 @@ class CodeGen(object):
self.read_iter = []
self.def_iter = []
self.mem_size = {}
+ self.tree = xml.etree.ElementTree.parse(self.argparser.args.xml)
+ self.root = self.tree.getroot()
def init_hook(self):
pass
@@ -229,11 +231,17 @@ class CodeGen(object):
for key, value in self.mem_size.items():
print(key + ".." + value)
+ def dump_all_childs(self):
+ for node in self.root.iter():
+ print(node.tag)
+
def gen_reader_funcs(self):
temp_dec_list = []
read_source = open(self.argparser.args.outdir + "/read.c", "w")
read_source.write("\n// automatically generated by faultrieber\n")
read_source.write("// " + self.dnt + "\n\n")
+ read_source.write("#ifndef FT_READ_H\n#define FT_READ_H\n")
+ read_source.write('#ifdef __cplusplus\nextern "C" {\n#endif\n')
read_source.write(text.header_list)
read_source.write('#include "./structs.h"\n\n')
inline = "inline " if self.argparser.args.inline else ""
@@ -252,13 +260,13 @@ class CodeGen(object):
if "isaggregate" in elem.attrib:
dummy_string += ", " + elem.attrib["name"] + "*" + " dummy_" + elem.attrib["name"]
read_source.write(static + inline + text.c_read_elem_sig.replace("YYY", elem.attrib["name"]).replace("XXX", elem.attrib["name"]+pointer))
- count = get_elem_count(elem, self.read_elems+self.def_elems)
+ count = get_elem_count(elem)
if count == 1:
for child in elem:
- child_count = get_elem_count(child, self.def_elems + self.read_elems)
+ child_count = get_elem_count(child)
ref_node_name = type_resolver(child, self.def_elems)
ref_node = get_def_node(ref_node_name, self.def_elems)
- size = get_elem_size(child, self.def_elems + self.read_elems)
+ size = get_elem_size(child)
read_size_replacement = str()
if size > 0:
read_size_replacement = str(size)
@@ -310,27 +318,52 @@ class CodeGen(object):
read_source.write(text.c_read_gen.replace("XXX", "dummy->" + elem.attrib["name"]).replace("YYY", type_resolver(elem, self.def_elems)))
#read_source.write(text.c_function_return_type)
read_source.write(text.c_function_close + "\n")
+ read_source.write('#ifdef __cplusplus\n}#endif\n')
+ read_source.write("#endif //end of header guard\n\n")
def gen_void_train(self):
- void_source = open(self.argparser.args.outdir + "/void.h", "w")
+ #void_source = open(self.argparser.args.outdir + "/void.h", "w")
+ void_source = open(self.argparser.args.outdir + "/aggregate.h", "w")
void_source.write("\n// automatically generated by faultreiber\n")
void_source.write("// " + self.dnt + "\n")
void_source.write('#include "./structs.h"\n')
void_source.write('#include "./read.c"\n')
void_source.write("#include <stdlib.h>\n")
- void_source.write("void** void_train(void) {\n")
+ #void_source.write("void** void_train(void) {\n")
+ void_source.write('#ifndef FT_AGGREGATE_H\n#define FT_AGGREGATE_H\n')
+ void_source.write('#ifdef __cplusplus\nextern "C" {\n#endif\n')
+ void_source.write("void read_aggr(int _fd) {\n")
+ for elem in self.read_elems:
+ count = get_elem_count(elem)
+ size = get_elem_size(elem)
+ if count != 1:
+ void_source.write(elem.attrib["name"] + "** " + elem.attrib["name"] + "_container;\n")
+ else:
+ void_source.write(elem.attrib["name"] + "* " + elem.attrib["name"] + "_container;\n")
+ for child in elem:
+ ref_node_name = type_resolver(child, self.def_elems)
+ ref_node = get_def_node(ref_node_name, self.def_elems)
+ if ref_node:
+ count = get_elem_count(child)
+ size = get_elem_size(child)
+ if count != 1:
+ void_source.write(ref_node.attrib["name"] + "** " + elem.attrib["name"] + "_" + child.attrib["name"] + "_container;\n")
+ else:
+ void_source.write(ref_node.attrib["name"] + "* " + elem.attrib["name"] + "_" + child.attrib["name"] + "_container;\n")
count_int = int()
count_void = int()
read_count = len(self.read_elems)
+ void_source.write("//TODO-assign sub-containers to contrainers here\n")
# FIXME-count and size present together is not being handled at all
- for elem in self.read_elems + self.def_elems:
+ for elem in self.read_elems:
+ #for elem in self.read_elems + self.def_elems:
if "isaggregate" in elem.attrib:
for child in elem:
ref_node_name = type_resolver(child, self.def_elems)
ref_node = get_def_node(ref_node_name, self.def_elems)
if ref_node: count_void+=1
- count = get_elem_count(child, self.def_elems + self.read_elems)
- size = get_elem_size(child, self.def_elems + self.read_elems)
+ count = get_elem_count(child)
+ size = get_elem_size(child)
type_width = get_type_width(child)
#print(elem.tag + " " + child.tag + " " + "count:" + str(count) + " " + "size:" + str(size) + " " + "typ_width:" + str(type_width))
if count > 0: count_int+=count*type_width
@@ -339,7 +372,8 @@ class CodeGen(object):
if size < 0: count_void+=1
sizeof = (str(count_int) if count_int > 0 else ("")) + ("+" if count_void>0 and count_int>0 else "") + ((str(count_void)+"*"+"sizeof(void*)") if count_void > 0 else "")
self.mem_size[elem.attrib["name"]] = text.c_reserve_void_ptr.replace("XXX", sizeof)
- void_source.write(elem.attrib["name"] + "* = " + text.c_reserve_void_ptr.replace("XXX", sizeof) + ";\n")
+ #void_source.write(elem.attrib["name"] + "* " + elem.attrib["name"] + "_container" + " = " + text.c_reserve_void_ptr.replace("XXX", sizeof) + ";\n")
+ void_source.write(elem.attrib["name"] + "_container" + " = " + text.c_reserve_void_ptr.replace("XXX", sizeof) + ";\n")
count_int = 0
count_void = 0
else:
@@ -347,30 +381,32 @@ class CodeGen(object):
ref_node = get_def_node(ref_node_name, self.def_elems)
if ref_node: count_void+=1
if "size" in elem.attrib:
- count = get_elem_count(elem, self.def_elems + self.read_elems)
+ count = get_elem_count(elem)
if count > 0: count_int+= count
else: count_void+=1
if "count" in elem.attrib:
- size = get_elem_size(elem, self.def_elems + self.read_elems)
+ size = get_elem_size(elem)
if size > 0: count_int+=size
else: count_void+=1
sizeof = (str(count_int)+"+" if count_int > 0 else "") + (str(count_void)+"*"+"sizeof(void*)") if count_void > 0 else ""
self.mem_size[elem.attrib["name"]] = text.c_reserve_void_ptr.replace("XXX", sizeof)
- void_source.write(elem.attrib["name"] + "* = " + text.c_reserve_void_ptr.replace("XXX", sizeof) + ";\n")
+ #void_source.write(elem.attrib["name"] + "* " + elem.attrib["name"] + "_container" + " = " + text.c_reserve_void_ptr.replace("XXX", sizeof) + ";\n")
+ void_source.write(elem.attrib["name"] + "_container" + " = " + text.c_reserve_void_ptr.replace("XXX", sizeof) + ";\n")
count_int = 0
count_void = 0
- void_source.write("}")
+ #void_source.write("}")
def gen_aggregate_read(self):
- agg_source = open(self.argparser.args.outdir + "/aggregate.h", "w")
- agg_source.write("\n// automatically generated by faultreiber\n")
- agg_source.write("// " + self.dnt + "\n")
- agg_source.write('#include "./structs.h"\n')
- agg_source.write('#include "./read.c"\n')
- agg_source.write("void read_aggr(void) {\n")
+ agg_source = open(self.argparser.args.outdir + "/aggregate.h", "a")
+ #agg_source.write("\n// automatically generated by faultreiber\n")
+ #agg_source.write("// " + self.dnt + "\n")
+ #agg_source.write('#include "./structs.h"\n')
+ #agg_source.write('#include "./read.c"\n')
for elem in self.read_elems:
- agg_source.write("ft_read_" + elem.attrib["name"] + "(_fd, );\n")
- agg_source.write("}")
+ agg_source.write("ft_read_" + elem.attrib["name"] + "(_fd," + elem.attrib["name"] + "_container" + ");\n")
+ agg_source.write("}\n")
+ agg_source.write('#ifdef __cplusplus\n}\n#endif\n')
+ agg_source.write("#endif //end of header guard\n\n")
def read_xml(self):
if self.argparser.args.xml:
@@ -493,7 +529,8 @@ class CodeGen(object):
#self.dump_read_elems()
self.gen_void_train()
self.gen_aggregate_read()
- self.dump_mem_dict()
+ #self.dump_mem_dict()
+ #self.dump_all_childs()
# write code here
def premain(argparser):
diff --git a/resources/wasm.xml b/resources/wasm.xml
index 09366be..c174429 100644
--- a/resources/wasm.xml
+++ b/resources/wasm.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<wasm:Structure xmlns:wasm="http://www.w3.org/2001/XMLSchema">
+<FT>
<Read>
<Magic_Number name="magic_number" type="uint32" count="1"></Magic_Number>
<Version name="version" type="uint32" count="1"></Version>
@@ -46,7 +46,6 @@
<Count name="count" encoding="leb128u" type="uint32" count="1"/>
<Entries name="entries" type="self::Data_Segment" count="self::Count"/>
</Data_Section>
- <Custom_Section name="W_Custom_Section" count="1" isaggregate="true"></Custom_Section>
</Read>
<Definition>
<Init_Expr name="init_expr_t" isaggregate="true">
@@ -122,4 +121,4 @@
<Data name="data" type="uchar" count="self::Size"/>
</Data_Segment>
</Definition>
-</wasm:Structure>
+</FT>
diff --git a/test/autowasm.c b/test/autowasm.c
index 3d39e44..02e0379 100644
--- a/test/autowasm.c
+++ b/test/autowasm.c
@@ -6,6 +6,7 @@
#include <unistd.h>
#include "./read.c"
+#include "./aggregate.h"
uint64_t read_leb128_u(int _fd, int max_size) {
uint8_t read_bytes = 0U;