1 // attributes.h -- object attributes for gold   -*- C++ -*-
2 
3 // Copyright (C) 2009-2016 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 
Object_attribute()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.
Object_attribute(const Object_attribute & oa)82   Object_attribute(const Object_attribute& oa)
83    : type_(oa.type_), int_value_(oa.int_value_), string_value_(oa.string_value_)
84   { }
85 
~Object_attribute()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
type()101   type() const
102   { return this->type_; }
103 
104   // Set attribute type.
105   void
set_type(int type)106   set_type(int type)
107   { this->type_ = type; }
108 
109   // Return integer value.
110   unsigned int
int_value()111   int_value() const
112   { return this->int_value_; }
113 
114   // Set integer value.
115   void
set_int_value(unsigned int i)116   set_int_value(unsigned int i)
117   { this->int_value_ = i; }
118 
119   // Return string value.
120   const std::string&
string_value()121   string_value() const
122   { return this->string_value_; }
123 
124   // Set string value.
125   void
set_string_value(const std::string & s)126   set_string_value(const std::string& s)
127   { this->string_value_ = s; }
128 
129   void
set_string_value(const char * s)130   set_string_value(const char* s)
131   { this->string_value_ = s; }
132 
133   // Whether attribute type has integer value.
134   static bool
attribute_type_has_int_value(int type)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
attribute_type_has_string_value(int type)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
attribute_type_has_no_default(int type)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
arg_type(int vendor,int tag)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
gnu_arg_type(int tag)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 
Vendor_object_attributes(int vendor)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 
~Vendor_object_attributes()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*
name()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*
known_attributes()242   known_attributes()
243   { return &this->known_attributes_[0]; }
244 
245   const Object_attribute*
known_attributes()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*
other_attributes()253   other_attributes()
254   { return &this->other_attributes_; }
255 
256   const Other_attributes*
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.
Attributes_section_data(const Attributes_section_data & asd)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 
~Attributes_section_data()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*
known_attributes(int vendor)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*
known_attributes(int vendor)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*
other_attributes(int vendor)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*
other_attributes(int vendor)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*
get_attribute(int vendor,int tag)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*
get_attribute(int vendor,int tag)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:
Output_attributes_section_data(const Attributes_section_data & asd)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
do_print_to_mapfile(Mapfile * mapfile)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
set_final_data_size()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)
412