X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fstruc-symbol.h;h=201671346c5bc7c26c4abee8de4e4cec3d07e53e;hb=73b090a922a5f43931f0ec10b1b1b9507c819ebf;hp=2326ee4f06fb9bd968fc70b73261472c831851e7;hpb=9497f5ac6bc10bdd65ea471787619bde1edca77d;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/struc-symbol.h b/gas/struc-symbol.h index 2326ee4f06..201671346c 100644 --- a/gas/struc-symbol.h +++ b/gas/struc-symbol.h @@ -1,12 +1,11 @@ /* struct_symbol.h - Internal symbol structure - Copyright 1987, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2005 - Free Software Foundation, Inc. + Copyright (C) 1987-2016 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. GAS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) + the Free Software Foundation; either version 3, or (at your option) any later version. GAS is distributed in the hope that it will be useful, @@ -22,33 +21,22 @@ #ifndef __struc_symbol_h__ #define __struc_symbol_h__ -/* The information we keep for a symbol. Note that the symbol table - holds pointers both to this and to local_symbol structures. See - below. */ - -struct symbol +struct symbol_flags { - /* BFD symbol */ - asymbol *bsym; - - /* The value of the symbol. */ - expressionS sy_value; - - /* Forwards and (optionally) backwards chain pointers. */ - struct symbol *sy_next; - struct symbol *sy_previous; + /* Wether the symbol is a local_symbol. */ + unsigned int sy_local_symbol : 1; - /* Pointer to the frag this symbol is attached to, if any. - Otherwise, NULL. */ - struct frag *sy_frag; + /* Wether symbol has been written. */ + unsigned int sy_written : 1; - unsigned int written : 1; /* Whether symbol value has been completely resolved (used during final pass over symbol table). */ unsigned int sy_resolved : 1; + /* Whether the symbol value is currently being resolved (used to detect loops in symbol dependencies). */ unsigned int sy_resolving : 1; + /* Whether the symbol value is used in a reloc. This is used to ensure that symbols used in relocs are written out, even if they are local and would otherwise not be. */ @@ -72,6 +60,39 @@ struct symbol routines. */ unsigned int sy_mri_common : 1; + /* This is set if the symbol is set with a .weakref directive. */ + unsigned int sy_weakrefr : 1; + + /* This is set when the symbol is referenced as part of a .weakref + directive, but only if the symbol was not in the symbol table + before. It is cleared as soon as any direct reference to the + symbol is present. */ + unsigned int sy_weakrefd : 1; +}; + +/* The information we keep for a symbol. Note that the symbol table + holds pointers both to this and to local_symbol structures. See + below. */ + +struct symbol +{ + /* Symbol flags. */ + struct symbol_flags sy_flags; + + /* BFD symbol */ + asymbol *bsym; + + /* The value of the symbol. */ + expressionS sy_value; + + /* Forwards and (optionally) backwards chain pointers. */ + struct symbol *sy_next; + struct symbol *sy_previous; + + /* Pointer to the frag this symbol is attached to, if any. + Otherwise, NULL. */ + struct frag *sy_frag; + #ifdef OBJ_SYMFIELD_TYPE OBJ_SYMFIELD_TYPE sy_obj; #endif @@ -98,9 +119,8 @@ struct symbol struct local_symbol { - /* This pointer is always NULL to indicate that this is a local - symbol. */ - asymbol *lsy_marker; + /* Symbol flags. Only sy_local_symbol and sy_resolved are relevant. */ + struct symbol_flags lsy_flags; /* The symbol section. This also serves as a flag. If this is reg_section, then this symbol has been converted into a regular @@ -111,8 +131,7 @@ struct local_symbol const char *lsy_name; /* The symbol frag or the real symbol, depending upon the value in - lsy_section. If the symbol has been fully resolved, lsy_frag is - set to NULL. */ + lsy_section. */ union { fragS *lsy_frag; @@ -129,8 +148,8 @@ struct local_symbol #define local_symbol_converted_p(l) ((l)->lsy_section == reg_section) #define local_symbol_mark_converted(l) ((l)->lsy_section = reg_section) -#define local_symbol_resolved_p(l) ((l)->u.lsy_frag == NULL) -#define local_symbol_mark_resolved(l) ((l)->u.lsy_frag = NULL) +#define local_symbol_resolved_p(l) ((l)->lsy_flags.sy_resolved) +#define local_symbol_mark_resolved(l) ((l)->lsy_flags.sy_resolved = 1) #define local_symbol_get_frag(l) ((l)->u.lsy_frag) #define local_symbol_set_frag(l, f) ((l)->u.lsy_frag = (f)) #define local_symbol_get_real_symbol(l) ((l)->u.lsy_sym)