|
@@ -1606,6 +1606,24 @@ process_arg(struct event_format *event, struct print_arg *arg, char **tok)
|
|
|
static enum event_type
|
|
|
process_op(struct event_format *event, struct print_arg *arg, char **tok);
|
|
|
|
|
|
+/*
|
|
|
+ * For __print_symbolic() and __print_flags, we need to completely
|
|
|
+ * evaluate the first argument, which defines what to print next.
|
|
|
+ */
|
|
|
+static enum event_type
|
|
|
+process_field_arg(struct event_format *event, struct print_arg *arg, char **tok)
|
|
|
+{
|
|
|
+ enum event_type type;
|
|
|
+
|
|
|
+ type = process_arg(event, arg, tok);
|
|
|
+
|
|
|
+ while (type == EVENT_OP) {
|
|
|
+ type = process_op(event, arg, tok);
|
|
|
+ }
|
|
|
+
|
|
|
+ return type;
|
|
|
+}
|
|
|
+
|
|
|
static enum event_type
|
|
|
process_cond(struct event_format *event, struct print_arg *top, char **tok)
|
|
|
{
|
|
@@ -2371,7 +2389,7 @@ process_flags(struct event_format *event, struct print_arg *arg, char **tok)
|
|
|
goto out_free;
|
|
|
}
|
|
|
|
|
|
- type = process_arg(event, field, &token);
|
|
|
+ type = process_field_arg(event, field, &token);
|
|
|
|
|
|
/* Handle operations in the first argument */
|
|
|
while (type == EVENT_OP)
|
|
@@ -2424,7 +2442,8 @@ process_symbols(struct event_format *event, struct print_arg *arg, char **tok)
|
|
|
goto out_free;
|
|
|
}
|
|
|
|
|
|
- type = process_arg(event, field, &token);
|
|
|
+ type = process_field_arg(event, field, &token);
|
|
|
+
|
|
|
if (test_type_token(type, token, EVENT_DELIM, ","))
|
|
|
goto out_free_field;
|
|
|
|
|
@@ -3446,7 +3465,7 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg
|
|
|
* is in the bottom half of the 32 bit field.
|
|
|
*/
|
|
|
offset &= 0xffff;
|
|
|
- val = (unsigned long long)(data + offset);
|
|
|
+ val = (unsigned long long)((unsigned long)data + offset);
|
|
|
break;
|
|
|
default: /* not sure what to do there */
|
|
|
return 0;
|