OLD | NEW |
1 /* SystemTap probe support for GDB. | 1 /* SystemTap probe support for GDB. |
2 | 2 |
3 Copyright (C) 2012 Free Software Foundation, Inc. | 3 Copyright (C) 2012-2013 Free Software Foundation, Inc. |
4 | 4 |
5 This file is part of GDB. | 5 This file is part of GDB. |
6 | 6 |
7 This program is free software; you can redistribute it and/or modify | 7 This program is free software; you can redistribute it and/or modify |
8 it under the terms of the GNU General Public License as published by | 8 it under the terms of the GNU General Public License as published by |
9 the Free Software Foundation; either version 3 of the License, or | 9 the Free Software Foundation; either version 3 of the License, or |
10 (at your option) any later version. | 10 (at your option) any later version. |
11 | 11 |
12 This program is distributed in the hope that it will be useful, | 12 This program is distributed in the hope that it will be useful, |
13 but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 | 46 |
47 #define STAP_BASE_SECTION_NAME ".stapsdt.base" | 47 #define STAP_BASE_SECTION_NAME ".stapsdt.base" |
48 | 48 |
49 /* Forward declaration. */ | 49 /* Forward declaration. */ |
50 | 50 |
51 static const struct probe_ops stap_probe_ops; | 51 static const struct probe_ops stap_probe_ops; |
52 | 52 |
53 /* Should we display debug information for the probe's argument expression | 53 /* Should we display debug information for the probe's argument expression |
54 parsing? */ | 54 parsing? */ |
55 | 55 |
56 static int stap_expression_debug = 0; | 56 static unsigned int stap_expression_debug = 0; |
57 | 57 |
58 /* The various possibilities of bitness defined for a probe's argument. | 58 /* The various possibilities of bitness defined for a probe's argument. |
59 | 59 |
60 The relationship is: | 60 The relationship is: |
61 | 61 |
62 - STAP_ARG_BITNESS_UNDEFINED: The user hasn't specified the bitness. | 62 - STAP_ARG_BITNESS_UNDEFINED: The user hasn't specified the bitness. |
63 - STAP_ARG_BITNESS_32BIT_UNSIGNED: argument string starts with `4@'. | 63 - STAP_ARG_BITNESS_32BIT_UNSIGNED: argument string starts with `4@'. |
64 - STAP_ARG_BITNESS_32BIT_SIGNED: argument string starts with `-4@'. | 64 - STAP_ARG_BITNESS_32BIT_SIGNED: argument string starts with `-4@'. |
65 - STAP_ARG_BITNESS_64BIT_UNSIGNED: argument string starts with `8@'. | 65 - STAP_ARG_BITNESS_64BIT_UNSIGNED: argument string starts with `8@'. |
66 - STAP_ARG_BITNESS_64BIT_SIGNED: argument string starts with `-8@'. */ | 66 - STAP_ARG_BITNESS_64BIT_SIGNED: argument string starts with `-8@'. */ |
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
415 if (*p->arg == '-') | 415 if (*p->arg == '-') |
416 { | 416 { |
417 got_minus = 1; | 417 got_minus = 1; |
418 ++p->arg; | 418 ++p->arg; |
419 } | 419 } |
420 | 420 |
421 if (isdigit (*p->arg)) | 421 if (isdigit (*p->arg)) |
422 { | 422 { |
423 /* The value of the displacement. */ | 423 /* The value of the displacement. */ |
424 long displacement; | 424 long displacement; |
| 425 char *endp; |
425 | 426 |
426 disp_p = 1; | 427 disp_p = 1; |
427 displacement = strtol (p->arg, (char **) &p->arg, 10); | 428 displacement = strtol (p->arg, &endp, 10); |
| 429 p->arg = endp; |
428 | 430 |
429 /* Generating the expression for the displacement. */ | 431 /* Generating the expression for the displacement. */ |
430 write_exp_elt_opcode (OP_LONG); | 432 write_exp_elt_opcode (OP_LONG); |
431 write_exp_elt_type (builtin_type (gdbarch)->builtin_long); | 433 write_exp_elt_type (builtin_type (gdbarch)->builtin_long); |
432 write_exp_elt_longcst (displacement); | 434 write_exp_elt_longcst (displacement); |
433 write_exp_elt_opcode (OP_LONG); | 435 write_exp_elt_opcode (OP_LONG); |
434 if (got_minus) | 436 if (got_minus) |
435 write_exp_elt_opcode (UNOP_NEG); | 437 write_exp_elt_opcode (UNOP_NEG); |
436 } | 438 } |
437 | 439 |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
591 - numeric literal; | 593 - numeric literal; |
592 - number (from register displacement) | 594 - number (from register displacement) |
593 - subexpression (beginning with `(') | 595 - subexpression (beginning with `(') |
594 | 596 |
595 We handle the register displacement here, and the other cases | 597 We handle the register displacement here, and the other cases |
596 recursively. */ | 598 recursively. */ |
597 if (p->inside_paren_p) | 599 if (p->inside_paren_p) |
598 tmp = skip_spaces_const (tmp); | 600 tmp = skip_spaces_const (tmp); |
599 | 601 |
600 if (isdigit (*tmp)) | 602 if (isdigit (*tmp)) |
601 » number = strtol (tmp, (char **) &tmp, 10); | 603 » { |
| 604 » char *endp; |
| 605 |
| 606 » number = strtol (tmp, &endp, 10); |
| 607 » tmp = endp; |
| 608 » } |
602 | 609 |
603 if (!reg_ind_prefix | 610 if (!reg_ind_prefix |
604 || strncmp (tmp, reg_ind_prefix, reg_ind_prefix_len) != 0) | 611 || strncmp (tmp, reg_ind_prefix, reg_ind_prefix_len) != 0) |
605 { | 612 { |
606 /* This is not a displacement. We skip the operator, and deal | 613 /* This is not a displacement. We skip the operator, and deal |
607 with it later. */ | 614 with it later. */ |
608 ++p->arg; | 615 ++p->arg; |
609 stap_parse_argument_conditionally (p); | 616 stap_parse_argument_conditionally (p); |
610 if (c == '-') | 617 if (c == '-') |
611 write_exp_elt_opcode (UNOP_NEG); | 618 write_exp_elt_opcode (UNOP_NEG); |
612 else if (c == '~') | 619 else if (c == '~') |
613 write_exp_elt_opcode (UNOP_COMPLEMENT); | 620 write_exp_elt_opcode (UNOP_COMPLEMENT); |
614 } | 621 } |
615 else | 622 else |
616 { | 623 { |
617 /* If we are here, it means it is a displacement. The only | 624 /* If we are here, it means it is a displacement. The only |
618 operations allowed here are `-' and `+'. */ | 625 operations allowed here are `-' and `+'. */ |
619 if (c == '~') | 626 if (c == '~') |
620 error (_("Invalid operator `%c' for register displacement " | 627 error (_("Invalid operator `%c' for register displacement " |
621 "on expression `%s'."), c, p->saved_arg); | 628 "on expression `%s'."), c, p->saved_arg); |
622 | 629 |
623 stap_parse_register_operand (p); | 630 stap_parse_register_operand (p); |
624 } | 631 } |
625 } | 632 } |
626 else if (isdigit (*p->arg)) | 633 else if (isdigit (*p->arg)) |
627 { | 634 { |
628 /* A temporary variable, needed for lookahead. */ | 635 /* A temporary variable, needed for lookahead. */ |
629 const char *tmp = p->arg; | 636 const char *tmp = p->arg; |
| 637 char *endp; |
630 long number; | 638 long number; |
631 | 639 |
632 /* We can be dealing with a numeric constant (if `const_prefix' is | 640 /* We can be dealing with a numeric constant (if `const_prefix' is |
633 NULL), or with a register displacement. */ | 641 NULL), or with a register displacement. */ |
634 number = strtol (tmp, (char **) &tmp, 10); | 642 number = strtol (tmp, &endp, 10); |
| 643 tmp = endp; |
635 | 644 |
636 if (p->inside_paren_p) | 645 if (p->inside_paren_p) |
637 tmp = skip_spaces_const (tmp); | 646 tmp = skip_spaces_const (tmp); |
638 if (!const_prefix && reg_ind_prefix | 647 if (!const_prefix && reg_ind_prefix |
639 && strncmp (tmp, reg_ind_prefix, reg_ind_prefix_len) != 0) | 648 && strncmp (tmp, reg_ind_prefix, reg_ind_prefix_len) != 0) |
640 { | 649 { |
641 /* We are dealing with a numeric constant. */ | 650 /* We are dealing with a numeric constant. */ |
642 write_exp_elt_opcode (OP_LONG); | 651 write_exp_elt_opcode (OP_LONG); |
643 write_exp_elt_type (builtin_type (gdbarch)->builtin_long); | 652 write_exp_elt_type (builtin_type (gdbarch)->builtin_long); |
644 write_exp_elt_longcst (number); | 653 write_exp_elt_longcst (number); |
(...skipping 15 matching lines...) Expand all Loading... |
660 stap_parse_register_operand (p); | 669 stap_parse_register_operand (p); |
661 else | 670 else |
662 error (_("Unknown numeric token on expression `%s'."), | 671 error (_("Unknown numeric token on expression `%s'."), |
663 p->saved_arg); | 672 p->saved_arg); |
664 } | 673 } |
665 else if (const_prefix | 674 else if (const_prefix |
666 && strncmp (p->arg, const_prefix, const_prefix_len) == 0) | 675 && strncmp (p->arg, const_prefix, const_prefix_len) == 0) |
667 { | 676 { |
668 /* We are dealing with a numeric constant. */ | 677 /* We are dealing with a numeric constant. */ |
669 long number; | 678 long number; |
| 679 char *endp; |
670 | 680 |
671 p->arg += const_prefix_len; | 681 p->arg += const_prefix_len; |
672 number = strtol (p->arg, (char **) &p->arg, 10); | 682 number = strtol (p->arg, &endp, 10); |
| 683 p->arg = endp; |
673 | 684 |
674 write_exp_elt_opcode (OP_LONG); | 685 write_exp_elt_opcode (OP_LONG); |
675 write_exp_elt_type (builtin_type (gdbarch)->builtin_long); | 686 write_exp_elt_type (builtin_type (gdbarch)->builtin_long); |
676 write_exp_elt_longcst (number); | 687 write_exp_elt_longcst (number); |
677 write_exp_elt_opcode (OP_LONG); | 688 write_exp_elt_opcode (OP_LONG); |
678 | 689 |
679 if (const_suffix) | 690 if (const_suffix) |
680 { | 691 { |
681 if (strncmp (p->arg, const_suffix, const_suffix_len) == 0) | 692 if (strncmp (p->arg, const_suffix, const_suffix_len) == 0) |
682 p->arg += const_suffix_len; | 693 p->arg += const_suffix_len; |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
896 | 907 |
897 Consider the following argument string (x86 syntax): | 908 Consider the following argument string (x86 syntax): |
898 | 909 |
899 `4@%eax 4@$10' | 910 `4@%eax 4@$10' |
900 | 911 |
901 We have two arguments, `%eax' and `$10', both with 32-bit unsigned bitness. | 912 We have two arguments, `%eax' and `$10', both with 32-bit unsigned bitness. |
902 This function basically handles them, properly filling some structures with | 913 This function basically handles them, properly filling some structures with |
903 this information. */ | 914 this information. */ |
904 | 915 |
905 static void | 916 static void |
906 stap_parse_probe_arguments (struct stap_probe *probe, struct objfile *objfile) | 917 stap_parse_probe_arguments (struct stap_probe *probe) |
907 { | 918 { |
908 const char *cur; | 919 const char *cur; |
909 struct gdbarch *gdbarch = get_objfile_arch (objfile); | 920 struct gdbarch *gdbarch = get_objfile_arch (probe->p.objfile); |
910 | 921 |
911 gdb_assert (!probe->args_parsed); | 922 gdb_assert (!probe->args_parsed); |
912 cur = probe->args_u.text; | 923 cur = probe->args_u.text; |
913 probe->args_parsed = 1; | 924 probe->args_parsed = 1; |
914 probe->args_u.vec = NULL; | 925 probe->args_u.vec = NULL; |
915 | 926 |
916 if (!cur || !*cur || *cur == ':') | 927 if (!cur || !*cur || *cur == ':') |
917 return; | 928 return; |
918 | 929 |
919 while (*cur) | 930 while (*cur) |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
984 cur = skip_spaces_const (cur); | 995 cur = skip_spaces_const (cur); |
985 | 996 |
986 VEC_safe_push (stap_probe_arg_s, probe->args_u.vec, &arg); | 997 VEC_safe_push (stap_probe_arg_s, probe->args_u.vec, &arg); |
987 } | 998 } |
988 } | 999 } |
989 | 1000 |
990 /* Given PROBE, returns the number of arguments present in that probe's | 1001 /* Given PROBE, returns the number of arguments present in that probe's |
991 argument string. */ | 1002 argument string. */ |
992 | 1003 |
993 static unsigned | 1004 static unsigned |
994 stap_get_probe_argument_count (struct probe *probe_generic, | 1005 stap_get_probe_argument_count (struct probe *probe_generic) |
995 » » » struct objfile *objfile) | |
996 { | 1006 { |
997 struct stap_probe *probe = (struct stap_probe *) probe_generic; | 1007 struct stap_probe *probe = (struct stap_probe *) probe_generic; |
998 | 1008 |
999 gdb_assert (probe_generic->pops == &stap_probe_ops); | 1009 gdb_assert (probe_generic->pops == &stap_probe_ops); |
1000 | 1010 |
1001 if (!probe->args_parsed) | 1011 if (!probe->args_parsed) |
1002 stap_parse_probe_arguments (probe, objfile); | 1012 { |
| 1013 if (probe_generic->pops->can_evaluate_probe_arguments (probe_generic)) |
| 1014 » stap_parse_probe_arguments (probe); |
| 1015 else |
| 1016 » { |
| 1017 » static int have_warned_stap_incomplete = 0; |
| 1018 |
| 1019 » if (!have_warned_stap_incomplete) |
| 1020 » { |
| 1021 » warning (_( |
| 1022 "The SystemTap SDT probe support is not fully implemented on this target;\n" |
| 1023 "you will not be able to inspect the arguments of the probes.\n" |
| 1024 "Please report a bug against GDB requesting a port to this target.")); |
| 1025 » have_warned_stap_incomplete = 1; |
| 1026 » } |
| 1027 |
| 1028 » /* Marking the arguments as "already parsed". */ |
| 1029 » probe->args_u.vec = NULL; |
| 1030 » probe->args_parsed = 1; |
| 1031 » } |
| 1032 } |
1003 | 1033 |
1004 gdb_assert (probe->args_parsed); | 1034 gdb_assert (probe->args_parsed); |
1005 return VEC_length (stap_probe_arg_s, probe->args_u.vec); | 1035 return VEC_length (stap_probe_arg_s, probe->args_u.vec); |
1006 } | 1036 } |
1007 | 1037 |
1008 /* Return 1 if OP is a valid operator inside a probe argument, or zero | 1038 /* Return 1 if OP is a valid operator inside a probe argument, or zero |
1009 otherwise. */ | 1039 otherwise. */ |
1010 | 1040 |
1011 static int | 1041 static int |
1012 stap_is_operator (const char *op) | 1042 stap_is_operator (const char *op) |
(...skipping 22 matching lines...) Expand all Loading... |
1035 | 1065 |
1036 default: | 1066 default: |
1037 /* We didn't find any operator. */ | 1067 /* We didn't find any operator. */ |
1038 ret = 0; | 1068 ret = 0; |
1039 } | 1069 } |
1040 | 1070 |
1041 return ret; | 1071 return ret; |
1042 } | 1072 } |
1043 | 1073 |
1044 static struct stap_probe_arg * | 1074 static struct stap_probe_arg * |
1045 stap_get_arg (struct stap_probe *probe, struct objfile *objfile, unsigned n) | 1075 stap_get_arg (struct stap_probe *probe, unsigned n) |
1046 { | 1076 { |
1047 if (!probe->args_parsed) | 1077 if (!probe->args_parsed) |
1048 stap_parse_probe_arguments (probe, objfile); | 1078 stap_parse_probe_arguments (probe); |
1049 | 1079 |
1050 return VEC_index (stap_probe_arg_s, probe->args_u.vec, n); | 1080 return VEC_index (stap_probe_arg_s, probe->args_u.vec, n); |
1051 } | 1081 } |
1052 | 1082 |
| 1083 /* Implement the `can_evaluate_probe_arguments' method of probe_ops. */ |
| 1084 |
| 1085 static int |
| 1086 stap_can_evaluate_probe_arguments (struct probe *probe_generic) |
| 1087 { |
| 1088 struct stap_probe *stap_probe = (struct stap_probe *) probe_generic; |
| 1089 struct gdbarch *gdbarch = get_objfile_arch (stap_probe->p.objfile); |
| 1090 |
| 1091 /* For SystemTap probes, we have to guarantee that the method |
| 1092 stap_is_single_operand is defined on gdbarch. If it is not, then it |
| 1093 means that argument evaluation is not implemented on this target. */ |
| 1094 return gdbarch_stap_is_single_operand_p (gdbarch); |
| 1095 } |
| 1096 |
1053 /* Evaluate the probe's argument N (indexed from 0), returning a value | 1097 /* Evaluate the probe's argument N (indexed from 0), returning a value |
1054 corresponding to it. Assertion is thrown if N does not exist. */ | 1098 corresponding to it. Assertion is thrown if N does not exist. */ |
1055 | 1099 |
1056 static struct value * | 1100 static struct value * |
1057 stap_evaluate_probe_argument (struct probe *probe_generic, | 1101 stap_evaluate_probe_argument (struct probe *probe_generic, unsigned n) |
1058 » » » struct objfile *objfile, unsigned n) | |
1059 { | 1102 { |
1060 struct stap_probe *stap_probe = (struct stap_probe *) probe_generic; | 1103 struct stap_probe *stap_probe = (struct stap_probe *) probe_generic; |
1061 struct stap_probe_arg *arg; | 1104 struct stap_probe_arg *arg; |
1062 int pos = 0; | 1105 int pos = 0; |
1063 | 1106 |
1064 gdb_assert (probe_generic->pops == &stap_probe_ops); | 1107 gdb_assert (probe_generic->pops == &stap_probe_ops); |
1065 | 1108 |
1066 arg = stap_get_arg (stap_probe, objfile, n); | 1109 arg = stap_get_arg (stap_probe, n); |
1067 return evaluate_subexp_standard (arg->atype, arg->aexpr, &pos, EVAL_NORMAL); | 1110 return evaluate_subexp_standard (arg->atype, arg->aexpr, &pos, EVAL_NORMAL); |
1068 } | 1111 } |
1069 | 1112 |
1070 /* Compile the probe's argument N (indexed from 0) to agent expression. | 1113 /* Compile the probe's argument N (indexed from 0) to agent expression. |
1071 Assertion is thrown if N does not exist. */ | 1114 Assertion is thrown if N does not exist. */ |
1072 | 1115 |
1073 static void | 1116 static void |
1074 stap_compile_to_ax (struct probe *probe_generic, struct objfile *objfile, | 1117 stap_compile_to_ax (struct probe *probe_generic, struct agent_expr *expr, |
1075 » » struct agent_expr *expr, struct axs_value *value, | 1118 » » struct axs_value *value, unsigned n) |
1076 » » unsigned n) | |
1077 { | 1119 { |
1078 struct stap_probe *stap_probe = (struct stap_probe *) probe_generic; | 1120 struct stap_probe *stap_probe = (struct stap_probe *) probe_generic; |
1079 struct stap_probe_arg *arg; | 1121 struct stap_probe_arg *arg; |
1080 union exp_element *pc; | 1122 union exp_element *pc; |
1081 | 1123 |
1082 gdb_assert (probe_generic->pops == &stap_probe_ops); | 1124 gdb_assert (probe_generic->pops == &stap_probe_ops); |
1083 | 1125 |
1084 arg = stap_get_arg (stap_probe, objfile, n); | 1126 arg = stap_get_arg (stap_probe, n); |
1085 | 1127 |
1086 pc = arg->aexpr->elts; | 1128 pc = arg->aexpr->elts; |
1087 gen_expr (arg->aexpr, &pc, expr, value); | 1129 gen_expr (arg->aexpr, &pc, expr, value); |
1088 | 1130 |
1089 require_rvalue (expr, value); | 1131 require_rvalue (expr, value); |
1090 value->type = arg->atype; | 1132 value->type = arg->atype; |
1091 } | 1133 } |
1092 | 1134 |
1093 /* Destroy (free) the data related to PROBE. PROBE memory itself is not feed | 1135 /* Destroy (free) the data related to PROBE. PROBE memory itself is not feed |
1094 as it is allocated from OBJFILE_OBSTACK. */ | 1136 as it is allocated from OBJFILE_OBSTACK. */ |
(...skipping 19 matching lines...) Expand all Loading... |
1114 | 1156 |
1115 | 1157 |
1116 | 1158 |
1117 | 1159 |
1118 /* This is called to compute the value of one of the $_probe_arg* | 1160 /* This is called to compute the value of one of the $_probe_arg* |
1119 convenience variables. */ | 1161 convenience variables. */ |
1120 | 1162 |
1121 static struct value * | 1163 static struct value * |
1122 compute_probe_arg (struct gdbarch *arch, struct internalvar *ivar, | 1164 compute_probe_arg (struct gdbarch *arch, struct internalvar *ivar, |
1123 void *data) | 1165 void *data) |
error: old chunk mismatch |
None
OLD | NEW |