Cross-references in list_head fields working.
[virt-mem.git] / extract / codegen / compile_kerneldb.ml
index 31bb000..2f7e89a 100644 (file)
@@ -67,8 +67,10 @@ let good_structs = [
   "net", {
     good_fields = [ "dev_base_head'next"; "dev_base_head'prev" ];
     field_metadata = [
-      "dev_base_head'next", ListHeadIsReally (Some ("net_device", "dev_list"));
-      "dev_base_head'prev", ListHeadIsReally (Some ("net_device", "dev_list"));
+      "dev_base_head'next",
+        ListHeadIsReally (Some ("net_device", "dev_list'next"));
+      "dev_base_head'prev",
+        ListHeadIsReally (Some ("net_device", "dev_list'next"));
     ];
   };
   "in_device", {
@@ -342,7 +344,16 @@ Options:
       ) structures
     ) in
 
-  let implem_parsers, interf_parsers, subst_parsers =
+  let implem_offsets, interf_offsets =
+    CG.generate_offsets (
+      List.map (
+       fun (struct_name,
+            (kernels, all_fields, _, _, _, _, _, _)) ->
+         (struct_name, (kernels, all_fields))
+      ) structures
+    ) in
+
+  let (implem_parsers, interf_parsers), subst_parsers =
     CG.generate_parsers (
       List.map (
        fun (struct_name, (_, _, _, _, _, _, palist, _)) ->
@@ -353,10 +364,13 @@ Options:
   (* 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_parsers;
+  CG.output_interf ~output_file
+    interf_types interf_offsets interf_parsers;
 
   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_parsers subst_parsers;
+  CG.output_implem ~output_file
+    implem_types implem_offsets implem_parsers
+    subst_parsers;
 
   printf "Finished.\n"