1// attributes.h -- object attributes for gold   -*- C++ -*-
2
3// Copyright (C) 2009-2017 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
36namespace gold
37{
38
39// Object attribute values.  The attribute tag is not stored in this object.
40
41class 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
206class 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
287class 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
382class 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)
412