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 ();
|
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
|
||||||
|
|||||||
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_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. */
|
||||||
|
|||||||
50
gas/ehopt.c
50
gas/ehopt.c
@@ -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));
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user