diff options
author | Josh Stone <jistone@redhat.com> | 2009-07-14 17:57:16 -0700 |
---|---|---|
committer | Josh Stone <jistone@redhat.com> | 2009-07-14 17:57:16 -0700 |
commit | d52761f89a1826b1cca29b1a63269eafe7197756 (patch) | |
tree | a5b5d178e1586fb1d4cdc2733089b8d6cb753be9 | |
parent | 9344d46f4186dbeaff984b1af6333d5c55221cd5 (diff) | |
download | systemtap-steved-d52761f89a1826b1cca29b1a63269eafe7197756.tar.gz systemtap-steved-d52761f89a1826b1cca29b1a63269eafe7197756.tar.xz systemtap-steved-d52761f89a1826b1cca29b1a63269eafe7197756.zip |
PR4166: Allow array-like indexing on pointers
* dwflpp.cxx (dwflpp::translate_components): let pointers get treated
the same as arrays, and add a final DIE dereference for array access.
* loc2c.c (c_translate_array): tolerate pointer types
* testsuite/systemtap.base/pointer_array.*: new test
-rw-r--r-- | dwflpp.cxx | 14 | ||||
-rw-r--r-- | loc2c.c | 3 | ||||
-rw-r--r-- | testsuite/systemtap.base/pointer_array.exp | 13 | ||||
-rw-r--r-- | testsuite/systemtap.base/pointer_array.stp | 16 |
4 files changed, 39 insertions, 7 deletions
@@ -1684,13 +1684,10 @@ dwflpp::translate_components(struct obstack *pool, break; case DW_TAG_pointer_type: - if (e->components[i].first == target_symbol::comp_literal_array_index) - throw semantic_error ("cannot index pointer", e->tok); - // XXX: of course, we should support this the same way C does, - // by explicit pointer arithmetic etc. PR4166. - c_translate_pointer (pool, 1, 0 /* PR9768*/, die, tail); - break; + if (e->components[i].first != target_symbol::comp_literal_array_index) + break; + /* else fall through as an array access */ case DW_TAG_array_type: if (e->components[i].first == target_symbol::comp_literal_array_index) @@ -1772,6 +1769,11 @@ dwflpp::translate_components(struct obstack *pool, if (dwarf_attr_integrate (die, DW_AT_type, attr_mem) == NULL) throw semantic_error ("cannot get type of field: " + string(dwarf_errmsg (-1)), e->tok); } + + /* For an array index, we need to dereference the final DIE */ + if (e->components.back().first == target_symbol::comp_literal_array_index) + die = dwarf_formref_die (attr_mem, die_mem); + return die; } @@ -1745,7 +1745,8 @@ c_translate_array (struct obstack *pool, int indent, Dwarf_Die *typedie, struct location **input, const char *idx, Dwarf_Word const_idx) { - assert (dwarf_tag (typedie) == DW_TAG_array_type); + assert (dwarf_tag (typedie) == DW_TAG_array_type || + dwarf_tag (typedie) == DW_TAG_pointer_type); ++indent; diff --git a/testsuite/systemtap.base/pointer_array.exp b/testsuite/systemtap.base/pointer_array.exp new file mode 100644 index 00000000..0e3af213 --- /dev/null +++ b/testsuite/systemtap.base/pointer_array.exp @@ -0,0 +1,13 @@ +set test "pointer_array" +set ::result_string {/bin/true +/ +b +i +n +/ +t +r +u +e +0} +stap_run2 $srcdir/$subdir/$test.stp -c/bin/true diff --git a/testsuite/systemtap.base/pointer_array.stp b/testsuite/systemtap.base/pointer_array.stp new file mode 100644 index 00000000..1d15ebf4 --- /dev/null +++ b/testsuite/systemtap.base/pointer_array.stp @@ -0,0 +1,16 @@ +probe syscall.execve +{ + if (pid() == target()) { + println(user_string($argv[0])) + printf("%c\n", $argv[0][0]) + printf("%c\n", $argv[0][1]) + printf("%c\n", $argv[0][2]) + printf("%c\n", $argv[0][3]) + printf("%c\n", $argv[0][4]) + printf("%c\n", $argv[0][5]) + printf("%c\n", $argv[0][6]) + printf("%c\n", $argv[0][7]) + printf("%c\n", $argv[0][8]) + println($argv[0][9]) + } +} |