From d18d199917337537713f9fc4b7ae4d6568f740cf Mon Sep 17 00:00:00 2001 From: Christian Eggers Date: Sun, 10 Mar 2019 19:21:53 +0100 Subject: [PATCH] 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. --- gas/ChangeLog | 11 +++++++++++ gas/symbols.c | 36 +++++++++++++++++++++++++++++++++++- gas/symbols.h | 3 +++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 174ff541247..274516cfd41 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,14 @@ +2019-03-13 Christian Eggers + + * 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 * dwarf2dbg.c (dwarf2_emit_insn): Fix calculation of line info offset. diff --git a/gas/symbols.c b/gas/symbols.c index b12ab74efd8..d8a9c9244c0 100644 --- a/gas/symbols.c +++ b/gas/symbols.c @@ -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. */ diff --git a/gas/symbols.h b/gas/symbols.h index 38ae3ac47b5..f8429d97300 100644 --- a/gas/symbols.h +++ b/gas/symbols.h @@ -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 *); -- 2.30.2