From fc64098a1a08f68c9f3b860ede3147ec177d5522 Mon Sep 17 00:00:00 2001 From: Cristian Dumitrescu Date: Mon, 13 Sep 2021 17:44:38 +0100 Subject: [PATCH] pipeline: introduce pipeline compilation 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 --- lib/pipeline/rte_swx_pipeline.c | 44 +++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/lib/pipeline/rte_swx_pipeline.c b/lib/pipeline/rte_swx_pipeline.c index 9afe42ed25..392e2cf1bc 100644 --- a/lib/pipeline/rte_swx_pipeline.c +++ b/lib/pipeline/rte_swx_pipeline.c @@ -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; +} -- 2.20.1