diff options
author | Mark Wielaard <mjw@redhat.com> | 2009-07-07 14:35:10 +0200 |
---|---|---|
committer | Mark Wielaard <mjw@redhat.com> | 2009-07-08 16:20:48 +0200 |
commit | 619d9aaf011c975159a79d34259083a596162bf1 (patch) | |
tree | 16599882e087d793b4ba69c602b46271204f0ec2 /loc2c.c | |
parent | 51305196f1d078849da1718bb6ccfbed5af182ed (diff) | |
download | systemtap-steved-619d9aaf011c975159a79d34259083a596162bf1.tar.gz systemtap-steved-619d9aaf011c975159a79d34259083a596162bf1.tar.xz systemtap-steved-619d9aaf011c975159a79d34259083a596162bf1.zip |
Add support for constant struct member field offsets.
* loc2c.h (c_translate_add_offset): New function prototype.
* loc2c.c (c_translate_add_offset): New function implementation.
* loc2c-test.c (handle_variable): Use c_translate_add_offset if appropriate.
* dwflpp.cxx (translate_location): Likewise.
Diffstat (limited to 'loc2c.c')
-rw-r--r-- | loc2c.c | 31 |
1 files changed, 31 insertions, 0 deletions
@@ -1669,7 +1669,38 @@ c_translate_pointer_store (struct obstack *pool, int indent, } +/* Translate a fragment to add an offset to the currently calculated + address of the input location. Used for struct fields. Only works + when location is already an actual base address. +*/ +void +c_translate_add_offset (struct obstack *pool, int indent, const char *comment, + Dwarf_Sword off, struct location **input) +{ + indent++; + if (comment == NULL || comment[0] == '\0') + comment = "field offset"; + switch ((*input)->type) + { + case loc_address: + obstack_printf (pool, "%*saddr += " SFORMAT "; // %s\n", + indent * 2 + 2, "", off, comment); + *input = (*input)->next = new_synthetic_loc (pool, *input, false); + break; + + case loc_register: + FAIL (*input, N_("cannot add offset of object in register")); + break; + case loc_noncontiguous: + FAIL (*input, N_("cannot add offset of noncontiguous object")); + break; + + default: + abort (); + break; + } +} /* Determine the element stride of an array type. */ static Dwarf_Word |