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