X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fconfig%2Fobj-coff-seh.c;h=b24e435677b822780aac775ade997517deca867b;hb=c0ea7c52e10024ecd29b8f0e23b666b6af926c6e;hp=83e8cb669c8e6415aa6b3ca3bb7dfe70361aa111;hpb=bea2c1d72cc5e0dd740ff59acbc90e643120eb88;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/config/obj-coff-seh.c b/gas/config/obj-coff-seh.c index 83e8cb669c..b24e435677 100644 --- a/gas/config/obj-coff-seh.c +++ b/gas/config/obj-coff-seh.c @@ -1,6 +1,5 @@ /* seh pdata/xdata coff object file format - Copyright 2009, 2010 - Free Software Foundation, Inc. + Copyright (C) 2009-2019 Free Software Foundation, Inc. This file is part of GAS. @@ -49,7 +48,7 @@ get_pxdata_name (segT seg, const char *base_name) const char *name,*dollar, *dot; char *sname; - name = bfd_get_section_name (stdoutput, seg); + name = bfd_section_name (seg); dollar = strchr (name, '$'); dot = strchr (name + 1, '.'); @@ -96,16 +95,16 @@ make_pxdata_seg (segT cseg, char *name) r = subseg_new (name, 0); /* Check if code segment is marked as linked once. */ - flags = bfd_get_section_flags (stdoutput, cseg) - & (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD - | SEC_LINK_DUPLICATES_ONE_ONLY | SEC_LINK_DUPLICATES_SAME_SIZE - | SEC_LINK_DUPLICATES_SAME_CONTENTS); + flags = (bfd_section_flags (cseg) + & (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD + | SEC_LINK_DUPLICATES_ONE_ONLY | SEC_LINK_DUPLICATES_SAME_SIZE + | SEC_LINK_DUPLICATES_SAME_CONTENTS)); /* Add standard section flags. */ flags |= SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA; /* Apply possibly linked once flags to new generated segment, too. */ - if (!bfd_set_section_flags (stdoutput, r, flags)) + if (!bfd_set_section_flags (r, flags)) as_bad (_("bfd_set_section_flags: %s"), bfd_errmsg (bfd_get_error ())); @@ -162,14 +161,21 @@ seh_validate_seg (const char *directive) const char *cseg_name, *nseg_name; if (seh_ctx_cur->code_seg == now_seg) return 1; - cseg_name = bfd_get_section_name (stdoutput, seh_ctx_cur->code_seg); - nseg_name = bfd_get_section_name (stdoutput, now_seg); + cseg_name = bfd_section_name (seh_ctx_cur->code_seg); + nseg_name = bfd_section_name (now_seg); as_bad (_("%s used in segment '%s' instead of expected '%s'"), directive, nseg_name, cseg_name); ignore_rest_of_line (); return 0; } +/* Switch back to the code section, whatever that may be. */ +static void +obj_coff_seh_code (int ignored ATTRIBUTE_UNUSED) +{ + subseg_set (seh_ctx_cur->code_seg, 0); +} + static void switch_xdata (int subseg, segT code_seg) { @@ -323,8 +329,7 @@ obj_coff_seh_handler (int what ATTRIBUTE_UNUSED) if (*input_line_pointer == '@') { - symbol_name = input_line_pointer; - name_end = get_symbol_end (); + name_end = get_symbol_name (&symbol_name); seh_ctx_cur->handler.X_op = O_constant; seh_ctx_cur->handler.X_add_number = 0; @@ -337,7 +342,7 @@ obj_coff_seh_handler (int what ATTRIBUTE_UNUSED) else as_bad (_("unknown constant value '%s' for handler"), symbol_name); - *input_line_pointer = name_end; + (void) restore_line_pointer (name_end); } else expression (&seh_ctx_cur->handler); @@ -353,8 +358,7 @@ obj_coff_seh_handler (int what ATTRIBUTE_UNUSED) { do { - symbol_name = input_line_pointer; - name_end = get_symbol_end (); + name_end = get_symbol_name (&symbol_name); if (strcasecmp (symbol_name, "@unwind") == 0) seh_ctx_cur->handler_flags |= UNW_FLAG_UHANDLER; @@ -363,7 +367,7 @@ obj_coff_seh_handler (int what ATTRIBUTE_UNUSED) else as_bad (_(".seh_handler constant '%s' unknown"), symbol_name); - *input_line_pointer = name_end; + (void) restore_line_pointer (name_end); } while (skip_whitespace_and_comma (0)); } @@ -448,10 +452,9 @@ obj_coff_seh_proc (int what ATTRIBUTE_UNUSED) SKIP_WHITESPACE (); - symbol_name = input_line_pointer; - name_end = get_symbol_end (); + name_end = get_symbol_name (&symbol_name); seh_ctx_cur->func_name = xstrdup (symbol_name); - *input_line_pointer = name_end; + (void) restore_line_pointer (name_end); demand_empty_rest_of_line (); @@ -480,10 +483,7 @@ void obj_coff_seh_do_final (void) { if (seh_ctx_cur != NULL) - { - as_bad (_("open SEH entry at end of file (missing .cfi_endproc)")); - do_seh_endproc (); - } + as_bad (_("open SEH entry at end of file (missing .seh_endproc)")); } /* Enter a prologue element into current context (x64). */ @@ -543,14 +543,13 @@ seh_x64_read_reg (const char *directive, int kind) SKIP_WHITESPACE (); if (*input_line_pointer == '%') ++input_line_pointer; - symbol_name = input_line_pointer; - name_end = get_symbol_end (); + name_end = get_symbol_name (& symbol_name); for (i = 0; i < 16; i++) if (! strcasecmp (regs[i], symbol_name)) break; - *input_line_pointer = name_end; + (void) restore_line_pointer (name_end); /* Error if register not found, or EAX used as a frame pointer. */ if (i == 16 || (kind == 0 && i == 0))