diff options
author | Alan Modra <amodra@gmail.com> | 2023-03-10 10:05:44 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2023-03-10 14:20:54 +1030 |
commit | 4148b4fe9fd15607aad8b082c7b724f355f2da64 (patch) | |
tree | 76ff795e3b90fd5ac7f9d57c584cae46ee376602 /gas/ehopt.c | |
parent | 8325b42c4b29c5ac06026ca6e4c541067382549b (diff) | |
download | fsf-binutils-gdb-4148b4fe9fd15607aad8b082c7b724f355f2da64.zip fsf-binutils-gdb-4148b4fe9fd15607aad8b082c7b724f355f2da64.tar.gz fsf-binutils-gdb-4148b4fe9fd15607aad8b082c7b724f355f2da64.tar.bz2 |
eh static data
Fix another case of oss-fuzz tripping over gas static state,
ie. starting over testing another input file with rubbish left
uncleared in bss. size_end_sym pointed at garbage.
* ehopt.c (get_cie_info): Delete forward declaration.
(struct frame_data): Move to file scope.
(frame): New static, packaged..
(check_eh_frame): ..eh_frame_data and debug_frame_data.
(eh_begin): New function.
* as.c (gas_init): Call eh_begin.
* as.h (eh_begin): Declare.
Diffstat (limited to 'gas/ehopt.c')
-rw-r--r-- | gas/ehopt.c | 50 |
1 files changed, 29 insertions, 21 deletions
diff --git a/gas/ehopt.c b/gas/ehopt.c index 268554d..feea61b 100644 --- a/gas/ehopt.c +++ b/gas/ehopt.c @@ -94,8 +94,6 @@ struct cie_info int z_augmentation; }; -static int get_cie_info (struct cie_info *); - /* Extract information from the CIE. */ static int @@ -238,6 +236,27 @@ enum frame_state state_error, }; +struct frame_data +{ + enum frame_state state; + + int cie_info_ok; + struct cie_info cie_info; + + symbolS *size_end_sym; + fragS *loc4_frag; + int loc4_fix; + + int aug_size; + int aug_shift; +}; + +static struct eh_state +{ + struct frame_data eh_data; + struct frame_data debug_data; +} frame; + /* This function is called from emit_expr. It looks for cases which we can optimize. @@ -254,23 +273,6 @@ enum frame_state int check_eh_frame (expressionS *exp, unsigned int *pnbytes) { - struct frame_data - { - enum frame_state state; - - int cie_info_ok; - struct cie_info cie_info; - - symbolS *size_end_sym; - fragS *loc4_frag; - int loc4_fix; - - int aug_size; - int aug_shift; - }; - - static struct frame_data eh_frame_data; - static struct frame_data debug_frame_data; struct frame_data *d; /* Don't optimize. */ @@ -285,9 +287,9 @@ check_eh_frame (expressionS *exp, unsigned int *pnbytes) /* Select the proper section data. */ if (startswith (segment_name (now_seg), ".eh_frame") && segment_name (now_seg)[9] != '_') - d = &eh_frame_data; + d = &frame.eh_data; else if (startswith (segment_name (now_seg), ".debug_frame")) - d = &debug_frame_data; + d = &frame.debug_data; else return 0; @@ -570,3 +572,9 @@ eh_frame_convert_frag (fragS *frag) frag->fr_subtype = 0; frag->fr_offset = 0; } + +void +eh_begin (void) +{ + memset (&frame, 0, sizeof (frame)); +} |