blob: ed7c12fc9df52447862536010118a95e9dee40a1 [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
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000588unsigned DataLayout::getPointerABIAlignment(unsigned AS) const {
589 DenseMap<unsigned, PointerAlignElem>::const_iterator val = Pointers.find(AS);
590 if (val == Pointers.end()) {
591 val = Pointers.find(0);
592 }
593 return val->second.ABIAlign;
594}
595
596unsigned DataLayout::getPointerPrefAlignment(unsigned AS) const {
597 DenseMap<unsigned, PointerAlignElem>::const_iterator val = Pointers.find(AS);
598 if (val == Pointers.end()) {
599 val = Pointers.find(0);
600 }
601 return val->second.PrefAlign;
602}
603
604unsigned DataLayout::getPointerSize(unsigned AS) const {
605 DenseMap<unsigned, PointerAlignElem>::const_iterator val = Pointers.find(AS);
606 if (val == Pointers.end()) {
607 val = Pointers.find(0);
608 }
609 return val->second.TypeByteWidth;
610}
611
Matt Arsenault6f4be902013-07-26 17:37:20 +0000612unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {
613 assert(Ty->isPtrOrPtrVectorTy() &&
614 "This should only be called with a pointer or pointer vector type");
615
616 if (Ty->isPointerTy())
617 return getTypeSizeInBits(Ty);
618
Matt Arsenault517cf482013-07-27 19:22:28 +0000619 return getTypeSizeInBits(Ty->getScalarType());
Matt Arsenault6f4be902013-07-26 17:37:20 +0000620}
Micah Villmowac34b5c2012-10-04 22:08:14 +0000621
Micah Villmowac34b5c2012-10-04 22:08:14 +0000622/*!
623 \param abi_or_pref Flag that determines which alignment is returned. true
624 returns the ABI alignment, false returns the preferred alignment.
625 \param Ty The underlying type for which alignment is determined.
626
627 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
628 == false) for the requested type \a Ty.
629 */
Micah Villmowb4faa152012-10-04 23:01:22 +0000630unsigned DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000631 int AlignType = -1;
632
633 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
634 switch (Ty->getTypeID()) {
635 // Early escape for the non-numeric types.
636 case Type::LabelTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000637 return (abi_or_pref
Micah Villmow89021e42012-10-09 16:06:12 +0000638 ? getPointerABIAlignment(0)
639 : getPointerPrefAlignment(0));
640 case Type::PointerTyID: {
641 unsigned AS = dyn_cast<PointerType>(Ty)->getAddressSpace();
642 return (abi_or_pref
643 ? getPointerABIAlignment(AS)
644 : getPointerPrefAlignment(AS));
645 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000646 case Type::ArrayTyID:
647 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
648
649 case Type::StructTyID: {
650 // Packed structure types always have an ABI alignment of one.
651 if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
652 return 1;
653
654 // Get the layout annotation... which is lazily created on demand.
655 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
656 unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty);
657 return std::max(Align, Layout->getAlignment());
658 }
659 case Type::IntegerTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000660 AlignType = INTEGER_ALIGN;
661 break;
662 case Type::HalfTyID:
663 case Type::FloatTyID:
664 case Type::DoubleTyID:
665 // PPC_FP128TyID and FP128TyID have different data contents, but the
666 // same size and alignment, so they look the same here.
667 case Type::PPC_FP128TyID:
668 case Type::FP128TyID:
669 case Type::X86_FP80TyID:
670 AlignType = FLOAT_ALIGN;
671 break;
672 case Type::X86_MMXTyID:
673 case Type::VectorTyID:
674 AlignType = VECTOR_ALIGN;
675 break;
676 default:
677 llvm_unreachable("Bad type for getAlignment!!!");
678 }
679
680 return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSizeInBits(Ty),
681 abi_or_pref, Ty);
682}
683
Micah Villmowb4faa152012-10-04 23:01:22 +0000684unsigned DataLayout::getABITypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000685 return getAlignment(Ty, true);
686}
687
688/// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
689/// an integer type of the specified bitwidth.
Micah Villmowb4faa152012-10-04 23:01:22 +0000690unsigned DataLayout::getABIIntegerTypeAlignment(unsigned BitWidth) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000691 return getAlignmentInfo(INTEGER_ALIGN, BitWidth, true, 0);
692}
693
Micah Villmowb4faa152012-10-04 23:01:22 +0000694unsigned DataLayout::getPrefTypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000695 return getAlignment(Ty, false);
696}
697
Micah Villmowb4faa152012-10-04 23:01:22 +0000698unsigned DataLayout::getPreferredTypeAlignmentShift(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000699 unsigned Align = getPrefTypeAlignment(Ty);
700 assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
701 return Log2_32(Align);
702}
703
Micah Villmow89021e42012-10-09 16:06:12 +0000704IntegerType *DataLayout::getIntPtrType(LLVMContext &C,
705 unsigned AddressSpace) const {
706 return IntegerType::get(C, getPointerSizeInBits(AddressSpace));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000707}
708
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000709Type *DataLayout::getIntPtrType(Type *Ty) const {
Chandler Carruth7ec50852012-11-01 08:07:29 +0000710 assert(Ty->isPtrOrPtrVectorTy() &&
711 "Expected a pointer or pointer vector type.");
Chandler Carruth7ec50852012-11-01 08:07:29 +0000712 unsigned NumBits = getTypeSizeInBits(Ty->getScalarType());
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000713 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
714 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
715 return VectorType::get(IntTy, VecTy->getNumElements());
716 return IntTy;
Micah Villmow12d91272012-10-24 15:52:52 +0000717}
718
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000719Type *DataLayout::getSmallestLegalIntType(LLVMContext &C, unsigned Width) const {
720 for (unsigned i = 0, e = (unsigned)LegalIntWidths.size(); i != e; ++i)
721 if (Width <= LegalIntWidths[i])
722 return Type::getIntNTy(C, LegalIntWidths[i]);
723 return 0;
724}
725
Matt Arsenault899f7d22013-09-16 22:43:16 +0000726unsigned DataLayout::getLargestLegalIntTypeSize() const {
727 unsigned MaxWidth = 0;
728 for (unsigned i = 0, e = (unsigned)LegalIntWidths.size(); i != e; ++i)
729 MaxWidth = std::max<unsigned>(MaxWidth, LegalIntWidths[i]);
730 return MaxWidth;
731}
732
Micah Villmowb4faa152012-10-04 23:01:22 +0000733uint64_t DataLayout::getIndexedOffset(Type *ptrTy,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000734 ArrayRef<Value *> Indices) const {
735 Type *Ty = ptrTy;
736 assert(Ty->isPointerTy() && "Illegal argument for getIndexedOffset()");
737 uint64_t Result = 0;
738
739 generic_gep_type_iterator<Value* const*>
740 TI = gep_type_begin(ptrTy, Indices);
741 for (unsigned CurIDX = 0, EndIDX = Indices.size(); CurIDX != EndIDX;
742 ++CurIDX, ++TI) {
743 if (StructType *STy = dyn_cast<StructType>(*TI)) {
744 assert(Indices[CurIDX]->getType() ==
745 Type::getInt32Ty(ptrTy->getContext()) &&
746 "Illegal struct idx");
747 unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
748
749 // Get structure layout information...
750 const StructLayout *Layout = getStructLayout(STy);
751
752 // Add in the offset, as calculated by the structure layout info...
753 Result += Layout->getElementOffset(FieldNo);
754
755 // Update Ty to refer to current element
756 Ty = STy->getElementType(FieldNo);
757 } else {
758 // Update Ty to refer to current element
759 Ty = cast<SequentialType>(Ty)->getElementType();
760
761 // Get the array index and the size of each array element.
762 if (int64_t arrayIdx = cast<ConstantInt>(Indices[CurIDX])->getSExtValue())
763 Result += (uint64_t)arrayIdx * getTypeAllocSize(Ty);
764 }
765 }
766
767 return Result;
768}
769
770/// getPreferredAlignment - Return the preferred alignment of the specified
771/// global. This includes an explicitly requested alignment (if the global
772/// has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000773unsigned DataLayout::getPreferredAlignment(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000774 Type *ElemType = GV->getType()->getElementType();
775 unsigned Alignment = getPrefTypeAlignment(ElemType);
776 unsigned GVAlignment = GV->getAlignment();
777 if (GVAlignment >= Alignment) {
778 Alignment = GVAlignment;
779 } else if (GVAlignment != 0) {
780 Alignment = std::max(GVAlignment, getABITypeAlignment(ElemType));
781 }
782
783 if (GV->hasInitializer() && GVAlignment == 0) {
784 if (Alignment < 16) {
785 // If the global is not external, see if it is large. If so, give it a
786 // larger alignment.
787 if (getTypeSizeInBits(ElemType) > 128)
788 Alignment = 16; // 16-byte alignment.
789 }
790 }
791 return Alignment;
792}
793
794/// getPreferredAlignmentLog - Return the preferred alignment of the
795/// specified global, returned in log form. This includes an explicitly
796/// requested alignment (if the global has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000797unsigned DataLayout::getPreferredAlignmentLog(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000798 return Log2_32(getPreferredAlignment(GV));
799}
Rafael Espindola93512512014-02-25 17:30:31 +0000800
801DataLayoutPass::DataLayoutPass() : ImmutablePass(ID), DL("") {
802 report_fatal_error("Bad DataLayoutPass ctor used. Tool did not specify a "
803 "DataLayout to use?");
804}
805
806DataLayoutPass::~DataLayoutPass() {}
807
808DataLayoutPass::DataLayoutPass(const DataLayout &DL)
809 : ImmutablePass(ID), DL(DL) {
810 initializeDataLayoutPassPass(*PassRegistry::getPassRegistry());
811}
812
Rafael Espindola93512512014-02-25 17:30:31 +0000813DataLayoutPass::DataLayoutPass(const Module *M) : ImmutablePass(ID), DL(M) {
814 initializeDataLayoutPassPass(*PassRegistry::getPassRegistry());
815}