Ulrich Drepper | b08d5a8 | 2005-07-26 05:00:05 +0000 | [diff] [blame^] | 1 | #include <libdw.h> |
| 2 | |
| 3 | struct obstack; /* Use <obstack.h> */ |
| 4 | struct location; /* Opaque */ |
| 5 | |
| 6 | |
| 7 | /* Translate a C fragment for the location expression, using *INPUT |
| 8 | as the starting location, begin from scratch if *INPUT is null. |
| 9 | If DW_OP_fbreg is used, it may have a subfragment computing from |
| 10 | the FB_ATTR location expression. |
| 11 | |
| 12 | On errors, exit and never return (XXX ?). On success, return the |
| 13 | first fragment created, which is also chained onto (*INPUT)->next. |
| 14 | *INPUT is then updated with the new tail of that chain. |
| 15 | *USED_DEREF is set to true iff the "deref" runtime operation |
| 16 | was used, otherwise it is not modified. */ |
| 17 | struct location *c_translate_location (struct obstack *, int indent, |
| 18 | Dwarf_Addr bias, |
| 19 | Dwarf_Attribute *loc_attr, |
| 20 | Dwarf_Addr address, |
| 21 | struct location **input, |
| 22 | Dwarf_Attribute *fb_attr); |
| 23 | |
| 24 | /* Translate a fragment to dereference the given pointer type, |
| 25 | where *INPUT is the location of the pointer with that type. */ |
| 26 | void c_translate_pointer (struct obstack *pool, int indent, |
| 27 | Dwarf_Addr dwbias, Dwarf_Die *typedie, |
| 28 | struct location **input); |
| 29 | |
| 30 | /* Translate a fragment to index an array (turning the location |
| 31 | of the array into the location of an element). If IDX is non-null, |
| 32 | it's a string of C code to emit in the fragment as the array index. |
| 33 | If the index is a known constant, IDX should be null and CONST_IDX |
| 34 | is used instead (this case can handle local arrays in registers). */ |
| 35 | void c_translate_array (struct obstack *pool, int indent, |
| 36 | Dwarf_Addr dwbias, Dwarf_Die *typedie, |
| 37 | struct location **input, |
| 38 | const char *idx, Dwarf_Word const_idx); |
| 39 | |
| 40 | /* Translate a fragment to compute the address of the input location |
| 41 | and assign it to the variable TARGET. This doesn't really do anything |
| 42 | (it always emits "TARGET = addr;"), but it will barf if the location |
| 43 | is a register or noncontiguous object. */ |
| 44 | void c_translate_addressof (struct obstack *pool, int indent, |
| 45 | Dwarf_Addr dwbias, Dwarf_Die *die, |
| 46 | Dwarf_Attribute *typeattr, |
| 47 | struct location **input, const char *target); |
| 48 | |
| 49 | /* Translate a fragment to fetch the value of variable or member DIE |
| 50 | at the *INPUT location and store it in variable TARGET. |
| 51 | This handles base integer types and bit fields. */ |
| 52 | void c_translate_fetch (struct obstack *pool, int indent, |
| 53 | Dwarf_Addr dwbias __attribute__ ((unused)), |
| 54 | Dwarf_Die *die, Dwarf_Attribute *typeattr, |
| 55 | struct location **input, const char *target); |
| 56 | |
| 57 | /* Emit the C fragment built up at LOC (i.e., the return value from the |
| 58 | first c_translate_location call made). INDENT should match that |
| 59 | passed to c_translate_* previously. |
| 60 | |
| 61 | Writes complete lines of C99, code forming a complete C block, to STREAM. |
| 62 | Return value is true iff that code uses the `deref' runtime macros. */ |
| 63 | bool c_emit_location (FILE *stream, struct location *loc, int indent); |