perf trace: Add string/dynamic cases to format_flags
authorTom Zanussi <tzanussi@gmail.com>
Tue, 6 Oct 2009 06:09:52 +0000 (01:09 -0500)
committerIngo Molnar <mingo@elte.hu>
Tue, 6 Oct 2009 13:04:46 +0000 (15:04 +0200)
Needed for distinguishing string fields in event stream processing.

Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: rostedt@goodmis.org
Cc: lizf@cn.fujitsu.com
Cc: hch@infradead.org
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
LKML-Reference: <1254809398-8078-4-git-send-email-tzanussi@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
tools/perf/util/trace-event-parse.c
tools/perf/util/trace-event.h

index de3fc8bf8bfe8e19232dfe9dcfbcaa173a331fd1..6f851f98b5b4e6acfc7f18b5d0dfa9ea35f4553b 100644 (file)
@@ -721,6 +721,24 @@ static int event_read_id(void)
        return -1;
 }
 
+static int field_is_string(struct format_field *field)
+{
+       if ((field->flags & FIELD_IS_ARRAY) &&
+           (!strstr(field->type, "char") || !strstr(field->type, "u8") ||
+            !strstr(field->type, "s8")))
+               return 1;
+
+       return 0;
+}
+
+static int field_is_dynamic(struct format_field *field)
+{
+       if (!strcmp(field->type, "__data_loc"))
+               return 1;
+
+       return 0;
+}
+
 static int event_read_fields(struct event *event, struct format_field **fields)
 {
        struct format_field *field = NULL;
@@ -865,6 +883,12 @@ static int event_read_fields(struct event *event, struct format_field **fields)
                        free(brackets);
                }
 
+               if (field_is_string(field)) {
+                       field->flags |= FIELD_IS_STRING;
+                       if (field_is_dynamic(field))
+                               field->flags |= FIELD_IS_DYNAMIC;
+               }
+
                if (test_type_token(type, token,  EVENT_OP, (char *)";"))
                        goto fail;
                free_token(token);
index cb92978be300458dfe8c4e4c1559e5c8fb2723cb..5f59a39fb88bd5f58458d28f4423ef5da0c9c11f 100644 (file)
@@ -27,6 +27,8 @@ enum format_flags {
        FIELD_IS_ARRAY          = 1,
        FIELD_IS_POINTER        = 2,
        FIELD_IS_SIGNED         = 4,
+       FIELD_IS_STRING         = 8,
+       FIELD_IS_DYNAMIC        = 16,
 };
 
 struct format_field {