aboutsummaryrefslogtreecommitdiff
path: root/gas/read.c
diff options
context:
space:
mode:
Diffstat (limited to 'gas/read.c')
-rw-r--r--gas/read.c49
1 files changed, 41 insertions, 8 deletions
diff --git a/gas/read.c b/gas/read.c
index 97a2ab2..c622eb2 100644
--- a/gas/read.c
+++ b/gas/read.c
@@ -1698,6 +1698,19 @@ s_app_file (int appfile)
}
}
+static int
+get_linefile_number (int *flag)
+{
+ SKIP_WHITESPACE ();
+
+ if (*input_line_pointer < '0' || *input_line_pointer > '9')
+ return 0;
+
+ *flag = get_absolute_expression ();
+
+ return 1;
+}
+
/* Handle the .appline pseudo-op. This is automatically generated by
do_scrub_chars when a preprocessor # line comment is seen. This
default definition may be overridden by the object or CPU specific
@@ -1706,10 +1719,19 @@ s_app_file (int appfile)
void
s_app_line (int appline)
{
+ char *file = NULL;
int l;
/* The given number is that of the next line. */
- l = get_absolute_expression () - 1;
+ if (appline)
+ l = get_absolute_expression ();
+ else if (!get_linefile_number (&l))
+ {
+ ignore_rest_of_line ();
+ return;
+ }
+
+ l--;
if (l < -1)
/* Some of the back ends can't deal with non-positive line numbers.
@@ -1726,18 +1748,20 @@ s_app_line (int appline)
else
{
int flags = 0;
- char *file = NULL;
int length = 0;
if (!appline)
{
- file = demand_copy_string (&length);
+ SKIP_WHITESPACE ();
+
+ if (*input_line_pointer == '"')
+ file = demand_copy_string (&length);
if (file)
{
int this_flag;
- while ((this_flag = get_absolute_expression ()))
+ while (get_linefile_number (&this_flag))
switch (this_flag)
{
/* From GCC's cpp documentation:
@@ -1772,16 +1796,25 @@ s_app_line (int appline)
this_flag);
break;
}
+
+ if (!is_end_of_line[(unsigned char)*input_line_pointer])
+ file = 0;
}
}
- new_logical_line_flags (file, l, flags);
+ if (appline || file)
+ {
+ new_logical_line_flags (file, l, flags);
#ifdef LISTING
- if (listing)
- listing_source_line (l);
+ if (listing)
+ listing_source_line (l);
#endif
+ }
}
- demand_empty_rest_of_line ();
+ if (appline || file)
+ demand_empty_rest_of_line ();
+ else
+ ignore_rest_of_line ();
}
/* Handle the .end pseudo-op. Actually, the real work is done in