diff options
Diffstat (limited to 'gas/symbols.c')
-rw-r--r-- | gas/symbols.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/gas/symbols.c b/gas/symbols.c index b12ab74..d8a9c92 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 @@ -844,6 +848,14 @@ symbol_temp_new_now (void) } 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) { return symbol_make (FAKE_LABEL_NAME); @@ -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. */ |