TargetData.cpp revision ae6f1fa36b020c89b0f44c4b4222d0f5fd9b6326
1//===-- TargetData.cpp - Data size & alignment routines --------------------==// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by the LLVM research group and is distributed under 6// the University of Illinois Open Source License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines target properties related to datatype size/offset/alignment 11// information. 12// 13// This structure should be created once, filled in if the defaults are not 14// correct and then passed around by const&. None of the members functions 15// require modification to the object. 16// 17//===----------------------------------------------------------------------===// 18 19#include "llvm/Target/TargetData.h" 20#include "llvm/Module.h" 21#include "llvm/DerivedTypes.h" 22#include "llvm/Constants.h" 23#include "llvm/Support/GetElementPtrTypeIterator.h" 24#include "llvm/Support/MathExtras.h" 25#include "llvm/Support/ManagedStatic.h" 26#include "llvm/ADT/DenseMap.h" 27#include "llvm/ADT/StringExtras.h" 28#include <algorithm> 29#include <cstdlib> 30#include <sstream> 31using namespace llvm; 32 33// Handle the Pass registration stuff necessary to use TargetData's. 34namespace { 35 // Register the default SparcV9 implementation... 36 RegisterPass<TargetData> X("targetdata", "Target Data Layout"); 37} 38 39//===----------------------------------------------------------------------===// 40// Support for StructLayout 41//===----------------------------------------------------------------------===// 42 43StructLayout::StructLayout(const StructType *ST, const TargetData &TD) { 44 StructAlignment = 0; 45 StructSize = 0; 46 NumElements = ST->getNumElements(); 47 48 // Loop over each of the elements, placing them in memory... 49 for (unsigned i = 0, e = NumElements; i != e; ++i) { 50 const Type *Ty = ST->getElementType(i); 51 unsigned TyAlign; 52 uint64_t TySize; 53 TyAlign = (ST->isPacked() ? 1 : TD.getABITypeAlignment(Ty)); 54 TySize = TD.getTypeSize(Ty); 55 56 // Add padding if necessary to make the data element aligned properly... 57 if (StructSize % TyAlign != 0) 58 StructSize = (StructSize/TyAlign + 1) * TyAlign; // Add padding... 59 60 // Keep track of maximum alignment constraint 61 StructAlignment = std::max(TyAlign, StructAlignment); 62 63 MemberOffsets[i] = StructSize; 64 StructSize += TySize; // Consume space for this data item 65 } 66 67 // Empty structures have alignment of 1 byte. 68 if (StructAlignment == 0) StructAlignment = 1; 69 70 // Add padding to the end of the struct so that it could be put in an array 71 // and all array elements would be aligned correctly. 72 if (StructSize % StructAlignment != 0) 73 StructSize = (StructSize/StructAlignment + 1) * StructAlignment; 74} 75 76 77/// getElementContainingOffset - Given a valid offset into the structure, 78/// return the structure index that contains it. 79unsigned StructLayout::getElementContainingOffset(uint64_t Offset) const { 80 const uint64_t *SI = 81 std::upper_bound(&MemberOffsets[0], &MemberOffsets[NumElements], Offset); 82 assert(SI != &MemberOffsets[0] && "Offset not in structure type!"); 83 --SI; 84 assert(*SI <= Offset && "upper_bound didn't work"); 85 assert((SI == &MemberOffsets[0] || *(SI-1) < Offset) && 86 (SI+1 == &MemberOffsets[NumElements] || *(SI+1) > Offset) && 87 "Upper bound didn't work!"); 88 return SI-&MemberOffsets[0]; 89} 90 91//===----------------------------------------------------------------------===// 92// TargetAlignElem, TargetAlign support 93//===----------------------------------------------------------------------===// 94 95TargetAlignElem 96TargetAlignElem::get(AlignTypeEnum align_type, unsigned char abi_align, 97 unsigned char pref_align, short bit_width) { 98 TargetAlignElem retval; 99 retval.AlignType = align_type; 100 retval.ABIAlign = abi_align; 101 retval.PrefAlign = pref_align; 102 retval.TypeBitWidth = bit_width; 103 return retval; 104} 105 106bool 107TargetAlignElem::operator<(const TargetAlignElem &rhs) const { 108 return ((AlignType < rhs.AlignType) 109 || (AlignType == rhs.AlignType && TypeBitWidth < rhs.TypeBitWidth)); 110} 111 112bool 113TargetAlignElem::operator==(const TargetAlignElem &rhs) const { 114 return (AlignType == rhs.AlignType 115 && ABIAlign == rhs.ABIAlign 116 && PrefAlign == rhs.PrefAlign 117 && TypeBitWidth == rhs.TypeBitWidth); 118} 119 120std::ostream & 121TargetAlignElem::dump(std::ostream &os) const { 122 return os << AlignType 123 << TypeBitWidth 124 << ":" << (int) (ABIAlign * 8) 125 << ":" << (int) (PrefAlign * 8); 126} 127 128const TargetAlignElem TargetData::InvalidAlignmentElem = 129 TargetAlignElem::get((AlignTypeEnum) -1, 0, 0, 0); 130 131//===----------------------------------------------------------------------===// 132// TargetData Class Implementation 133//===----------------------------------------------------------------------===// 134 135/*! 136 A TargetDescription string consists of a sequence of hyphen-delimited 137 specifiers for target endianness, pointer size and alignments, and various 138 primitive type sizes and alignments. A typical string looks something like: 139 <br><br> 140 "E-p:32:32:32-i1:8:8-i8:8:8-i32:32:32-i64:32:64-f32:32:32-f64:32:64" 141 <br><br> 142 (note: this string is not fully specified and is only an example.) 143 \p 144 Alignments come in two flavors: ABI and preferred. ABI alignment (abi_align, 145 below) dictates how a type will be aligned within an aggregate and when used 146 as an argument. Preferred alignment (pref_align, below) determines a type's 147 alignment when emitted as a global. 148 \p 149 Specifier string details: 150 <br><br> 151 <i>[E|e]</i>: Endianness. "E" specifies a big-endian target data model, "e" 152 specifies a little-endian target data model. 153 <br><br> 154 <i>p:<size>:<abi_align>:<pref_align></i>: Pointer size, ABI and preferred 155 alignment. 156 <br><br> 157 <i><type><size>:<abi_align>:<pref_align></i>: Numeric type alignment. Type is 158 one of <i>i|f|v|a</i>, corresponding to integer, floating point, vector (aka 159 packed) or aggregate. Size indicates the size, e.g., 32 or 64 bits. 160 \p 161 The default string, fully specified is: 162 <br><br> 163 "E-p:64:64:64-a0:0:0-f32:32:32-f64:0:64" 164 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:0:64" 165 "-v64:64:64-v128:128:128" 166 <br><br> 167 Note that in the case of aggregates, 0 is the default ABI and preferred 168 alignment. This is a special case, where the aggregate's computed worst-case 169 alignment will be used. 170 */ 171void TargetData::init(const std::string &TargetDescription) { 172 std::string temp = TargetDescription; 173 174 LittleEndian = false; 175 PointerMemSize = 8; 176 PointerABIAlign = 8; 177 PointerPrefAlign = PointerABIAlign; 178 179 // Default alignments 180 setAlignment(INTEGER_ALIGN, 1, 1, 1); // Bool 181 setAlignment(INTEGER_ALIGN, 1, 1, 8); // Byte 182 setAlignment(INTEGER_ALIGN, 2, 2, 16); // short 183 setAlignment(INTEGER_ALIGN, 4, 4, 32); // int 184 setAlignment(INTEGER_ALIGN, 4, 8, 64); // long 185 setAlignment(FLOAT_ALIGN, 4, 4, 32); // float 186 setAlignment(FLOAT_ALIGN, 8, 8, 64); // double 187 setAlignment(VECTOR_ALIGN, 8, 8, 64); // v2i32 188 setAlignment(VECTOR_ALIGN, 16, 16, 128); // v16i8, v8i16, v4i32, ... 189 setAlignment(AGGREGATE_ALIGN, 0, 0, 0); // struct, union, class, ... 190 191 while (!temp.empty()) { 192 std::string token = getToken(temp, "-"); 193 194 std::string arg0 = getToken(token, ":"); 195 const char *p = arg0.c_str(); 196 AlignTypeEnum align_type; 197 short size; 198 unsigned char abi_align; 199 unsigned char pref_align; 200 201 switch(*p) { 202 case 'E': 203 LittleEndian = false; 204 break; 205 case 'e': 206 LittleEndian = true; 207 break; 208 case 'p': 209 PointerMemSize = atoi(getToken(token,":").c_str()) / 8; 210 PointerABIAlign = atoi(getToken(token,":").c_str()) / 8; 211 PointerPrefAlign = atoi(getToken(token,":").c_str()) / 8; 212 if (PointerPrefAlign == 0) 213 PointerPrefAlign = PointerABIAlign; 214 break; 215 case 'i': 216 case 'v': 217 case 'f': 218 case 'a': { 219 align_type = (*p == 'i' ? INTEGER_ALIGN : 220 (*p == 'f' ? FLOAT_ALIGN : 221 (*p == 'v' ? VECTOR_ALIGN : AGGREGATE_ALIGN))); 222 size = (short) atoi(++p); 223 abi_align = atoi(getToken(token, ":").c_str()) / 8; 224 pref_align = atoi(getToken(token, ":").c_str()) / 8; 225 if (pref_align == 0) 226 pref_align = abi_align; 227 setAlignment(align_type, abi_align, pref_align, size); 228 break; 229 } 230 default: 231 break; 232 } 233 } 234} 235 236TargetData::TargetData(const Module *M) { 237 init(M->getDataLayout()); 238} 239 240void 241TargetData::setAlignment(AlignTypeEnum align_type, unsigned char abi_align, 242 unsigned char pref_align, short bit_width) { 243 TargetAlignElem elt = TargetAlignElem::get(align_type, abi_align, 244 pref_align, bit_width); 245 std::pair<align_iterator, align_iterator> ins_result = 246 std::equal_range(Alignments.begin(), Alignments.end(), elt); 247 align_iterator I = ins_result.first; 248 if (I != Alignments.end() && I->AlignType == align_type && 249 I->TypeBitWidth == bit_width) { 250 // Update the abi, preferred alignments. 251 I->ABIAlign = abi_align; 252 I->PrefAlign = pref_align; 253 } else 254 Alignments.insert(I, elt); 255 256#if 0 257 // Keep around for debugging and testing... 258 align_iterator E = ins_result.second; 259 260 cerr << "setAlignment(" << elt << ")\n"; 261 cerr << "I = " << (I - Alignments.begin()) 262 << ", E = " << (E - Alignments.begin()) << "\n"; 263 std::copy(Alignments.begin(), Alignments.end(), 264 std::ostream_iterator<TargetAlignElem>(*cerr, "\n")); 265 cerr << "=====\n"; 266#endif 267} 268 269const TargetAlignElem & 270TargetData::getAlignment(AlignTypeEnum align_type, short bit_width) const 271{ 272 std::pair<align_const_iterator, align_const_iterator> find_result = 273 std::equal_range(Alignments.begin(), Alignments.end(), 274 TargetAlignElem::get(align_type, 0, 0, 275 bit_width)); 276 align_const_iterator I = find_result.first; 277 278 // Note: This may not be reasonable if variable-width integer sizes are 279 // passed, at which point, more sophisticated searching will need to be done. 280 return *I; 281} 282 283/// LayoutInfo - The lazy cache of structure layout information maintained by 284/// TargetData. Note that the struct types must have been free'd before 285/// llvm_shutdown is called (and thus this is deallocated) because all the 286/// targets with cached elements should have been destroyed. 287/// 288typedef std::pair<const TargetData*,const StructType*> LayoutKey; 289 290struct DenseMapLayoutKeyInfo { 291 static inline LayoutKey getEmptyKey() { return LayoutKey(0, 0); } 292 static inline LayoutKey getTombstoneKey() { 293 return LayoutKey((TargetData*)(intptr_t)-1, 0); 294 } 295 static unsigned getHashValue(const LayoutKey &Val) { 296 return DenseMapKeyInfo<void*>::getHashValue(Val.first) ^ 297 DenseMapKeyInfo<void*>::getHashValue(Val.second); 298 } 299 static bool isPod() { return true; } 300}; 301 302typedef DenseMap<LayoutKey, StructLayout*, DenseMapLayoutKeyInfo> LayoutInfoTy; 303static ManagedStatic<LayoutInfoTy> LayoutInfo; 304 305 306TargetData::~TargetData() { 307 if (LayoutInfo.isConstructed()) { 308 // Remove any layouts for this TD. 309 LayoutInfoTy &TheMap = *LayoutInfo; 310 for (LayoutInfoTy::iterator I = TheMap.begin(), E = TheMap.end(); 311 I != E; ) { 312 if (I->first.first == this) { 313 I->second->~StructLayout(); 314 free(I->second); 315 TheMap.erase(I++); 316 } else { 317 ++I; 318 } 319 } 320 } 321} 322 323const StructLayout *TargetData::getStructLayout(const StructType *Ty) const { 324 LayoutInfoTy &TheMap = *LayoutInfo; 325 326 StructLayout *&SL = TheMap[LayoutKey(this, Ty)]; 327 if (SL) return SL; 328 329 // Otherwise, create the struct layout. Because it is variable length, we 330 // malloc it, then use placement new. 331 unsigned NumElts = Ty->getNumElements(); 332 StructLayout *L = 333 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1)*sizeof(uint64_t)); 334 335 // Set SL before calling StructLayout's ctor. The ctor could cause other 336 // entries to be added to TheMap, invalidating our reference. 337 SL = L; 338 339 new (L) StructLayout(Ty, *this); 340 341 return L; 342} 343 344/// InvalidateStructLayoutInfo - TargetData speculatively caches StructLayout 345/// objects. If a TargetData object is alive when types are being refined and 346/// removed, this method must be called whenever a StructType is removed to 347/// avoid a dangling pointer in this cache. 348void TargetData::InvalidateStructLayoutInfo(const StructType *Ty) const { 349 if (!LayoutInfo.isConstructed()) return; // No cache. 350 351 LayoutInfoTy::iterator I = LayoutInfo->find(LayoutKey(this, Ty)); 352 if (I != LayoutInfo->end()) { 353 I->second->~StructLayout(); 354 free(I->second); 355 LayoutInfo->erase(I); 356 } 357} 358 359 360std::string TargetData::getStringRepresentation() const { 361 std::string repr; 362 repr.append(LittleEndian ? "e" : "E"); 363 repr.append("-p:").append(itostr((int64_t) (PointerMemSize * 8))). 364 append(":").append(itostr((int64_t) (PointerABIAlign * 8))). 365 append(":").append(itostr((int64_t) (PointerPrefAlign * 8))); 366 for (align_const_iterator I = Alignments.begin(); 367 I != Alignments.end(); 368 ++I) { 369 repr.append("-").append(1, (char) I->AlignType). 370 append(utostr((int64_t) I->TypeBitWidth)). 371 append(":").append(utostr((uint64_t) (I->ABIAlign * 8))). 372 append(":").append(utostr((uint64_t) (I->PrefAlign * 8))); 373 } 374 return repr; 375} 376 377 378uint64_t TargetData::getTypeSize(const Type *Ty) const { 379 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!"); 380 switch (Ty->getTypeID()) { 381 case Type::LabelTyID: 382 case Type::PointerTyID: 383 return getPointerSize(); 384 case Type::ArrayTyID: { 385 const ArrayType *ATy = cast<ArrayType>(Ty); 386 uint64_t Size; 387 unsigned char Alignment; 388 Size = getTypeSize(ATy->getElementType()); 389 Alignment = getABITypeAlignment(ATy->getElementType()); 390 unsigned AlignedSize = (Size + Alignment - 1)/Alignment*Alignment; 391 return AlignedSize*ATy->getNumElements(); 392 } 393 case Type::StructTyID: { 394 // Get the layout annotation... which is lazily created on demand. 395 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty)); 396 return Layout->getSizeInBytes(); 397 } 398 case Type::IntegerTyID: { 399 unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth(); 400 if (BitWidth <= 8) { 401 return 1; 402 } else if (BitWidth <= 16) { 403 return 2; 404 } else if (BitWidth <= 32) { 405 return 4; 406 } else if (BitWidth <= 64) { 407 return 8; 408 } else 409 assert(0 && "Integer types > 64 bits not supported."); 410 break; 411 } 412 case Type::VoidTyID: 413 return 1; 414 case Type::FloatTyID: 415 return 4; 416 case Type::DoubleTyID: 417 return 8; 418 case Type::VectorTyID: { 419 const VectorType *PTy = cast<VectorType>(Ty); 420 return PTy->getBitWidth() / 8; 421 } 422 default: 423 assert(0 && "TargetData::getTypeSize(): Unsupported type"); 424 break; 425 } 426 return 0; 427} 428 429uint64_t TargetData::getTypeSizeInBits(const Type *Ty) const { 430 if (Ty->isInteger()) 431 return cast<IntegerType>(Ty)->getBitWidth(); 432 else 433 return getTypeSize(Ty) * 8; 434} 435 436 437/*! 438 \param abi_or_pref Flag that determines which alignment is returned. true 439 returns the ABI alignment, false returns the preferred alignment. 440 \param Ty The underlying type for which alignment is determined. 441 442 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref 443 == false) for the requested type \a Ty. 444 */ 445unsigned char TargetData::getAlignment(const Type *Ty, bool abi_or_pref) const { 446 int AlignType = -1; 447 448 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!"); 449 switch (Ty->getTypeID()) { 450 /* Early escape for the non-numeric types */ 451 case Type::LabelTyID: 452 case Type::PointerTyID: 453 return (abi_or_pref 454 ? getPointerABIAlignment() 455 : getPointerPrefAlignment()); 456 case Type::ArrayTyID: 457 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref); 458 459 case Type::StructTyID: { 460 // Packed structure types always have an ABI alignment of one. 461 if (cast<StructType>(Ty)->isPacked() && abi_or_pref) 462 return 1; 463 464 // Get the layout annotation... which is lazily created on demand. 465 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty)); 466 const TargetAlignElem &elem = getAlignment(AGGREGATE_ALIGN, 0); 467 assert(validAlignment(elem) 468 && "Aggregate alignment return invalid in getAlignment"); 469 unsigned Align = abi_or_pref ? elem.ABIAlign : elem.PrefAlign; 470 return Align < Layout->getAlignment() ? Layout->StructAlignment : Align; 471 } 472 case Type::IntegerTyID: 473 case Type::VoidTyID: 474 AlignType = INTEGER_ALIGN; 475 break; 476 case Type::FloatTyID: 477 case Type::DoubleTyID: 478 AlignType = FLOAT_ALIGN; 479 break; 480 case Type::VectorTyID: 481 AlignType = VECTOR_ALIGN; 482 break; 483 default: 484 assert(0 && "Bad type for getAlignment!!!"); 485 break; 486 } 487 488 const TargetAlignElem &elem = getAlignment((AlignTypeEnum) AlignType, 489 getTypeSize(Ty) * 8); 490 if (validAlignment(elem)) 491 return (abi_or_pref ? elem.ABIAlign : elem.PrefAlign); 492 else { 493 cerr << "TargetData::getAlignment: align type " << AlignType 494 << " size " << getTypeSize(Ty) << " not found in Alignments.\n"; 495 abort(); 496 /*NOTREACHED*/ 497 return 0; 498 } 499} 500 501unsigned char TargetData::getABITypeAlignment(const Type *Ty) const { 502 return getAlignment(Ty, true); 503} 504 505unsigned char TargetData::getPrefTypeAlignment(const Type *Ty) const { 506 return getAlignment(Ty, false); 507} 508 509unsigned char TargetData::getPreferredTypeAlignmentShift(const Type *Ty) const { 510 unsigned Align = (unsigned) getPrefTypeAlignment(Ty); 511 assert(!(Align & (Align-1)) && "Alignment is not a power of two!"); 512 return Log2_32(Align); 513} 514 515/// getIntPtrType - Return an unsigned integer type that is the same size or 516/// greater to the host pointer size. 517const Type *TargetData::getIntPtrType() const { 518 switch (getPointerSize()) { 519 default: assert(0 && "Unknown pointer size!"); 520 case 2: return Type::Int16Ty; 521 case 4: return Type::Int32Ty; 522 case 8: return Type::Int64Ty; 523 } 524} 525 526 527uint64_t TargetData::getIndexedOffset(const Type *ptrTy, Value* const* Indices, 528 unsigned NumIndices) const { 529 const Type *Ty = ptrTy; 530 assert(isa<PointerType>(Ty) && "Illegal argument for getIndexedOffset()"); 531 uint64_t Result = 0; 532 533 generic_gep_type_iterator<Value* const*> 534 TI = gep_type_begin(ptrTy, Indices, Indices+NumIndices); 535 for (unsigned CurIDX = 0; CurIDX != NumIndices; ++CurIDX, ++TI) { 536 if (const StructType *STy = dyn_cast<StructType>(*TI)) { 537 assert(Indices[CurIDX]->getType() == Type::Int32Ty &&"Illegal struct idx"); 538 unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue(); 539 540 // Get structure layout information... 541 const StructLayout *Layout = getStructLayout(STy); 542 543 // Add in the offset, as calculated by the structure layout info... 544 Result += Layout->getElementOffset(FieldNo); 545 546 // Update Ty to refer to current element 547 Ty = STy->getElementType(FieldNo); 548 } else { 549 // Update Ty to refer to current element 550 Ty = cast<SequentialType>(Ty)->getElementType(); 551 552 // Get the array index and the size of each array element. 553 int64_t arrayIdx = cast<ConstantInt>(Indices[CurIDX])->getSExtValue(); 554 Result += arrayIdx * (int64_t)getTypeSize(Ty); 555 } 556 } 557 558 return Result; 559} 560 561/// getPreferredAlignmentLog - Return the preferred alignment of the 562/// specified global, returned in log form. This includes an explicitly 563/// requested alignment (if the global has one). 564unsigned TargetData::getPreferredAlignmentLog(const GlobalVariable *GV) const { 565 const Type *ElemType = GV->getType()->getElementType(); 566 unsigned Alignment = getPreferredTypeAlignmentShift(ElemType); 567 if (GV->getAlignment() > (1U << Alignment)) 568 Alignment = Log2_32(GV->getAlignment()); 569 570 if (GV->hasInitializer()) { 571 if (Alignment < 4) { 572 // If the global is not external, see if it is large. If so, give it a 573 // larger alignment. 574 if (getTypeSize(ElemType) > 128) 575 Alignment = 4; // 16-byte alignment. 576 } 577 } 578 return Alignment; 579} 580