Experimental automated 'follower' code.
[virt-mem.git] / extract / codegen / compile_kerneldb.ml
index 2f7e89a..4ad221f 100644 (file)
@@ -47,9 +47,9 @@ let good_structs = [
                    "comm"; "pid" ];
     field_metadata = [
       "tasks'next", ListHeadIsReally None;
-      "tasks'prev", ListHeadIsReally None;
+      (*"tasks'prev", ListHeadIsReally None; XXX point to 'next *)
       "run_list'next", ListHeadIsReally None;
-      "run_list'prev", ListHeadIsReally None;
+      (*"run_list'prev", ListHeadIsReally None; XXX point to 'next *)
     ];
   };
   "net_device", {
@@ -59,7 +59,7 @@ let good_structs = [
                    "addr_len" ];
     field_metadata = [
       "dev_list'next", ListHeadIsReally None;
-      "dev_list'prev", ListHeadIsReally None;
+      (*"dev_list'prev", ListHeadIsReally None; XXX point to 'next *)
       "ip_ptr", VoidPointerIsReally "in_device";
       "ip6_ptr", VoidPointerIsReally "inet6_dev";
     ];
@@ -307,7 +307,7 @@ Options:
          fun { SC.sf_name = name; sf_fields = fields } ->
            printf "    type %s = {\n" name;
            List.iter (
-             fun { PP.field_name = name; field_type = typ } ->
+             fun (name, typ) ->
                printf "      %s %s;\n" (PP.string_of_f_type typ) name
            ) fields;
            printf "    }\n";
@@ -318,7 +318,7 @@ Options:
          fun { SC.cf_name = name; cf_fields = fields } ->
            printf "    type %s = {\n" name;
            List.iter (
-             fun { PP.field_name = name; field_type = typ } ->
+             fun (name, typ) ->
                printf "      %s %s;\n" (PP.string_of_f_type typ) name
            ) fields;
            printf "    }\n";
@@ -361,16 +361,23 @@ Options:
       ) structures
     ) in
 
+  let implem_followers, interf_followers =
+    CG.generate_followers (
+      List.map (
+       fun (struct_name, (kernels, _, sflist, sfhash, _, _, _, pahash)) ->
+         (struct_name, (kernels, sflist, sfhash, pahash))
+      ) structures
+    ) in
+
   (* Output the generated code. *)
   let output_file = outputdir // "kernel.mli" in
   printf "Writing kernel data interface to %s ...\n%!" output_file;
   CG.output_interf ~output_file
-    interf_types interf_offsets interf_parsers;
+    interf_types interf_offsets interf_parsers interf_followers;
 
   let output_file = outputdir // "kernel.ml" in
   printf "Writing kernel data parsers to %s ...\n%!" output_file;
   CG.output_implem ~output_file
-    implem_types implem_offsets implem_parsers
-    subst_parsers;
+    implem_types implem_offsets implem_parsers subst_parsers implem_followers;
 
   printf "Finished.\n"