pipeline: introduce pipeline compilation
authorCristian Dumitrescu <cristian.dumitrescu@intel.com>
Mon, 13 Sep 2021 16:44:38 +0000 (17:44 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Mon, 27 Sep 2021 10:09:15 +0000 (12:09 +0200)
Lay the foundation to generate C code for the pipeline: C functions
for actions and custom instructions are generated, built as shared
object library and loaded into the pipeline.

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
lib/pipeline/rte_swx_pipeline.c

index 9afe42e..392e2cf 100644 (file)
@@ -8977,6 +8977,9 @@ rte_swx_pipeline_instructions_config(struct rte_swx_pipeline *p,
        return 0;
 }
 
+static int
+pipeline_compile(struct rte_swx_pipeline *p);
+
 int
 rte_swx_pipeline_build(struct rte_swx_pipeline *p)
 {
@@ -9046,6 +9049,9 @@ rte_swx_pipeline_build(struct rte_swx_pipeline *p)
                goto error;
 
        p->build_done = 1;
+
+       pipeline_compile(p);
+
        return 0;
 
 error:
@@ -9789,3 +9795,41 @@ rte_swx_ctl_meter_stats_read(struct rte_swx_pipeline *p,
 
        return 0;
 }
+
+/*
+ * Pipeline compilation.
+ */
+static int
+pipeline_codegen(struct rte_swx_pipeline *p)
+{
+       FILE *f = NULL;
+
+       if (!p)
+               return -EINVAL;
+
+       /* Create the .c file. */
+       f = fopen("/tmp/pipeline.c", "w");
+       if (!f)
+               return -EIO;
+
+       /* Include the .h file. */
+       fprintf(f, "#include \"rte_swx_pipeline_internal.h\"\n");
+
+       /* Close the .c file. */
+       fclose(f);
+
+       return 0;
+}
+
+static int
+pipeline_compile(struct rte_swx_pipeline *p)
+{
+       int status = 0;
+
+       /* Code generation. */
+       status = pipeline_codegen(p);
+       if (status)
+               return status;
+
+       return status;
+}