(root)/
binutils-2.41/
gold/
attributes.h
       1  // attributes.h -- object attributes for gold   -*- C++ -*-
       2  
       3  // Copyright (C) 2009-2023 Free Software Foundation, Inc.
       4  // Written by Doug Kwan <dougkwan@google.com>.
       5  // This file contains code adapted from BFD.
       6  
       7  // This file is part of gold.
       8  
       9  // This program is free software; you can redistribute it and/or modify
      10  // it under the terms of the GNU General Public License as published by
      11  // the Free Software Foundation; either version 3 of the License, or
      12  // (at your option) any later version.
      13  
      14  // This program is distributed in the hope that it will be useful,
      15  // but WITHOUT ANY WARRANTY; without even the implied warranty of
      16  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      17  // GNU General Public License for more details.
      18  
      19  // You should have received a copy of the GNU General Public License
      20  // along with this program; if not, write to the Free Software
      21  // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
      22  // MA 02110-1301, USA.
      23  
      24  // Handle object attributes.
      25  
      26  #ifndef GOLD_ATTRIBUTES_H
      27  #define GOLD_ATTRIBUTES_H
      28  
      29  #include <map>
      30  
      31  #include "parameters.h"
      32  #include "target.h"
      33  #include "output.h"
      34  #include "reduced_debug_output.h"
      35  
      36  namespace gold
      37  {
      38  
      39  // Object attribute values.  The attribute tag is not stored in this object.
      40  
      41  class Object_attribute
      42  {
      43   public:
      44    // The value of an object attribute.  The type indicates whether the
      45    // attribute holds and integer, a string, or both.  It can also indicate that
      46    // there can be no default (i.e. all values must be written to file, even
      47    // zero).
      48    enum
      49    {
      50      ATTR_TYPE_FLAG_INT_VAL = (1 << 0),
      51      ATTR_TYPE_FLAG_STR_VAL = (1 << 1),
      52      ATTR_TYPE_FLAG_NO_DEFAULT = (1 << 2)
      53    };
      54  
      55    // Object attributes may either be defined by the processor ABI, index
      56    // OBJ_ATTR_PROC in the *_obj_attributes arrays, or be GNU-specific
      57    // (and possibly also processor-specific), index OBJ_ATTR_GNU.
      58    enum
      59    {
      60      OBJ_ATTR_PROC,
      61      OBJ_ATTR_GNU,
      62      OBJ_ATTR_FIRST = OBJ_ATTR_PROC,
      63      OBJ_ATTR_LAST = OBJ_ATTR_GNU
      64    };
      65  
      66    // The following object attribute tags are taken as generic, for all
      67    // targets and for "gnu" where there is no target standard. 
      68    enum
      69    {
      70      Tag_NULL = 0,
      71      Tag_File = 1,
      72      Tag_Section = 2,
      73      Tag_Symbol = 3,
      74      Tag_compatibility = 32
      75    };
      76  
      77    Object_attribute()
      78     : type_(0), int_value_(0), string_value_()
      79    { }
      80  
      81    // Copying constructor.  We need to implement this to copy the string value.
      82    Object_attribute(const Object_attribute& oa)
      83     : type_(oa.type_), int_value_(oa.int_value_), string_value_(oa.string_value_)
      84    { }
      85  
      86    ~Object_attribute()
      87    { }
      88  
      89    // Assignment operator.  We need to implement this to copy the string value.
      90    Object_attribute&
      91    operator=(const Object_attribute& source)
      92    {
      93      this->type_ = source.type_;
      94      this->int_value_ = source.int_value_;
      95      this->string_value_ = source.string_value_;
      96      return *this;
      97    }
      98  
      99    // Return attribute type.
     100    int
     101    type() const
     102    { return this->type_; }
     103  
     104    // Set attribute type.
     105    void
     106    set_type(int type)
     107    { this->type_ = type; }
     108  
     109    // Return integer value.
     110    unsigned int
     111    int_value() const
     112    { return this->int_value_; }
     113  
     114    // Set integer value.
     115    void
     116    set_int_value(unsigned int i)
     117    { this->int_value_ = i; }
     118  
     119    // Return string value.
     120    const std::string&
     121    string_value() const
     122    { return this->string_value_; }
     123  
     124    // Set string value.
     125    void
     126    set_string_value(const std::string& s)
     127    { this->string_value_ = s; }
     128  
     129    void
     130    set_string_value(const char* s)
     131    { this->string_value_ = s; }
     132  
     133    // Whether attribute type has integer value.
     134    static bool
     135    attribute_type_has_int_value(int type)
     136    { return (type & ATTR_TYPE_FLAG_INT_VAL) != 0; }
     137  
     138    // Whether attribute type has string value.
     139    static bool
     140    attribute_type_has_string_value(int type)
     141    { return (type & ATTR_TYPE_FLAG_STR_VAL) != 0; }
     142  
     143    // Whether attribute type has no default value.
     144    static bool
     145    attribute_type_has_no_default(int type)
     146    { return (type & ATTR_TYPE_FLAG_NO_DEFAULT) != 0; }
     147  
     148    // Whether this has default value (0/"").
     149    bool
     150    is_default_attribute() const;
     151  
     152    // Return ULEB128 encoded size of tag and attribute.  
     153    size_t
     154    size(int tag) const;
     155  
     156    // Whether this matches another object attribute in merging.
     157    bool
     158    matches(const Object_attribute& oa) const;
     159    
     160    // Write to attribute with tag to BUFFER.
     161    void
     162    write(int tag, std::vector<unsigned char>* buffer) const;
     163  
     164    // Determine what arguments an attribute tag takes.
     165    static int
     166    arg_type(int vendor, int tag)
     167    {
     168      switch (vendor)
     169        {
     170        case OBJ_ATTR_PROC:
     171  	return parameters->target().attribute_arg_type(tag);
     172        case OBJ_ATTR_GNU:
     173  	return Object_attribute::gnu_arg_type(tag);
     174        default:
     175  	gold_unreachable();
     176       }
     177    }
     178  
     179   private:
     180    // Determine whether a GNU object attribute tag takes an integer, a
     181    // string or both.  */
     182    static int
     183    gnu_arg_type(int tag)
     184    {
     185      // Except for Tag_compatibility, for GNU attributes we follow the
     186      // same rule ARM ones > 32 follow: odd-numbered tags take strings
     187      // and even-numbered tags take integers.  In addition, tag & 2 is
     188      // nonzero for architecture-independent tags and zero for
     189      // architecture-dependent ones.
     190      if (tag == Object_attribute::Tag_compatibility)
     191        return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL;
     192      else
     193        return (tag & 1) != 0 ? ATTR_TYPE_FLAG_STR_VAL : ATTR_TYPE_FLAG_INT_VAL;
     194    }
     195  
     196    // Attribute type.
     197    int type_;
     198    // Integer value.
     199    int int_value_;
     200    // String value.
     201    std::string string_value_;
     202  };
     203  
     204  // This class contains attributes of a particular vendor.
     205  
     206  class Vendor_object_attributes
     207  {
     208   public:
     209    // The maximum number of known object attributes for any target.
     210    static const int NUM_KNOWN_ATTRIBUTES = 71;
     211  
     212    Vendor_object_attributes(int vendor)
     213      : vendor_(vendor), other_attributes_() 
     214    { }
     215  
     216    // Copying constructor.
     217    Vendor_object_attributes(const Vendor_object_attributes&);
     218  
     219    ~Vendor_object_attributes()
     220    {
     221      for (Other_attributes::iterator p = this->other_attributes_.begin();
     222  	 p != this->other_attributes_.end();
     223  	 ++p)
     224        delete p->second;
     225    }
     226  
     227    // Size of this in number of bytes.
     228    size_t
     229    size() const;
     230    
     231    // Name of this written vendor subsection.
     232    const char*
     233    name() const
     234    {
     235      return (this->vendor_ == Object_attribute::OBJ_ATTR_PROC
     236  	    ? parameters->target().attributes_vendor()
     237  	    : "gnu");
     238    }
     239  
     240    // Return an array of known attributes.
     241    Object_attribute*
     242    known_attributes()
     243    { return &this->known_attributes_[0]; }
     244  
     245    const Object_attribute*
     246    known_attributes() const
     247    { return &this->known_attributes_[0]; }
     248  
     249    typedef std::map<int, Object_attribute*> Other_attributes;
     250  
     251    // Return attributes other than the known ones.
     252    Other_attributes*
     253    other_attributes()
     254    { return &this->other_attributes_; }
     255  
     256    const Other_attributes*
     257    other_attributes() const
     258    { return &this->other_attributes_; }
     259  
     260    // Return a new attribute associated with TAG.
     261    Object_attribute*
     262    new_attribute(int tag);
     263  
     264    // Get an attribute
     265    Object_attribute*
     266    get_attribute(int tag);
     267  
     268    const Object_attribute*
     269    get_attribute(int tag) const;
     270  
     271    // Write to BUFFER.
     272    void
     273    write(std::vector<unsigned char>* buffer) const;
     274  
     275   private:
     276    // Vendor of the object attributes.
     277    int vendor_;
     278    // Attributes with known tags.  There are store in an array for fast
     279    // access.
     280    Object_attribute known_attributes_[NUM_KNOWN_ATTRIBUTES];
     281    // Attributes with known tags.  There are stored in a sorted container.
     282    Other_attributes other_attributes_;
     283  };
     284  
     285  // This class contains contents of an attributes section.
     286  
     287  class Attributes_section_data
     288  {
     289   public:
     290    // Construct an Attributes_section_data object by parsing section contents
     291    // in VIEW of SIZE.
     292    Attributes_section_data(const unsigned char* view, section_size_type size);
     293  
     294    // Copying constructor.
     295    Attributes_section_data(const Attributes_section_data& asd)
     296    {
     297      for (int vendor = Object_attribute::OBJ_ATTR_FIRST;
     298  	 vendor <= Object_attribute::OBJ_ATTR_LAST;
     299  	 ++vendor)
     300        this->vendor_object_attributes_[vendor] =
     301  	new Vendor_object_attributes(*asd.vendor_object_attributes_[vendor]);
     302    }
     303    
     304    ~Attributes_section_data()
     305    {
     306      for (int vendor = Object_attribute::OBJ_ATTR_FIRST;
     307  	 vendor <= Object_attribute::OBJ_ATTR_LAST;
     308  	 ++vendor)
     309        delete this->vendor_object_attributes_[vendor];
     310    }
     311   
     312    // Return the size of this as number of bytes.
     313    size_t
     314    size() const;
     315  
     316    // Return an array of known attributes.
     317    Object_attribute*
     318    known_attributes(int vendor)
     319    {
     320      gold_assert(vendor >= OBJ_ATTR_FIRST && vendor <= OBJ_ATTR_LAST);
     321      return this->vendor_object_attributes_[vendor]->known_attributes();
     322    }
     323  
     324    const Object_attribute*
     325    known_attributes(int vendor) const
     326    {
     327      gold_assert(vendor >= OBJ_ATTR_FIRST && vendor <= OBJ_ATTR_LAST);
     328      return this->vendor_object_attributes_[vendor]->known_attributes();
     329    }
     330  
     331    // Return the other attributes.
     332    Vendor_object_attributes::Other_attributes*
     333    other_attributes(int vendor)
     334    {
     335      gold_assert(vendor >= OBJ_ATTR_FIRST && vendor <= OBJ_ATTR_LAST);
     336      return this->vendor_object_attributes_[vendor]->other_attributes();
     337    }
     338  
     339    // Return the other attributes.
     340    const Vendor_object_attributes::Other_attributes*
     341    other_attributes(int vendor) const
     342    {
     343      gold_assert(vendor >= OBJ_ATTR_FIRST && vendor <= OBJ_ATTR_LAST);
     344      return this->vendor_object_attributes_[vendor]->other_attributes();
     345    }
     346  
     347    // Return an attribute.
     348    Object_attribute*
     349    get_attribute(int vendor, int tag)
     350    {
     351      gold_assert(vendor >= OBJ_ATTR_FIRST && vendor <= OBJ_ATTR_LAST);
     352      return this->vendor_object_attributes_[vendor]->get_attribute(tag);
     353    }
     354    
     355    const Object_attribute*
     356    get_attribute(int vendor, int tag) const
     357    {
     358      gold_assert(vendor >= OBJ_ATTR_FIRST && vendor <= OBJ_ATTR_LAST);
     359      return this->vendor_object_attributes_[vendor]->get_attribute(tag);
     360    }
     361    
     362    // Merge target-independent attributes from another Attributes_section_data
     363    // of an object called NAME.
     364    void
     365    merge(const char* name, const Attributes_section_data* pasd);
     366  
     367    // Write to byte stream in an unsigned char vector.
     368    void
     369    write(std::vector<unsigned char>*) const;
     370  
     371   private:
     372    // For convenience.
     373    static const int OBJ_ATTR_FIRST = Object_attribute::OBJ_ATTR_FIRST;
     374    static const int OBJ_ATTR_LAST = Object_attribute::OBJ_ATTR_LAST;
     375  
     376    // Vendor object attributes.
     377    Vendor_object_attributes* vendor_object_attributes_[OBJ_ATTR_LAST+1];
     378  };
     379  
     380  // This class is used for writing out an Attribute_section_data.
     381  
     382  class Output_attributes_section_data : public Output_section_data
     383  {
     384   public:
     385    Output_attributes_section_data(const Attributes_section_data& asd)
     386      : Output_section_data(1), attributes_section_data_(asd)
     387    { }
     388  
     389   protected:
     390    // Write to a map file.
     391    void
     392    do_print_to_mapfile(Mapfile* mapfile) const
     393    { mapfile->print_output_data(this, _("** attributes")); }
     394  
     395    // Write the data to the output file.
     396    void
     397    do_write(Output_file*);
     398    
     399    // Set final data size.
     400    void
     401    set_final_data_size()
     402    { this->set_data_size(attributes_section_data_.size()); }
     403  
     404   private:
     405    // Attributes_section_data corresponding to this.
     406    const Attributes_section_data& attributes_section_data_;
     407  };
     408  
     409  } // End namespace gold.
     410  
     411  #endif	// !defined(GOLD_ATTRIBUTES_H)