(s_mri_sect): New function.
* read.h (s_mri_sect): Declare.
* config/obj-coff.c (obj_coff_section) (both versions): In MRI
mode, call s_mri_sect.
(obj_pseudo_table): Add sect.s and section.s. Move sect outside
of ifndef BFD_ASSEMBLER.
* config/obj-elf.c (elf_pseudo_table): Add section.s, sect,
sect.s.
(obj_elf_section): In MRI mode, call s_mri_sect.
* config/tc-m68k.c (md_pseudo_table): Add restore, save.
(struct save_opts): Define.
(save_stack): New static variable.
(s_save, s_restore): New static functions.
Thu Aug 10 00:38:11 1995 Ian Lance Taylor <ian@cygnus.com>
+ * read.c (potable): Add spc, ttl, xcom, xref.
+ (s_mri_sect): New function.
+ * read.h (s_mri_sect): Declare.
+ * config/obj-coff.c (obj_coff_section) (both versions): In MRI
+ mode, call s_mri_sect.
+ (obj_pseudo_table): Add sect.s and section.s. Move sect outside
+ of ifndef BFD_ASSEMBLER.
+ * config/obj-elf.c (elf_pseudo_table): Add section.s, sect,
+ sect.s.
+ (obj_elf_section): In MRI mode, call s_mri_sect.
+ * config/tc-m68k.c (md_pseudo_table): Add restore, save.
+ (struct save_opts): Define.
+ (save_stack): New static variable.
+ (s_save, s_restore): New static functions.
+
* read.c (s_set): Remove unused local ptr.
(hex_float): Check target_big_endian.
(equals): Remove unused local p.
+
* config/tc-a29k.h (TARGET_BYTES_BIG_ENDIAN): Define.
* config/tc-h8500.h (TARGET_BYTES_BIG_ENDIAN): Define.
* config/tc-hppa.h (TARGET_BYTES_BIG_ENDIAN): Define.
static void s_fopt PARAMS ((int));
static void s_opt PARAMS ((int));
static void s_reg PARAMS ((int));
+static void s_restore PARAMS ((int));
+static void s_save PARAMS ((int));
static int current_architecture;
{"mask2", s_ignore, 0},
{"opt", s_opt, 0},
{"reg", s_reg, 0},
+ {"restore", s_restore, 0},
+ {"save", s_save, 0},
{0, 0, 0}
};
demand_empty_rest_of_line ();
}
+
+/* This structure is used for the MRI SAVE and RESTORE pseudo-ops. */
+
+struct save_opts
+{
+ struct save_opts *next;
+ int abspcadd;
+ int symbols_case_sensitive;
+ int keep_locals;
+ int short_refs;
+ int architecture;
+ int quick;
+ int rel32;
+ int listing;
+ int no_warnings;
+ /* FIXME: We don't save OPT S. */
+};
+
+/* This variable holds the stack of saved options. */
+
+static struct save_opts *save_stack;
+
+/* The MRI SAVE pseudo-op. */
+
+static void
+s_save (ignore)
+ int ignore;
+{
+ struct save_opts *s;
+
+ s = (struct save_opts *) xmalloc (sizeof (struct save_opts));
+ s->abspcadd = m68k_abspcadd;
+ s->symbols_case_sensitive = symbols_case_sensitive;
+ s->keep_locals = flag_keep_locals;
+ s->short_refs = flag_short_refs;
+ s->architecture = current_architecture;
+ s->quick = m68k_quick;
+ s->rel32 = m68k_rel32;
+ s->listing = listing;
+ s->no_warnings = flag_no_warnings;
+
+ s->next = save_stack;
+ save_stack = s;
+
+ demand_empty_rest_of_line ();
+}
+
+/* The MRI RESTORE pseudo-op. */
+
+static void
+s_restore (ignore)
+ int ignore;
+{
+ struct save_opts *s;
+
+ if (save_stack == NULL)
+ {
+ as_bad ("restore without save");
+ ignore_rest_of_line ();
+ return;
+ }
+
+ s = save_stack;
+ save_stack = s->next;
+
+ m68k_abspcadd = s->abspcadd;
+ symbols_case_sensitive = s->symbols_case_sensitive;
+ flag_keep_locals = s->keep_locals;
+ flag_short_refs = s->short_refs;
+ current_architecture = s->architecture;
+ m68k_quick = s->quick;
+ m68k_rel32 = s->rel32;
+ listing = s->listing;
+ flag_no_warnings = s->no_warnings;
+
+ free (s);
+
+ demand_empty_rest_of_line ();
+}
\f
/*
* md_parse_option
{"single", float_cons, 'f'},
/* size */
{"space", s_space, 0},
+ {"spc", s_ignore, 0},
{"stabd", s_stab, 'd'},
{"stabn", s_stab, 'n'},
{"stabs", s_stab, 's'},
{"this_gcc_requires_the_gnu_assembler", s_ignore, 0},
{"title", listing_title, 0}, /* Listing title */
+ {"ttl", listing_title, 0},
/* type */
/* use */
/* val */
+ {"xcom", s_comm, 0},
{"xdef", s_globl, 0},
+ {"xref", s_ignore, 0},
{"xstabs", s_xstab, 's'},
{"word", cons, 2},
{"zero", s_space, 0},
demand_empty_rest_of_line ();
} /* s_org() */
+/* Handle parsing for the MRI SECT/SECTION pseudo-op. This should be
+ called by the obj-format routine which handles section changing
+ when in MRI mode. It will create a new section, and return it. It
+ will set *TYPE to the section type: one of '\0' (unspecified), 'C'
+ (code), 'D' (data), 'M' (mixed), or 'R' (romable). If
+ BFD_ASSEMBLER is defined, the flags will be set in the section. */
+
+void
+s_mri_sect (type)
+ char *type;
+{
+ char *name;
+ char c;
+ segT seg;
+
+ SKIP_WHITESPACE ();
+
+ name = input_line_pointer;
+ if (! isdigit ((unsigned char) *name))
+ c = get_symbol_end ();
+ else
+ {
+ do
+ {
+ ++input_line_pointer;
+ }
+ while (isdigit ((unsigned char) *input_line_pointer));
+ c = *input_line_pointer;
+ *input_line_pointer = '\0';
+ }
+
+ name = strdup (name);
+ if (name == NULL)
+ as_fatal ("virtual memory exhausted");
+
+ *input_line_pointer = c;
+
+ seg = subseg_new (name, 0);
+
+ if (*input_line_pointer == ',')
+ {
+ int align;
+
+ ++input_line_pointer;
+ align = get_absolute_expression ();
+ record_alignment (seg, align);
+ }
+
+ *type = '\0';
+ if (*input_line_pointer == ',')
+ {
+ c = *++input_line_pointer;
+ c = toupper ((unsigned char) c);
+ if (c == 'C' || c == 'D' || c == 'M' || c == 'R')
+ *type = c;
+ else
+ as_bad ("unrecognized section type");
+ ++input_line_pointer;
+
+#ifdef BFD_ASSEMBLER
+ {
+ flagword flags;
+
+ flags = SEC_NO_FLAGS;
+ if (type == 'C')
+ flags = SEC_CODE;
+ else if (type == 'D')
+ flags = SEC_DATA;
+ else if (type == 'R')
+ flags = SEC_ROM;
+ if (flags != SEC_NO_FLAGS)
+ {
+ if (! bfd_set_section_flags (stdoutput, seg, flags))
+ as_warn ("error setting flags for \"%s\": %s",
+ bfd_section_name (stdoutput, sec),
+ bfd_errmsg (bfd_get_error ()));
+ }
+ }
+#endif
+ }
+
+ /* Ignore the HP type. */
+ if (*input_line_pointer == ',')
+ input_line_pointer += 2;
+
+ demand_empty_rest_of_line ();
+}
+
void
s_set (ignore)
int ignore;