From 4148b4fe9fd15607aad8b082c7b724f355f2da64 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 10 Mar 2023 10:05:44 +1030 Subject: [PATCH] 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. --- gas/as.c | 1 + gas/as.h | 1 + gas/ehopt.c | 50 +++++++++++++++++++++++++++++--------------------- 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/gas/as.c b/gas/as.c index 62f32fc865a..a18438c2542 100644 --- a/gas/as.c +++ b/gas/as.c @@ -1328,6 +1328,7 @@ gas_init (void) read_begin (); input_scrub_begin (); expr_begin (); + eh_begin (); int macro_strip_at = 0; #ifdef TC_I960 diff --git a/gas/as.h b/gas/as.h index 4c5fa9ecf7d..4d3a71410ff 100644 --- a/gas/as.h +++ b/gas/as.h @@ -538,6 +538,7 @@ int check_eh_frame (struct expressionS *, unsigned int *); int eh_frame_estimate_size_before_relax (fragS *); int eh_frame_relax_frag (fragS *); void eh_frame_convert_frag (fragS *); +void eh_begin (void); int generic_force_reloc (struct fix *); /* SFrame FRE optimization. */ diff --git a/gas/ehopt.c b/gas/ehopt.c index 268554d89a7..feea61b9223 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)); +} -- 2.30.2