Symbols with octets value
Up to now, all symbol values are in units of bytes, where a "byte" can consist of one or more octets (e.g. 8 bit or 16 bit). Allow to specfiy that the "unit" of a newly created symbol is octets (exactly 8 bit), instead of bytes. * symbols.h (symbol_temp_new_now_octets): Declare. (symbol_set_value_now_octets, symbol_octets_p): Declare. * symbols.c (struct symbol_flags): New member sy_octets. (symbol_temp_new_now_octets): New function. (resolve_symbol_value): Return octets instead of bytes if sy_octets is set. (symbol_set_value_now_octets): New function. (symbol_octets_p): New function.
This commit is contained in:
parent
71250b94dc
commit
d18d199917
@ -1,3 +1,14 @@
|
||||
2019-03-13 Christian Eggers <ceggers@gmx.de>
|
||||
|
||||
* symbols.h (symbol_temp_new_now_octets): Declare.
|
||||
(symbol_set_value_now_octets, symbol_octets_p): Declare.
|
||||
* symbols.c (struct symbol_flags): New member sy_octets.
|
||||
(symbol_temp_new_now_octets): New function.
|
||||
(resolve_symbol_value): Return octets instead of bytes if
|
||||
sy_octets is set.
|
||||
(symbol_set_value_now_octets): New function.
|
||||
(symbol_octets_p): New function.
|
||||
|
||||
2019-03-13 Christian Eggers <ceggers@gmx.de>
|
||||
|
||||
* dwarf2dbg.c (dwarf2_emit_insn): Fix calculation of line info offset.
|
||||
|
@ -73,6 +73,10 @@ struct symbol_flags
|
||||
before. It is cleared as soon as any direct reference to the
|
||||
symbol is present. */
|
||||
unsigned int sy_weakrefd : 1;
|
||||
|
||||
/* This if set if the unit of the symbol value is "octets" instead
|
||||
of "bytes". */
|
||||
unsigned int sy_octets : 1;
|
||||
};
|
||||
|
||||
/* The information we keep for a symbol. Note that the symbol table
|
||||
@ -843,6 +847,14 @@ symbol_temp_new_now (void)
|
||||
return symbol_temp_new (now_seg, frag_now_fix (), frag_now);
|
||||
}
|
||||
|
||||
symbolS *
|
||||
symbol_temp_new_now_octets (void)
|
||||
{
|
||||
symbolS * symb = symbol_temp_new (now_seg, frag_now_fix_octets (), frag_now);
|
||||
symb->sy_flags.sy_octets = 1;
|
||||
return symb;
|
||||
}
|
||||
|
||||
symbolS *
|
||||
symbol_temp_make (void)
|
||||
{
|
||||
@ -1324,7 +1336,10 @@ resolve_symbol_value (symbolS *symp)
|
||||
/* Fall through. */
|
||||
|
||||
case O_constant:
|
||||
final_val += symp->sy_frag->fr_address / OCTETS_PER_BYTE;
|
||||
if (symp->sy_flags.sy_octets)
|
||||
final_val += symp->sy_frag->fr_address;
|
||||
else
|
||||
final_val += symp->sy_frag->fr_address / OCTETS_PER_BYTE;
|
||||
if (final_seg == expr_section)
|
||||
final_seg = absolute_section;
|
||||
/* Fall through. */
|
||||
@ -2650,6 +2665,18 @@ symbol_set_value_now (symbolS *sym)
|
||||
symbol_set_frag (sym, frag_now);
|
||||
}
|
||||
|
||||
/* Set the value of SYM to the current position in the current segment,
|
||||
in octets. */
|
||||
|
||||
void
|
||||
symbol_set_value_now_octets (symbolS *sym)
|
||||
{
|
||||
S_SET_SEGMENT (sym, now_seg);
|
||||
S_SET_VALUE (sym, frag_now_fix_octets ());
|
||||
symbol_set_frag (sym, frag_now);
|
||||
sym->sy_flags.sy_octets = 1;
|
||||
}
|
||||
|
||||
/* Set the frag of a symbol. */
|
||||
|
||||
void
|
||||
@ -2921,6 +2948,13 @@ symbol_set_bfdsym (symbolS *s, asymbol *bsym)
|
||||
/* else XXX - What do we do now ? */
|
||||
}
|
||||
|
||||
/* Return whether symbol unit is "octets" (instead of "bytes"). */
|
||||
|
||||
int symbol_octets_p (symbolS *s)
|
||||
{
|
||||
return s->sy_flags.sy_octets;
|
||||
}
|
||||
|
||||
#ifdef OBJ_SYMFIELD_TYPE
|
||||
|
||||
/* Get a pointer to the object format information for a symbol. */
|
||||
|
@ -57,6 +57,7 @@ symbolS *symbol_clone_if_forward_ref (symbolS *, int);
|
||||
#define symbol_clone_if_forward_ref(s) symbol_clone_if_forward_ref (s, 0)
|
||||
symbolS *symbol_temp_new (segT, valueT, fragS *);
|
||||
symbolS *symbol_temp_new_now (void);
|
||||
symbolS *symbol_temp_new_now_octets (void);
|
||||
symbolS *symbol_temp_make (void);
|
||||
|
||||
symbolS *colon (const char *sym_name);
|
||||
@ -181,6 +182,7 @@ extern expressionS *symbol_get_value_expression (symbolS *);
|
||||
extern void symbol_set_value_expression (symbolS *, const expressionS *);
|
||||
extern offsetT *symbol_X_add_number (symbolS *);
|
||||
extern void symbol_set_value_now (symbolS *);
|
||||
extern void symbol_set_value_now_octets (symbolS *);
|
||||
extern void symbol_set_frag (symbolS *, fragS *);
|
||||
extern fragS *symbol_get_frag (symbolS *);
|
||||
extern void symbol_mark_used (symbolS *);
|
||||
@ -206,6 +208,7 @@ extern symbolS *symbol_symbolS (symbolS *);
|
||||
extern asymbol *symbol_get_bfdsym (symbolS *);
|
||||
extern void symbol_set_bfdsym (symbolS *, asymbol *);
|
||||
extern int symbol_same_p (symbolS *, symbolS *);
|
||||
extern int symbol_octets_p (symbolS *);
|
||||
|
||||
#ifdef OBJ_SYMFIELD_TYPE
|
||||
OBJ_SYMFIELD_TYPE *symbol_get_obj (symbolS *);
|
||||
|
Loading…
x
Reference in New Issue
Block a user