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