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.
This commit is contained in:
Alan Modra
2023-03-10 10:05:44 +10:30
parent 8325b42c4b
commit 4148b4fe9f
3 changed files with 31 additions and 21 deletions

View File

@@ -1328,6 +1328,7 @@ gas_init (void)
read_begin (); read_begin ();
input_scrub_begin (); input_scrub_begin ();
expr_begin (); expr_begin ();
eh_begin ();
int macro_strip_at = 0; int macro_strip_at = 0;
#ifdef TC_I960 #ifdef TC_I960

View File

@@ -538,6 +538,7 @@ int check_eh_frame (struct expressionS *, unsigned int *);
int eh_frame_estimate_size_before_relax (fragS *); int eh_frame_estimate_size_before_relax (fragS *);
int eh_frame_relax_frag (fragS *); int eh_frame_relax_frag (fragS *);
void eh_frame_convert_frag (fragS *); void eh_frame_convert_frag (fragS *);
void eh_begin (void);
int generic_force_reloc (struct fix *); int generic_force_reloc (struct fix *);
/* SFrame FRE optimization. */ /* SFrame FRE optimization. */

View File

@@ -94,8 +94,6 @@ struct cie_info
int z_augmentation; int z_augmentation;
}; };
static int get_cie_info (struct cie_info *);
/* Extract information from the CIE. */ /* Extract information from the CIE. */
static int static int
@@ -238,6 +236,27 @@ enum frame_state
state_error, 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 /* This function is called from emit_expr. It looks for cases which
we can optimize. we can optimize.
@@ -254,23 +273,6 @@ enum frame_state
int int
check_eh_frame (expressionS *exp, unsigned int *pnbytes) 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; struct frame_data *d;
/* Don't optimize. */ /* Don't optimize. */
@@ -285,9 +287,9 @@ check_eh_frame (expressionS *exp, unsigned int *pnbytes)
/* Select the proper section data. */ /* Select the proper section data. */
if (startswith (segment_name (now_seg), ".eh_frame") if (startswith (segment_name (now_seg), ".eh_frame")
&& segment_name (now_seg)[9] != '_') && segment_name (now_seg)[9] != '_')
d = &eh_frame_data; d = &frame.eh_data;
else if (startswith (segment_name (now_seg), ".debug_frame")) else if (startswith (segment_name (now_seg), ".debug_frame"))
d = &debug_frame_data; d = &frame.debug_data;
else else
return 0; return 0;
@@ -570,3 +572,9 @@ eh_frame_convert_frag (fragS *frag)
frag->fr_subtype = 0; frag->fr_subtype = 0;
frag->fr_offset = 0; frag->fr_offset = 0;
} }
void
eh_begin (void)
{
memset (&frame, 0, sizeof (frame));
}