aboutsummaryrefslogtreecommitdiff
path: root/gas/read.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2023-03-01 12:50:34 +1030
committerAlan Modra <amodra@gmail.com>2023-03-01 12:50:34 +1030
commitd09f4d4a9b96dcb4b732fe13549506be5b276ec2 (patch)
tree3ce424c6f9f9103533272008905249b233821e76 /gas/read.c
parent0eb3224b35d94576e0498eed51373f52dee71bf1 (diff)
downloadgdb-d09f4d4a9b96dcb4b732fe13549506be5b276ec2.zip
gdb-d09f4d4a9b96dcb4b732fe13549506be5b276ec2.tar.gz
gdb-d09f4d4a9b96dcb4b732fe13549506be5b276ec2.tar.bz2
gas s_fill caused internal error in frag_new
Fix an internal error after "non-constant fill count for absolute section". * read.c (s_fill): Don't create frags after errors.
Diffstat (limited to 'gas/read.c')
-rw-r--r--gas/read.c30
1 files changed, 20 insertions, 10 deletions
diff --git a/gas/read.c b/gas/read.c
index d43584b..5d83d35 100644
--- a/gas/read.c
+++ b/gas/read.c
@@ -2201,22 +2201,32 @@ s_fill (int ignore ATTRIBUTE_UNUSED)
as_warn (_("repeat < 0; .fill ignored"));
size = 0;
}
-
- if (size && !need_pass_2)
+ else if (size && !need_pass_2)
{
- if (now_seg == absolute_section)
+ if (now_seg == absolute_section && rep_exp.X_op != O_constant)
{
- if (rep_exp.X_op != O_constant)
- as_bad (_("non-constant fill count for absolute section"));
- else if (fill && rep_exp.X_add_number != 0)
- as_bad (_("attempt to fill absolute section with non-zero value"));
- abs_section_offset += rep_exp.X_add_number * size;
+ as_bad (_("non-constant fill count for absolute section"));
+ size = 0;
+ }
+ else if (now_seg == absolute_section && fill && rep_exp.X_add_number != 0)
+ {
+ as_bad (_("attempt to fill absolute section with non-zero value"));
+ size = 0;
}
else if (fill
&& (rep_exp.X_op != O_constant || rep_exp.X_add_number != 0)
&& in_bss ())
- as_bad (_("attempt to fill section `%s' with non-zero value"),
- segment_name (now_seg));
+ {
+ as_bad (_("attempt to fill section `%s' with non-zero value"),
+ segment_name (now_seg));
+ size = 0;
+ }
+ }
+
+ if (size && !need_pass_2)
+ {
+ if (now_seg == absolute_section)
+ abs_section_offset += rep_exp.X_add_number * size;
if (rep_exp.X_op == O_constant)
{