aboutsummaryrefslogtreecommitdiff
path: root/gas/read.c
diff options
context:
space:
mode:
authorMichael Meissner <gnu@the-meissners.org>1996-05-23 21:58:22 +0000
committerMichael Meissner <gnu@the-meissners.org>1996-05-23 21:58:22 +0000
commitadeab39b2051bfb53020940267b516b2de28c868 (patch)
tree4e950c9b4a9a4afdb3425c77a217ce17b4e54b53 /gas/read.c
parent63cafcefeac326d2435260714834a785dfa768dd (diff)
downloadgdb-adeab39b2051bfb53020940267b516b2de28c868.zip
gdb-adeab39b2051bfb53020940267b516b2de28c868.tar.gz
gdb-adeab39b2051bfb53020940267b516b2de28c868.tar.bz2
Add .skip as a synonym for .space
Diffstat (limited to 'gas/read.c')
-rw-r--r--gas/read.c143
1 files changed, 82 insertions, 61 deletions
diff --git a/gas/read.c b/gas/read.c
index 5e3ca14..3eee055 100644
--- a/gas/read.c
+++ b/gas/read.c
@@ -363,6 +363,7 @@ static const pseudo_typeS potable[] =
{"single", float_cons, 'f'},
/* size */
{"space", s_space, 0},
+ {"skip", s_space, 0},
{"spc", s_ignore, 0},
{"stabd", s_stab, 'd'},
{"stabn", s_stab, 'n'},
@@ -2001,6 +2002,9 @@ static int
get_line_sb (line)
sb *line;
{
+ if (input_line_pointer[-1] == '\n')
+ bump_line_counters ();
+
if (input_line_pointer >= buffer_limit)
{
buffer_limit = input_scrub_next_buffer (&input_line_pointer);
@@ -2013,11 +2017,8 @@ get_line_sb (line)
while (input_line_pointer < buffer_limit
&& is_end_of_line[(unsigned char) *input_line_pointer])
{
- if (*input_line_pointer == '\n')
- {
- bump_line_counters ();
- LISTING_NEWLINE ();
- }
+ if (input_line_pointer[-1] == '\n')
+ bump_line_counters ();
++input_line_pointer;
}
return 1;
@@ -2046,8 +2047,6 @@ s_macro (ignore)
if (line_label != NULL)
sb_add_string (&label, S_GET_NAME (line_label));
- demand_empty_rest_of_line ();
-
err = define_macro (0, &s, &label, get_line_sb);
if (err != NULL)
as_bad_where (file, line, "%s", err);
@@ -2495,7 +2494,7 @@ s_space (mult)
int mult;
{
expressionS exp;
- long temp_fill;
+ expressionS val;
char *p = 0;
char *stop = NULL;
char stopc;
@@ -2507,72 +2506,94 @@ s_space (mult)
if (flag_mri)
stop = mri_comment_field (&stopc);
- /* Just like .fill, but temp_size = 1 */
expression (&exp);
- if (exp.X_op == O_constant)
- {
- long repeat;
- repeat = exp.X_add_number;
- if (mult)
- repeat *= mult;
- if (repeat <= 0)
- {
- if (! flag_mri || repeat < 0)
- as_warn (".space repeat count is %s, ignored",
- repeat ? "negative" : "zero");
- goto getout;
- }
+ SKIP_WHITESPACE ();
+ if (*input_line_pointer == ',')
+ {
+ ++input_line_pointer;
+ expression (&val);
+ }
+ else
+ {
+ val.X_op = O_constant;
+ val.X_add_number = 0;
+ }
- /* If we are in the absolute section, just bump the offset. */
- if (now_seg == absolute_section)
+ if (val.X_op != O_constant
+ || val.X_add_number < - 0x80
+ || val.X_add_number > 0xff
+ || (mult != 0 && mult != 1 && val.X_add_number != 0))
+ {
+ if (exp.X_op != O_constant)
+ as_bad ("Unsupported variable size or fill value");
+ else
{
- abs_section_offset += repeat;
- goto getout;
- }
+ offsetT i;
- /* If we are secretly in an MRI common section, then creating
- space just increases the size of the common symbol. */
- if (mri_common_symbol != NULL)
- {
- S_SET_VALUE (mri_common_symbol,
- S_GET_VALUE (mri_common_symbol) + repeat);
- goto getout;
+ if (mult == 0)
+ mult = 1;
+ for (i = 0; i < exp.X_add_number; i++)
+ emit_expr (&val, mult);
}
-
- if (!need_pass_2)
- p = frag_var (rs_fill, 1, 1, (relax_substateT) 0, (symbolS *) 0,
- repeat, (char *) 0);
}
else
{
- if (now_seg == absolute_section)
+ if (exp.X_op == O_constant)
{
- as_bad ("space allocation too complex in absolute section");
- subseg_set (text_section, 0);
+ long repeat;
+
+ repeat = exp.X_add_number;
+ if (mult)
+ repeat *= mult;
+ if (repeat <= 0)
+ {
+ if (! flag_mri || repeat < 0)
+ as_warn (".space repeat count is %s, ignored",
+ repeat ? "negative" : "zero");
+ goto getout;
+ }
+
+ /* If we are in the absolute section, just bump the offset. */
+ if (now_seg == absolute_section)
+ {
+ abs_section_offset += repeat;
+ goto getout;
+ }
+
+ /* If we are secretly in an MRI common section, then
+ creating space just increases the size of the common
+ symbol. */
+ if (mri_common_symbol != NULL)
+ {
+ S_SET_VALUE (mri_common_symbol,
+ S_GET_VALUE (mri_common_symbol) + repeat);
+ goto getout;
+ }
+
+ if (!need_pass_2)
+ p = frag_var (rs_fill, 1, 1, (relax_substateT) 0, (symbolS *) 0,
+ repeat, (char *) 0);
}
- if (mri_common_symbol != NULL)
+ else
{
- as_bad ("space allocation too complex in common section");
- mri_common_symbol = NULL;
+ if (now_seg == absolute_section)
+ {
+ as_bad ("space allocation too complex in absolute section");
+ subseg_set (text_section, 0);
+ }
+ if (mri_common_symbol != NULL)
+ {
+ as_bad ("space allocation too complex in common section");
+ mri_common_symbol = NULL;
+ }
+ if (!need_pass_2)
+ p = frag_var (rs_space, 1, 1, (relax_substateT) 0,
+ make_expr_symbol (&exp), 0L, (char *) 0);
}
- if (!need_pass_2)
- p = frag_var (rs_space, 1, 1, (relax_substateT) 0,
- make_expr_symbol (&exp), 0L, (char *) 0);
- }
- SKIP_WHITESPACE ();
- if (*input_line_pointer == ',')
- {
- input_line_pointer++;
- temp_fill = get_absolute_expression ();
- }
- else
- {
- temp_fill = 0;
- }
- if (p)
- {
- *p = temp_fill;
+
+ if (p)
+ *p = val.X_add_number;
}
getout: