blob: e6ca17a6ebfb0bd249a9bcad913e057fb089f2ad [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"
Chandler Carruth03eb0de2014-03-04 10:40:04 +000025#include "llvm/IR/GetElementPtrTypeIterator.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000026#include "llvm/IR/Module.h"
Micah Villmowac34b5c2012-10-04 22:08:14 +000027#include "llvm/Support/ErrorHandling.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000028#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
Rafael Espindola93512512014-02-25 17:30:31 +000038INITIALIZE_PASS(DataLayoutPass, "datalayout", "Data Layout", false, true)
39char DataLayoutPass::ID = 0;
Micah Villmowac34b5c2012-10-04 22:08:14 +000040
41//===----------------------------------------------------------------------===//
42// Support for StructLayout
43//===----------------------------------------------------------------------===//
44
Eli Bendersky41913c72013-04-16 15:41:18 +000045StructLayout::StructLayout(StructType *ST, const DataLayout &DL) {
Micah Villmowac34b5c2012-10-04 22:08:14 +000046 assert(!ST->isOpaque() && "Cannot get layout of opaque structs");
47 StructAlignment = 0;
48 StructSize = 0;
49 NumElements = ST->getNumElements();
50
51 // Loop over each of the elements, placing them in memory.
52 for (unsigned i = 0, e = NumElements; i != e; ++i) {
53 Type *Ty = ST->getElementType(i);
Eli Bendersky41913c72013-04-16 15:41:18 +000054 unsigned TyAlign = ST->isPacked() ? 1 : DL.getABITypeAlignment(Ty);
Micah Villmowac34b5c2012-10-04 22:08:14 +000055
56 // Add padding if necessary to align the data element properly.
57 if ((StructSize & (TyAlign-1)) != 0)
Micah Villmowb4faa152012-10-04 23:01:22 +000058 StructSize = DataLayout::RoundUpAlignment(StructSize, TyAlign);
Micah Villmowac34b5c2012-10-04 22:08:14 +000059
60 // Keep track of maximum alignment constraint.
61 StructAlignment = std::max(TyAlign, StructAlignment);
62
63 MemberOffsets[i] = StructSize;
Eli Bendersky41913c72013-04-16 15:41:18 +000064 StructSize += DL.getTypeAllocSize(Ty); // Consume space for this data item
Micah Villmowac34b5c2012-10-04 22:08:14 +000065 }
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-1)) != 0)
Micah Villmowb4faa152012-10-04 23:01:22 +000073 StructSize = DataLayout::RoundUpAlignment(StructSize, StructAlignment);
Micah Villmowac34b5c2012-10-04 22:08:14 +000074}
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
89 // Multiple fields can have the same offset if any of them are zero sized.
90 // For example, in { i32, [0 x i32], i32 }, searching for offset 4 will stop
91 // at the i32 element, because it is the last element at that offset. This is
92 // the right one to return, because anything after it will have a higher
93 // offset, implying that this element is non-empty.
94 return SI-&MemberOffsets[0];
95}
96
97//===----------------------------------------------------------------------===//
Micah Villmowb4faa152012-10-04 23:01:22 +000098// LayoutAlignElem, LayoutAlign support
Micah Villmowac34b5c2012-10-04 22:08:14 +000099//===----------------------------------------------------------------------===//
100
Micah Villmowb4faa152012-10-04 23:01:22 +0000101LayoutAlignElem
102LayoutAlignElem::get(AlignTypeEnum align_type, unsigned abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000103 unsigned pref_align, uint32_t bit_width) {
104 assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
Micah Villmowb4faa152012-10-04 23:01:22 +0000105 LayoutAlignElem retval;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000106 retval.AlignType = align_type;
107 retval.ABIAlign = abi_align;
108 retval.PrefAlign = pref_align;
109 retval.TypeBitWidth = bit_width;
110 return retval;
111}
112
113bool
Micah Villmowb4faa152012-10-04 23:01:22 +0000114LayoutAlignElem::operator==(const LayoutAlignElem &rhs) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000115 return (AlignType == rhs.AlignType
116 && ABIAlign == rhs.ABIAlign
117 && PrefAlign == rhs.PrefAlign
118 && TypeBitWidth == rhs.TypeBitWidth);
119}
120
Micah Villmowb4faa152012-10-04 23:01:22 +0000121const LayoutAlignElem
Benjamin Kramer058f5b32013-11-19 20:28:04 +0000122DataLayout::InvalidAlignmentElem = { INVALID_ALIGN, 0, 0, 0 };
Micah Villmow89021e42012-10-09 16:06:12 +0000123
124//===----------------------------------------------------------------------===//
125// PointerAlignElem, PointerAlign support
126//===----------------------------------------------------------------------===//
127
128PointerAlignElem
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000129PointerAlignElem::get(uint32_t AddressSpace, unsigned ABIAlign,
130 unsigned PrefAlign, uint32_t TypeByteWidth) {
131 assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
Micah Villmow89021e42012-10-09 16:06:12 +0000132 PointerAlignElem retval;
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000133 retval.AddressSpace = AddressSpace;
134 retval.ABIAlign = ABIAlign;
135 retval.PrefAlign = PrefAlign;
136 retval.TypeByteWidth = TypeByteWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000137 return retval;
138}
139
140bool
141PointerAlignElem::operator==(const PointerAlignElem &rhs) const {
142 return (ABIAlign == rhs.ABIAlign
143 && AddressSpace == rhs.AddressSpace
144 && PrefAlign == rhs.PrefAlign
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000145 && TypeByteWidth == rhs.TypeByteWidth);
Micah Villmow89021e42012-10-09 16:06:12 +0000146}
147
148const PointerAlignElem
Benjamin Kramer058f5b32013-11-19 20:28:04 +0000149DataLayout::InvalidPointerElem = { 0U, 0U, 0U, ~0U };
Micah Villmowac34b5c2012-10-04 22:08:14 +0000150
151//===----------------------------------------------------------------------===//
Micah Villmowb4faa152012-10-04 23:01:22 +0000152// DataLayout Class Implementation
Micah Villmowac34b5c2012-10-04 22:08:14 +0000153//===----------------------------------------------------------------------===//
154
Rafael Espindola58873562014-01-03 19:21:54 +0000155const char *DataLayout::getManglingComponent(const Triple &T) {
156 if (T.isOSBinFormatMachO())
157 return "-m:o";
158 if (T.isOSBinFormatELF() || T.isArch64Bit())
159 return "-m:e";
160 assert(T.isOSBinFormatCOFF());
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000161 return "-m:w";
Rafael Espindola58873562014-01-03 19:21:54 +0000162}
163
Rafael Espindolae23b8772013-12-20 15:21:32 +0000164static const LayoutAlignElem DefaultAlignments[] = {
Rafael Espindola458a4852013-12-19 23:03:03 +0000165 { INTEGER_ALIGN, 1, 1, 1 }, // i1
166 { INTEGER_ALIGN, 8, 1, 1 }, // i8
167 { INTEGER_ALIGN, 16, 2, 2 }, // i16
168 { INTEGER_ALIGN, 32, 4, 4 }, // i32
169 { INTEGER_ALIGN, 64, 4, 8 }, // i64
170 { FLOAT_ALIGN, 16, 2, 2 }, // half
171 { FLOAT_ALIGN, 32, 4, 4 }, // float
172 { FLOAT_ALIGN, 64, 8, 8 }, // double
173 { FLOAT_ALIGN, 128, 16, 16 }, // ppcf128, quad, ...
174 { VECTOR_ALIGN, 64, 8, 8 }, // v2i32, v1i64, ...
175 { VECTOR_ALIGN, 128, 16, 16 }, // v16i8, v8i16, v4i32, ...
176 { AGGREGATE_ALIGN, 0, 0, 8 } // struct
177};
178
Rafael Espindola248ac132014-02-25 22:23:04 +0000179void DataLayout::reset(StringRef Desc) {
180 clear();
181
Micah Villmowac34b5c2012-10-04 22:08:14 +0000182 LayoutMap = 0;
183 LittleEndian = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000184 StackNaturalAlign = 0;
Rafael Espindola58873562014-01-03 19:21:54 +0000185 ManglingMode = MM_None;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000186
187 // Default alignments
Rafael Espindola458a4852013-12-19 23:03:03 +0000188 for (int I = 0, N = array_lengthof(DefaultAlignments); I < N; ++I) {
Rafael Espindolae23b8772013-12-20 15:21:32 +0000189 const LayoutAlignElem &E = DefaultAlignments[I];
Rafael Espindola458a4852013-12-19 23:03:03 +0000190 setAlignment((AlignTypeEnum)E.AlignType, E.ABIAlign, E.PrefAlign,
191 E.TypeBitWidth);
192 }
Micah Villmow89021e42012-10-09 16:06:12 +0000193 setPointerAlignment(0, 8, 8, 8);
Patrik Hägglund01860a62012-11-14 09:04:56 +0000194
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000195 parseSpecifier(Desc);
196}
197
198/// Checked version of split, to ensure mandatory subparts.
199static std::pair<StringRef, StringRef> split(StringRef Str, char Separator) {
200 assert(!Str.empty() && "parse error, string can't be empty here");
201 std::pair<StringRef, StringRef> Split = Str.split(Separator);
202 assert((!Split.second.empty() || Split.first == Str) &&
203 "a trailing separator is not allowed");
204 return Split;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000205}
206
Cameron McInally8af9eac2014-01-07 19:51:38 +0000207/// Get an unsigned integer, including error checks.
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000208static unsigned getInt(StringRef R) {
Cameron McInallyf0379fa2014-01-13 22:04:55 +0000209 unsigned Result;
Patrik Hägglund504f4782012-11-28 14:32:52 +0000210 bool error = R.getAsInteger(10, Result); (void)error;
Cameron McInallyf0379fa2014-01-13 22:04:55 +0000211 if (error)
212 report_fatal_error("not a number, or does not fit in an unsigned int");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000213 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;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000337 case 'w':
338 ManglingMode = MM_WINCOFF;
Rafael Espindola58873562014-01-03 19:21:54 +0000339 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
Rafael Espindola248ac132014-02-25 22:23:04 +0000349DataLayout::DataLayout(const Module *M) : LayoutMap(0) {
Rafael Espindolaf863ee22014-02-25 20:01:08 +0000350 const DataLayout *Other = M->getDataLayout();
351 if (Other)
352 *this = *Other;
353 else
Rafael Espindola248ac132014-02-25 22:23:04 +0000354 reset("");
Rafael Espindolaf863ee22014-02-25 20:01:08 +0000355}
Micah Villmowac34b5c2012-10-04 22:08:14 +0000356
Rafael Espindolaae593f12014-02-26 17:02:08 +0000357bool DataLayout::operator==(const DataLayout &Other) const {
358 bool Ret = LittleEndian == Other.LittleEndian &&
359 StackNaturalAlign == Other.StackNaturalAlign &&
360 ManglingMode == Other.ManglingMode &&
361 LegalIntWidths == Other.LegalIntWidths &&
362 Alignments == Other.Alignments && Pointers == Pointers;
363 assert(Ret == (getStringRepresentation() == Other.getStringRepresentation()));
364 return Ret;
365}
366
Micah Villmowac34b5c2012-10-04 22:08:14 +0000367void
Micah Villmowb4faa152012-10-04 23:01:22 +0000368DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000369 unsigned pref_align, uint32_t bit_width) {
370 assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
371 assert(pref_align < (1 << 16) && "Alignment doesn't fit in bitfield");
372 assert(bit_width < (1 << 24) && "Bit width doesn't fit in bitfield");
373 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmow6d05e692012-10-05 17:02:14 +0000374 if (Alignments[i].AlignType == (unsigned)align_type &&
Micah Villmowac34b5c2012-10-04 22:08:14 +0000375 Alignments[i].TypeBitWidth == bit_width) {
376 // Update the abi, preferred alignments.
377 Alignments[i].ABIAlign = abi_align;
378 Alignments[i].PrefAlign = pref_align;
379 return;
380 }
381 }
382
Micah Villmowb4faa152012-10-04 23:01:22 +0000383 Alignments.push_back(LayoutAlignElem::get(align_type, abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000384 pref_align, bit_width));
385}
386
Rafael Espindola667fcb82014-02-26 16:58:35 +0000387static bool comparePointerAlignElem(const PointerAlignElem &A,
388 uint32_t AddressSpace) {
389 return A.AddressSpace < AddressSpace;
390}
391
392DataLayout::PointersTy::iterator
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000393DataLayout::findPointerLowerBound(uint32_t AddressSpace) {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000394 return std::lower_bound(Pointers.begin(), Pointers.end(), AddressSpace,
395 comparePointerAlignElem);
396}
397
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000398void DataLayout::setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign,
399 unsigned PrefAlign,
400 uint32_t TypeByteWidth) {
401 assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000402 PointersTy::iterator I = findPointerLowerBound(AddrSpace);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000403 if (I == Pointers.end() || I->AddressSpace != AddrSpace) {
404 Pointers.insert(I, PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign,
405 TypeByteWidth));
Micah Villmow89021e42012-10-09 16:06:12 +0000406 } else {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000407 I->ABIAlign = ABIAlign;
408 I->PrefAlign = PrefAlign;
409 I->TypeByteWidth = TypeByteWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000410 }
411}
412
Micah Villmowac34b5c2012-10-04 22:08:14 +0000413/// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
Micah Villmowb4faa152012-10-04 23:01:22 +0000414/// preferred if ABIInfo = false) the layout wants for the specified datatype.
415unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000416 uint32_t BitWidth, bool ABIInfo,
417 Type *Ty) const {
418 // Check to see if we have an exact match and remember the best match we see.
419 int BestMatchIdx = -1;
420 int LargestInt = -1;
421 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmow6d05e692012-10-05 17:02:14 +0000422 if (Alignments[i].AlignType == (unsigned)AlignType &&
Micah Villmowac34b5c2012-10-04 22:08:14 +0000423 Alignments[i].TypeBitWidth == BitWidth)
424 return ABIInfo ? Alignments[i].ABIAlign : Alignments[i].PrefAlign;
425
426 // The best match so far depends on what we're looking for.
427 if (AlignType == INTEGER_ALIGN &&
428 Alignments[i].AlignType == INTEGER_ALIGN) {
429 // The "best match" for integers is the smallest size that is larger than
430 // the BitWidth requested.
431 if (Alignments[i].TypeBitWidth > BitWidth && (BestMatchIdx == -1 ||
Eli Benderskyfaf5e3e2013-01-30 19:24:23 +0000432 Alignments[i].TypeBitWidth < Alignments[BestMatchIdx].TypeBitWidth))
Micah Villmowac34b5c2012-10-04 22:08:14 +0000433 BestMatchIdx = i;
434 // However, if there isn't one that's larger, then we must use the
435 // largest one we have (see below)
436 if (LargestInt == -1 ||
437 Alignments[i].TypeBitWidth > Alignments[LargestInt].TypeBitWidth)
438 LargestInt = i;
439 }
440 }
441
442 // Okay, we didn't find an exact solution. Fall back here depending on what
443 // is being looked for.
444 if (BestMatchIdx == -1) {
445 // If we didn't find an integer alignment, fall back on most conservative.
446 if (AlignType == INTEGER_ALIGN) {
447 BestMatchIdx = LargestInt;
448 } else {
449 assert(AlignType == VECTOR_ALIGN && "Unknown alignment type!");
450
451 // By default, use natural alignment for vector types. This is consistent
452 // with what clang and llvm-gcc do.
453 unsigned Align = getTypeAllocSize(cast<VectorType>(Ty)->getElementType());
454 Align *= cast<VectorType>(Ty)->getNumElements();
455 // If the alignment is not a power of 2, round up to the next power of 2.
456 // This happens for non-power-of-2 length vectors.
457 if (Align & (Align-1))
458 Align = NextPowerOf2(Align);
459 return Align;
460 }
461 }
462
463 // Since we got a "best match" index, just return it.
464 return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
465 : Alignments[BestMatchIdx].PrefAlign;
466}
467
468namespace {
469
470class StructLayoutMap {
471 typedef DenseMap<StructType*, StructLayout*> LayoutInfoTy;
472 LayoutInfoTy LayoutInfo;
473
474public:
475 virtual ~StructLayoutMap() {
476 // Remove any layouts.
477 for (LayoutInfoTy::iterator I = LayoutInfo.begin(), E = LayoutInfo.end();
478 I != E; ++I) {
479 StructLayout *Value = I->second;
480 Value->~StructLayout();
481 free(Value);
482 }
483 }
484
485 StructLayout *&operator[](StructType *STy) {
486 return LayoutInfo[STy];
487 }
488
489 // for debugging...
490 virtual void dump() const {}
491};
492
493} // end anonymous namespace
494
Rafael Espindola248ac132014-02-25 22:23:04 +0000495void DataLayout::clear() {
496 LegalIntWidths.clear();
497 Alignments.clear();
498 Pointers.clear();
499 delete static_cast<StructLayoutMap *>(LayoutMap);
500 LayoutMap = 0;
501}
502
Micah Villmowb4faa152012-10-04 23:01:22 +0000503DataLayout::~DataLayout() {
Rafael Espindola248ac132014-02-25 22:23:04 +0000504 clear();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000505}
506
Micah Villmowb4faa152012-10-04 23:01:22 +0000507const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000508 if (!LayoutMap)
509 LayoutMap = new StructLayoutMap();
510
511 StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
512 StructLayout *&SL = (*STM)[Ty];
513 if (SL) return SL;
514
515 // Otherwise, create the struct layout. Because it is variable length, we
516 // malloc it, then use placement new.
517 int NumElts = Ty->getNumElements();
518 StructLayout *L =
519 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t));
520
521 // Set SL before calling StructLayout's ctor. The ctor could cause other
522 // entries to be added to TheMap, invalidating our reference.
523 SL = L;
524
525 new (L) StructLayout(Ty, *this);
526
527 return L;
528}
529
Micah Villmowb4faa152012-10-04 23:01:22 +0000530std::string DataLayout::getStringRepresentation() const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000531 std::string Result;
532 raw_string_ostream OS(Result);
533
Micah Villmow89021e42012-10-09 16:06:12 +0000534 OS << (LittleEndian ? "e" : "E");
Rafael Espindola58873562014-01-03 19:21:54 +0000535
536 switch (ManglingMode) {
537 case MM_None:
538 break;
539 case MM_ELF:
540 OS << "-m:e";
541 break;
542 case MM_MachO:
543 OS << "-m:o";
544 break;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000545 case MM_WINCOFF:
546 OS << "-m:w";
Rafael Espindola58873562014-01-03 19:21:54 +0000547 break;
548 case MM_Mips:
549 OS << "-m:m";
550 break;
551 }
552
Rafael Espindola667fcb82014-02-26 16:58:35 +0000553 for (PointersTy::const_iterator I = Pointers.begin(), E = Pointers.end();
554 I != E; ++I) {
555 const PointerAlignElem &PI = *I;
Rafael Espindola458a4852013-12-19 23:03:03 +0000556
557 // Skip default.
558 if (PI.AddressSpace == 0 && PI.ABIAlign == 8 && PI.PrefAlign == 8 &&
559 PI.TypeByteWidth == 8)
560 continue;
561
Micah Villmow89021e42012-10-09 16:06:12 +0000562 OS << "-p";
563 if (PI.AddressSpace) {
564 OS << PI.AddressSpace;
565 }
Rafael Espindola458a4852013-12-19 23:03:03 +0000566 OS << ":" << PI.TypeByteWidth*8 << ':' << PI.ABIAlign*8;
567 if (PI.PrefAlign != PI.ABIAlign)
568 OS << ':' << PI.PrefAlign*8;
Micah Villmow89021e42012-10-09 16:06:12 +0000569 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000570
Rafael Espindolae23b8772013-12-20 15:21:32 +0000571 const LayoutAlignElem *DefaultStart = DefaultAlignments;
572 const LayoutAlignElem *DefaultEnd =
Rafael Espindola458a4852013-12-19 23:03:03 +0000573 DefaultStart + array_lengthof(DefaultAlignments);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000574 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmowb4faa152012-10-04 23:01:22 +0000575 const LayoutAlignElem &AI = Alignments[i];
Rafael Espindola458a4852013-12-19 23:03:03 +0000576 if (std::find(DefaultStart, DefaultEnd, AI) != DefaultEnd)
577 continue;
578 OS << '-' << (char)AI.AlignType;
579 if (AI.TypeBitWidth)
580 OS << AI.TypeBitWidth;
581 OS << ':' << AI.ABIAlign*8;
582 if (AI.ABIAlign != AI.PrefAlign)
583 OS << ':' << AI.PrefAlign*8;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000584 }
585
586 if (!LegalIntWidths.empty()) {
587 OS << "-n" << (unsigned)LegalIntWidths[0];
588
589 for (unsigned i = 1, e = LegalIntWidths.size(); i != e; ++i)
590 OS << ':' << (unsigned)LegalIntWidths[i];
591 }
Rafael Espindola458a4852013-12-19 23:03:03 +0000592
593 if (StackNaturalAlign)
594 OS << "-S" << StackNaturalAlign*8;
595
Micah Villmowac34b5c2012-10-04 22:08:14 +0000596 return OS.str();
597}
598
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000599unsigned DataLayout::getPointerABIAlignment(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000600 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000601 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000602 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000603 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000604 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000605 return I->ABIAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000606}
607
608unsigned DataLayout::getPointerPrefAlignment(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000609 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000610 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000611 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000612 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000613 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000614 return I->PrefAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000615}
616
617unsigned DataLayout::getPointerSize(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000618 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000619 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000620 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000621 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000622 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000623 return I->TypeByteWidth;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000624}
625
Matt Arsenault6f4be902013-07-26 17:37:20 +0000626unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {
627 assert(Ty->isPtrOrPtrVectorTy() &&
628 "This should only be called with a pointer or pointer vector type");
629
630 if (Ty->isPointerTy())
631 return getTypeSizeInBits(Ty);
632
Matt Arsenault517cf482013-07-27 19:22:28 +0000633 return getTypeSizeInBits(Ty->getScalarType());
Matt Arsenault6f4be902013-07-26 17:37:20 +0000634}
Micah Villmowac34b5c2012-10-04 22:08:14 +0000635
Micah Villmowac34b5c2012-10-04 22:08:14 +0000636/*!
637 \param abi_or_pref Flag that determines which alignment is returned. true
638 returns the ABI alignment, false returns the preferred alignment.
639 \param Ty The underlying type for which alignment is determined.
640
641 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
642 == false) for the requested type \a Ty.
643 */
Micah Villmowb4faa152012-10-04 23:01:22 +0000644unsigned DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000645 int AlignType = -1;
646
647 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
648 switch (Ty->getTypeID()) {
649 // Early escape for the non-numeric types.
650 case Type::LabelTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000651 return (abi_or_pref
Micah Villmow89021e42012-10-09 16:06:12 +0000652 ? getPointerABIAlignment(0)
653 : getPointerPrefAlignment(0));
654 case Type::PointerTyID: {
655 unsigned AS = dyn_cast<PointerType>(Ty)->getAddressSpace();
656 return (abi_or_pref
657 ? getPointerABIAlignment(AS)
658 : getPointerPrefAlignment(AS));
659 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000660 case Type::ArrayTyID:
661 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
662
663 case Type::StructTyID: {
664 // Packed structure types always have an ABI alignment of one.
665 if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
666 return 1;
667
668 // Get the layout annotation... which is lazily created on demand.
669 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
670 unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty);
671 return std::max(Align, Layout->getAlignment());
672 }
673 case Type::IntegerTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000674 AlignType = INTEGER_ALIGN;
675 break;
676 case Type::HalfTyID:
677 case Type::FloatTyID:
678 case Type::DoubleTyID:
679 // PPC_FP128TyID and FP128TyID have different data contents, but the
680 // same size and alignment, so they look the same here.
681 case Type::PPC_FP128TyID:
682 case Type::FP128TyID:
683 case Type::X86_FP80TyID:
684 AlignType = FLOAT_ALIGN;
685 break;
686 case Type::X86_MMXTyID:
687 case Type::VectorTyID:
688 AlignType = VECTOR_ALIGN;
689 break;
690 default:
691 llvm_unreachable("Bad type for getAlignment!!!");
692 }
693
694 return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSizeInBits(Ty),
695 abi_or_pref, Ty);
696}
697
Micah Villmowb4faa152012-10-04 23:01:22 +0000698unsigned DataLayout::getABITypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000699 return getAlignment(Ty, true);
700}
701
702/// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
703/// an integer type of the specified bitwidth.
Micah Villmowb4faa152012-10-04 23:01:22 +0000704unsigned DataLayout::getABIIntegerTypeAlignment(unsigned BitWidth) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000705 return getAlignmentInfo(INTEGER_ALIGN, BitWidth, true, 0);
706}
707
Micah Villmowb4faa152012-10-04 23:01:22 +0000708unsigned DataLayout::getPrefTypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000709 return getAlignment(Ty, false);
710}
711
Micah Villmowb4faa152012-10-04 23:01:22 +0000712unsigned DataLayout::getPreferredTypeAlignmentShift(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000713 unsigned Align = getPrefTypeAlignment(Ty);
714 assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
715 return Log2_32(Align);
716}
717
Micah Villmow89021e42012-10-09 16:06:12 +0000718IntegerType *DataLayout::getIntPtrType(LLVMContext &C,
719 unsigned AddressSpace) const {
720 return IntegerType::get(C, getPointerSizeInBits(AddressSpace));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000721}
722
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000723Type *DataLayout::getIntPtrType(Type *Ty) const {
Chandler Carruth7ec50852012-11-01 08:07:29 +0000724 assert(Ty->isPtrOrPtrVectorTy() &&
725 "Expected a pointer or pointer vector type.");
Chandler Carruth7ec50852012-11-01 08:07:29 +0000726 unsigned NumBits = getTypeSizeInBits(Ty->getScalarType());
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000727 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
728 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
729 return VectorType::get(IntTy, VecTy->getNumElements());
730 return IntTy;
Micah Villmow12d91272012-10-24 15:52:52 +0000731}
732
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000733Type *DataLayout::getSmallestLegalIntType(LLVMContext &C, unsigned Width) const {
734 for (unsigned i = 0, e = (unsigned)LegalIntWidths.size(); i != e; ++i)
735 if (Width <= LegalIntWidths[i])
736 return Type::getIntNTy(C, LegalIntWidths[i]);
737 return 0;
738}
739
Matt Arsenault899f7d22013-09-16 22:43:16 +0000740unsigned DataLayout::getLargestLegalIntTypeSize() const {
741 unsigned MaxWidth = 0;
742 for (unsigned i = 0, e = (unsigned)LegalIntWidths.size(); i != e; ++i)
743 MaxWidth = std::max<unsigned>(MaxWidth, LegalIntWidths[i]);
744 return MaxWidth;
745}
746
Micah Villmowb4faa152012-10-04 23:01:22 +0000747uint64_t DataLayout::getIndexedOffset(Type *ptrTy,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000748 ArrayRef<Value *> Indices) const {
749 Type *Ty = ptrTy;
750 assert(Ty->isPointerTy() && "Illegal argument for getIndexedOffset()");
751 uint64_t Result = 0;
752
753 generic_gep_type_iterator<Value* const*>
754 TI = gep_type_begin(ptrTy, Indices);
755 for (unsigned CurIDX = 0, EndIDX = Indices.size(); CurIDX != EndIDX;
756 ++CurIDX, ++TI) {
757 if (StructType *STy = dyn_cast<StructType>(*TI)) {
758 assert(Indices[CurIDX]->getType() ==
759 Type::getInt32Ty(ptrTy->getContext()) &&
760 "Illegal struct idx");
761 unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
762
763 // Get structure layout information...
764 const StructLayout *Layout = getStructLayout(STy);
765
766 // Add in the offset, as calculated by the structure layout info...
767 Result += Layout->getElementOffset(FieldNo);
768
769 // Update Ty to refer to current element
770 Ty = STy->getElementType(FieldNo);
771 } else {
772 // Update Ty to refer to current element
773 Ty = cast<SequentialType>(Ty)->getElementType();
774
775 // Get the array index and the size of each array element.
776 if (int64_t arrayIdx = cast<ConstantInt>(Indices[CurIDX])->getSExtValue())
777 Result += (uint64_t)arrayIdx * getTypeAllocSize(Ty);
778 }
779 }
780
781 return Result;
782}
783
784/// getPreferredAlignment - Return the preferred alignment of the specified
785/// global. This includes an explicitly requested alignment (if the global
786/// has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000787unsigned DataLayout::getPreferredAlignment(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000788 Type *ElemType = GV->getType()->getElementType();
789 unsigned Alignment = getPrefTypeAlignment(ElemType);
790 unsigned GVAlignment = GV->getAlignment();
791 if (GVAlignment >= Alignment) {
792 Alignment = GVAlignment;
793 } else if (GVAlignment != 0) {
794 Alignment = std::max(GVAlignment, getABITypeAlignment(ElemType));
795 }
796
797 if (GV->hasInitializer() && GVAlignment == 0) {
798 if (Alignment < 16) {
799 // If the global is not external, see if it is large. If so, give it a
800 // larger alignment.
801 if (getTypeSizeInBits(ElemType) > 128)
802 Alignment = 16; // 16-byte alignment.
803 }
804 }
805 return Alignment;
806}
807
808/// getPreferredAlignmentLog - Return the preferred alignment of the
809/// specified global, returned in log form. This includes an explicitly
810/// requested alignment (if the global has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000811unsigned DataLayout::getPreferredAlignmentLog(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000812 return Log2_32(getPreferredAlignment(GV));
813}
Rafael Espindola93512512014-02-25 17:30:31 +0000814
815DataLayoutPass::DataLayoutPass() : ImmutablePass(ID), DL("") {
816 report_fatal_error("Bad DataLayoutPass ctor used. Tool did not specify a "
817 "DataLayout to use?");
818}
819
820DataLayoutPass::~DataLayoutPass() {}
821
822DataLayoutPass::DataLayoutPass(const DataLayout &DL)
823 : ImmutablePass(ID), DL(DL) {
824 initializeDataLayoutPassPass(*PassRegistry::getPassRegistry());
825}
826
Rafael Espindola93512512014-02-25 17:30:31 +0000827DataLayoutPass::DataLayoutPass(const Module *M) : ImmutablePass(ID), DL(M) {
828 initializeDataLayoutPassPass(*PassRegistry::getPassRegistry());
829}