diff options
Diffstat (limited to 'gas/read.c')
-rw-r--r-- | gas/read.c | 49 |
1 files changed, 41 insertions, 8 deletions
@@ -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 |