/* seh pdata/xdata coff object file format
- Copyright (C) 2009-2014 Free Software Foundation, Inc.
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
This file is part of GAS.
/* Local data. */
static seh_context *seh_ctx_cur = NULL;
-static struct hash_control *seh_hash;
+static htab_t seh_hash;
static struct seh_seg_list *x_segcur = NULL;
static struct seh_seg_list *p_segcur = NULL;
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, '.');
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 ()));
static void
seh_hash_insert (const char *name, struct seh_seg_list *item)
{
- const char *error_string;
-
- if ((error_string = hash_jam (seh_hash, name, (char *) item)))
- as_fatal (_("Inserting \"%s\" into structure table failed: %s"),
- name, error_string);
+ str_hash_insert (seh_hash, name, (char *) item);
}
static struct seh_seg_list *
seh_hash_find (char *name)
{
- return (struct seh_seg_list *) hash_find (seh_hash, name);
+ return (struct seh_seg_list *) str_hash_find (seh_hash, name);
}
static struct seh_seg_list *
/* Initialize seh_hash once. */
if (!seh_hash)
- seh_hash = hash_new ();
+ seh_hash = str_htab_create ();
name = get_pxdata_name (cseg, base_name);
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 ();
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;
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);
{
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;
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));
}
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 ();
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). */
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))