aboutsummaryrefslogtreecommitdiff
path: root/gas/config/obj-coff-seh.h
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2010-08-30 21:51:28 +0000
committerRichard Henderson <rth@redhat.com>2010-08-30 21:51:28 +0000
commit681418c21c56a1c356e1a3b4c89f065f0837e843 (patch)
tree38ec8f93e4d94383fd33cafb7c183a704637be0d /gas/config/obj-coff-seh.h
parent03f17ccfe196bd03d370b5c0d9983b8d8eed12d7 (diff)
downloadgdb-681418c21c56a1c356e1a3b4c89f065f0837e843.zip
gdb-681418c21c56a1c356e1a3b4c89f065f0837e843.tar.gz
gdb-681418c21c56a1c356e1a3b4c89f065f0837e843.tar.bz2
* config/obj-coff-seh.c: Rewrite the entire file.
(symtab, symptr, reltab, relcount, relsize): Remove. (seh_ctx_root, seh_ctx): Remove. (xdata_seg, xdata_subseg, pdata_seg): New. (switch_xdata, switch_pdata): New. (verify_context, verify_context_and_target, skip_whitespace_and_comma): New parsing functions. Rewrite all parsing functions to use them. (obj_coff_seh_32): Fix != arm thinko. (obj_coff_seh_handler): For x64, don't accept handler pointer here, only flags. (obj_coff_seh_handlerdata): New. (do_seh_endproc): Split out of ... (obj_coff_seh_endproc): ... here. (obj_coff_seh_proc): Use it, if needed. (seh_x64_make_prologue_element): Use XRESIZEVEC, symbol_temp_new_now. (seh_x64_read_reg): Remove mm_regs alternative. Tidy integer reg alternatives. Don't slurp commas. (seh_read_offset): Remove. (obj_coff_seh_pushframe): Split out from obj_coff_seh_push. (obj_coff_seh_scope): Remove. (obj_coff_seh_save): Decide UWOP_SAVE_* vs _FAR immediately. (obj_coff_seh_stackalloc): Decide _SMALL vs _LARGE immediately. (out_one, out_two, out_four): New. (seh_x64_write_prologue_data, seh_x64_size_prologue_data, seh_x64_write_function_xdata, write_function_xdata): Rewrite from seh_x64_write_xdata, seh_needed_unwind_info, seh_store_elm_data, seh_getelm_data_size, seh_getsize_of_unwind_entry, seh_make_unwind_entry, seh_getsize_unwind_data, and seh_create_unwind_data. (seh_arm_write_function_pdata): Rewrite from seh_arm_create_pdata. (write_function_pdata): Rewrite from make_function_entry_pdata. (seh_write_text_eh_data, make_function_entry_pdata, seh_arm_create_pdata, seh_arm_write_pdata, seh_reloc, save_relocs, seh_symbol_init, seh_symbol, quick_section, seh_emit_rva, seh_emit_long, seh_make_globl, seh_make_section2, seh_make_section, seh_make_xlbl_name, make_seh_text_label, seh_fill_pcsyms, seh_needed_unwind_info, seh_store_elm_data, seh_getelm_data_size, seh_getsize_of_unwind_entry, seh_make_unwind_entry, seh_getsize_unwind_data, seh_create_unwind_data, seh_make_function_entry_xdata, seh_x64_makescope_elem): Remove. * config/obj-coff-seh.h (SEH_CMDS): Remove seh_savemm, seh_scope. Add seh_handlerdata. Adjust function/what arguments for seh_savereg, seh_pushframe, seh_stackalloc. (struct seh_prologue_element): Adjust members to closer match the elements of the UNWIND_CODE structure. (struct seh_scope_elem): Remove. (struct seh_context): Replace char* members with symbolS or expressionS as appropriate. Sort members by ARM/x64 applicability. Remove obsolete stuff wrt direct symbol and reloc manipulation.
Diffstat (limited to 'gas/config/obj-coff-seh.h')
-rw-r--r--gas/config/obj-coff-seh.h105
1 files changed, 37 insertions, 68 deletions
diff --git a/gas/config/obj-coff-seh.h b/gas/config/obj-coff-seh.h
index aa151cd..429c100 100644
--- a/gas/config/obj-coff-seh.h
+++ b/gas/config/obj-coff-seh.h
@@ -45,7 +45,9 @@
The pseudos:
.seh_proc <fct_name>
.seh_endprologue
- .seh_handler <handler>[,<handler-data>]]
+ .seh_handler <handler>[,@unwind][,@except] (x64)
+ .seh_handler <handler>[,<handler_data>] (others)
+ .seh_handlerdata
.seh_eh
.seh_32/.seh_no32
.seh_endproc
@@ -53,106 +55,76 @@
.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_pushreg", obj_coff_seh_pushreg, 0}, \
+ {"seh_savereg", obj_coff_seh_save, 1}, \
{"seh_savexmm", obj_coff_seh_save, 2}, \
- {"seh_pushframe", obj_coff_seh_push, 1}, \
+ {"seh_pushframe", obj_coff_seh_pushframe, 0}, \
{"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_stackalloc", obj_coff_seh_stackalloc, 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},
+ {"seh_handler", obj_coff_seh_handler, 0}, \
+ {"seh_handlerdata", obj_coff_seh_handlerdata, 0},
/* Type definitions. */
typedef struct seh_prologue_element
{
+ int code;
+ int info;
+ offsetT off;
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;
+ /* Unwind data. */
+ symbolS *xdata_addr;
/* PrologueEnd. */
- char *endprologue_symbol;
symbolS *endprologue_addr;
- bfd_vma endprologue_offset;
/* ExceptionHandler. */
- char *handler_name;
- /* ExceptionHandlerData. */
- char *handler_data_name;
+ expressionS handler;
+ /* ExceptionHandlerData. (arm, mips) */
+ expressionS handler_data;
+
+ /* ARM .seh_eh directive seen. */
int handler_written;
+
/* WinCE specific data. */
int use_instruction_32;
+ /* Was record already processed. */
+ int done;
+
+ /* x64 flags for the xdata header. */
+ int handler_flags;
+ int subsection;
- /* 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;
+ int frameoff;
+
/* Information about x64 specific unwind data fields. */
- size_t elems_count;
- size_t elems_max;
+ int elems_count;
+ int elems_max;
seh_prologue_element *elems;
- size_t scope_max;
- size_t scope_count;
- seh_scope_elem *scopes;
} seh_context;
typedef enum seh_kind {
@@ -163,21 +135,18 @@ typedef enum seh_kind {
} seh_kind;
/* Forward declarations. */
-static void obj_coff_seh_stack_alloc (int);
+static void obj_coff_seh_stackalloc (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_save (int);
+static void obj_coff_seh_pushreg (int);
+static void obj_coff_seh_pushframe (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);
+static void obj_coff_seh_handlerdata (int);
#define UNDSEC (asection *) &bfd_und_section