mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-05 15:15:42 +00:00
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:
1
gas/as.c
1
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
|
||||
|
||||
1
gas/as.h
1
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. */
|
||||
|
||||
50
gas/ehopt.c
50
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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user