Skip to content

Commit

Permalink
perf tools: Make trace event format parser aware of cast to pointers
Browse files Browse the repository at this point in the history
The ftrace event format parser handles the usual casts but not
the cast to pointers. Such casts have been introduced recently
with the module trace events and raise the following parsing
error:

	Fatal: bad op token )

This is because it considers the "*" character as a binary
operator. Make it then aware of casts to pointers.

Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <1250543271-8383-4-git-send-email-fweisbec@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Frederic Weisbecker authored and Ingo Molnar committed Aug 17, 2009
1 parent 9df37dd commit 3f9edc2
Showing 1 changed file with 27 additions and 4 deletions.
31 changes: 27 additions & 4 deletions tools/perf/util/trace-event-parse.c
Original file line number Diff line number Diff line change
Expand Up @@ -1462,18 +1462,34 @@ process_paren(struct event *event, struct print_arg *arg, char **tok)
{
struct print_arg *item_arg;
enum event_type type;
int ptr_cast = 0;
char *token;

type = process_arg(event, arg, &token);

if (type == EVENT_ERROR)
return EVENT_ERROR;

if (type == EVENT_OP)
type = process_op(event, arg, &token);
if (type == EVENT_OP) {
/* handle the ptr casts */
if (!strcmp(token, "*")) {
/*
* FIXME: should we zapp whitespaces before ')' ?
* (may require a peek_token_item())
*/
if (__peek_char() == ')') {
ptr_cast = 1;
free_token(token);
type = read_token_item(&token);
}
}
if (!ptr_cast) {
type = process_op(event, arg, &token);

if (type == EVENT_ERROR)
return EVENT_ERROR;
if (type == EVENT_ERROR)
return EVENT_ERROR;
}
}

if (test_type_token(type, token, EVENT_DELIM, (char *)")")) {
free_token(token);
Expand All @@ -1499,6 +1515,13 @@ process_paren(struct event *event, struct print_arg *arg, char **tok)
item_arg = malloc_or_die(sizeof(*item_arg));

arg->type = PRINT_TYPE;
if (ptr_cast) {
char *old = arg->atom.atom;

arg->atom.atom = malloc_or_die(strlen(old + 3));
sprintf(arg->atom.atom, "%s *", old);
free(old);
}
arg->typecast.type = arg->atom.atom;
arg->typecast.item = item_arg;
type = process_arg_token(event, item_arg, &token, type);
Expand Down

0 comments on commit 3f9edc2

Please sign in to comment.