summaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
Diffstat (limited to 'gas')
-rw-r--r--gas/app.c66
-rw-r--r--gas/as.h9
-rw-r--r--gas/input-file.c19
-rw-r--r--gas/read.c71
4 files changed, 88 insertions, 77 deletions
diff --git a/gas/app.c b/gas/app.c
index 2a8df3ace5e..c51c0f02726 100644
--- a/gas/app.c
+++ b/gas/app.c
@@ -191,6 +191,7 @@ static char out_buf[20];
static int add_newlines;
static char *saved_input;
static int saved_input_len;
+static char input_buffer[32 * 1024];
static const char *mri_state;
static char mri_last_ch;
@@ -227,8 +228,14 @@ app_push ()
saved->out_string = out_string;
memcpy (saved->out_buf, out_buf, sizeof (out_buf));
saved->add_newlines = add_newlines;
- saved->saved_input = saved_input;
- saved->saved_input_len = saved_input_len;
+ if (saved_input == NULL)
+ saved->saved_input = NULL;
+ else
+ {
+ saved->saved_input = xmalloc (saved_input_len);
+ memcpy (saved->saved_input, saved_input, saved_input_len);
+ saved->saved_input_len = saved_input_len;
+ }
saved->scrub_m68k_mri = scrub_m68k_mri;
saved->mri_state = mri_state;
saved->mri_last_ch = mri_last_ch;
@@ -256,8 +263,16 @@ app_pop (arg)
out_string = saved->out_string;
memcpy (out_buf, saved->out_buf, sizeof (out_buf));
add_newlines = saved->add_newlines;
- saved_input = saved->saved_input;
- saved_input_len = saved->saved_input_len;
+ if (saved->saved_input == NULL)
+ saved_input = NULL;
+ else
+ {
+ assert (saved->saved_input_len <= sizeof input_buffer);
+ memcpy (input_buffer, saved->saved_input, saved->saved_input_len);
+ saved_input = input_buffer;
+ saved_input_len = saved->saved_input_len;
+ free (saved->saved_input);
+ }
scrub_m68k_mri = saved->scrub_m68k_mri;
mri_state = saved->mri_state;
mri_last_ch = saved->mri_last_ch;
@@ -308,7 +323,7 @@ process_escape (ch)
int
do_scrub_chars (get, tostart, tolen)
- int (*get) PARAMS ((char **));
+ int (*get) PARAMS ((char *, int));
char *tostart;
int tolen;
{
@@ -357,18 +372,15 @@ do_scrub_chars (get, tostart, tolen)
/* This macro gets the next input character. */
-#define GET() \
- (from < fromend \
- ? * (unsigned char *) (from++) \
- : ((saved_input != NULL \
- ? (free (saved_input), \
- saved_input = NULL, \
- 0) \
- : 0), \
- fromlen = (*get) (&from), \
- fromend = from + fromlen, \
- (fromlen == 0 \
- ? EOF \
+#define GET() \
+ (from < fromend \
+ ? * (unsigned char *) (from++) \
+ : (saved_input = NULL, \
+ fromlen = (*get) (input_buffer, sizeof input_buffer), \
+ from = input_buffer, \
+ fromend = from + fromlen, \
+ (fromlen == 0 \
+ ? EOF \
: * (unsigned char *) (from++))))
/* This macro pushes a character back on the input stream. */
@@ -400,9 +412,10 @@ do_scrub_chars (get, tostart, tolen)
}
else
{
- fromlen = (*get) (&from);
+ fromlen = (*get) (input_buffer, sizeof input_buffer);
if (fromlen == 0)
return 0;
+ from = input_buffer;
fromend = from + fromlen;
}
@@ -1232,23 +1245,12 @@ do_scrub_chars (get, tostart, tolen)
processed. */
if (fromend > from)
{
- char *save;
-
- save = (char *) xmalloc (fromend - from);
- memcpy (save, from, fromend - from);
- if (saved_input != NULL)
- free (saved_input);
- saved_input = save;
+ saved_input = from;
saved_input_len = fromend - from;
}
else
- {
- if (saved_input != NULL)
- {
- free (saved_input);
- saved_input = NULL;
- }
- }
+ saved_input = NULL;
+
return to - tostart;
}
diff --git a/gas/as.h b/gas/as.h
index a72dfad28dc..65d3bad1c91 100644
--- a/gas/as.h
+++ b/gas/as.h
@@ -1,5 +1,5 @@
/* as.h - global header file
- Copyright (C) 1987, 90, 91, 92, 93, 94, 95, 96, 97, 1998
+ Copyright (C) 1987, 90, 91, 92, 93, 94, 95, 96, 97, 98, 1999
Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
@@ -559,7 +559,7 @@ char *atof_ieee PARAMS ((char *str, int what_kind, LITTLENUM_TYPE * words));
char *input_scrub_include_file PARAMS ((char *filename, char *position));
char *input_scrub_new_file PARAMS ((char *filename));
char *input_scrub_next_buffer PARAMS ((char **bufp));
-int do_scrub_chars PARAMS ((int (*get) (char **), char *to, int tolen));
+int do_scrub_chars PARAMS ((int (*get) (char *, int), char *to, int tolen));
int gen_to_words PARAMS ((LITTLENUM_TYPE * words, int precision,
long exponent_bits));
int had_err PARAMS ((void));
@@ -592,13 +592,13 @@ void print_dependencies PARAMS ((void));
struct expressionS;
struct fix;
-struct symbol;
+typedef struct symbol symbolS;
struct relax_type;
typedef struct frag fragS;
#ifdef BFD_ASSEMBLER
/* literal.c */
-valueT add_to_literal_pool PARAMS ((struct symbol *, valueT, segT, int));
+valueT add_to_literal_pool PARAMS ((symbolS *, valueT, segT, int));
#endif
int check_eh_frame PARAMS ((struct expressionS *, unsigned int *));
@@ -611,7 +611,6 @@ void eh_frame_convert_frag PARAMS ((fragS *));
/* this one starts the chain of target dependant headers */
#include "targ-env.h"
-#include "struc-symbol.h"
#include "write.h"
#include "frags.h"
#include "hash.h"
diff --git a/gas/input-file.c b/gas/input-file.c
index c63f7c9b63b..634f6f73930 100644
--- a/gas/input-file.c
+++ b/gas/input-file.c
@@ -1,5 +1,6 @@
/* input_file.c - Deal with Input Files -
- Copyright (C) 1987, 1990, 1991, 1992, 1998 Free Software Foundation, Inc.
+ Copyright (C) 1987, 90, 91, 92, 93, 94, 95, 98, 1999
+ Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
@@ -14,8 +15,9 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with GAS; see the file COPYING. If not, write to
- the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+ along with GAS; see the file COPYING. If not, write to the Free
+ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+ 02111-1307, USA. */
/*
* Confines all details of reading source bytes to this module.
@@ -30,7 +32,7 @@
#include "as.h"
#include "input-file.h"
-static int input_file_get PARAMS ((char **));
+static int input_file_get PARAMS ((char *, int));
/* This variable is non-zero if the file currently being read should be
preprocessed by app. It is zero if the file can be read straight in.
@@ -191,19 +193,18 @@ input_file_close ()
/* This function is passed to do_scrub_chars. */
static int
-input_file_get (from)
- char **from;
+input_file_get (buf, buflen)
+ char *buf;
+ int buflen;
{
- static char buf[BUFFER_SIZE];
int size;
- size = fread (buf, sizeof (char), sizeof buf, f_in);
+ size = fread (buf, sizeof (char), buflen, f_in);
if (size < 0)
{
as_perror (_("Can't read from %s"), file_name);
size = 0;
}
- *from = buf;
return size;
}
diff --git a/gas/read.c b/gas/read.c
index abee749b5d5..7859fe146eb 100644
--- a/gas/read.c
+++ b/gas/read.c
@@ -208,7 +208,7 @@ static int dwarf_file_string;
#endif
static void cons_worker PARAMS ((int, int));
-static int scrub_from_string PARAMS ((char **));
+static int scrub_from_string PARAMS ((char *, int));
static void do_align PARAMS ((int, char *, int, int));
static void s_align PARAMS ((int, int));
static void s_lcomm_internal PARAMS ((int, int));
@@ -480,15 +480,18 @@ static char *scrub_string;
static char *scrub_string_end;
static int
-scrub_from_string (from)
- char **from;
+scrub_from_string (buf, buflen)
+ char *buf;
+ int buflen;
{
- int size;
-
- *from = scrub_string;
- size = scrub_string_end - scrub_string;
- scrub_string = scrub_string_end;
- return size;
+ int copy;
+
+ copy = scrub_string_end - scrub_string;
+ if (copy > buflen)
+ copy = buflen;
+ memcpy (buf, scrub_string, copy);
+ scrub_string += copy;
+ return copy;
}
/* read_a_source_file()
@@ -788,7 +791,7 @@ read_a_source_file (name)
mri_pending_align = 0;
if (line_label != NULL)
{
- line_label->sy_frag = frag_now;
+ symbol_set_frag (line_label, frag_now);
S_SET_VALUE (line_label, frag_now_fix ());
}
}
@@ -869,7 +872,7 @@ read_a_source_file (name)
mri_pending_align = 0;
if (line_label != NULL)
{
- line_label->sy_frag = frag_now;
+ symbol_set_frag (line_label, frag_now);
S_SET_VALUE (line_label, frag_now_fix ());
}
}
@@ -1489,10 +1492,12 @@ s_mri_common (small)
if (line_label != NULL)
{
- line_label->sy_value.X_op = O_symbol;
- line_label->sy_value.X_add_symbol = sym;
- line_label->sy_value.X_add_number = S_GET_VALUE (sym);
- line_label->sy_frag = &zero_address_frag;
+ expressionS exp;
+ exp.X_op = O_symbol;
+ exp.X_add_symbol = sym;
+ exp.X_add_number = 0;
+ symbol_set_value_expression (line_label, &exp);
+ symbol_set_frag (line_label, &zero_address_frag);
S_SET_SEGMENT (line_label, expr_section);
}
@@ -2064,9 +2069,9 @@ s_lcomm_internal (needs_align, bytes_p)
frag_align (align, 0, 0);
/* detach from old frag */
if (S_GET_SEGMENT (symbolP) == bss_seg)
- symbolP->sy_frag->fr_symbol = NULL;
+ symbol_get_frag (symbolP)->fr_symbol = NULL;
- symbolP->sy_frag = frag_now;
+ symbol_set_frag (symbolP, frag_now);
pfrag = frag_var (rs_org, 1, 1, (relax_substateT)0, symbolP,
(offsetT) temp, (char *) 0);
*pfrag = 0;
@@ -2261,7 +2266,7 @@ s_macro (ignore)
{
S_SET_SEGMENT (line_label, undefined_section);
S_SET_VALUE (line_label, 0);
- line_label->sy_frag = &zero_address_frag;
+ symbol_set_frag (line_label, &zero_address_frag);
}
if (((flag_m68k_mri
@@ -2783,9 +2788,12 @@ s_space (mult)
S_SET_VALUE (mri_common_symbol, val + 1);
if (line_label != NULL)
{
- know (line_label->sy_value.X_op == O_symbol);
- know (line_label->sy_value.X_add_symbol == mri_common_symbol);
- line_label->sy_value.X_add_number += 1;
+ expressionS *symexp;
+
+ symexp = symbol_get_value_expression (line_label);
+ know (symexp->X_op == O_symbol);
+ know (symexp->X_add_symbol == mri_common_symbol);
+ symexp->X_add_number += 1;
}
}
}
@@ -2794,7 +2802,7 @@ s_space (mult)
do_align (1, (char *) NULL, 0, 0);
if (line_label != NULL)
{
- line_label->sy_frag = frag_now;
+ symbol_set_frag (line_label, frag_now);
S_SET_VALUE (line_label, frag_now_fix ());
}
}
@@ -3114,7 +3122,8 @@ pseudo_set (symbolP)
&& (S_GET_SEGMENT (exp.X_add_symbol)
== S_GET_SEGMENT (exp.X_op_symbol))
&& SEG_NORMAL (S_GET_SEGMENT (exp.X_add_symbol))
- && exp.X_add_symbol->sy_frag == exp.X_op_symbol->sy_frag)
+ && (symbol_get_frag (exp.X_add_symbol)
+ == symbol_get_frag (exp.X_op_symbol)))
{
exp.X_op = O_constant;
exp.X_add_number = (S_GET_VALUE (exp.X_add_symbol)
@@ -3138,19 +3147,19 @@ pseudo_set (symbolP)
#endif /* OBJ_AOUT or OBJ_BOUT */
S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
if (exp.X_op != O_constant)
- symbolP->sy_frag = &zero_address_frag;
+ symbol_set_frag (symbolP, &zero_address_frag);
break;
case O_register:
S_SET_SEGMENT (symbolP, reg_section);
S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
- symbolP->sy_frag = &zero_address_frag;
+ symbol_set_frag (symbolP, &zero_address_frag);
break;
case O_symbol:
if (S_GET_SEGMENT (exp.X_add_symbol) == undefined_section
|| exp.X_add_number != 0)
- symbolP->sy_value = exp;
+ symbol_set_value_expression (symbolP, &exp);
else
{
symbolS *s = exp.X_add_symbol;
@@ -3164,7 +3173,7 @@ pseudo_set (symbolP)
#endif /* OBJ_AOUT or OBJ_BOUT */
S_SET_VALUE (symbolP,
exp.X_add_number + S_GET_VALUE (s));
- symbolP->sy_frag = s->sy_frag;
+ symbol_set_frag (symbolP, symbol_get_frag (s));
copy_symbol_attributes (symbolP, s);
}
break;
@@ -3172,7 +3181,7 @@ pseudo_set (symbolP)
default:
/* The value is some complex expression.
FIXME: Should we set the segment to anything? */
- symbolP->sy_value = exp;
+ symbol_set_value_expression (symbolP, &exp);
break;
}
}
@@ -3401,13 +3410,13 @@ emit_expr (exp, nbytes)
/* Handle a negative bignum. */
if (op == O_uminus
&& exp->X_add_number == 0
- && exp->X_add_symbol->sy_value.X_op == O_big
- && exp->X_add_symbol->sy_value.X_add_number > 0)
+ && symbol_get_value_expression (exp->X_add_symbol)->X_op == O_big
+ && symbol_get_value_expression (exp->X_add_symbol)->X_add_number > 0)
{
int i;
unsigned long carry;
- exp = &exp->X_add_symbol->sy_value;
+ exp = symbol_get_value_expression (exp->X_add_symbol);
/* Negate the bignum: one's complement each digit and add 1. */
carry = 1;