summaryrefslogtreecommitdiff
path: root/overlay/tracepoint_format.leg
diff options
context:
space:
mode:
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>2017-12-18 23:00:54 +0000
committerLionel Landwerlin <lionel.g.landwerlin@intel.com>2017-12-22 11:17:37 +0000
commit865a47ca2b93b208ba016f3c4fc00831ec7bfec6 (patch)
treefae09896c77b2d7c3ccd9989e23d5dc041442888 /overlay/tracepoint_format.leg
parentbeb26d89ff5c5621c1e6b6ac2a45439507af86b7 (diff)
overlay: parse tracepoints from sysfs to figure out fields' location
With changes going to drm-tip, the tracepoints field locations are going to change. This change introduces a tracepoint parser (using a peg parser) which lets us figure out field positions on the fly. v2: Fix automake build (Lionel) v3: Make overlay build conditional on peg (Petri) Make wait_end callback more readable (Chris) Drop tracepoint_id(), instead parsing from format file (Lionel) v4: Fix existing configure.ac issue with overlay build (Petri) v5: Silence unused function (Lionel) v6: Fix missing double quote in v4 (Lionel) Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Acked-by: Chris Wilson <chris@chris-wilson.co.uk> For the build system changes: Acked-by: Petri Latvala <petri.latvala@intel.com>
Diffstat (limited to 'overlay/tracepoint_format.leg')
-rw-r--r--overlay/tracepoint_format.leg35
1 files changed, 35 insertions, 0 deletions
diff --git a/overlay/tracepoint_format.leg b/overlay/tracepoint_format.leg
new file mode 100644
index 00000000..7a09149d
--- /dev/null
+++ b/overlay/tracepoint_format.leg
@@ -0,0 +1,35 @@
+TracepointFmt =
+ 'name' ':' Space n:PropertyName EndLine
+ { free(v.string); }
+ 'ID:' Space v:Number EndLine
+ { yy->ctx.tp->event_id = v.integer; }
+ 'format:' EndLine
+ Field+
+ 'print fmt:' [^.]* !.
+
+Field = Space (Property ';' Space)+ EndLine
+ { yy->ctx.tp->n_fields++; }
+ | EndLine
+
+Property = 'offset' ':' v:Number
+ { yy->ctx.tp->fields[yy->ctx.tp->n_fields].offset = v.integer; }
+ | 'size' ':' v:Number
+ { yy->ctx.tp->fields[yy->ctx.tp->n_fields].size = v.integer; }
+ | 'signed' ':' v:Number
+ { yy->ctx.tp->fields[yy->ctx.tp->n_fields].is_signed = v.integer != 0; }
+ | 'field' ':' v:PropertyValue
+ { snprintf(yy->ctx.tp->fields[yy->ctx.tp->n_fields].name,
+ sizeof(yy->ctx.tp->fields[yy->ctx.tp->n_fields].name),
+ "%s", strrchr(v.string, ' ') + 1); free(v.string); }
+ | n:PropertyName ':' v:PropertyValue
+ { free(n.string); free(v.string); }
+
+PropertyName = < [A-Za-z0-9_]+ >
+ { $$.string = strdup(yytext); }
+PropertyValue = < [^;]+ >
+ { $$.string = strdup(yytext); }
+Number = < [0-9]+ >
+ { $$.integer = atoi(yytext); }
+
+EndLine = [\n]
+Space = [ \t]*