blob: 7de41faac4f03c980be172beb438e69d6997867f [file] [log] [blame]
Micah Villmowb4faa152012-10-04 23:01:22 +00001//===-- DataLayout.cpp - Data size & alignment routines --------------------==//
Micah Villmowac34b5c2012-10-04 22:08:14 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Micah Villmowb4faa152012-10-04 23:01:22 +000010// This file defines layout properties related to datatype size/offset/alignment
Micah Villmowac34b5c2012-10-04 22:08:14 +000011// 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
Chandler Carruth9fb823b2013-01-02 11:36:10 +000019#include "llvm/IR/DataLayout.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000020#include "llvm/ADT/DenseMap.h"
Rafael Espindola458a4852013-12-19 23:03:03 +000021#include "llvm/ADT/STLExtras.h"
Rafael Espindola58873562014-01-03 19:21:54 +000022#include "llvm/ADT/Triple.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000023#include "llvm/IR/Constants.h"
24#include "llvm/IR/DerivedTypes.h"
25#include "llvm/IR/Module.h"
Micah Villmowac34b5c2012-10-04 22:08:14 +000026#include "llvm/Support/ErrorHandling.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000027#include "llvm/Support/GetElementPtrTypeIterator.h"
28#include "llvm/Support/ManagedStatic.h"
29#include "llvm/Support/MathExtras.h"
Micah Villmowac34b5c2012-10-04 22:08:14 +000030#include "llvm/Support/Mutex.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000031#include "llvm/Support/raw_ostream.h"
Micah Villmowac34b5c2012-10-04 22:08:14 +000032#include <algorithm>
33#include <cstdlib>
34using namespace llvm;
35
Micah Villmowb4faa152012-10-04 23:01:22 +000036// Handle the Pass registration stuff necessary to use DataLayout's.
Micah Villmowac34b5c2012-10-04 22:08:14 +000037
38// Register the default SparcV9 implementation...
Micah Villmowb4faa152012-10-04 23:01:22 +000039INITIALIZE_PASS(DataLayout, "datalayout", "Data Layout", false, true)
40char DataLayout::ID = 0;
Micah Villmowac34b5c2012-10-04 22:08:14 +000041
42//===----------------------------------------------------------------------===//
43// Support for StructLayout
44//===----------------------------------------------------------------------===//
45
Eli Bendersky41913c72013-04-16 15:41:18 +000046StructLayout::StructLayout(StructType *ST, const DataLayout &DL) {
Micah Villmowac34b5c2012-10-04 22:08:14 +000047 assert(!ST->isOpaque() && "Cannot get layout of opaque structs");
48 StructAlignment = 0;
49 StructSize = 0;
50 NumElements = ST->getNumElements();
51
52 // Loop over each of the elements, placing them in memory.
53 for (unsigned i = 0, e = NumElements; i != e; ++i) {
54 Type *Ty = ST->getElementType(i);
Eli Bendersky41913c72013-04-16 15:41:18 +000055 unsigned TyAlign = ST->isPacked() ? 1 : DL.getABITypeAlignment(Ty);
Micah Villmowac34b5c2012-10-04 22:08:14 +000056
57 // Add padding if necessary to align the data element properly.
58 if ((StructSize & (TyAlign-1)) != 0)
Micah Villmowb4faa152012-10-04 23:01:22 +000059 StructSize = DataLayout::RoundUpAlignment(StructSize, TyAlign);
Micah Villmowac34b5c2012-10-04 22:08:14 +000060
61 // Keep track of maximum alignment constraint.
62 StructAlignment = std::max(TyAlign, StructAlignment);
63
64 MemberOffsets[i] = StructSize;
Eli Bendersky41913c72013-04-16 15:41:18 +000065 StructSize += DL.getTypeAllocSize(Ty); // Consume space for this data item
Micah Villmowac34b5c2012-10-04 22:08:14 +000066 }
67
68 // Empty structures have alignment of 1 byte.
69 if (StructAlignment == 0) StructAlignment = 1;
70
71 // Add padding to the end of the struct so that it could be put in an array
72 // and all array elements would be aligned correctly.
73 if ((StructSize & (StructAlignment-1)) != 0)
Micah Villmowb4faa152012-10-04 23:01:22 +000074 StructSize = DataLayout::RoundUpAlignment(StructSize, StructAlignment);
Micah Villmowac34b5c2012-10-04 22:08:14 +000075}
76
77
78/// getElementContainingOffset - Given a valid offset into the structure,
79/// return the structure index that contains it.
80unsigned StructLayout::getElementContainingOffset(uint64_t Offset) const {
81 const uint64_t *SI =
82 std::upper_bound(&MemberOffsets[0], &MemberOffsets[NumElements], Offset);
83 assert(SI != &MemberOffsets[0] && "Offset not in structure type!");
84 --SI;
85 assert(*SI <= Offset && "upper_bound didn't work");
86 assert((SI == &MemberOffsets[0] || *(SI-1) <= Offset) &&
87 (SI+1 == &MemberOffsets[NumElements] || *(SI+1) > Offset) &&
88 "Upper bound didn't work!");
89
90 // Multiple fields can have the same offset if any of them are zero sized.
91 // For example, in { i32, [0 x i32], i32 }, searching for offset 4 will stop
92 // at the i32 element, because it is the last element at that offset. This is
93 // the right one to return, because anything after it will have a higher
94 // offset, implying that this element is non-empty.
95 return SI-&MemberOffsets[0];
96}
97
98//===----------------------------------------------------------------------===//
Micah Villmowb4faa152012-10-04 23:01:22 +000099// LayoutAlignElem, LayoutAlign support
Micah Villmowac34b5c2012-10-04 22:08:14 +0000100//===----------------------------------------------------------------------===//
101
Micah Villmowb4faa152012-10-04 23:01:22 +0000102LayoutAlignElem
103LayoutAlignElem::get(AlignTypeEnum align_type, unsigned abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000104 unsigned pref_align, uint32_t bit_width) {
105 assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
Micah Villmowb4faa152012-10-04 23:01:22 +0000106 LayoutAlignElem retval;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000107 retval.AlignType = align_type;
108 retval.ABIAlign = abi_align;
109 retval.PrefAlign = pref_align;
110 retval.TypeBitWidth = bit_width;
111 return retval;
112}
113
114bool
Micah Villmowb4faa152012-10-04 23:01:22 +0000115LayoutAlignElem::operator==(const LayoutAlignElem &rhs) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000116 return (AlignType == rhs.AlignType
117 && ABIAlign == rhs.ABIAlign
118 && PrefAlign == rhs.PrefAlign
119 && TypeBitWidth == rhs.TypeBitWidth);
120}
121
Micah Villmowb4faa152012-10-04 23:01:22 +0000122const LayoutAlignElem
Benjamin Kramer058f5b32013-11-19 20:28:04 +0000123DataLayout::InvalidAlignmentElem = { INVALID_ALIGN, 0, 0, 0 };
Micah Villmow89021e42012-10-09 16:06:12 +0000124
125//===----------------------------------------------------------------------===//
126// PointerAlignElem, PointerAlign support
127//===----------------------------------------------------------------------===//
128
129PointerAlignElem
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000130PointerAlignElem::get(uint32_t AddressSpace, unsigned ABIAlign,
131 unsigned PrefAlign, uint32_t TypeByteWidth) {
132 assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
Micah Villmow89021e42012-10-09 16:06:12 +0000133 PointerAlignElem retval;
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000134 retval.AddressSpace = AddressSpace;
135 retval.ABIAlign = ABIAlign;
136 retval.PrefAlign = PrefAlign;
137 retval.TypeByteWidth = TypeByteWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000138 return retval;
139}
140
141bool
142PointerAlignElem::operator==(const PointerAlignElem &rhs) const {
143 return (ABIAlign == rhs.ABIAlign
144 && AddressSpace == rhs.AddressSpace
145 && PrefAlign == rhs.PrefAlign
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000146 && TypeByteWidth == rhs.TypeByteWidth);
Micah Villmow89021e42012-10-09 16:06:12 +0000147}
148
149const PointerAlignElem
Benjamin Kramer058f5b32013-11-19 20:28:04 +0000150DataLayout::InvalidPointerElem = { 0U, 0U, 0U, ~0U };
Micah Villmowac34b5c2012-10-04 22:08:14 +0000151
152//===----------------------------------------------------------------------===//
Micah Villmowb4faa152012-10-04 23:01:22 +0000153// DataLayout Class Implementation
Micah Villmowac34b5c2012-10-04 22:08:14 +0000154//===----------------------------------------------------------------------===//
155
Rafael Espindola58873562014-01-03 19:21:54 +0000156const char *DataLayout::getManglingComponent(const Triple &T) {
157 if (T.isOSBinFormatMachO())
158 return "-m:o";
159 if (T.isOSBinFormatELF() || T.isArch64Bit())
160 return "-m:e";
161 assert(T.isOSBinFormatCOFF());
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000162 return "-m:w";
Rafael Espindola58873562014-01-03 19:21:54 +0000163}
164
Rafael Espindolae23b8772013-12-20 15:21:32 +0000165static const LayoutAlignElem DefaultAlignments[] = {
Rafael Espindola458a4852013-12-19 23:03:03 +0000166 { INTEGER_ALIGN, 1, 1, 1 }, // i1
167 { INTEGER_ALIGN, 8, 1, 1 }, // i8
168 { INTEGER_ALIGN, 16, 2, 2 }, // i16
169 { INTEGER_ALIGN, 32, 4, 4 }, // i32
170 { INTEGER_ALIGN, 64, 4, 8 }, // i64
171 { FLOAT_ALIGN, 16, 2, 2 }, // half
172 { FLOAT_ALIGN, 32, 4, 4 }, // float
173 { FLOAT_ALIGN, 64, 8, 8 }, // double
174 { FLOAT_ALIGN, 128, 16, 16 }, // ppcf128, quad, ...
175 { VECTOR_ALIGN, 64, 8, 8 }, // v2i32, v1i64, ...
176 { VECTOR_ALIGN, 128, 16, 16 }, // v16i8, v8i16, v4i32, ...
177 { AGGREGATE_ALIGN, 0, 0, 8 } // struct
178};
179
Patrik Hägglund01860a62012-11-14 09:04:56 +0000180void DataLayout::init(StringRef Desc) {
Micah Villmowb4faa152012-10-04 23:01:22 +0000181 initializeDataLayoutPass(*PassRegistry::getPassRegistry());
Micah Villmowac34b5c2012-10-04 22:08:14 +0000182
183 LayoutMap = 0;
184 LittleEndian = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000185 StackNaturalAlign = 0;
Rafael Espindola58873562014-01-03 19:21:54 +0000186 ManglingMode = MM_None;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000187
188 // Default alignments
Rafael Espindola458a4852013-12-19 23:03:03 +0000189 for (int I = 0, N = array_lengthof(DefaultAlignments); I < N; ++I) {
Rafael Espindolae23b8772013-12-20 15:21:32 +0000190 const LayoutAlignElem &E = DefaultAlignments[I];
Rafael Espindola458a4852013-12-19 23:03:03 +0000191 setAlignment((AlignTypeEnum)E.AlignType, E.ABIAlign, E.PrefAlign,
192 E.TypeBitWidth);
193 }
Micah Villmow89021e42012-10-09 16:06:12 +0000194 setPointerAlignment(0, 8, 8, 8);
Patrik Hägglund01860a62012-11-14 09:04:56 +0000195
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000196 parseSpecifier(Desc);
197}
198
199/// Checked version of split, to ensure mandatory subparts.
200static std::pair<StringRef, StringRef> split(StringRef Str, char Separator) {
201 assert(!Str.empty() && "parse error, string can't be empty here");
202 std::pair<StringRef, StringRef> Split = Str.split(Separator);
203 assert((!Split.second.empty() || Split.first == Str) &&
204 "a trailing separator is not allowed");
205 return Split;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000206}
207
Cameron McInally8af9eac2014-01-07 19:51:38 +0000208/// Get an unsigned integer, including error checks.
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000209static unsigned getInt(StringRef R) {
Cameron McInallyf0379fa2014-01-13 22:04:55 +0000210 unsigned Result;
Patrik Hägglund504f4782012-11-28 14:32:52 +0000211 bool error = R.getAsInteger(10, Result); (void)error;
Cameron McInallyf0379fa2014-01-13 22:04:55 +0000212 if (error)
213 report_fatal_error("not a number, or does not fit in an unsigned int");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000214 return Result;
215}
216
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000217/// Convert bits into bytes. Assert if not a byte width multiple.
218static unsigned inBytes(unsigned Bits) {
219 assert(Bits % 8 == 0 && "number of bits must be a byte width multiple");
220 return Bits / 8;
221}
222
223void DataLayout::parseSpecifier(StringRef Desc) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000224 while (!Desc.empty()) {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000225 // Split at '-'.
226 std::pair<StringRef, StringRef> Split = split(Desc, '-');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000227 Desc = Split.second;
228
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000229 // Split at ':'.
230 Split = split(Split.first, ':');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000231
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000232 // Aliases used below.
233 StringRef &Tok = Split.first; // Current token.
234 StringRef &Rest = Split.second; // The rest of the string.
Micah Villmowac34b5c2012-10-04 22:08:14 +0000235
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000236 char Specifier = Tok.front();
237 Tok = Tok.substr(1);
238
239 switch (Specifier) {
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000240 case 's':
241 // Ignored for backward compatibility.
242 // FIXME: remove this on LLVM 4.0.
243 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000244 case 'E':
Patrik Hägglund01860a62012-11-14 09:04:56 +0000245 LittleEndian = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000246 break;
247 case 'e':
Patrik Hägglund01860a62012-11-14 09:04:56 +0000248 LittleEndian = true;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000249 break;
250 case 'p': {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000251 // Address space.
252 unsigned AddrSpace = Tok.empty() ? 0 : getInt(Tok);
253 assert(AddrSpace < 1 << 24 &&
254 "Invalid address space, must be a 24bit integer");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000255
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000256 // Size.
257 Split = split(Rest, ':');
258 unsigned PointerMemSize = inBytes(getInt(Tok));
259
260 // ABI alignment.
261 Split = split(Rest, ':');
262 unsigned PointerABIAlign = inBytes(getInt(Tok));
263
264 // Preferred alignment.
265 unsigned PointerPrefAlign = PointerABIAlign;
266 if (!Rest.empty()) {
267 Split = split(Rest, ':');
268 PointerPrefAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000269 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000270
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000271 setPointerAlignment(AddrSpace, PointerABIAlign, PointerPrefAlign,
272 PointerMemSize);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000273 break;
274 }
275 case 'i':
276 case 'v':
277 case 'f':
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000278 case 'a': {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000279 AlignTypeEnum AlignType;
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000280 switch (Specifier) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000281 default:
282 case 'i': AlignType = INTEGER_ALIGN; break;
283 case 'v': AlignType = VECTOR_ALIGN; break;
284 case 'f': AlignType = FLOAT_ALIGN; break;
285 case 'a': AlignType = AGGREGATE_ALIGN; break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000286 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000287
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000288 // Bit size.
289 unsigned Size = Tok.empty() ? 0 : getInt(Tok);
290
Rafael Espindolaabdd7262014-01-06 21:40:24 +0000291 assert((AlignType != AGGREGATE_ALIGN || Size == 0) &&
292 "These specifications don't have a size");
293
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000294 // ABI alignment.
295 Split = split(Rest, ':');
296 unsigned ABIAlign = inBytes(getInt(Tok));
297
298 // Preferred alignment.
299 unsigned PrefAlign = ABIAlign;
300 if (!Rest.empty()) {
301 Split = split(Rest, ':');
302 PrefAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000303 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000304
Patrik Hägglund01860a62012-11-14 09:04:56 +0000305 setAlignment(AlignType, ABIAlign, PrefAlign, Size);
Micah Villmowb4faa152012-10-04 23:01:22 +0000306
Micah Villmowac34b5c2012-10-04 22:08:14 +0000307 break;
308 }
309 case 'n': // Native integer types.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000310 for (;;) {
311 unsigned Width = getInt(Tok);
312 assert(Width != 0 && "width must be non-zero");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000313 LegalIntWidths.push_back(Width);
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000314 if (Rest.empty())
315 break;
316 Split = split(Rest, ':');
317 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000318 break;
319 case 'S': { // Stack natural alignment.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000320 StackNaturalAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000321 break;
322 }
Rafael Espindola58873562014-01-03 19:21:54 +0000323 case 'm':
324 assert(Tok.empty());
325 assert(Rest.size() == 1);
326 switch(Rest[0]) {
327 default:
328 llvm_unreachable("Unknown mangling in datalayout string");
329 case 'e':
330 ManglingMode = MM_ELF;
331 break;
332 case 'o':
333 ManglingMode = MM_MachO;
334 break;
335 case 'm':
336 ManglingMode = MM_Mips;
337 break;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000338 case 'w':
339 ManglingMode = MM_WINCOFF;
Rafael Espindola58873562014-01-03 19:21:54 +0000340 break;
341 }
342 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000343 default:
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000344 llvm_unreachable("Unknown specifier in datalayout string");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000345 break;
346 }
347 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000348}
349
350/// Default ctor.
351///
352/// @note This has to exist, because this is a pass, but it should never be
353/// used.
Micah Villmowb4faa152012-10-04 23:01:22 +0000354DataLayout::DataLayout() : ImmutablePass(ID) {
355 report_fatal_error("Bad DataLayout ctor used. "
Eli Benderskyfaf5e3e2013-01-30 19:24:23 +0000356 "Tool did not specify a DataLayout to use?");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000357}
358
Micah Villmowb4faa152012-10-04 23:01:22 +0000359DataLayout::DataLayout(const Module *M)
Micah Villmowac34b5c2012-10-04 22:08:14 +0000360 : ImmutablePass(ID) {
Patrik Hägglund01860a62012-11-14 09:04:56 +0000361 init(M->getDataLayout());
Micah Villmowac34b5c2012-10-04 22:08:14 +0000362}
363
364void
Micah Villmowb4faa152012-10-04 23:01:22 +0000365DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000366 unsigned pref_align, uint32_t bit_width) {
367 assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
368 assert(pref_align < (1 << 16) && "Alignment doesn't fit in bitfield");
369 assert(bit_width < (1 << 24) && "Bit width doesn't fit in bitfield");
370 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmow6d05e692012-10-05 17:02:14 +0000371 if (Alignments[i].AlignType == (unsigned)align_type &&
Micah Villmowac34b5c2012-10-04 22:08:14 +0000372 Alignments[i].TypeBitWidth == bit_width) {
373 // Update the abi, preferred alignments.
374 Alignments[i].ABIAlign = abi_align;
375 Alignments[i].PrefAlign = pref_align;
376 return;
377 }
378 }
379
Micah Villmowb4faa152012-10-04 23:01:22 +0000380 Alignments.push_back(LayoutAlignElem::get(align_type, abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000381 pref_align, bit_width));
382}
383
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000384void DataLayout::setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign,
385 unsigned PrefAlign,
386 uint32_t TypeByteWidth) {
387 assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
388 DenseMap<unsigned,PointerAlignElem>::iterator val = Pointers.find(AddrSpace);
Micah Villmow89021e42012-10-09 16:06:12 +0000389 if (val == Pointers.end()) {
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000390 Pointers[AddrSpace] =
391 PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign, TypeByteWidth);
Micah Villmow89021e42012-10-09 16:06:12 +0000392 } else {
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000393 val->second.ABIAlign = ABIAlign;
394 val->second.PrefAlign = PrefAlign;
395 val->second.TypeByteWidth = TypeByteWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000396 }
397}
398
Micah Villmowac34b5c2012-10-04 22:08:14 +0000399/// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
Micah Villmowb4faa152012-10-04 23:01:22 +0000400/// preferred if ABIInfo = false) the layout wants for the specified datatype.
401unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000402 uint32_t BitWidth, bool ABIInfo,
403 Type *Ty) const {
404 // Check to see if we have an exact match and remember the best match we see.
405 int BestMatchIdx = -1;
406 int LargestInt = -1;
407 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmow6d05e692012-10-05 17:02:14 +0000408 if (Alignments[i].AlignType == (unsigned)AlignType &&
Micah Villmowac34b5c2012-10-04 22:08:14 +0000409 Alignments[i].TypeBitWidth == BitWidth)
410 return ABIInfo ? Alignments[i].ABIAlign : Alignments[i].PrefAlign;
411
412 // The best match so far depends on what we're looking for.
413 if (AlignType == INTEGER_ALIGN &&
414 Alignments[i].AlignType == INTEGER_ALIGN) {
415 // The "best match" for integers is the smallest size that is larger than
416 // the BitWidth requested.
417 if (Alignments[i].TypeBitWidth > BitWidth && (BestMatchIdx == -1 ||
Eli Benderskyfaf5e3e2013-01-30 19:24:23 +0000418 Alignments[i].TypeBitWidth < Alignments[BestMatchIdx].TypeBitWidth))
Micah Villmowac34b5c2012-10-04 22:08:14 +0000419 BestMatchIdx = i;
420 // However, if there isn't one that's larger, then we must use the
421 // largest one we have (see below)
422 if (LargestInt == -1 ||
423 Alignments[i].TypeBitWidth > Alignments[LargestInt].TypeBitWidth)
424 LargestInt = i;
425 }
426 }
427
428 // Okay, we didn't find an exact solution. Fall back here depending on what
429 // is being looked for.
430 if (BestMatchIdx == -1) {
431 // If we didn't find an integer alignment, fall back on most conservative.
432 if (AlignType == INTEGER_ALIGN) {
433 BestMatchIdx = LargestInt;
434 } else {
435 assert(AlignType == VECTOR_ALIGN && "Unknown alignment type!");
436
437 // By default, use natural alignment for vector types. This is consistent
438 // with what clang and llvm-gcc do.
439 unsigned Align = getTypeAllocSize(cast<VectorType>(Ty)->getElementType());
440 Align *= cast<VectorType>(Ty)->getNumElements();
441 // If the alignment is not a power of 2, round up to the next power of 2.
442 // This happens for non-power-of-2 length vectors.
443 if (Align & (Align-1))
444 Align = NextPowerOf2(Align);
445 return Align;
446 }
447 }
448
449 // Since we got a "best match" index, just return it.
450 return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
451 : Alignments[BestMatchIdx].PrefAlign;
452}
453
454namespace {
455
456class StructLayoutMap {
457 typedef DenseMap<StructType*, StructLayout*> LayoutInfoTy;
458 LayoutInfoTy LayoutInfo;
459
460public:
461 virtual ~StructLayoutMap() {
462 // Remove any layouts.
463 for (LayoutInfoTy::iterator I = LayoutInfo.begin(), E = LayoutInfo.end();
464 I != E; ++I) {
465 StructLayout *Value = I->second;
466 Value->~StructLayout();
467 free(Value);
468 }
469 }
470
471 StructLayout *&operator[](StructType *STy) {
472 return LayoutInfo[STy];
473 }
474
475 // for debugging...
476 virtual void dump() const {}
477};
478
479} // end anonymous namespace
480
Micah Villmowb4faa152012-10-04 23:01:22 +0000481DataLayout::~DataLayout() {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000482 delete static_cast<StructLayoutMap*>(LayoutMap);
483}
484
Pete Cooper6308a822013-03-12 17:37:31 +0000485bool DataLayout::doFinalization(Module &M) {
486 delete static_cast<StructLayoutMap*>(LayoutMap);
487 LayoutMap = 0;
488 return false;
489}
490
Micah Villmowb4faa152012-10-04 23:01:22 +0000491const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000492 if (!LayoutMap)
493 LayoutMap = new StructLayoutMap();
494
495 StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
496 StructLayout *&SL = (*STM)[Ty];
497 if (SL) return SL;
498
499 // Otherwise, create the struct layout. Because it is variable length, we
500 // malloc it, then use placement new.
501 int NumElts = Ty->getNumElements();
502 StructLayout *L =
503 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t));
504
505 // Set SL before calling StructLayout's ctor. The ctor could cause other
506 // entries to be added to TheMap, invalidating our reference.
507 SL = L;
508
509 new (L) StructLayout(Ty, *this);
510
511 return L;
512}
513
Micah Villmowb4faa152012-10-04 23:01:22 +0000514std::string DataLayout::getStringRepresentation() const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000515 std::string Result;
516 raw_string_ostream OS(Result);
517
Micah Villmow89021e42012-10-09 16:06:12 +0000518 OS << (LittleEndian ? "e" : "E");
Rafael Espindola58873562014-01-03 19:21:54 +0000519
520 switch (ManglingMode) {
521 case MM_None:
522 break;
523 case MM_ELF:
524 OS << "-m:e";
525 break;
526 case MM_MachO:
527 OS << "-m:o";
528 break;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000529 case MM_WINCOFF:
530 OS << "-m:w";
Rafael Espindola58873562014-01-03 19:21:54 +0000531 break;
532 case MM_Mips:
533 OS << "-m:m";
534 break;
535 }
536
Micah Villmow89021e42012-10-09 16:06:12 +0000537 SmallVector<unsigned, 8> addrSpaces;
538 // Lets get all of the known address spaces and sort them
539 // into increasing order so that we can emit the string
540 // in a cleaner format.
541 for (DenseMap<unsigned, PointerAlignElem>::const_iterator
542 pib = Pointers.begin(), pie = Pointers.end();
543 pib != pie; ++pib) {
544 addrSpaces.push_back(pib->first);
545 }
546 std::sort(addrSpaces.begin(), addrSpaces.end());
Craig Topperaf0dea12013-07-04 01:31:24 +0000547 for (SmallVectorImpl<unsigned>::iterator asb = addrSpaces.begin(),
Micah Villmow89021e42012-10-09 16:06:12 +0000548 ase = addrSpaces.end(); asb != ase; ++asb) {
549 const PointerAlignElem &PI = Pointers.find(*asb)->second;
Rafael Espindola458a4852013-12-19 23:03:03 +0000550
551 // Skip default.
552 if (PI.AddressSpace == 0 && PI.ABIAlign == 8 && PI.PrefAlign == 8 &&
553 PI.TypeByteWidth == 8)
554 continue;
555
Micah Villmow89021e42012-10-09 16:06:12 +0000556 OS << "-p";
557 if (PI.AddressSpace) {
558 OS << PI.AddressSpace;
559 }
Rafael Espindola458a4852013-12-19 23:03:03 +0000560 OS << ":" << PI.TypeByteWidth*8 << ':' << PI.ABIAlign*8;
561 if (PI.PrefAlign != PI.ABIAlign)
562 OS << ':' << PI.PrefAlign*8;
Micah Villmow89021e42012-10-09 16:06:12 +0000563 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000564
Rafael Espindolae23b8772013-12-20 15:21:32 +0000565 const LayoutAlignElem *DefaultStart = DefaultAlignments;
566 const LayoutAlignElem *DefaultEnd =
Rafael Espindola458a4852013-12-19 23:03:03 +0000567 DefaultStart + array_lengthof(DefaultAlignments);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000568 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmowb4faa152012-10-04 23:01:22 +0000569 const LayoutAlignElem &AI = Alignments[i];
Rafael Espindola458a4852013-12-19 23:03:03 +0000570 if (std::find(DefaultStart, DefaultEnd, AI) != DefaultEnd)
571 continue;
572 OS << '-' << (char)AI.AlignType;
573 if (AI.TypeBitWidth)
574 OS << AI.TypeBitWidth;
575 OS << ':' << AI.ABIAlign*8;
576 if (AI.ABIAlign != AI.PrefAlign)
577 OS << ':' << AI.PrefAlign*8;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000578 }
579
580 if (!LegalIntWidths.empty()) {
581 OS << "-n" << (unsigned)LegalIntWidths[0];
582
583 for (unsigned i = 1, e = LegalIntWidths.size(); i != e; ++i)
584 OS << ':' << (unsigned)LegalIntWidths[i];
585 }
Rafael Espindola458a4852013-12-19 23:03:03 +0000586
587 if (StackNaturalAlign)
588 OS << "-S" << StackNaturalAlign*8;
589
Micah Villmowac34b5c2012-10-04 22:08:14 +0000590 return OS.str();
591}
592
Matt Arsenault6f4be902013-07-26 17:37:20 +0000593unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {
594 assert(Ty->isPtrOrPtrVectorTy() &&
595 "This should only be called with a pointer or pointer vector type");
596
597 if (Ty->isPointerTy())
598 return getTypeSizeInBits(Ty);
599
Matt Arsenault517cf482013-07-27 19:22:28 +0000600 return getTypeSizeInBits(Ty->getScalarType());
Matt Arsenault6f4be902013-07-26 17:37:20 +0000601}
Micah Villmowac34b5c2012-10-04 22:08:14 +0000602
Micah Villmowac34b5c2012-10-04 22:08:14 +0000603/*!
604 \param abi_or_pref Flag that determines which alignment is returned. true
605 returns the ABI alignment, false returns the preferred alignment.
606 \param Ty The underlying type for which alignment is determined.
607
608 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
609 == false) for the requested type \a Ty.
610 */
Micah Villmowb4faa152012-10-04 23:01:22 +0000611unsigned DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000612 int AlignType = -1;
613
614 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
615 switch (Ty->getTypeID()) {
616 // Early escape for the non-numeric types.
617 case Type::LabelTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000618 return (abi_or_pref
Micah Villmow89021e42012-10-09 16:06:12 +0000619 ? getPointerABIAlignment(0)
620 : getPointerPrefAlignment(0));
621 case Type::PointerTyID: {
622 unsigned AS = dyn_cast<PointerType>(Ty)->getAddressSpace();
623 return (abi_or_pref
624 ? getPointerABIAlignment(AS)
625 : getPointerPrefAlignment(AS));
626 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000627 case Type::ArrayTyID:
628 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
629
630 case Type::StructTyID: {
631 // Packed structure types always have an ABI alignment of one.
632 if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
633 return 1;
634
635 // Get the layout annotation... which is lazily created on demand.
636 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
637 unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty);
638 return std::max(Align, Layout->getAlignment());
639 }
640 case Type::IntegerTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000641 AlignType = INTEGER_ALIGN;
642 break;
643 case Type::HalfTyID:
644 case Type::FloatTyID:
645 case Type::DoubleTyID:
646 // PPC_FP128TyID and FP128TyID have different data contents, but the
647 // same size and alignment, so they look the same here.
648 case Type::PPC_FP128TyID:
649 case Type::FP128TyID:
650 case Type::X86_FP80TyID:
651 AlignType = FLOAT_ALIGN;
652 break;
653 case Type::X86_MMXTyID:
654 case Type::VectorTyID:
655 AlignType = VECTOR_ALIGN;
656 break;
657 default:
658 llvm_unreachable("Bad type for getAlignment!!!");
659 }
660
661 return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSizeInBits(Ty),
662 abi_or_pref, Ty);
663}
664
Micah Villmowb4faa152012-10-04 23:01:22 +0000665unsigned DataLayout::getABITypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000666 return getAlignment(Ty, true);
667}
668
669/// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
670/// an integer type of the specified bitwidth.
Micah Villmowb4faa152012-10-04 23:01:22 +0000671unsigned DataLayout::getABIIntegerTypeAlignment(unsigned BitWidth) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000672 return getAlignmentInfo(INTEGER_ALIGN, BitWidth, true, 0);
673}
674
Micah Villmowb4faa152012-10-04 23:01:22 +0000675unsigned DataLayout::getPrefTypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000676 return getAlignment(Ty, false);
677}
678
Micah Villmowb4faa152012-10-04 23:01:22 +0000679unsigned DataLayout::getPreferredTypeAlignmentShift(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000680 unsigned Align = getPrefTypeAlignment(Ty);
681 assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
682 return Log2_32(Align);
683}
684
Micah Villmow89021e42012-10-09 16:06:12 +0000685IntegerType *DataLayout::getIntPtrType(LLVMContext &C,
686 unsigned AddressSpace) const {
687 return IntegerType::get(C, getPointerSizeInBits(AddressSpace));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000688}
689
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000690Type *DataLayout::getIntPtrType(Type *Ty) const {
Chandler Carruth7ec50852012-11-01 08:07:29 +0000691 assert(Ty->isPtrOrPtrVectorTy() &&
692 "Expected a pointer or pointer vector type.");
Chandler Carruth7ec50852012-11-01 08:07:29 +0000693 unsigned NumBits = getTypeSizeInBits(Ty->getScalarType());
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000694 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
695 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
696 return VectorType::get(IntTy, VecTy->getNumElements());
697 return IntTy;
Micah Villmow12d91272012-10-24 15:52:52 +0000698}
699
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000700Type *DataLayout::getSmallestLegalIntType(LLVMContext &C, unsigned Width) const {
701 for (unsigned i = 0, e = (unsigned)LegalIntWidths.size(); i != e; ++i)
702 if (Width <= LegalIntWidths[i])
703 return Type::getIntNTy(C, LegalIntWidths[i]);
704 return 0;
705}
706
Matt Arsenault899f7d22013-09-16 22:43:16 +0000707unsigned DataLayout::getLargestLegalIntTypeSize() const {
708 unsigned MaxWidth = 0;
709 for (unsigned i = 0, e = (unsigned)LegalIntWidths.size(); i != e; ++i)
710 MaxWidth = std::max<unsigned>(MaxWidth, LegalIntWidths[i]);
711 return MaxWidth;
712}
713
Micah Villmowb4faa152012-10-04 23:01:22 +0000714uint64_t DataLayout::getIndexedOffset(Type *ptrTy,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000715 ArrayRef<Value *> Indices) const {
716 Type *Ty = ptrTy;
717 assert(Ty->isPointerTy() && "Illegal argument for getIndexedOffset()");
718 uint64_t Result = 0;
719
720 generic_gep_type_iterator<Value* const*>
721 TI = gep_type_begin(ptrTy, Indices);
722 for (unsigned CurIDX = 0, EndIDX = Indices.size(); CurIDX != EndIDX;
723 ++CurIDX, ++TI) {
724 if (StructType *STy = dyn_cast<StructType>(*TI)) {
725 assert(Indices[CurIDX]->getType() ==
726 Type::getInt32Ty(ptrTy->getContext()) &&
727 "Illegal struct idx");
728 unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
729
730 // Get structure layout information...
731 const StructLayout *Layout = getStructLayout(STy);
732
733 // Add in the offset, as calculated by the structure layout info...
734 Result += Layout->getElementOffset(FieldNo);
735
736 // Update Ty to refer to current element
737 Ty = STy->getElementType(FieldNo);
738 } else {
739 // Update Ty to refer to current element
740 Ty = cast<SequentialType>(Ty)->getElementType();
741
742 // Get the array index and the size of each array element.
743 if (int64_t arrayIdx = cast<ConstantInt>(Indices[CurIDX])->getSExtValue())
744 Result += (uint64_t)arrayIdx * getTypeAllocSize(Ty);
745 }
746 }
747
748 return Result;
749}
750
751/// getPreferredAlignment - Return the preferred alignment of the specified
752/// global. This includes an explicitly requested alignment (if the global
753/// has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000754unsigned DataLayout::getPreferredAlignment(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000755 Type *ElemType = GV->getType()->getElementType();
756 unsigned Alignment = getPrefTypeAlignment(ElemType);
757 unsigned GVAlignment = GV->getAlignment();
758 if (GVAlignment >= Alignment) {
759 Alignment = GVAlignment;
760 } else if (GVAlignment != 0) {
761 Alignment = std::max(GVAlignment, getABITypeAlignment(ElemType));
762 }
763
764 if (GV->hasInitializer() && GVAlignment == 0) {
765 if (Alignment < 16) {
766 // If the global is not external, see if it is large. If so, give it a
767 // larger alignment.
768 if (getTypeSizeInBits(ElemType) > 128)
769 Alignment = 16; // 16-byte alignment.
770 }
771 }
772 return Alignment;
773}
774
775/// getPreferredAlignmentLog - Return the preferred alignment of the
776/// specified global, returned in log form. This includes an explicitly
777/// requested alignment (if the global has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000778unsigned DataLayout::getPreferredAlignmentLog(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000779 return Log2_32(getPreferredAlignment(GV));
780}