blob: ccdaec5e554f465acd806ccd39afe18f027a1e3b [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
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
357void
Micah Villmowb4faa152012-10-04 23:01:22 +0000358DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000359 unsigned pref_align, uint32_t bit_width) {
360 assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
361 assert(pref_align < (1 << 16) && "Alignment doesn't fit in bitfield");
362 assert(bit_width < (1 << 24) && "Bit width doesn't fit in bitfield");
363 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmow6d05e692012-10-05 17:02:14 +0000364 if (Alignments[i].AlignType == (unsigned)align_type &&
Micah Villmowac34b5c2012-10-04 22:08:14 +0000365 Alignments[i].TypeBitWidth == bit_width) {
366 // Update the abi, preferred alignments.
367 Alignments[i].ABIAlign = abi_align;
368 Alignments[i].PrefAlign = pref_align;
369 return;
370 }
371 }
372
Micah Villmowb4faa152012-10-04 23:01:22 +0000373 Alignments.push_back(LayoutAlignElem::get(align_type, abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000374 pref_align, bit_width));
375}
376
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000377void DataLayout::setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign,
378 unsigned PrefAlign,
379 uint32_t TypeByteWidth) {
380 assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
381 DenseMap<unsigned,PointerAlignElem>::iterator val = Pointers.find(AddrSpace);
Micah Villmow89021e42012-10-09 16:06:12 +0000382 if (val == Pointers.end()) {
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000383 Pointers[AddrSpace] =
384 PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign, TypeByteWidth);
Micah Villmow89021e42012-10-09 16:06:12 +0000385 } else {
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000386 val->second.ABIAlign = ABIAlign;
387 val->second.PrefAlign = PrefAlign;
388 val->second.TypeByteWidth = TypeByteWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000389 }
390}
391
Micah Villmowac34b5c2012-10-04 22:08:14 +0000392/// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
Micah Villmowb4faa152012-10-04 23:01:22 +0000393/// preferred if ABIInfo = false) the layout wants for the specified datatype.
394unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000395 uint32_t BitWidth, bool ABIInfo,
396 Type *Ty) const {
397 // Check to see if we have an exact match and remember the best match we see.
398 int BestMatchIdx = -1;
399 int LargestInt = -1;
400 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmow6d05e692012-10-05 17:02:14 +0000401 if (Alignments[i].AlignType == (unsigned)AlignType &&
Micah Villmowac34b5c2012-10-04 22:08:14 +0000402 Alignments[i].TypeBitWidth == BitWidth)
403 return ABIInfo ? Alignments[i].ABIAlign : Alignments[i].PrefAlign;
404
405 // The best match so far depends on what we're looking for.
406 if (AlignType == INTEGER_ALIGN &&
407 Alignments[i].AlignType == INTEGER_ALIGN) {
408 // The "best match" for integers is the smallest size that is larger than
409 // the BitWidth requested.
410 if (Alignments[i].TypeBitWidth > BitWidth && (BestMatchIdx == -1 ||
Eli Benderskyfaf5e3e2013-01-30 19:24:23 +0000411 Alignments[i].TypeBitWidth < Alignments[BestMatchIdx].TypeBitWidth))
Micah Villmowac34b5c2012-10-04 22:08:14 +0000412 BestMatchIdx = i;
413 // However, if there isn't one that's larger, then we must use the
414 // largest one we have (see below)
415 if (LargestInt == -1 ||
416 Alignments[i].TypeBitWidth > Alignments[LargestInt].TypeBitWidth)
417 LargestInt = i;
418 }
419 }
420
421 // Okay, we didn't find an exact solution. Fall back here depending on what
422 // is being looked for.
423 if (BestMatchIdx == -1) {
424 // If we didn't find an integer alignment, fall back on most conservative.
425 if (AlignType == INTEGER_ALIGN) {
426 BestMatchIdx = LargestInt;
427 } else {
428 assert(AlignType == VECTOR_ALIGN && "Unknown alignment type!");
429
430 // By default, use natural alignment for vector types. This is consistent
431 // with what clang and llvm-gcc do.
432 unsigned Align = getTypeAllocSize(cast<VectorType>(Ty)->getElementType());
433 Align *= cast<VectorType>(Ty)->getNumElements();
434 // If the alignment is not a power of 2, round up to the next power of 2.
435 // This happens for non-power-of-2 length vectors.
436 if (Align & (Align-1))
437 Align = NextPowerOf2(Align);
438 return Align;
439 }
440 }
441
442 // Since we got a "best match" index, just return it.
443 return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
444 : Alignments[BestMatchIdx].PrefAlign;
445}
446
447namespace {
448
449class StructLayoutMap {
450 typedef DenseMap<StructType*, StructLayout*> LayoutInfoTy;
451 LayoutInfoTy LayoutInfo;
452
453public:
454 virtual ~StructLayoutMap() {
455 // Remove any layouts.
456 for (LayoutInfoTy::iterator I = LayoutInfo.begin(), E = LayoutInfo.end();
457 I != E; ++I) {
458 StructLayout *Value = I->second;
459 Value->~StructLayout();
460 free(Value);
461 }
462 }
463
464 StructLayout *&operator[](StructType *STy) {
465 return LayoutInfo[STy];
466 }
467
468 // for debugging...
469 virtual void dump() const {}
470};
471
472} // end anonymous namespace
473
Rafael Espindola248ac132014-02-25 22:23:04 +0000474void DataLayout::clear() {
475 LegalIntWidths.clear();
476 Alignments.clear();
477 Pointers.clear();
478 delete static_cast<StructLayoutMap *>(LayoutMap);
479 LayoutMap = 0;
480}
481
Micah Villmowb4faa152012-10-04 23:01:22 +0000482DataLayout::~DataLayout() {
Rafael Espindola248ac132014-02-25 22:23:04 +0000483 clear();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000484}
485
Micah Villmowb4faa152012-10-04 23:01:22 +0000486const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000487 if (!LayoutMap)
488 LayoutMap = new StructLayoutMap();
489
490 StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
491 StructLayout *&SL = (*STM)[Ty];
492 if (SL) return SL;
493
494 // Otherwise, create the struct layout. Because it is variable length, we
495 // malloc it, then use placement new.
496 int NumElts = Ty->getNumElements();
497 StructLayout *L =
498 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t));
499
500 // Set SL before calling StructLayout's ctor. The ctor could cause other
501 // entries to be added to TheMap, invalidating our reference.
502 SL = L;
503
504 new (L) StructLayout(Ty, *this);
505
506 return L;
507}
508
Micah Villmowb4faa152012-10-04 23:01:22 +0000509std::string DataLayout::getStringRepresentation() const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000510 std::string Result;
511 raw_string_ostream OS(Result);
512
Micah Villmow89021e42012-10-09 16:06:12 +0000513 OS << (LittleEndian ? "e" : "E");
Rafael Espindola58873562014-01-03 19:21:54 +0000514
515 switch (ManglingMode) {
516 case MM_None:
517 break;
518 case MM_ELF:
519 OS << "-m:e";
520 break;
521 case MM_MachO:
522 OS << "-m:o";
523 break;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000524 case MM_WINCOFF:
525 OS << "-m:w";
Rafael Espindola58873562014-01-03 19:21:54 +0000526 break;
527 case MM_Mips:
528 OS << "-m:m";
529 break;
530 }
531
Micah Villmow89021e42012-10-09 16:06:12 +0000532 SmallVector<unsigned, 8> addrSpaces;
533 // Lets get all of the known address spaces and sort them
534 // into increasing order so that we can emit the string
535 // in a cleaner format.
536 for (DenseMap<unsigned, PointerAlignElem>::const_iterator
537 pib = Pointers.begin(), pie = Pointers.end();
538 pib != pie; ++pib) {
539 addrSpaces.push_back(pib->first);
540 }
541 std::sort(addrSpaces.begin(), addrSpaces.end());
Craig Topperaf0dea12013-07-04 01:31:24 +0000542 for (SmallVectorImpl<unsigned>::iterator asb = addrSpaces.begin(),
Micah Villmow89021e42012-10-09 16:06:12 +0000543 ase = addrSpaces.end(); asb != ase; ++asb) {
544 const PointerAlignElem &PI = Pointers.find(*asb)->second;
Rafael Espindola458a4852013-12-19 23:03:03 +0000545
546 // Skip default.
547 if (PI.AddressSpace == 0 && PI.ABIAlign == 8 && PI.PrefAlign == 8 &&
548 PI.TypeByteWidth == 8)
549 continue;
550
Micah Villmow89021e42012-10-09 16:06:12 +0000551 OS << "-p";
552 if (PI.AddressSpace) {
553 OS << PI.AddressSpace;
554 }
Rafael Espindola458a4852013-12-19 23:03:03 +0000555 OS << ":" << PI.TypeByteWidth*8 << ':' << PI.ABIAlign*8;
556 if (PI.PrefAlign != PI.ABIAlign)
557 OS << ':' << PI.PrefAlign*8;
Micah Villmow89021e42012-10-09 16:06:12 +0000558 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000559
Rafael Espindolae23b8772013-12-20 15:21:32 +0000560 const LayoutAlignElem *DefaultStart = DefaultAlignments;
561 const LayoutAlignElem *DefaultEnd =
Rafael Espindola458a4852013-12-19 23:03:03 +0000562 DefaultStart + array_lengthof(DefaultAlignments);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000563 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmowb4faa152012-10-04 23:01:22 +0000564 const LayoutAlignElem &AI = Alignments[i];
Rafael Espindola458a4852013-12-19 23:03:03 +0000565 if (std::find(DefaultStart, DefaultEnd, AI) != DefaultEnd)
566 continue;
567 OS << '-' << (char)AI.AlignType;
568 if (AI.TypeBitWidth)
569 OS << AI.TypeBitWidth;
570 OS << ':' << AI.ABIAlign*8;
571 if (AI.ABIAlign != AI.PrefAlign)
572 OS << ':' << AI.PrefAlign*8;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000573 }
574
575 if (!LegalIntWidths.empty()) {
576 OS << "-n" << (unsigned)LegalIntWidths[0];
577
578 for (unsigned i = 1, e = LegalIntWidths.size(); i != e; ++i)
579 OS << ':' << (unsigned)LegalIntWidths[i];
580 }
Rafael Espindola458a4852013-12-19 23:03:03 +0000581
582 if (StackNaturalAlign)
583 OS << "-S" << StackNaturalAlign*8;
584
Micah Villmowac34b5c2012-10-04 22:08:14 +0000585 return OS.str();
586}
587
Matt Arsenault6f4be902013-07-26 17:37:20 +0000588unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {
589 assert(Ty->isPtrOrPtrVectorTy() &&
590 "This should only be called with a pointer or pointer vector type");
591
592 if (Ty->isPointerTy())
593 return getTypeSizeInBits(Ty);
594
Matt Arsenault517cf482013-07-27 19:22:28 +0000595 return getTypeSizeInBits(Ty->getScalarType());
Matt Arsenault6f4be902013-07-26 17:37:20 +0000596}
Micah Villmowac34b5c2012-10-04 22:08:14 +0000597
Micah Villmowac34b5c2012-10-04 22:08:14 +0000598/*!
599 \param abi_or_pref Flag that determines which alignment is returned. true
600 returns the ABI alignment, false returns the preferred alignment.
601 \param Ty The underlying type for which alignment is determined.
602
603 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
604 == false) for the requested type \a Ty.
605 */
Micah Villmowb4faa152012-10-04 23:01:22 +0000606unsigned DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000607 int AlignType = -1;
608
609 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
610 switch (Ty->getTypeID()) {
611 // Early escape for the non-numeric types.
612 case Type::LabelTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000613 return (abi_or_pref
Micah Villmow89021e42012-10-09 16:06:12 +0000614 ? getPointerABIAlignment(0)
615 : getPointerPrefAlignment(0));
616 case Type::PointerTyID: {
617 unsigned AS = dyn_cast<PointerType>(Ty)->getAddressSpace();
618 return (abi_or_pref
619 ? getPointerABIAlignment(AS)
620 : getPointerPrefAlignment(AS));
621 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000622 case Type::ArrayTyID:
623 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
624
625 case Type::StructTyID: {
626 // Packed structure types always have an ABI alignment of one.
627 if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
628 return 1;
629
630 // Get the layout annotation... which is lazily created on demand.
631 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
632 unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty);
633 return std::max(Align, Layout->getAlignment());
634 }
635 case Type::IntegerTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000636 AlignType = INTEGER_ALIGN;
637 break;
638 case Type::HalfTyID:
639 case Type::FloatTyID:
640 case Type::DoubleTyID:
641 // PPC_FP128TyID and FP128TyID have different data contents, but the
642 // same size and alignment, so they look the same here.
643 case Type::PPC_FP128TyID:
644 case Type::FP128TyID:
645 case Type::X86_FP80TyID:
646 AlignType = FLOAT_ALIGN;
647 break;
648 case Type::X86_MMXTyID:
649 case Type::VectorTyID:
650 AlignType = VECTOR_ALIGN;
651 break;
652 default:
653 llvm_unreachable("Bad type for getAlignment!!!");
654 }
655
656 return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSizeInBits(Ty),
657 abi_or_pref, Ty);
658}
659
Micah Villmowb4faa152012-10-04 23:01:22 +0000660unsigned DataLayout::getABITypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000661 return getAlignment(Ty, true);
662}
663
664/// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
665/// an integer type of the specified bitwidth.
Micah Villmowb4faa152012-10-04 23:01:22 +0000666unsigned DataLayout::getABIIntegerTypeAlignment(unsigned BitWidth) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000667 return getAlignmentInfo(INTEGER_ALIGN, BitWidth, true, 0);
668}
669
Micah Villmowb4faa152012-10-04 23:01:22 +0000670unsigned DataLayout::getPrefTypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000671 return getAlignment(Ty, false);
672}
673
Micah Villmowb4faa152012-10-04 23:01:22 +0000674unsigned DataLayout::getPreferredTypeAlignmentShift(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000675 unsigned Align = getPrefTypeAlignment(Ty);
676 assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
677 return Log2_32(Align);
678}
679
Micah Villmow89021e42012-10-09 16:06:12 +0000680IntegerType *DataLayout::getIntPtrType(LLVMContext &C,
681 unsigned AddressSpace) const {
682 return IntegerType::get(C, getPointerSizeInBits(AddressSpace));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000683}
684
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000685Type *DataLayout::getIntPtrType(Type *Ty) const {
Chandler Carruth7ec50852012-11-01 08:07:29 +0000686 assert(Ty->isPtrOrPtrVectorTy() &&
687 "Expected a pointer or pointer vector type.");
Chandler Carruth7ec50852012-11-01 08:07:29 +0000688 unsigned NumBits = getTypeSizeInBits(Ty->getScalarType());
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000689 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
690 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
691 return VectorType::get(IntTy, VecTy->getNumElements());
692 return IntTy;
Micah Villmow12d91272012-10-24 15:52:52 +0000693}
694
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000695Type *DataLayout::getSmallestLegalIntType(LLVMContext &C, unsigned Width) const {
696 for (unsigned i = 0, e = (unsigned)LegalIntWidths.size(); i != e; ++i)
697 if (Width <= LegalIntWidths[i])
698 return Type::getIntNTy(C, LegalIntWidths[i]);
699 return 0;
700}
701
Matt Arsenault899f7d22013-09-16 22:43:16 +0000702unsigned DataLayout::getLargestLegalIntTypeSize() const {
703 unsigned MaxWidth = 0;
704 for (unsigned i = 0, e = (unsigned)LegalIntWidths.size(); i != e; ++i)
705 MaxWidth = std::max<unsigned>(MaxWidth, LegalIntWidths[i]);
706 return MaxWidth;
707}
708
Micah Villmowb4faa152012-10-04 23:01:22 +0000709uint64_t DataLayout::getIndexedOffset(Type *ptrTy,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000710 ArrayRef<Value *> Indices) const {
711 Type *Ty = ptrTy;
712 assert(Ty->isPointerTy() && "Illegal argument for getIndexedOffset()");
713 uint64_t Result = 0;
714
715 generic_gep_type_iterator<Value* const*>
716 TI = gep_type_begin(ptrTy, Indices);
717 for (unsigned CurIDX = 0, EndIDX = Indices.size(); CurIDX != EndIDX;
718 ++CurIDX, ++TI) {
719 if (StructType *STy = dyn_cast<StructType>(*TI)) {
720 assert(Indices[CurIDX]->getType() ==
721 Type::getInt32Ty(ptrTy->getContext()) &&
722 "Illegal struct idx");
723 unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
724
725 // Get structure layout information...
726 const StructLayout *Layout = getStructLayout(STy);
727
728 // Add in the offset, as calculated by the structure layout info...
729 Result += Layout->getElementOffset(FieldNo);
730
731 // Update Ty to refer to current element
732 Ty = STy->getElementType(FieldNo);
733 } else {
734 // Update Ty to refer to current element
735 Ty = cast<SequentialType>(Ty)->getElementType();
736
737 // Get the array index and the size of each array element.
738 if (int64_t arrayIdx = cast<ConstantInt>(Indices[CurIDX])->getSExtValue())
739 Result += (uint64_t)arrayIdx * getTypeAllocSize(Ty);
740 }
741 }
742
743 return Result;
744}
745
746/// getPreferredAlignment - Return the preferred alignment of the specified
747/// global. This includes an explicitly requested alignment (if the global
748/// has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000749unsigned DataLayout::getPreferredAlignment(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000750 Type *ElemType = GV->getType()->getElementType();
751 unsigned Alignment = getPrefTypeAlignment(ElemType);
752 unsigned GVAlignment = GV->getAlignment();
753 if (GVAlignment >= Alignment) {
754 Alignment = GVAlignment;
755 } else if (GVAlignment != 0) {
756 Alignment = std::max(GVAlignment, getABITypeAlignment(ElemType));
757 }
758
759 if (GV->hasInitializer() && GVAlignment == 0) {
760 if (Alignment < 16) {
761 // If the global is not external, see if it is large. If so, give it a
762 // larger alignment.
763 if (getTypeSizeInBits(ElemType) > 128)
764 Alignment = 16; // 16-byte alignment.
765 }
766 }
767 return Alignment;
768}
769
770/// getPreferredAlignmentLog - Return the preferred alignment of the
771/// specified global, returned in log form. This includes an explicitly
772/// requested alignment (if the global has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000773unsigned DataLayout::getPreferredAlignmentLog(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000774 return Log2_32(getPreferredAlignment(GV));
775}
Rafael Espindola93512512014-02-25 17:30:31 +0000776
777DataLayoutPass::DataLayoutPass() : ImmutablePass(ID), DL("") {
778 report_fatal_error("Bad DataLayoutPass ctor used. Tool did not specify a "
779 "DataLayout to use?");
780}
781
782DataLayoutPass::~DataLayoutPass() {}
783
784DataLayoutPass::DataLayoutPass(const DataLayout &DL)
785 : ImmutablePass(ID), DL(DL) {
786 initializeDataLayoutPassPass(*PassRegistry::getPassRegistry());
787}
788
789DataLayoutPass::DataLayoutPass(StringRef Str) : ImmutablePass(ID), DL(Str) {
790 initializeDataLayoutPassPass(*PassRegistry::getPassRegistry());
791}
792
793DataLayoutPass::DataLayoutPass(const Module *M) : ImmutablePass(ID), DL(M) {
794 initializeDataLayoutPassPass(*PassRegistry::getPassRegistry());
795}