1 //===- ARMELFAttributeData.h ----------------------------------------------===// 2 // 3 // The MCLinker Project 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 #include "ARMELFAttributeData.h" 10 11 #include <mcld/LinkerConfig.h> 12 #include <mcld/MC/Input.h> 13 #include <mcld/Support/LEB128.h> 14 #include <mcld/Support/MsgHandling.h> 15 16 using namespace mcld; 17 18 const ELFAttributeValue *ARMELFAttributeData::getAttributeValue(TagType pTag) const 19 { 20 if (pTag <= Tag_Max) { 21 const ELFAttributeValue &attr_value = m_Attrs[pTag]; 22 23 if (attr_value.isInitialized()) { 24 return &attr_value; 25 } else { 26 // Don't return uninitialized attribute value. 27 return NULL; 28 } 29 } else { 30 UnknownAttrsMap::const_iterator attr_it = m_UnknownAttrs.find(pTag); 31 32 if (attr_it == m_UnknownAttrs.end()) { 33 return NULL; 34 } else { 35 return &attr_it->second; 36 } 37 } 38 } 39 40 std::pair<ELFAttributeValue*, bool> 41 ARMELFAttributeData::getOrCreateAttributeValue(TagType pTag) 42 { 43 ELFAttributeValue *attr_value = NULL; 44 45 if (pTag <= Tag_Max) { 46 attr_value = &m_Attrs[pTag]; 47 } else { 48 // An unknown tag encounterred. 49 attr_value = &m_UnknownAttrs[pTag]; 50 } 51 52 assert(attr_value != NULL); 53 54 // Setup the value type. 55 if (!attr_value->isUninitialized()) { 56 return std::make_pair(attr_value, false); 57 } else { 58 attr_value->setType(GetAttributeValueType(pTag)); 59 return std::make_pair(attr_value, true); 60 } 61 } 62 63 unsigned int ARMELFAttributeData::GetAttributeValueType(TagType pTag) 64 { 65 // See ARM [ABI-addenda], 2.2.6. 66 switch (pTag) { 67 case Tag_compatibility: { 68 return (ELFAttributeValue::Int | ELFAttributeValue::String); 69 } 70 case Tag_nodefaults: { 71 return (ELFAttributeValue::Int | ELFAttributeValue::NoDefault); 72 } 73 case Tag_CPU_raw_name: 74 case Tag_CPU_name: { 75 return ELFAttributeValue::String; 76 } 77 default: { 78 if (pTag < 32) 79 return ELFAttributeValue::Int; 80 else 81 return ((pTag & 1) ? ELFAttributeValue::String : 82 ELFAttributeValue::Int); 83 } 84 } 85 // unreachable 86 } 87 88 //===--------------------------------------------------------------------===// 89 // Helper Functions for merge() 90 //===--------------------------------------------------------------------===// 91 92 namespace { 93 94 /* 95 * Helper function to decode value in Tag_also_compatible_with. 96 * 97 * @ref ARM [ABI-addenda], 2.3.7.3 98 */ 99 static int 100 decode_secondary_compatibility_attribute(const ELFAttributeValue &pValue) 101 { 102 // The encoding of Tag_also_compatible_with is: 103 // 104 // Tag_also_compatible_with (=65), NTSB: data 105 // 106 // The data can be either an ULEB128-encoded number followed by a NULL byte or 107 // a NULL-terminated string. Currently, only the following byte sequence in 108 // data are currently defined: 109 // 110 // Tag_CPU_arch (=6) [The arch] 0 111 assert((pValue.type() == ELFAttributeValue::String) && 112 "Value of Tag_also_compatible_with must be a string!"); 113 114 const std::string &data = pValue.getStringValue(); 115 116 // Though the integer is in LEB128 format, but they occupy only 1 byte in 117 // currently defined value. 118 if (data.length() < 2) 119 // Must have a byte for Tag_CPU_arch (=6) 120 // a byte for specifying the CPU architecture (CPU_Arch_ARM_*) 121 // 122 // Currently, the 2nd byte can only be v4T (=2) or v6-M (=11). 123 return -1; 124 125 if ((static_cast<uint8_t>(data[0]) == ARMELFAttributeData::Tag_CPU_arch) && 126 ((data[1] == ARMELFAttributeData::CPU_Arch_ARM_V4T) || 127 (data[1] == ARMELFAttributeData::CPU_Arch_ARM_V6_M))) 128 return static_cast<uint32_t>(data[1]); 129 130 // Tag_also_compatible_with can be safely ignored. 131 return -1; 132 } 133 134 /* 135 * This helper array keeps the ordering of the values in attributes such as 136 * Tag_ABI_align_needed which are sored as 1 > 2 > 0. 137 */ 138 static const int value_ordering_120[] = { 0, 2, 1 }; 139 140 } // anonymous namespace 141 142 //===--------------------------------------------------------------------===// 143 // End Helper Functions for merge() 144 //===--------------------------------------------------------------------===// 145 146 bool ARMELFAttributeData::merge(const LinkerConfig& pConfig, 147 const Input &pInput, TagType pTag, 148 const ELFAttributeValue& pInAttr) 149 { 150 // Pre-condition 151 // 1. The out_attr must be initailized and has value of the same type as 152 // pInAttr. 153 // 2. The value helf by out_attr and pInAttr must be different. 154 ELFAttributeValue &out_attr = m_Attrs[pTag]; 155 156 // Attribute in the output must have value assigned. 157 assert(out_attr.isInitialized() && "No output attribute to be merged!"); 158 159 switch (pTag) { 160 case Tag_CPU_arch: { 161 // Need value of Tag_also_compatible_with in the input for merge. 162 if (pInAttr.getIntValue() <= CPU_Arch_Max) { 163 m_CPUArch = pInAttr.getIntValue(); 164 } else { 165 error(diag::error_unknown_cpu_arch) << pInput.name(); 166 return false; 167 } 168 break; 169 } 170 case Tag_CPU_name: { 171 // need value of Tag_CPU_arch in the input for merge 172 m_CPUName = pInAttr.getStringValue(); 173 break; 174 } 175 case Tag_CPU_raw_name: { 176 // need value of Tag_CPU_arch in the input for merge 177 m_CPURawName = pInAttr.getStringValue(); 178 break; 179 } 180 case Tag_FP_arch: { 181 // need value of Tag_HardFP_use in the input for merge 182 m_FPArch = pInAttr.getIntValue(); 183 break; 184 } 185 case Tag_ABI_HardFP_use: { 186 // need value of Tag_FP_arch in the input for merge 187 m_HardFPUse = pInAttr.getIntValue(); 188 break; 189 } 190 case Tag_also_compatible_with: { 191 // need value of Tag_CPU_arch in the input for merge 192 m_SecondaryCPUArch = decode_secondary_compatibility_attribute(pInAttr); 193 break; 194 } 195 case Tag_ABI_VFP_args: { 196 // need value of Tag_ABI_FP_number_model in the input for merge 197 m_VFPArgs = pInAttr.getIntValue(); 198 break; 199 } 200 // The value of these tags are integers and after merge, only the greatest 201 // value held by pInAttr and out_attr goes into output. 202 case Tag_ARM_ISA_use: 203 case Tag_THUMB_ISA_use: 204 case Tag_WMMX_arch: 205 case Tag_Advanced_SIMD_arch: 206 case Tag_ABI_FP_rounding: 207 case Tag_ABI_FP_exceptions: 208 case Tag_ABI_FP_user_exceptions: 209 case Tag_ABI_FP_number_model: 210 case Tag_FP_HP_extension: 211 case Tag_CPU_unaligned_access: 212 case Tag_T2EE_use: { 213 assert((out_attr.type() == ELFAttributeValue::Int) && 214 (pInAttr.type() == ELFAttributeValue::Int) && 215 "should have integer parameeter!"); 216 if (pInAttr.getIntValue() > out_attr.getIntValue()) 217 out_attr.setIntValue(pInAttr.getIntValue()); 218 break; 219 } 220 // The value of these tags are integers and after merge, only the smallest 221 // value held by pInAttr and out_attr goes into output. 222 case Tag_ABI_align_preserved: 223 case Tag_ABI_PCS_RO_data: { 224 assert((out_attr.type() == ELFAttributeValue::Int) && 225 (pInAttr.type() == ELFAttributeValue::Int) && 226 "should have integer parameeter!"); 227 if (pInAttr.getIntValue() < out_attr.getIntValue()) 228 out_attr.setIntValue(pInAttr.getIntValue()); 229 break; 230 } 231 // The values of these attributes are sorted as 1 > 2 > 0. And the greater 232 // value becomes output. 233 case Tag_ABI_align_needed: 234 case Tag_ABI_FP_denormal: 235 case Tag_ABI_PCS_GOT_use: { 236 const int in_val = pInAttr.getIntValue(); 237 const int out_val = out_attr.getIntValue(); 238 239 if (in_val <= 2) { 240 if (out_val <= 2) { 241 // Use value_ordering_120 to determine the ordering. 242 if (value_ordering_120[in_val] > value_ordering_120[out_val]) { 243 out_attr.setIntValue(in_val); 244 } 245 } 246 } else { 247 // input value > 2, for future-proofing 248 if (in_val > out_val) { 249 out_attr.setIntValue(in_val); 250 } 251 } 252 break; 253 } 254 // These tags use the first value ever seen. 255 case Tag_ABI_optimization_goals: 256 case Tag_ABI_FP_optimization_goals: { 257 break; 258 } 259 // Tag_CPU_arch_profile 260 case Tag_CPU_arch_profile: { 261 if (pInAttr.getIntValue() == Arch_Profile_None) 262 return true; 263 264 switch (out_attr.getIntValue()) { 265 case Arch_Profile_None: { 266 out_attr.setIntValue(pInAttr.getIntValue()); 267 break; 268 } 269 case Arch_Profile_RealOrApp: { 270 if (pInAttr.getIntValue() != Arch_Profile_Microcontroller) 271 out_attr.setIntValue(pInAttr.getIntValue()); 272 else 273 warning(diag::warn_mismatch_cpu_arch_profile) 274 << pInAttr.getIntValue() << pInput.name(); 275 break; 276 } 277 default: { 278 // out_attr is Arch_Profile_Application or Arch_Profile_Realtime or 279 // Arch_Profile_Microcontroller. 280 if ((pInAttr.getIntValue() == Arch_Profile_RealOrApp) && 281 (out_attr.getIntValue() != Arch_Profile_Microcontroller)) { 282 // do nothing 283 } else { 284 if (pConfig.options().warnMismatch()) 285 warning(diag::warn_mismatch_cpu_arch_profile) 286 << pInAttr.getIntValue() << pInput.name(); 287 } 288 break; 289 } 290 } 291 break; 292 } 293 // Tag_MPextension_use and Tag_MPextension_use_legacy 294 case Tag_MPextension_use: 295 case Tag_MPextension_use_legacy: { 296 if (m_MPextensionUse < 0) { 297 m_MPextensionUse = pInAttr.getIntValue(); 298 } else { 299 if (static_cast<unsigned>(m_MPextensionUse) != pInAttr.getIntValue()) { 300 warning(diag::error_mismatch_mpextension_use) << pInput.name(); 301 } 302 } 303 break; 304 } 305 // Tag_DIV_use 306 case Tag_DIV_use: { 307 if (pInAttr.getIntValue() == 2) { 308 // 2 means the code was permitted to use SDIV/UDIV in anyway. 309 out_attr.setIntValue(2); 310 } else { 311 // Merge until settling down Tag_CPU_arch. 312 m_DIVUse = pInAttr.getIntValue(); 313 } 314 break; 315 } 316 // Tag_ABI_enum_size 317 case Tag_ABI_enum_size: { 318 if ((out_attr.getIntValue() == Enum_Unused) || 319 (out_attr.getIntValue() == Enum_Containerized_As_Possible)) 320 out_attr.setIntValue(pInAttr.getIntValue()); 321 else if (pInAttr.getIntValue() != Enum_Containerized_As_Possible && 322 pConfig.options().warnMismatch()) 323 warning(diag::warn_mismatch_enum_size) 324 << pInput.name() << pInAttr.getIntValue() 325 << out_attr.getIntValue(); 326 break; 327 } 328 // Tag_ABI_FP_16bit_format 329 case Tag_ABI_FP_16bit_format: { 330 // 0: doesn't use any 16-bit FP number 331 // 1: use IEEE 754 format 16-bit FP number 332 // 2: use VFPv3/Advanced SIMD "alternative format" 16-bit FP number 333 if (pInAttr.getIntValue() != 0) { 334 if (out_attr.getIntValue() == 0) { 335 out_attr.setIntValue(pInAttr.getIntValue()); 336 } else { 337 if (pConfig.options().warnMismatch()) 338 warning(diag::warn_mismatch_fp16_format) << pInput.name(); 339 } 340 } 341 break; 342 } 343 // Tag_nodefaults 344 case Tag_nodefaults: { 345 // There's nothing to do for this tag. It doesn't have an actual value. 346 break; 347 } 348 // Tag_conformance 349 case Tag_conformance: { 350 // Throw away the value if the attribute value doesn't match. 351 if (out_attr.getStringValue() != pInAttr.getStringValue()) 352 out_attr.setStringValue(""); 353 break; 354 } 355 // Tag_Virtualization_use 356 case Tag_Virtualization_use: { 357 // 0: No use of any virtualization extension 358 // 1: TrustZone 359 // 2: Virtualization extension such as HVC and ERET 360 // 3: TrustZone and virtualization extension are permitted 361 if (pInAttr.getIntValue() != 0) { 362 if (out_attr.getIntValue() == 0) { 363 out_attr.setIntValue(pInAttr.getIntValue()); 364 } else { 365 if ((out_attr.getIntValue() <= 3) && (pInAttr.getIntValue() <= 3)) { 366 // Promote to 3 367 out_attr.setIntValue(3); 368 } else { 369 warning(diag::warn_unrecognized_virtualization_use) 370 << pInput.name() << pInAttr.getIntValue(); 371 } 372 } 373 } 374 break; 375 } 376 // Tag_ABI_WMMX_args 377 case Tag_ABI_WMMX_args: { 378 // There's no way to merge this value (i.e., objects contain different 379 // value in this tag are definitely incompatible.) 380 if (pConfig.options().warnMismatch()) 381 warning(diag::warn_mismatch_abi_wmmx_args) << pInput.name(); 382 break; 383 } 384 // Tag_PCS_config 385 case Tag_PCS_config: { 386 // 0 means no standard configuration used or no information recorded. 387 if (pInAttr.getIntValue() != 0) { 388 if (out_attr.getIntValue() == 0) 389 out_attr.setIntValue(pInAttr.getIntValue()); 390 else { 391 // Different values in these attribute are conflict 392 if (pConfig.options().warnMismatch()) 393 warning(diag::warn_mismatch_pcs_config) << pInput.name(); 394 } 395 } 396 break; 397 } 398 // Tag_ABI_PCS_R9_use 399 case Tag_ABI_PCS_R9_use: { 400 if (pInAttr.getIntValue() != R9_Unused) { 401 if (out_attr.getIntValue() == R9_Unused) 402 out_attr.setIntValue(pInAttr.getIntValue()); 403 else { 404 if (pConfig.options().warnMismatch()) 405 warning(diag::warn_mismatch_r9_use) << pInput.name(); 406 } 407 } 408 break; 409 } 410 // Tag_ABI_PCS_RW_data 411 case Tag_ABI_PCS_RW_data: { 412 if (pInAttr.getIntValue() == RW_data_SB_Relative) { 413 // Require using R9 as SB (global Static Base register). 414 if ((out_attr.getIntValue() != R9_Unused) && 415 (out_attr.getIntValue() != R9_SB) && 416 pConfig.options().warnMismatch()) 417 warning(diag::warn_mismatch_r9_use) << pInput.name(); 418 } 419 // Choose the smaller value 420 if (pInAttr.getIntValue() < out_attr.getIntValue()) 421 out_attr.setIntValue(pInAttr.getIntValue()); 422 break; 423 } 424 // Tag_ABI_PCS_wchar_t 425 case Tag_ABI_PCS_wchar_t: { 426 // 0: no use of wchar_t 427 // 2: sizeof(wchar_t) = 2 428 // 4: sizeof(wchar_t) = 4 429 if (pInAttr.getIntValue() != 0) { 430 if (out_attr.getIntValue() == 0) 431 out_attr.setIntValue(pInAttr.getIntValue()); 432 else { 433 if (pConfig.options().warnMismatch()) 434 warning(diag::warn_mismatch_wchar_size) 435 << pInput.name() << pInAttr.getIntValue() 436 << out_attr.getIntValue(); 437 } 438 } 439 break; 440 } 441 default: { 442 // Handle unknown attributes: 443 // 444 // Since we don't know how to merge the value of unknown attribute, we 445 // have to ignore it. There're two rules related to the processing (See 446 // ARM [ABI-addenda] 2.2.6, Coding extensibility and compatibility.): 447 // 448 // 1. For tag N where N >= 128, tag N has the same properties as 449 // tag N % 128. 450 // 2. Tag 64-127 can be safely ignored. 451 // 3. Tag 0-63 must be comprehended, therefore we cannot ignore. 452 if (pConfig.options().warnMismatch()) { 453 if ((pTag & 127) < 64) { 454 warning(diag::warn_unknown_mandatory_attribute) << pTag 455 << pInput.name(); 456 } else { 457 warning(diag::warn_unknown_attribute) << pTag << pInput.name(); 458 } 459 } 460 break; 461 } 462 } 463 return true; 464 } 465 466 //===--------------------------------------------------------------------===// 467 // Helper Functions for postMerge() 468 //===--------------------------------------------------------------------===// 469 470 namespace { 471 472 /* 473 * Helper function to encode value in Tag_also_compatible_with. 474 * 475 * @ref ARM [ABI-addenda], 2.3.7.3 476 */ 477 static void 478 encode_secondary_compatibility_attribute(ELFAttributeValue &pValue, int pArch) 479 { 480 if ((pArch < 0) || (pArch > ARMELFAttributeData::CPU_Arch_Max)) { 481 pValue.setStringValue(""); 482 } else { 483 char new_value[] = { 484 ARMELFAttributeData::Tag_CPU_arch, 485 static_cast<char>(pArch), 486 0 487 }; 488 pValue.setStringValue(std::string(new_value, sizeof(new_value))); 489 } 490 return; 491 } 492 493 /* 494 * Combine the main and secondary CPU arch value 495 */ 496 static int 497 calculate_cpu_arch(int cpu_arch, int secondary_arch) 498 { 499 // short-circuit 500 if ((secondary_arch < 0) || 501 ((cpu_arch + secondary_arch) != (ARMELFAttributeData::CPU_Arch_ARM_V4T + 502 ARMELFAttributeData::CPU_Arch_ARM_V6_M))) 503 return cpu_arch; 504 505 if ((cpu_arch == ARMELFAttributeData::CPU_Arch_ARM_V4T) && 506 (secondary_arch == ARMELFAttributeData::CPU_Arch_ARM_V6_M)) 507 return ARMELFAttributeData::CPU_Arch_ARM_V4T_Plus_V6_M; 508 else if ((cpu_arch == ARMELFAttributeData::CPU_Arch_ARM_V6_M) && 509 (secondary_arch == ARMELFAttributeData::CPU_Arch_ARM_V4T)) 510 return ARMELFAttributeData::CPU_Arch_ARM_V4T_Plus_V6_M; 511 else 512 return cpu_arch; 513 } 514 515 /* 516 * Given a CPU arch X and a CPU arch Y in which Y is newer than X, the value in 517 * cpu_compatibility_table[X][Y] is the CPU arch required to run ISA both from X 518 * and Y. 0 in the table means unreachable and -1 means conflict architecture 519 * profile. 520 */ 521 #define CPU(C) ARMELFAttributeData::CPU_Arch_ARM_ ## C 522 static const int cpu_compatibility_table[][CPU(V4T_Plus_V6_M) + 1] = 523 { 524 /* old\new ARM v6T2 ARM v6K ARM v7 ARM v6-M ARM v6S-M ARM v7E-M ARMv8, ARM v4t + v6-M */ 525 /* Pre v4 */ { CPU(V6T2), CPU(V6K), CPU(V7), -1, -1, -1, -1, -1 }, 526 /* ARM v4 */ { CPU(V6T2), CPU(V6K), CPU(V7), -1, -1, -1, -1, -1 }, 527 /* ARM v4T */ { CPU(V6T2), CPU(V6K), CPU(V7), CPU(V6K), CPU(V6K), CPU(V7E_M), CPU(V8), CPU(V4T) }, 528 /* ARM v5T */ { CPU(V6T2), CPU(V6K), CPU(V7), CPU(V6K), CPU(V6K), CPU(V7E_M), CPU(V8), CPU(V5T) }, 529 /* ARM v5TE */ { CPU(V6T2), CPU(V6K), CPU(V7), CPU(V6K), CPU(V6K), CPU(V7E_M), CPU(V8), CPU(V5TE) }, 530 /* ARM v5TEJ */ { CPU(V6T2), CPU(V6K), CPU(V7), CPU(V6K), CPU(V6K), CPU(V7E_M), CPU(V8), CPU(V5TEJ) }, 531 /* ARM v6 */ { CPU(V6T2), CPU(V6K), CPU(V7), CPU(V6K), CPU(V6K), CPU(V7E_M), CPU(V8), CPU(V6) }, 532 /* ARM v6KZ */ { CPU(V7), CPU(V6KZ), CPU(V7), CPU(V6KZ), CPU(V6KZ), CPU(V7E_M), CPU(V8), CPU(V6KZ) }, 533 /* ARM v6T2 */ { CPU(V6T2), CPU(V7), CPU(V7), CPU(V7), CPU(V7), CPU(V7E_M), CPU(V8), CPU(V6T2) }, 534 /* ARM v6K */ { 0, CPU(V6K), CPU(V7), CPU(V6K), CPU(V6K), CPU(V7E_M), CPU(V8), CPU(V6K) }, 535 /* ARM v7 */ { 0, 0, CPU(V7), CPU(V7), CPU(V7), CPU(V7E_M), CPU(V8), CPU(V7) }, 536 /* ARM v6-M */ { 0, 0, 0, CPU(V6_M), CPU(V6S_M), CPU(V7E_M), CPU(V8), CPU(V6_M) }, 537 /* ARM v6S-M */ { 0, 0, 0, 0, CPU(V6S_M), CPU(V7E_M), CPU(V8), CPU(V6S_M) }, 538 /* ARM v7E-M */ { 0, 0, 0, 0, 0, CPU(V7E_M), CPU(V8), CPU(V7E_M) }, 539 /* ARM v8 */ { 0, 0, 0, 0, 0, 0, CPU(V8), CPU(V8) }, 540 /* v4T + v6-M */ { 0, 0, 0, 0, 0, 0, 0, CPU(V4T_Plus_V6_M) } 541 }; 542 543 /* 544 * Helper function to determine the merge of two different CPU arch. 545 */ 546 static int merge_cpu_arch(int out_cpu_arch, int in_cpu_arch) 547 { 548 if (out_cpu_arch > CPU(V4T_Plus_V6_M)) 549 return in_cpu_arch; 550 551 int new_cpu_arch, old_cpu_arch; 552 if (out_cpu_arch > in_cpu_arch) { 553 new_cpu_arch = out_cpu_arch; 554 old_cpu_arch = in_cpu_arch; 555 } else { 556 new_cpu_arch = in_cpu_arch; 557 old_cpu_arch = out_cpu_arch; 558 } 559 560 // No need to check the compatibility since the CPU architectures before 561 // V6KZ add features monotonically. 562 if (new_cpu_arch <= CPU(V6KZ)) 563 return new_cpu_arch; 564 565 return cpu_compatibility_table[old_cpu_arch][new_cpu_arch - CPU(V6T2)]; 566 } 567 #undef CPU 568 569 /* 570 * Generic CPU name is used when Tag_CPU_name is unable to guess during the 571 * merge of Tag_CPU_arch. 572 */ 573 static const char* generic_cpu_name_table[] = { 574 /* Pre v4 */"Pre v4", 575 /* Pre v4 */"ARM v4", 576 /* ARM v4T */"ARM v4T", 577 /* ARM v5T */"ARM v5T", 578 /* ARM v5TE */"ARM v5TE", 579 /* ARM v5TEJ */"ARM v5TEJ", 580 /* ARM v6 */"ARM v6", 581 /* ARM v6KZ */"ARM v6KZ", 582 /* ARM v6T2 */"ARM v6T2", 583 /* ARM v6K */"ARM v6K", 584 /* ARM v7 */"ARM v7", 585 /* ARM v6-M */"ARM v6-M", 586 /* ARM v6S-M */"ARM v6S-M", 587 /* ARM v7E-M */"ARM v7E-M", 588 /* ARM v8 */"ARM v8", 589 }; 590 591 static const char* get_generic_cpu_name(int cpu_arch) { 592 assert(static_cast<size_t>(cpu_arch) < 593 (sizeof(generic_cpu_name_table) / sizeof(generic_cpu_name_table[0]))); 594 return generic_cpu_name_table[cpu_arch]; 595 } 596 597 /* 598 * Helper functions & data used in the merge of two different FP arch. 599 */ 600 static const struct fp_config_data { 601 int version; 602 int regs; 603 } fp_configs[] = { 604 { 0, 0 }, 605 { 1, 16 }, 606 { 2, 16 }, 607 { 3, 32 }, 608 { 3, 16 }, 609 { 4, 32 }, 610 { 4, 16 }, 611 { 8, 32 }, 612 { 8, 16 }, 613 }; 614 615 static const size_t num_fp_configs = 616 sizeof(fp_configs) / sizeof(fp_config_data); 617 618 // Given h(x, y) = (x * (y >> 4) + (y >> 5)) 619 // 620 // fp_config_hash_table[ h(0, 0) = 0 ] = 0 621 // fp_config_hash_table[ h(1, 16) = 1 ] = 1 622 // fp_config_hash_table[ h(2, 16) = 2 ] = 2 623 // fp_config_hash_table[ h(3, 32) = 7 ] = 3 624 // fp_config_hash_table[ h(3, 16) = 3 ] = 4 625 // fp_config_hash_table[ h(4, 32) = 9 ] = 5 626 // fp_config_hash_table[ h(4, 16) = 4 ] = 6 627 // fp_config_hash_table[ h(8, 32) = 17 ] = 7 628 // fp_config_hash_table[ h(8, 16) = 8 ] = 8 629 // 630 // h(0, 0) = 0 631 static const uint8_t fp_config_hash_table[] = 632 { 633 #define UND static_cast<uint8_t>(-1) 634 /* 0 */0, 635 /* 1 */1, 636 /* 2 */2, 637 /* 3 */4, 638 /* 4 */6, 639 /* 5 */UND, 640 /* 6 */UND, 641 /* 7 */3, 642 /* 8 */8, 643 /* 9 */5, 644 /* 10 */UND, 645 /* 11 */UND, 646 /* 12 */UND, 647 /* 13 */UND, 648 /* 14 */UND, 649 /* 15 */UND, 650 /* 16 */UND, 651 /* 17 */7, 652 #undef UND 653 }; 654 655 static const size_t num_hash_table_entries = 656 sizeof(fp_config_hash_table) / sizeof(fp_config_hash_table[0]); 657 658 static int calculate_fp_config_hash(const struct fp_config_data &pConfig) 659 { 660 int x = pConfig.version; 661 int y = pConfig.regs; 662 return (x * (y >> 4) + (y >> 5)); 663 } 664 665 static int get_fp_arch_of_config(const struct fp_config_data &pConfig) 666 { 667 int hash = calculate_fp_config_hash(pConfig); 668 assert(static_cast<size_t>(hash) < num_hash_table_entries); 669 return fp_config_hash_table[hash]; 670 } 671 672 static bool is_allowed_use_of_div(int cpu_arch, int cpu_arch_profile, 673 int div_use) { 674 // 0: The code was permitted to use SDIV and UDIV in the Thumb ISA on v7-R or 675 // v7-M. 676 // 1: The code was not permitted to use SDIV and UDIV. 677 // 2: The code was explicitly permitted to use SDIV and UDIV. 678 switch (div_use) { 679 case 0: { 680 if ((cpu_arch == ARMELFAttributeData::CPU_Arch_ARM_V7) && 681 ((cpu_arch_profile == 'R') || (cpu_arch_profile == 'M'))) { 682 return true; 683 } else { 684 return (cpu_arch >= ARMELFAttributeData::CPU_Arch_ARM_V7E_M); 685 } 686 } 687 case 1: { 688 return false; 689 } 690 case 2: 691 // For future proofing 692 default: { 693 return true; 694 } 695 } 696 } 697 698 } // anonymous namespace 699 700 //===--------------------------------------------------------------------===// 701 // End Helper Functions for postMerge() 702 //===--------------------------------------------------------------------===// 703 704 bool ARMELFAttributeData::postMerge(const LinkerConfig& pConfig, 705 const Input &pInput) 706 { 707 // Process Tag_CPU_arch, Tag_CPU_name, Tag_CPU_raw_name, and 708 // Tag_also_compatible_with. 709 ELFAttributeValue &out_cpu_arch_attr = m_Attrs[Tag_CPU_arch]; 710 ELFAttributeValue &out_secondary_compatibility_attr = 711 m_Attrs[Tag_also_compatible_with]; 712 713 if ((m_CurrentCPUArch < 0) && out_cpu_arch_attr.isInitialized()) { 714 // Current input initializes the value of Tag_CPU_arch. Validate it. 715 int out_cpu_arch = out_cpu_arch_attr.getIntValue(); 716 717 if (out_cpu_arch > CPU_Arch_Max) { 718 error(diag::error_unknown_cpu_arch) << pInput.name(); 719 return false; 720 } 721 722 // Initialize m_CurrentCPUArch. 723 int out_secondary_arch = -1; 724 if (out_secondary_compatibility_attr.isInitialized()) 725 out_secondary_arch = decode_secondary_compatibility_attribute( 726 out_secondary_compatibility_attr); 727 728 m_CurrentCPUArch = calculate_cpu_arch(out_cpu_arch, out_secondary_arch); 729 } 730 731 if (m_CPUArch >= 0) { 732 assert(out_cpu_arch_attr.isInitialized() && "CPU arch has never set!"); 733 assert(m_CurrentCPUArch >= 0); 734 735 int in_cpu_arch = calculate_cpu_arch(m_CPUArch, m_SecondaryCPUArch); 736 int result_cpu_arch = merge_cpu_arch(m_CurrentCPUArch, in_cpu_arch); 737 738 if (result_cpu_arch < 0) { 739 warning(diag::warn_mismatch_cpu_arch_profile) 740 << in_cpu_arch << pInput.name(); 741 } else { 742 if (result_cpu_arch != m_CurrentCPUArch) { 743 // Value of Tag_CPU_arch are going to changea. 744 m_CurrentCPUArch = result_cpu_arch; 745 746 // Write the result value to the output. 747 if (result_cpu_arch == CPU_Arch_ARM_V4T_Plus_V6_M) { 748 out_cpu_arch_attr.setIntValue(CPU_Arch_ARM_V4T); 749 encode_secondary_compatibility_attribute( 750 out_secondary_compatibility_attr, CPU_Arch_ARM_V6_M); 751 } else { 752 out_cpu_arch_attr.setIntValue(result_cpu_arch); 753 encode_secondary_compatibility_attribute( 754 out_secondary_compatibility_attr, -1); 755 } 756 757 ELFAttributeValue &out_cpu_name = m_Attrs[Tag_CPU_name]; 758 ELFAttributeValue &out_cpu_raw_name = m_Attrs[Tag_CPU_raw_name]; 759 760 if (m_CurrentCPUArch != in_cpu_arch) { 761 // Unable to guess the Tag_CPU_name. Use the generic name. 762 if (out_cpu_name.isInitialized()) { 763 out_cpu_name.setStringValue(get_generic_cpu_name(m_CurrentCPUArch)); 764 } 765 766 // Tag_CPU_raw_name becomes unknown. Set to default value to disable 767 // it. 768 out_cpu_raw_name.setStringValue(""); 769 } else { 770 // Use the value of Tag_CPU_name and Tag_CPU_raw_name from the input. 771 if (!m_CPUName.empty()) { 772 ELFAttributeValue &out_cpu_name = m_Attrs[Tag_CPU_name]; 773 assert(out_cpu_name.isInitialized() && "CPU name has never set!"); 774 out_cpu_name.setStringValue(m_CPUName); 775 } 776 777 if (!m_CPURawName.empty()) { 778 ELFAttributeValue &out_cpu_raw_name = m_Attrs[Tag_CPU_raw_name]; 779 assert(out_cpu_raw_name.isInitialized() && 780 "CPU raw name has never set!"); 781 out_cpu_raw_name.setStringValue(m_CPURawName); 782 } 783 } 784 } 785 } 786 } // (m_CPUArch >= 0) 787 788 // Process Tag_ABI_VFP_args. 789 if (m_VFPArgs >= 0) { 790 ELFAttributeValue &out_attr = m_Attrs[Tag_ABI_VFP_args]; 791 ELFAttributeValue &out_float_number_model_attr = 792 m_Attrs[Tag_ABI_FP_number_model]; 793 794 assert(out_attr.isInitialized() && "VFP args has never set!"); 795 796 // If the output is not permitted to use floating number, this attribute 797 // is ignored (migrate the value from input directly.) 798 if (out_float_number_model_attr.isUninitialized() || 799 (out_float_number_model_attr.getIntValue() == 0)) { 800 // Inherit requirement from input. 801 out_attr.setIntValue(m_VFPArgs); 802 } else { 803 if (pConfig.options().warnMismatch()) 804 warning(diag::warn_mismatch_vfp_args) << pInput.name(); 805 } 806 } 807 808 // Process Tag_FP_arch. 809 ELFAttributeValue &out_fp_arch_attr = m_Attrs[Tag_FP_arch]; 810 if (m_FPArch >= 0) { 811 assert(out_fp_arch_attr.isInitialized() && "FP arch has never set!"); 812 813 // Tag_FP_arch 814 // 0: instructions requiring FP hardware are not permitted 815 // 1: VFP1 816 // 2: VFP2 817 // 3: VFP3 D32 818 // 4: VFP3 D16 819 // 5: VFP4 D32 820 // 6: VFP4 D16 821 // 7: ARM v8-A D32 822 // 8: ARM v8-A D16 823 if (out_fp_arch_attr.getIntValue() == 0) { 824 // Output has no constraints on FP hardware. Copy the requirement from 825 // input. 826 out_fp_arch_attr.setIntValue(m_FPArch); 827 } else if (m_FPArch == 0) { 828 // Input has no constraints on FP hardware. Do nothing. 829 } else { 830 // If here, both output and input contain non-zero value of Tag_FP_arch. 831 832 // Version greater than num_fp_configs is not defined. Choose the greater 833 // one for future-proofing. 834 if (static_cast<unsigned>(m_FPArch) > num_fp_configs) { 835 if (static_cast<unsigned>(m_FPArch) > out_fp_arch_attr.getIntValue()) { 836 out_fp_arch_attr.setIntValue(m_FPArch); 837 } 838 } else { 839 if (out_fp_arch_attr.getIntValue() < num_fp_configs) { 840 const struct fp_config_data &input_fp_config = fp_configs[ m_FPArch ]; 841 842 const struct fp_config_data &output_fp_config = 843 fp_configs[ out_fp_arch_attr.getIntValue() ]; 844 845 const struct fp_config_data result_fp_config = { 846 /*version*/((output_fp_config.version > input_fp_config.version) ? 847 output_fp_config.version : input_fp_config.version), 848 /* regs */((output_fp_config.regs > input_fp_config.regs) ? 849 output_fp_config.regs : input_fp_config.regs), 850 }; 851 // Find the attribute value corresponding the result_fp_config 852 out_fp_arch_attr.setIntValue(get_fp_arch_of_config(result_fp_config)); 853 } 854 } 855 } 856 } // (m_FPArch >= 0) 857 858 // Process Tag_ABI_HardFP_use. 859 ELFAttributeValue &out_hardfp_use_attr = m_Attrs[Tag_ABI_HardFP_use]; 860 861 if (!m_HardFPUseInitialized && out_hardfp_use_attr.isInitialized()) { 862 m_HardFPUse = out_hardfp_use_attr.getIntValue(); 863 m_HardFPUseInitialized = true; 864 } 865 866 if (m_HardFPUse >= 0) { 867 // Tag_ABI_HardFP_use depends on the meaning of Tag_FP_arch when it's 0. 868 assert(out_hardfp_use_attr.isInitialized() && "HardFP use has never set!"); 869 870 if (out_fp_arch_attr.isUninitialized() || 871 (out_fp_arch_attr.getIntValue() == 0)) { 872 // Has no constraints on FP hardware. 873 out_hardfp_use_attr.setIntValue(m_HardFPUse); 874 } else { 875 // Both output and input contain non-zero value of Tag_FP_arch and we have 876 // different Tag_ABI_HaedFP_Use settings other than 0. 877 if ((out_fp_arch_attr.getIntValue() > 0) && (m_HardFPUse > 0)) 878 // Promote to 3 (The user permitted this entity to use both SP and DP 879 // VFP instruction.) 880 out_hardfp_use_attr.setIntValue(3); 881 } 882 } 883 884 // Move the value of Tag_MPextension_use_legacy to Tag_MPextension_use. 885 ELFAttributeValue &out_mpextension_use_legacy = 886 m_Attrs[Tag_MPextension_use_legacy]; 887 888 ELFAttributeValue &out_mpextension_use = m_Attrs[Tag_MPextension_use]; 889 890 // If Tag_MPextension_use_legacy has value, it must be introduced by current 891 // input since it is reset every time after the merge completed. 892 if (out_mpextension_use_legacy.isInitialized()) { 893 if (out_mpextension_use.isInitialized()) { 894 if (m_MPextensionUse < 0) { 895 // The value of Tag_MPextension_use is introduced by the current input. 896 // Check whether it is consistent with the one set in legacy. 897 m_MPextensionUse = out_mpextension_use.getIntValue(); 898 } else { 899 // Current input introduces value of Tag_MPextension_use in 900 // m_MPextensionUse. 901 } 902 903 // Check the consistency between m_MPextensionUse and the value of 904 // Tag_MPextension_use_legacy. 905 if (static_cast<unsigned>(m_MPextensionUse) != 906 out_mpextension_use_legacy.getIntValue()) { 907 error(diag::error_mismatch_mpextension_use) << pInput.name(); 908 return false; 909 } 910 } else { 911 if (m_MPextensionUse < 0) { 912 // Tag_MPextension_use is not set. Initialize it and move the value. 913 out_mpextension_use.setType(ELFAttributeValue::Int); 914 out_mpextension_use.setIntValue(out_mpextension_use.getIntValue()); 915 } else { 916 // Unreachable case since the value to unitialized attribute is directly 917 // assigned in ELFAttribute::Subsection::merge(). 918 assert(false && "Tag_MPextension_use is uninitialized but have value?"); 919 } 920 } 921 922 // Reset the attribute to uninitialized so it won't be included in the 923 // output. 924 out_mpextension_use_legacy.setType(ELFAttributeValue::Uninitialized); 925 } 926 927 // Process Tag_MPextension_use. 928 if (m_MPextensionUse > 0) { 929 assert(out_mpextension_use.isInitialized()); 930 931 if (static_cast<unsigned>(m_MPextensionUse) > 932 out_mpextension_use.getIntValue()) { 933 out_mpextension_use.setIntValue(m_MPextensionUse); 934 } 935 } 936 937 // Process Tag_DIV_use. 938 ELFAttributeValue &out_div_use_attr = m_Attrs[Tag_DIV_use]; 939 940 if (!m_DIVUseInitialized && out_div_use_attr.isInitialized()) { 941 // Perform the merge by reverting value of Tag_DIV_use and setup m_DIVUse. 942 m_DIVUse = out_div_use_attr.getIntValue(); 943 out_div_use_attr.setIntValue(0); 944 m_DIVUseInitialized = true; 945 } 946 947 if (m_DIVUse >= 0) { 948 assert(out_div_use_attr.isInitialized()); 949 950 const ELFAttributeValue &out_cpu_arch_profile_attr = 951 m_Attrs[Tag_CPU_arch_profile]; 952 953 int out_cpu_arch_profile = Arch_Profile_None; 954 if (out_cpu_arch_profile_attr.isInitialized()) { 955 out_cpu_arch_profile = out_cpu_arch_profile_attr.getIntValue(); 956 } 957 958 if (m_DIVUse == 1) { 959 // Input (=1) was not permitted to use SDIV and UDIV. See whether current 960 // output was explicitly permitted the use. 961 if (!is_allowed_use_of_div(m_CurrentCPUArch, out_cpu_arch_profile, 962 out_div_use_attr.getIntValue())) { 963 out_div_use_attr.setIntValue(1); 964 } 965 } else { 966 if (out_div_use_attr.getIntValue() != 1) { 967 // Output does not explicitly forbid the use of SDIV/UDIV. See whether 968 // the input attribute can allow it under current CPU architecture 969 // profile. 970 if (is_allowed_use_of_div(m_CurrentCPUArch, out_cpu_arch_profile, 971 m_DIVUse)) { 972 out_div_use_attr.setIntValue(m_DIVUse); 973 } 974 } 975 } 976 } 977 978 return true; 979 } 980 981 size_t ARMELFAttributeData::sizeOutput() const { 982 size_t result = 0; 983 984 // Size contributed by known attributes 985 for (unsigned i = 0; i <= Tag_Max; ++i) { 986 TagType tag = static_cast<TagType>(i); 987 const ELFAttributeValue &value = m_Attrs[tag]; 988 989 if (value.shouldEmit()) { 990 result += leb128::size(static_cast<uint32_t>(tag)); 991 result += value.getSize(); 992 } 993 } 994 995 // Size contributed by unknown attributes 996 for (UnknownAttrsMap::const_iterator unknown_attr_it = m_UnknownAttrs.begin(), 997 unknown_attr_end = m_UnknownAttrs.end(); 998 unknown_attr_it != unknown_attr_end; ++unknown_attr_it) { 999 TagType tag = unknown_attr_it->first; 1000 const ELFAttributeValue &value = unknown_attr_it->second; 1001 1002 if (value.shouldEmit()) { 1003 result += leb128::size(static_cast<uint32_t>(tag)); 1004 result += value.getSize(); 1005 } 1006 } 1007 1008 return result; 1009 } 1010 1011 size_t ARMELFAttributeData::emit(char *pBuf) const { 1012 char *buffer = pBuf; 1013 1014 // Tag_conformance "should be emitted first in a file-scope sub-subsection of 1015 // the first public subsection of the attribute section." 1016 // 1017 // See ARM [ABI-addenda], 2.3.7.4 Conformance tag 1018 const ELFAttributeValue &attr_conformance = m_Attrs[Tag_conformance]; 1019 1020 if (attr_conformance.shouldEmit()) { 1021 if (!ELFAttributeData::WriteAttribute(Tag_conformance, attr_conformance, 1022 buffer)) { 1023 return 0; 1024 } 1025 } 1026 1027 // Tag_nodefaults "should be emitted before any other tag in an attribute 1028 // subsection other that the conformance tag" 1029 // 1030 // See ARM [ABI-addenda], 2.3.7.5 No defaults tag 1031 const ELFAttributeValue &attr_nodefaults = m_Attrs[Tag_nodefaults]; 1032 1033 if (attr_nodefaults.shouldEmit()) { 1034 if (!ELFAttributeData::WriteAttribute(Tag_nodefaults, attr_nodefaults, 1035 buffer)) { 1036 return 0; 1037 } 1038 } 1039 1040 // Tag_conformance (=67) 1041 // Tag_nodefaults (=64) 1042 for (unsigned i = 0; i < Tag_nodefaults; ++i) { 1043 TagType tag = static_cast<TagType>(i); 1044 const ELFAttributeValue &value = m_Attrs[tag]; 1045 1046 if (value.shouldEmit() && 1047 !ELFAttributeData::WriteAttribute(tag, value, buffer)) { 1048 return 0; 1049 } 1050 } 1051 1052 for (unsigned i = (Tag_nodefaults + 1); i <= Tag_Max; ++i) { 1053 TagType tag = static_cast<TagType>(i); 1054 const ELFAttributeValue &value = m_Attrs[tag]; 1055 1056 if (value.shouldEmit() && (i != Tag_conformance) && 1057 !ELFAttributeData::WriteAttribute(tag, value, buffer)) { 1058 return 0; 1059 } 1060 } 1061 1062 for (UnknownAttrsMap::const_iterator unknown_attr_it = m_UnknownAttrs.begin(), 1063 unknown_attr_end = m_UnknownAttrs.end(); 1064 unknown_attr_it != unknown_attr_end; ++unknown_attr_it) { 1065 TagType tag = unknown_attr_it->first; 1066 const ELFAttributeValue &value = unknown_attr_it->second; 1067 1068 if (value.shouldEmit() && 1069 !ELFAttributeData::WriteAttribute(tag, value, buffer)) { 1070 return 0; 1071 } 1072 } 1073 1074 return (buffer - pBuf); 1075 } 1076 1077 bool ARMELFAttributeData::usingThumb() const 1078 { 1079 int arch = m_Attrs[Tag_CPU_arch].getIntValue(); 1080 if ((arch == CPU_Arch_ARM_V6_M) || (arch == CPU_Arch_ARM_V6S_M)) 1081 return true; 1082 if ((arch != CPU_Arch_ARM_V7) && (arch != CPU_Arch_ARM_V7E_M)) 1083 return false; 1084 1085 arch = m_Attrs[Tag_CPU_arch_profile].getIntValue(); 1086 return arch == Arch_Profile_Microcontroller; 1087 } 1088 1089 bool ARMELFAttributeData::usingThumb2() const 1090 { 1091 int arch = m_Attrs[Tag_CPU_arch].getIntValue(); 1092 return (arch == CPU_Arch_ARM_V6T2) || (arch == CPU_Arch_ARM_V7); 1093 } 1094