blob: 6f32be08c5ba8029559c78a6d1d647c07ee0e49b [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());
162 return "-m:c";
163}
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 McInally8af9eac2014-01-07 19:51:38 +0000210 unsigned Result = 0;
Patrik Hägglund504f4782012-11-28 14:32:52 +0000211 bool error = R.getAsInteger(10, Result); (void)error;
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000212 assert(!error && "not a number, or does not fit in an unsigned int");
213 return Result;
214}
215
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000216/// Convert bits into bytes. Assert if not a byte width multiple.
217static unsigned inBytes(unsigned Bits) {
218 assert(Bits % 8 == 0 && "number of bits must be a byte width multiple");
219 return Bits / 8;
220}
221
222void DataLayout::parseSpecifier(StringRef Desc) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000223 while (!Desc.empty()) {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000224 // Split at '-'.
225 std::pair<StringRef, StringRef> Split = split(Desc, '-');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000226 Desc = Split.second;
227
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000228 // Split at ':'.
229 Split = split(Split.first, ':');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000230
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000231 // Aliases used below.
232 StringRef &Tok = Split.first; // Current token.
233 StringRef &Rest = Split.second; // The rest of the string.
Micah Villmowac34b5c2012-10-04 22:08:14 +0000234
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000235 char Specifier = Tok.front();
236 Tok = Tok.substr(1);
237
238 switch (Specifier) {
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000239 case 's':
240 // Ignored for backward compatibility.
241 // FIXME: remove this on LLVM 4.0.
242 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000243 case 'E':
Patrik Hägglund01860a62012-11-14 09:04:56 +0000244 LittleEndian = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000245 break;
246 case 'e':
Patrik Hägglund01860a62012-11-14 09:04:56 +0000247 LittleEndian = true;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000248 break;
249 case 'p': {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000250 // Address space.
251 unsigned AddrSpace = Tok.empty() ? 0 : getInt(Tok);
252 assert(AddrSpace < 1 << 24 &&
253 "Invalid address space, must be a 24bit integer");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000254
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000255 // Size.
256 Split = split(Rest, ':');
257 unsigned PointerMemSize = inBytes(getInt(Tok));
258
259 // ABI alignment.
260 Split = split(Rest, ':');
261 unsigned PointerABIAlign = inBytes(getInt(Tok));
262
263 // Preferred alignment.
264 unsigned PointerPrefAlign = PointerABIAlign;
265 if (!Rest.empty()) {
266 Split = split(Rest, ':');
267 PointerPrefAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000268 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000269
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000270 setPointerAlignment(AddrSpace, PointerABIAlign, PointerPrefAlign,
271 PointerMemSize);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000272 break;
273 }
274 case 'i':
275 case 'v':
276 case 'f':
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000277 case 'a': {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000278 AlignTypeEnum AlignType;
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000279 switch (Specifier) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000280 default:
281 case 'i': AlignType = INTEGER_ALIGN; break;
282 case 'v': AlignType = VECTOR_ALIGN; break;
283 case 'f': AlignType = FLOAT_ALIGN; break;
284 case 'a': AlignType = AGGREGATE_ALIGN; break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000285 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000286
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000287 // Bit size.
288 unsigned Size = Tok.empty() ? 0 : getInt(Tok);
289
Rafael Espindolaabdd7262014-01-06 21:40:24 +0000290 assert((AlignType != AGGREGATE_ALIGN || Size == 0) &&
291 "These specifications don't have a size");
292
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000293 // ABI alignment.
294 Split = split(Rest, ':');
295 unsigned ABIAlign = inBytes(getInt(Tok));
296
297 // Preferred alignment.
298 unsigned PrefAlign = ABIAlign;
299 if (!Rest.empty()) {
300 Split = split(Rest, ':');
301 PrefAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000302 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000303
Patrik Hägglund01860a62012-11-14 09:04:56 +0000304 setAlignment(AlignType, ABIAlign, PrefAlign, Size);
Micah Villmowb4faa152012-10-04 23:01:22 +0000305
Micah Villmowac34b5c2012-10-04 22:08:14 +0000306 break;
307 }
308 case 'n': // Native integer types.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000309 for (;;) {
310 unsigned Width = getInt(Tok);
311 assert(Width != 0 && "width must be non-zero");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000312 LegalIntWidths.push_back(Width);
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000313 if (Rest.empty())
314 break;
315 Split = split(Rest, ':');
316 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000317 break;
318 case 'S': { // Stack natural alignment.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000319 StackNaturalAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000320 break;
321 }
Rafael Espindola58873562014-01-03 19:21:54 +0000322 case 'm':
323 assert(Tok.empty());
324 assert(Rest.size() == 1);
325 switch(Rest[0]) {
326 default:
327 llvm_unreachable("Unknown mangling in datalayout string");
328 case 'e':
329 ManglingMode = MM_ELF;
330 break;
331 case 'o':
332 ManglingMode = MM_MachO;
333 break;
334 case 'm':
335 ManglingMode = MM_Mips;
336 break;
337 case 'c':
338 ManglingMode = MM_COFF;
339 break;
340 }
341 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000342 default:
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000343 llvm_unreachable("Unknown specifier in datalayout string");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000344 break;
345 }
346 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000347}
348
349/// Default ctor.
350///
351/// @note This has to exist, because this is a pass, but it should never be
352/// used.
Micah Villmowb4faa152012-10-04 23:01:22 +0000353DataLayout::DataLayout() : ImmutablePass(ID) {
354 report_fatal_error("Bad DataLayout ctor used. "
Eli Benderskyfaf5e3e2013-01-30 19:24:23 +0000355 "Tool did not specify a DataLayout to use?");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000356}
357
Micah Villmowb4faa152012-10-04 23:01:22 +0000358DataLayout::DataLayout(const Module *M)
Micah Villmowac34b5c2012-10-04 22:08:14 +0000359 : ImmutablePass(ID) {
Patrik Hägglund01860a62012-11-14 09:04:56 +0000360 init(M->getDataLayout());
Micah Villmowac34b5c2012-10-04 22:08:14 +0000361}
362
363void
Micah Villmowb4faa152012-10-04 23:01:22 +0000364DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000365 unsigned pref_align, uint32_t bit_width) {
366 assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
367 assert(pref_align < (1 << 16) && "Alignment doesn't fit in bitfield");
368 assert(bit_width < (1 << 24) && "Bit width doesn't fit in bitfield");
369 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmow6d05e692012-10-05 17:02:14 +0000370 if (Alignments[i].AlignType == (unsigned)align_type &&
Micah Villmowac34b5c2012-10-04 22:08:14 +0000371 Alignments[i].TypeBitWidth == bit_width) {
372 // Update the abi, preferred alignments.
373 Alignments[i].ABIAlign = abi_align;
374 Alignments[i].PrefAlign = pref_align;
375 return;
376 }
377 }
378
Micah Villmowb4faa152012-10-04 23:01:22 +0000379 Alignments.push_back(LayoutAlignElem::get(align_type, abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000380 pref_align, bit_width));
381}
382
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000383void DataLayout::setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign,
384 unsigned PrefAlign,
385 uint32_t TypeByteWidth) {
386 assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
387 DenseMap<unsigned,PointerAlignElem>::iterator val = Pointers.find(AddrSpace);
Micah Villmow89021e42012-10-09 16:06:12 +0000388 if (val == Pointers.end()) {
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000389 Pointers[AddrSpace] =
390 PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign, TypeByteWidth);
Micah Villmow89021e42012-10-09 16:06:12 +0000391 } else {
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000392 val->second.ABIAlign = ABIAlign;
393 val->second.PrefAlign = PrefAlign;
394 val->second.TypeByteWidth = TypeByteWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000395 }
396}
397
Micah Villmowac34b5c2012-10-04 22:08:14 +0000398/// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
Micah Villmowb4faa152012-10-04 23:01:22 +0000399/// preferred if ABIInfo = false) the layout wants for the specified datatype.
400unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000401 uint32_t BitWidth, bool ABIInfo,
402 Type *Ty) const {
403 // Check to see if we have an exact match and remember the best match we see.
404 int BestMatchIdx = -1;
405 int LargestInt = -1;
406 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmow6d05e692012-10-05 17:02:14 +0000407 if (Alignments[i].AlignType == (unsigned)AlignType &&
Micah Villmowac34b5c2012-10-04 22:08:14 +0000408 Alignments[i].TypeBitWidth == BitWidth)
409 return ABIInfo ? Alignments[i].ABIAlign : Alignments[i].PrefAlign;
410
411 // The best match so far depends on what we're looking for.
412 if (AlignType == INTEGER_ALIGN &&
413 Alignments[i].AlignType == INTEGER_ALIGN) {
414 // The "best match" for integers is the smallest size that is larger than
415 // the BitWidth requested.
416 if (Alignments[i].TypeBitWidth > BitWidth && (BestMatchIdx == -1 ||
Eli Benderskyfaf5e3e2013-01-30 19:24:23 +0000417 Alignments[i].TypeBitWidth < Alignments[BestMatchIdx].TypeBitWidth))
Micah Villmowac34b5c2012-10-04 22:08:14 +0000418 BestMatchIdx = i;
419 // However, if there isn't one that's larger, then we must use the
420 // largest one we have (see below)
421 if (LargestInt == -1 ||
422 Alignments[i].TypeBitWidth > Alignments[LargestInt].TypeBitWidth)
423 LargestInt = i;
424 }
425 }
426
427 // Okay, we didn't find an exact solution. Fall back here depending on what
428 // is being looked for.
429 if (BestMatchIdx == -1) {
430 // If we didn't find an integer alignment, fall back on most conservative.
431 if (AlignType == INTEGER_ALIGN) {
432 BestMatchIdx = LargestInt;
433 } else {
434 assert(AlignType == VECTOR_ALIGN && "Unknown alignment type!");
435
436 // By default, use natural alignment for vector types. This is consistent
437 // with what clang and llvm-gcc do.
438 unsigned Align = getTypeAllocSize(cast<VectorType>(Ty)->getElementType());
439 Align *= cast<VectorType>(Ty)->getNumElements();
440 // If the alignment is not a power of 2, round up to the next power of 2.
441 // This happens for non-power-of-2 length vectors.
442 if (Align & (Align-1))
443 Align = NextPowerOf2(Align);
444 return Align;
445 }
446 }
447
448 // Since we got a "best match" index, just return it.
449 return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
450 : Alignments[BestMatchIdx].PrefAlign;
451}
452
453namespace {
454
455class StructLayoutMap {
456 typedef DenseMap<StructType*, StructLayout*> LayoutInfoTy;
457 LayoutInfoTy LayoutInfo;
458
459public:
460 virtual ~StructLayoutMap() {
461 // Remove any layouts.
462 for (LayoutInfoTy::iterator I = LayoutInfo.begin(), E = LayoutInfo.end();
463 I != E; ++I) {
464 StructLayout *Value = I->second;
465 Value->~StructLayout();
466 free(Value);
467 }
468 }
469
470 StructLayout *&operator[](StructType *STy) {
471 return LayoutInfo[STy];
472 }
473
474 // for debugging...
475 virtual void dump() const {}
476};
477
478} // end anonymous namespace
479
Micah Villmowb4faa152012-10-04 23:01:22 +0000480DataLayout::~DataLayout() {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000481 delete static_cast<StructLayoutMap*>(LayoutMap);
482}
483
Pete Cooper6308a822013-03-12 17:37:31 +0000484bool DataLayout::doFinalization(Module &M) {
485 delete static_cast<StructLayoutMap*>(LayoutMap);
486 LayoutMap = 0;
487 return false;
488}
489
Micah Villmowb4faa152012-10-04 23:01:22 +0000490const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000491 if (!LayoutMap)
492 LayoutMap = new StructLayoutMap();
493
494 StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
495 StructLayout *&SL = (*STM)[Ty];
496 if (SL) return SL;
497
498 // Otherwise, create the struct layout. Because it is variable length, we
499 // malloc it, then use placement new.
500 int NumElts = Ty->getNumElements();
501 StructLayout *L =
502 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t));
503
504 // Set SL before calling StructLayout's ctor. The ctor could cause other
505 // entries to be added to TheMap, invalidating our reference.
506 SL = L;
507
508 new (L) StructLayout(Ty, *this);
509
510 return L;
511}
512
Micah Villmowb4faa152012-10-04 23:01:22 +0000513std::string DataLayout::getStringRepresentation() const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000514 std::string Result;
515 raw_string_ostream OS(Result);
516
Micah Villmow89021e42012-10-09 16:06:12 +0000517 OS << (LittleEndian ? "e" : "E");
Rafael Espindola58873562014-01-03 19:21:54 +0000518
519 switch (ManglingMode) {
520 case MM_None:
521 break;
522 case MM_ELF:
523 OS << "-m:e";
524 break;
525 case MM_MachO:
526 OS << "-m:o";
527 break;
528 case MM_COFF:
529 OS << "-m:c";
530 break;
531 case MM_Mips:
532 OS << "-m:m";
533 break;
534 }
535
Micah Villmow89021e42012-10-09 16:06:12 +0000536 SmallVector<unsigned, 8> addrSpaces;
537 // Lets get all of the known address spaces and sort them
538 // into increasing order so that we can emit the string
539 // in a cleaner format.
540 for (DenseMap<unsigned, PointerAlignElem>::const_iterator
541 pib = Pointers.begin(), pie = Pointers.end();
542 pib != pie; ++pib) {
543 addrSpaces.push_back(pib->first);
544 }
545 std::sort(addrSpaces.begin(), addrSpaces.end());
Craig Topperaf0dea12013-07-04 01:31:24 +0000546 for (SmallVectorImpl<unsigned>::iterator asb = addrSpaces.begin(),
Micah Villmow89021e42012-10-09 16:06:12 +0000547 ase = addrSpaces.end(); asb != ase; ++asb) {
548 const PointerAlignElem &PI = Pointers.find(*asb)->second;
Rafael Espindola458a4852013-12-19 23:03:03 +0000549
550 // Skip default.
551 if (PI.AddressSpace == 0 && PI.ABIAlign == 8 && PI.PrefAlign == 8 &&
552 PI.TypeByteWidth == 8)
553 continue;
554
Micah Villmow89021e42012-10-09 16:06:12 +0000555 OS << "-p";
556 if (PI.AddressSpace) {
557 OS << PI.AddressSpace;
558 }
Rafael Espindola458a4852013-12-19 23:03:03 +0000559 OS << ":" << PI.TypeByteWidth*8 << ':' << PI.ABIAlign*8;
560 if (PI.PrefAlign != PI.ABIAlign)
561 OS << ':' << PI.PrefAlign*8;
Micah Villmow89021e42012-10-09 16:06:12 +0000562 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000563
Rafael Espindolae23b8772013-12-20 15:21:32 +0000564 const LayoutAlignElem *DefaultStart = DefaultAlignments;
565 const LayoutAlignElem *DefaultEnd =
Rafael Espindola458a4852013-12-19 23:03:03 +0000566 DefaultStart + array_lengthof(DefaultAlignments);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000567 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmowb4faa152012-10-04 23:01:22 +0000568 const LayoutAlignElem &AI = Alignments[i];
Rafael Espindola458a4852013-12-19 23:03:03 +0000569 if (std::find(DefaultStart, DefaultEnd, AI) != DefaultEnd)
570 continue;
571 OS << '-' << (char)AI.AlignType;
572 if (AI.TypeBitWidth)
573 OS << AI.TypeBitWidth;
574 OS << ':' << AI.ABIAlign*8;
575 if (AI.ABIAlign != AI.PrefAlign)
576 OS << ':' << AI.PrefAlign*8;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000577 }
578
579 if (!LegalIntWidths.empty()) {
580 OS << "-n" << (unsigned)LegalIntWidths[0];
581
582 for (unsigned i = 1, e = LegalIntWidths.size(); i != e; ++i)
583 OS << ':' << (unsigned)LegalIntWidths[i];
584 }
Rafael Espindola458a4852013-12-19 23:03:03 +0000585
586 if (StackNaturalAlign)
587 OS << "-S" << StackNaturalAlign*8;
588
Micah Villmowac34b5c2012-10-04 22:08:14 +0000589 return OS.str();
590}
591
Matt Arsenault6f4be902013-07-26 17:37:20 +0000592unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {
593 assert(Ty->isPtrOrPtrVectorTy() &&
594 "This should only be called with a pointer or pointer vector type");
595
596 if (Ty->isPointerTy())
597 return getTypeSizeInBits(Ty);
598
Matt Arsenault517cf482013-07-27 19:22:28 +0000599 return getTypeSizeInBits(Ty->getScalarType());
Matt Arsenault6f4be902013-07-26 17:37:20 +0000600}
Micah Villmowac34b5c2012-10-04 22:08:14 +0000601
Micah Villmowac34b5c2012-10-04 22:08:14 +0000602/*!
603 \param abi_or_pref Flag that determines which alignment is returned. true
604 returns the ABI alignment, false returns the preferred alignment.
605 \param Ty The underlying type for which alignment is determined.
606
607 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
608 == false) for the requested type \a Ty.
609 */
Micah Villmowb4faa152012-10-04 23:01:22 +0000610unsigned DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000611 int AlignType = -1;
612
613 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
614 switch (Ty->getTypeID()) {
615 // Early escape for the non-numeric types.
616 case Type::LabelTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000617 return (abi_or_pref
Micah Villmow89021e42012-10-09 16:06:12 +0000618 ? getPointerABIAlignment(0)
619 : getPointerPrefAlignment(0));
620 case Type::PointerTyID: {
621 unsigned AS = dyn_cast<PointerType>(Ty)->getAddressSpace();
622 return (abi_or_pref
623 ? getPointerABIAlignment(AS)
624 : getPointerPrefAlignment(AS));
625 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000626 case Type::ArrayTyID:
627 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
628
629 case Type::StructTyID: {
630 // Packed structure types always have an ABI alignment of one.
631 if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
632 return 1;
633
634 // Get the layout annotation... which is lazily created on demand.
635 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
636 unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty);
637 return std::max(Align, Layout->getAlignment());
638 }
639 case Type::IntegerTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000640 AlignType = INTEGER_ALIGN;
641 break;
642 case Type::HalfTyID:
643 case Type::FloatTyID:
644 case Type::DoubleTyID:
645 // PPC_FP128TyID and FP128TyID have different data contents, but the
646 // same size and alignment, so they look the same here.
647 case Type::PPC_FP128TyID:
648 case Type::FP128TyID:
649 case Type::X86_FP80TyID:
650 AlignType = FLOAT_ALIGN;
651 break;
652 case Type::X86_MMXTyID:
653 case Type::VectorTyID:
654 AlignType = VECTOR_ALIGN;
655 break;
656 default:
657 llvm_unreachable("Bad type for getAlignment!!!");
658 }
659
660 return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSizeInBits(Ty),
661 abi_or_pref, Ty);
662}
663
Micah Villmowb4faa152012-10-04 23:01:22 +0000664unsigned DataLayout::getABITypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000665 return getAlignment(Ty, true);
666}
667
668/// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
669/// an integer type of the specified bitwidth.
Micah Villmowb4faa152012-10-04 23:01:22 +0000670unsigned DataLayout::getABIIntegerTypeAlignment(unsigned BitWidth) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000671 return getAlignmentInfo(INTEGER_ALIGN, BitWidth, true, 0);
672}
673
Micah Villmowb4faa152012-10-04 23:01:22 +0000674unsigned DataLayout::getPrefTypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000675 return getAlignment(Ty, false);
676}
677
Micah Villmowb4faa152012-10-04 23:01:22 +0000678unsigned DataLayout::getPreferredTypeAlignmentShift(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000679 unsigned Align = getPrefTypeAlignment(Ty);
680 assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
681 return Log2_32(Align);
682}
683
Micah Villmow89021e42012-10-09 16:06:12 +0000684IntegerType *DataLayout::getIntPtrType(LLVMContext &C,
685 unsigned AddressSpace) const {
686 return IntegerType::get(C, getPointerSizeInBits(AddressSpace));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000687}
688
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000689Type *DataLayout::getIntPtrType(Type *Ty) const {
Chandler Carruth7ec50852012-11-01 08:07:29 +0000690 assert(Ty->isPtrOrPtrVectorTy() &&
691 "Expected a pointer or pointer vector type.");
Chandler Carruth7ec50852012-11-01 08:07:29 +0000692 unsigned NumBits = getTypeSizeInBits(Ty->getScalarType());
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000693 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
694 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
695 return VectorType::get(IntTy, VecTy->getNumElements());
696 return IntTy;
Micah Villmow12d91272012-10-24 15:52:52 +0000697}
698
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000699Type *DataLayout::getSmallestLegalIntType(LLVMContext &C, unsigned Width) const {
700 for (unsigned i = 0, e = (unsigned)LegalIntWidths.size(); i != e; ++i)
701 if (Width <= LegalIntWidths[i])
702 return Type::getIntNTy(C, LegalIntWidths[i]);
703 return 0;
704}
705
Matt Arsenault899f7d22013-09-16 22:43:16 +0000706unsigned DataLayout::getLargestLegalIntTypeSize() const {
707 unsigned MaxWidth = 0;
708 for (unsigned i = 0, e = (unsigned)LegalIntWidths.size(); i != e; ++i)
709 MaxWidth = std::max<unsigned>(MaxWidth, LegalIntWidths[i]);
710 return MaxWidth;
711}
712
Micah Villmowb4faa152012-10-04 23:01:22 +0000713uint64_t DataLayout::getIndexedOffset(Type *ptrTy,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000714 ArrayRef<Value *> Indices) const {
715 Type *Ty = ptrTy;
716 assert(Ty->isPointerTy() && "Illegal argument for getIndexedOffset()");
717 uint64_t Result = 0;
718
719 generic_gep_type_iterator<Value* const*>
720 TI = gep_type_begin(ptrTy, Indices);
721 for (unsigned CurIDX = 0, EndIDX = Indices.size(); CurIDX != EndIDX;
722 ++CurIDX, ++TI) {
723 if (StructType *STy = dyn_cast<StructType>(*TI)) {
724 assert(Indices[CurIDX]->getType() ==
725 Type::getInt32Ty(ptrTy->getContext()) &&
726 "Illegal struct idx");
727 unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
728
729 // Get structure layout information...
730 const StructLayout *Layout = getStructLayout(STy);
731
732 // Add in the offset, as calculated by the structure layout info...
733 Result += Layout->getElementOffset(FieldNo);
734
735 // Update Ty to refer to current element
736 Ty = STy->getElementType(FieldNo);
737 } else {
738 // Update Ty to refer to current element
739 Ty = cast<SequentialType>(Ty)->getElementType();
740
741 // Get the array index and the size of each array element.
742 if (int64_t arrayIdx = cast<ConstantInt>(Indices[CurIDX])->getSExtValue())
743 Result += (uint64_t)arrayIdx * getTypeAllocSize(Ty);
744 }
745 }
746
747 return Result;
748}
749
750/// getPreferredAlignment - Return the preferred alignment of the specified
751/// global. This includes an explicitly requested alignment (if the global
752/// has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000753unsigned DataLayout::getPreferredAlignment(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000754 Type *ElemType = GV->getType()->getElementType();
755 unsigned Alignment = getPrefTypeAlignment(ElemType);
756 unsigned GVAlignment = GV->getAlignment();
757 if (GVAlignment >= Alignment) {
758 Alignment = GVAlignment;
759 } else if (GVAlignment != 0) {
760 Alignment = std::max(GVAlignment, getABITypeAlignment(ElemType));
761 }
762
763 if (GV->hasInitializer() && GVAlignment == 0) {
764 if (Alignment < 16) {
765 // If the global is not external, see if it is large. If so, give it a
766 // larger alignment.
767 if (getTypeSizeInBits(ElemType) > 128)
768 Alignment = 16; // 16-byte alignment.
769 }
770 }
771 return Alignment;
772}
773
774/// getPreferredAlignmentLog - Return the preferred alignment of the
775/// specified global, returned in log form. This includes an explicitly
776/// requested alignment (if the global has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000777unsigned DataLayout::getPreferredAlignmentLog(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000778 return Log2_32(getPreferredAlignment(GV));
779}