diff options
Diffstat (limited to 'overlay/tracepoint_format.leg')
-rw-r--r-- | overlay/tracepoint_format.leg | 35 |
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]* |