"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", {
"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";
];
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";
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";
) 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"