diff options
Diffstat (limited to 'contrib/gdb/gdb/dwarf2-frame.h')
-rw-r--r-- | contrib/gdb/gdb/dwarf2-frame.h | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/contrib/gdb/gdb/dwarf2-frame.h b/contrib/gdb/gdb/dwarf2-frame.h new file mode 100644 index 0000000..1ae44b5 --- /dev/null +++ b/contrib/gdb/gdb/dwarf2-frame.h @@ -0,0 +1,98 @@ +/* Frame unwinder for frames with DWARF Call Frame Information. + + Copyright 2003, 2004 Free Software Foundation, Inc. + + Contributed by Mark Kettenis. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef DWARF2_FRAME_H +#define DWARF2_FRAME_H 1 + +struct gdbarch; +struct objfile; +struct frame_info; + +/* Register rule. */ + +enum dwarf2_frame_reg_rule +{ + /* Make certain that 0 maps onto the correct enum value; the + corresponding structure is being initialized using memset zero. + This indicates that CFI didn't provide any information at all + about a register, leaving how to obtain its value totally + unspecified. */ + DWARF2_FRAME_REG_UNSPECIFIED = 0, + + /* The term "undefined" comes from the DWARF2 CFI spec which this + code is moddeling; it indicates that the register's value is + "undefined". GCC uses the less formal term "unsaved". Its + definition is a combination of REG_UNDEFINED and REG_UNSPECIFIED. + The failure to differentiate the two helps explain a few problems + with the CFI generated by GCC. */ + DWARF2_FRAME_REG_UNDEFINED, + DWARF2_FRAME_REG_SAVED_OFFSET, + DWARF2_FRAME_REG_SAVED_REG, + DWARF2_FRAME_REG_SAVED_EXP, + DWARF2_FRAME_REG_SAME_VALUE, + + /* These aren't defined by the DWARF2 CFI specification, but are + used internally by GDB. */ + DWARF2_FRAME_REG_RA, /* Return Address. */ + DWARF2_FRAME_REG_CFA /* Call Frame Address. */ +}; + +/* Register state. */ + +struct dwarf2_frame_state_reg +{ + /* Each register save state can be described in terms of a CFA slot, + another register, or a location expression. */ + union { + LONGEST offset; + ULONGEST reg; + unsigned char *exp; + } loc; + ULONGEST exp_len; + enum dwarf2_frame_reg_rule how; +}; + +/* Set the architecture-specific register state initialization + function for GDBARCH to INIT_REG. */ + +extern void dwarf2_frame_set_init_reg (struct gdbarch *gdbarch, + void (*init_reg) (struct gdbarch *, int, + struct dwarf2_frame_state_reg *)); + +/* Return the frame unwind methods for the function that contains PC, + or NULL if it can't be handled by DWARF CFI frame unwinder. */ + +extern const struct frame_unwind * + dwarf2_frame_sniffer (struct frame_info *next_frame); + +/* Return the frame base methods for the function that contains PC, or + NULL if it can't be handled by the DWARF CFI frame unwinder. */ + +extern const struct frame_base * + dwarf2_frame_base_sniffer (struct frame_info *next_frame); + +/* Register the DWARF CFI for OBJFILE. */ + +void dwarf2_frame_build_info (struct objfile *objfile); + +#endif /* dwarf2-frame.h */ |