This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Symbols with octets value


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=d18d199917337537713f9fc4b7ae4d6568f740cf

commit d18d199917337537713f9fc4b7ae4d6568f740cf
Author: Christian Eggers <ceggers@gmx.de>
Date:   Sun Mar 10 19:21:53 2019 +0100

    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.

Diff:
---
 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 174ff54..274516c 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,16 @@
 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.
 
 2019-03-12  Andreas Krebbel  <krebbel@linux.ibm.com>
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.  */
diff --git a/gas/symbols.h b/gas/symbols.h
index 38ae3ac..f8429d9 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 *);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]