diff options
| author | bloodstalker <thabogre@gmail.com> | 2018-08-01 20:59:10 +0000 | 
|---|---|---|
| committer | bloodstalker <thabogre@gmail.com> | 2018-08-01 20:59:10 +0000 | 
| commit | 5fa4284fbeba36a89f226b24bd302af98eba6c3d (patch) | |
| tree | 5f75009e5f4ce440b79be651569272d34b17efbe | |
| parent | update (diff) | |
| download | faultreiber-5fa4284fbeba36a89f226b24bd302af98eba6c3d.tar.gz faultreiber-5fa4284fbeba36a89f226b24bd302af98eba6c3d.zip | |
update
Diffstat (limited to '')
| -rwxr-xr-x | main.py | 85 | ||||
| -rw-r--r-- | resources/wasm.xml | 5 | ||||
| -rw-r--r-- | test/autowasm.c | 1 | 
3 files changed, 64 insertions, 27 deletions
| @@ -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; | 
