diff options
| -rw-r--r-- | tools/lib/traceevent/event-parse.c | 125 |
1 files changed, 83 insertions, 42 deletions
diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c index 16da20c552bc..ef2c65f91677 100644 --- a/tools/lib/traceevent/event-parse.c +++ b/tools/lib/traceevent/event-parse.c | |||
| @@ -1915,90 +1915,120 @@ eval_type(unsigned long long val, struct print_arg *arg, int pointer) | |||
| 1915 | return eval_type_str(val, arg->typecast.type, pointer); | 1915 | return eval_type_str(val, arg->typecast.type, pointer); |
| 1916 | } | 1916 | } |
| 1917 | 1917 | ||
| 1918 | static long long arg_num_eval(struct print_arg *arg) | 1918 | static int arg_num_eval(struct print_arg *arg, long long *val) |
| 1919 | { | 1919 | { |
| 1920 | long long left, right; | 1920 | long long left, right; |
| 1921 | long long val = 0; | 1921 | int ret = 1; |
| 1922 | 1922 | ||
| 1923 | switch (arg->type) { | 1923 | switch (arg->type) { |
| 1924 | case PRINT_ATOM: | 1924 | case PRINT_ATOM: |
| 1925 | val = strtoll(arg->atom.atom, NULL, 0); | 1925 | *val = strtoll(arg->atom.atom, NULL, 0); |
| 1926 | break; | 1926 | break; |
| 1927 | case PRINT_TYPE: | 1927 | case PRINT_TYPE: |
| 1928 | val = arg_num_eval(arg->typecast.item); | 1928 | ret = arg_num_eval(arg->typecast.item, val); |
| 1929 | val = eval_type(val, arg, 0); | 1929 | if (!ret) |
| 1930 | break; | ||
| 1931 | *val = eval_type(*val, arg, 0); | ||
| 1930 | break; | 1932 | break; |
| 1931 | case PRINT_OP: | 1933 | case PRINT_OP: |
| 1932 | switch (arg->op.op[0]) { | 1934 | switch (arg->op.op[0]) { |
| 1933 | case '|': | 1935 | case '|': |
| 1934 | left = arg_num_eval(arg->op.left); | 1936 | ret = arg_num_eval(arg->op.left, &left); |
| 1935 | right = arg_num_eval(arg->op.right); | 1937 | if (!ret) |
| 1938 | break; | ||
| 1939 | ret = arg_num_eval(arg->op.right, &right); | ||
| 1940 | if (!ret) | ||
| 1941 | break; | ||
| 1936 | if (arg->op.op[1]) | 1942 | if (arg->op.op[1]) |
| 1937 | val = left || right; | 1943 | *val = left || right; |
| 1938 | else | 1944 | else |
| 1939 | val = left | right; | 1945 | *val = left | right; |
| 1940 | break; | 1946 | break; |
| 1941 | case '&': | 1947 | case '&': |
| 1942 | left = arg_num_eval(arg->op.left); | 1948 | ret = arg_num_eval(arg->op.left, &left); |
| 1943 | right = arg_num_eval(arg->op.right); | 1949 | if (!ret) |
| 1950 | break; | ||
| 1951 | ret = arg_num_eval(arg->op.right, &right); | ||
| 1952 | if (!ret) | ||
| 1953 | break; | ||
| 1944 | if (arg->op.op[1]) | 1954 | if (arg->op.op[1]) |
| 1945 | val = left && right; | 1955 | *val = left && right; |
| 1946 | else | 1956 | else |
| 1947 | val = left & right; | 1957 | *val = left & right; |
| 1948 | break; | 1958 | break; |
| 1949 | case '<': | 1959 | case '<': |
| 1950 | left = arg_num_eval(arg->op.left); | 1960 | ret = arg_num_eval(arg->op.left, &left); |
| 1951 | right = arg_num_eval(arg->op.right); | 1961 | if (!ret) |
| 1962 | break; | ||
| 1963 | ret = arg_num_eval(arg->op.right, &right); | ||
| 1964 | if (!ret) | ||
| 1965 | break; | ||
| 1952 | switch (arg->op.op[1]) { | 1966 | switch (arg->op.op[1]) { |
| 1953 | case 0: | 1967 | case 0: |
| 1954 | val = left < right; | 1968 | *val = left < right; |
| 1955 | break; | 1969 | break; |
| 1956 | case '<': | 1970 | case '<': |
| 1957 | val = left << right; | 1971 | *val = left << right; |
| 1958 | break; | 1972 | break; |
| 1959 | case '=': | 1973 | case '=': |
| 1960 | val = left <= right; | 1974 | *val = left <= right; |
| 1961 | break; | 1975 | break; |
| 1962 | default: | 1976 | default: |
| 1963 | die("unknown op '%s'", arg->op.op); | 1977 | do_warning("unknown op '%s'", arg->op.op); |
| 1978 | ret = 0; | ||
| 1964 | } | 1979 | } |
| 1965 | break; | 1980 | break; |
| 1966 | case '>': | 1981 | case '>': |
| 1967 | left = arg_num_eval(arg->op.left); | 1982 | ret = arg_num_eval(arg->op.left, &left); |
| 1968 | right = arg_num_eval(arg->op.right); | 1983 | if (!ret) |
| 1984 | break; | ||
| 1985 | ret = arg_num_eval(arg->op.right, &right); | ||
| 1986 | if (!ret) | ||
| 1987 | break; | ||
| 1969 | switch (arg->op.op[1]) { | 1988 | switch (arg->op.op[1]) { |
| 1970 | case 0: | 1989 | case 0: |
| 1971 | val = left > right; | 1990 | *val = left > right; |
| 1972 | break; | 1991 | break; |
| 1973 | case '>': | 1992 | case '>': |
| 1974 | val = left >> right; | 1993 | *val = left >> right; |
| 1975 | break; | 1994 | break; |
| 1976 | case '=': | 1995 | case '=': |
| 1977 | val = left >= right; | 1996 | *val = left >= right; |
| 1978 | break; | 1997 | break; |
| 1979 | default: | 1998 | default: |
| 1980 | die("unknown op '%s'", arg->op.op); | 1999 | do_warning("unknown op '%s'", arg->op.op); |
| 2000 | ret = 0; | ||
| 1981 | } | 2001 | } |
| 1982 | break; | 2002 | break; |
| 1983 | case '=': | 2003 | case '=': |
| 1984 | left = arg_num_eval(arg->op.left); | 2004 | ret = arg_num_eval(arg->op.left, &left); |
| 1985 | right = arg_num_eval(arg->op.right); | 2005 | if (!ret) |
| 1986 | 2006 | break; | |
| 1987 | if (arg->op.op[1] != '=') | 2007 | ret = arg_num_eval(arg->op.right, &right); |
| 1988 | die("unknown op '%s'", arg->op.op); | 2008 | if (!ret) |
| 2009 | break; | ||
| 1989 | 2010 | ||
| 1990 | val = left == right; | 2011 | if (arg->op.op[1] != '=') { |
| 2012 | do_warning("unknown op '%s'", arg->op.op); | ||
| 2013 | ret = 0; | ||
| 2014 | } else | ||
| 2015 | *val = left == right; | ||
| 1991 | break; | 2016 | break; |
| 1992 | case '!': | 2017 | case '!': |
| 1993 | left = arg_num_eval(arg->op.left); | 2018 | ret = arg_num_eval(arg->op.left, &left); |
| 1994 | right = arg_num_eval(arg->op.right); | 2019 | if (!ret) |
| 2020 | break; | ||
| 2021 | ret = arg_num_eval(arg->op.right, &right); | ||
| 2022 | if (!ret) | ||
| 2023 | break; | ||
| 1995 | 2024 | ||
| 1996 | switch (arg->op.op[1]) { | 2025 | switch (arg->op.op[1]) { |
| 1997 | case '=': | 2026 | case '=': |
| 1998 | val = left != right; | 2027 | *val = left != right; |
| 1999 | break; | 2028 | break; |
| 2000 | default: | 2029 | default: |
| 2001 | die("unknown op '%s'", arg->op.op); | 2030 | do_warning("unknown op '%s'", arg->op.op); |
| 2031 | ret = 0; | ||
| 2002 | } | 2032 | } |
| 2003 | break; | 2033 | break; |
| 2004 | case '-': | 2034 | case '-': |
| @@ -2006,12 +2036,17 @@ static long long arg_num_eval(struct print_arg *arg) | |||
| 2006 | if (arg->op.left->type == PRINT_NULL) | 2036 | if (arg->op.left->type == PRINT_NULL) |
| 2007 | left = 0; | 2037 | left = 0; |
| 2008 | else | 2038 | else |
| 2009 | left = arg_num_eval(arg->op.left); | 2039 | ret = arg_num_eval(arg->op.left, &left); |
| 2010 | right = arg_num_eval(arg->op.right); | 2040 | if (!ret) |
| 2011 | val = left - right; | 2041 | break; |
