aboutsummaryrefslogtreecommitdiff
path: root/gas/config/obj-coff-seh.h
diff options
context:
space:
mode:
authorKai Tietz <kai.tietz@onevision.com>2009-08-17 11:46:29 +0000
committerKai Tietz <kai.tietz@onevision.com>2009-08-17 11:46:29 +0000
commit987499b2425ad953bf823e03b75e45381a4e0b4a (patch)
treedb8631de611c01ea1fc6a7b444fe6c0c46676efa /gas/config/obj-coff-seh.h
parentf3d2b04b5f22ad48ed6e62b207ba759694569935 (diff)
downloadgdb-987499b2425ad953bf823e03b75e45381a4e0b4a.zip
gdb-987499b2425ad953bf823e03b75e45381a4e0b4a.tar.gz
gdb-987499b2425ad953bf823e03b75e45381a4e0b4a.tar.bz2
Add missed files.
Diffstat (limited to 'gas/config/obj-coff-seh.h')
-rw-r--r--gas/config/obj-coff-seh.h161
1 files changed, 161 insertions, 0 deletions
diff --git a/gas/config/obj-coff-seh.h b/gas/config/obj-coff-seh.h
new file mode 100644
index 0000000..42b00f5
--- /dev/null
+++ b/gas/config/obj-coff-seh.h
@@ -0,0 +1,161 @@
+/* Short overview:
+ There are at the moment three different function entry formats preset.
+ The first is the MIPS one. The second version
+ is for ARM, PPC, SH3, and SH4 mainly for Windows CE.
+ The third is the IA64 and x64 version. Note, the IA64 isn't implemented yet,
+ but to find information about it, please see specification about IA64 on
+ http://download.intel.com/design/Itanium/Downloads/245358.pdf file.
+
+ The first version has just entries in the pdata section: BeginAddress,
+ EndAddress, ExceptionHandler, HandlerData, and PrologueEndAddress. Each
+ value is a pointer to the corresponding data and has size of 4 bytes.
+
+ The second variant has the following entries in the pdata section.
+ BeginAddress, PrologueLength (8 bits), EndAddress (22 bits),
+ Use-32-bit-instruction (1 bit), and Exception-Handler-Exists (1 bit).
+ If the FunctionLength is zero, or the Exception-Handler-Exists bit
+ is true, a PDATA_EH block is placed directly before function entry.
+
+ The third version has a function entry block of BeginAddress (RVA),
+ EndAddress (RVA), and UnwindData (RVA). The description of the
+ prologue, excepetion-handler, and additional SEH data is stored
+ within the UNWIND_DATA field in the xdata section.
+
+ The pseudos:
+ .seh_proc <fct_name>
+ .seh_endprologue
+ .seh_handler <handler>[,<handler-data>]]
+ .seh_eh
+ .seh_32/.seh_no32
+ .seh_endproc
+ .seh_setframe <reg>,<offset>
+ .seh_stackalloc
+ .seh_pushreg
+ .seh_savereg
+ .seh_savemm
+ .seh_savexmm
+ .seh_pushframe
+ .seh_scope
+ */
+
+/* architecture specific pdata/xdata handling. */
+#define SEH_CMDS \
+ {"seh_proc", obj_coff_seh_proc, 0}, \
+ {"seh_endproc", obj_coff_seh_endproc, 0}, \
+ {"seh_pushreg", obj_coff_seh_push, 0}, \
+ {"seh_savereg", obj_coff_seh_save, 0}, \
+ {"seh_savemm", obj_coff_seh_save, 1}, \
+ {"seh_savexmm", obj_coff_seh_save, 2}, \
+ {"seh_pushframe", obj_coff_seh_push, 1}, \
+ {"seh_endprologue", obj_coff_seh_endprologue, 0}, \
+ {"seh_setframe", obj_coff_seh_setframe, 0}, \
+ {"seh_stackalloc", obj_coff_seh_stack_alloc, 0}, \
+ {"seh_handler", obj_coff_seh_handler, 0}, \
+ {"seh_eh", obj_coff_seh_eh, 0}, \
+ {"seh_32", obj_coff_seh_32, 1}, \
+ {"seh_no32", obj_coff_seh_32, 0}, \
+ {"seh_scope", obj_coff_seh_scope, 0},
+
+/* Type definitions. */
+
+typedef struct seh_prologue_element
+{
+ symbolS *pc_addr;
+ char *pc_symbol;
+ int kind;
+ int reg;
+ bfd_vma offset;
+} seh_prologue_element;
+
+typedef struct seh_scope_elem {
+ char *begin_addr;
+ char *end_addr;
+ char *handler_addr;
+ char *jump_addr;
+} seh_scope_elem;
+
+typedef struct seh_context
+{
+ struct seh_context *next;
+ /* Was record alread processed. */
+ int done;
+ /* Function name. */
+ char *func_name;
+ /* BeginAddress. */
+ char *start_symbol;
+ symbolS *start_addr;
+ bfd_vma start_offset;
+ /* EndAddress. */
+ char *end_symbol;
+ symbolS *end_addr;
+ bfd_vma end_offset;
+ /* PrologueEnd. */
+ char *endprologue_symbol;
+ symbolS *endprologue_addr;
+ bfd_vma endprologue_offset;
+ /* ExceptionHandler. */
+ char *handler_name;
+ /* ExceptionHandlerData. */
+ char *handler_data_name;
+ int handler_written;
+ /* WinCE specific data. */
+ int use_instruction_32;
+
+ /* the bfd to store data within. */
+ bfd *abfd;
+ /* the current section to generate data within. */
+ asection *section;
+ /* Relocations for section. */
+ unsigned int count_reloc;
+ /* Symbols within section. */
+ unsigned int count_syms;
+ /* Iterator for text lable generation. */
+ unsigned int tlbl_count;
+ /* Iterator for xdata lable generation. */
+ unsigned int xlbl_count;
+ /* The name of the first xdata label. */
+ char *xdata_first;
+ /* FIelds used for x64 generation of chained information. */
+ char **xdata_names;
+ char **xdata_pcsyms;
+ int *xdata_elm_start;
+ /* Size and offset within current generated xdata section. */
+ size_t xdata_sz;
+ size_t xdata_offset;
+ /* x64 framereg and frame offset information. */
+ int framereg;
+ bfd_vma frameoff;
+ /* Information about x64 specific unwind data fields. */
+ size_t elems_count;
+ size_t elems_max;
+ seh_prologue_element *elems;
+ size_t scope_max;
+ size_t scope_count;
+ seh_scope_elem *scopes;
+} seh_context;
+
+typedef enum seh_kind {
+ seh_kind_unknown = 0,
+ seh_kind_mips = 1, /* Used for MIPS and x86 pdata generation. */
+ seh_kind_arm = 2, /* Used for ARM, PPC, SH3, and SH4 pdata (PDATA_EH) generation. */
+ seh_kind_x64 = 3 /* Used for IA64 and x64 pdata/xdata generation. */
+} seh_kind;
+
+/* Forward declarations. */
+static void obj_coff_seh_stack_alloc (int);
+static void obj_coff_seh_setframe (int);
+static void obj_coff_seh_endprologue (int);
+static void obj_coff_seh_save (int);
+static void obj_coff_seh_push (int);
+static void obj_coff_seh_endproc (int);
+static void obj_coff_seh_eh (int);
+static void obj_coff_seh_32 (int);
+static void obj_coff_seh_proc (int);
+static void obj_coff_seh_handler (int);
+static void obj_coff_seh_scope (int);
+static int seh_read_offset (const char *, bfd_vma *);
+static int seh_x64_read_reg (const char *, int, int *);
+static void seh_x64_make_prologue_element (int, int, bfd_vma);
+static void make_function_entry_pdata (seh_context *c);
+
+#define UNDSEC (asection *) &bfd_und_section