blob: d60c79f52e86bdde23486a8eb9538f9e96195103 [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
Patrik Hägglund01860a62012-11-14 09:04:56 +0000179void DataLayout::init(StringRef Desc) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000180 LayoutMap = 0;
181 LittleEndian = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000182 StackNaturalAlign = 0;
Rafael Espindola58873562014-01-03 19:21:54 +0000183 ManglingMode = MM_None;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000184
185 // Default alignments
Rafael Espindola458a4852013-12-19 23:03:03 +0000186 for (int I = 0, N = array_lengthof(DefaultAlignments); I < N; ++I) {
Rafael Espindolae23b8772013-12-20 15:21:32 +0000187 const LayoutAlignElem &E = DefaultAlignments[I];
Rafael Espindola458a4852013-12-19 23:03:03 +0000188 setAlignment((AlignTypeEnum)E.AlignType, E.ABIAlign, E.PrefAlign,
189 E.TypeBitWidth);
190 }
Micah Villmow89021e42012-10-09 16:06:12 +0000191 setPointerAlignment(0, 8, 8, 8);
Patrik Hägglund01860a62012-11-14 09:04:56 +0000192
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000193 parseSpecifier(Desc);
194}
195
196/// Checked version of split, to ensure mandatory subparts.
197static std::pair<StringRef, StringRef> split(StringRef Str, char Separator) {
198 assert(!Str.empty() && "parse error, string can't be empty here");
199 std::pair<StringRef, StringRef> Split = Str.split(Separator);
200 assert((!Split.second.empty() || Split.first == Str) &&
201 "a trailing separator is not allowed");
202 return Split;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000203}
204
Cameron McInally8af9eac2014-01-07 19:51:38 +0000205/// Get an unsigned integer, including error checks.
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000206static unsigned getInt(StringRef R) {
Cameron McInallyf0379fa2014-01-13 22:04:55 +0000207 unsigned Result;
Patrik Hägglund504f4782012-11-28 14:32:52 +0000208 bool error = R.getAsInteger(10, Result); (void)error;
Cameron McInallyf0379fa2014-01-13 22:04:55 +0000209 if (error)
210 report_fatal_error("not a number, or does not fit in an unsigned int");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000211 return Result;
212}
213
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000214/// Convert bits into bytes. Assert if not a byte width multiple.
215static unsigned inBytes(unsigned Bits) {
216 assert(Bits % 8 == 0 && "number of bits must be a byte width multiple");
217 return Bits / 8;
218}
219
220void DataLayout::parseSpecifier(StringRef Desc) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000221 while (!Desc.empty()) {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000222 // Split at '-'.
223 std::pair<StringRef, StringRef> Split = split(Desc, '-');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000224 Desc = Split.second;
225
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000226 // Split at ':'.
227 Split = split(Split.first, ':');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000228
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000229 // Aliases used below.
230 StringRef &Tok = Split.first; // Current token.
231 StringRef &Rest = Split.second; // The rest of the string.
Micah Villmowac34b5c2012-10-04 22:08:14 +0000232
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000233 char Specifier = Tok.front();
234 Tok = Tok.substr(1);
235
236 switch (Specifier) {
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000237 case 's':
238 // Ignored for backward compatibility.
239 // FIXME: remove this on LLVM 4.0.
240 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000241 case 'E':
Patrik Hägglund01860a62012-11-14 09:04:56 +0000242 LittleEndian = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000243 break;
244 case 'e':
Patrik Hägglund01860a62012-11-14 09:04:56 +0000245 LittleEndian = true;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000246 break;
247 case 'p': {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000248 // Address space.
249 unsigned AddrSpace = Tok.empty() ? 0 : getInt(Tok);
250 assert(AddrSpace < 1 << 24 &&
251 "Invalid address space, must be a 24bit integer");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000252
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000253 // Size.
254 Split = split(Rest, ':');
255 unsigned PointerMemSize = inBytes(getInt(Tok));
256
257 // ABI alignment.
258 Split = split(Rest, ':');
259 unsigned PointerABIAlign = inBytes(getInt(Tok));
260
261 // Preferred alignment.
262 unsigned PointerPrefAlign = PointerABIAlign;
263 if (!Rest.empty()) {
264 Split = split(Rest, ':');
265 PointerPrefAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000266 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000267
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000268 setPointerAlignment(AddrSpace, PointerABIAlign, PointerPrefAlign,
269 PointerMemSize);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000270 break;
271 }
272 case 'i':
273 case 'v':
274 case 'f':
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000275 case 'a': {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000276 AlignTypeEnum AlignType;
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000277 switch (Specifier) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000278 default:
279 case 'i': AlignType = INTEGER_ALIGN; break;
280 case 'v': AlignType = VECTOR_ALIGN; break;
281 case 'f': AlignType = FLOAT_ALIGN; break;
282 case 'a': AlignType = AGGREGATE_ALIGN; break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000283 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000284
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000285 // Bit size.
286 unsigned Size = Tok.empty() ? 0 : getInt(Tok);
287
Rafael Espindolaabdd7262014-01-06 21:40:24 +0000288 assert((AlignType != AGGREGATE_ALIGN || Size == 0) &&
289 "These specifications don't have a size");
290
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000291 // ABI alignment.
292 Split = split(Rest, ':');
293 unsigned ABIAlign = inBytes(getInt(Tok));
294
295 // Preferred alignment.
296 unsigned PrefAlign = ABIAlign;
297 if (!Rest.empty()) {
298 Split = split(Rest, ':');
299 PrefAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000300 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000301
Patrik Hägglund01860a62012-11-14 09:04:56 +0000302 setAlignment(AlignType, ABIAlign, PrefAlign, Size);
Micah Villmowb4faa152012-10-04 23:01:22 +0000303
Micah Villmowac34b5c2012-10-04 22:08:14 +0000304 break;
305 }
306 case 'n': // Native integer types.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000307 for (;;) {
308 unsigned Width = getInt(Tok);
309 assert(Width != 0 && "width must be non-zero");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000310 LegalIntWidths.push_back(Width);
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000311 if (Rest.empty())
312 break;
313 Split = split(Rest, ':');
314 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000315 break;
316 case 'S': { // Stack natural alignment.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000317 StackNaturalAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000318 break;
319 }
Rafael Espindola58873562014-01-03 19:21:54 +0000320 case 'm':
321 assert(Tok.empty());
322 assert(Rest.size() == 1);
323 switch(Rest[0]) {
324 default:
325 llvm_unreachable("Unknown mangling in datalayout string");
326 case 'e':
327 ManglingMode = MM_ELF;
328 break;
329 case 'o':
330 ManglingMode = MM_MachO;
331 break;
332 case 'm':
333 ManglingMode = MM_Mips;
334 break;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000335 case 'w':
336 ManglingMode = MM_WINCOFF;
Rafael Espindola58873562014-01-03 19:21:54 +0000337 break;
338 }
339 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000340 default:
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000341 llvm_unreachable("Unknown specifier in datalayout string");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000342 break;
343 }
344 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000345}
346
Rafael Espindolaf863ee22014-02-25 20:01:08 +0000347DataLayout::DataLayout(const Module *M) {
348 const DataLayout *Other = M->getDataLayout();
349 if (Other)
350 *this = *Other;
351 else
352 init("");
353}
Micah Villmowac34b5c2012-10-04 22:08:14 +0000354
355void
Micah Villmowb4faa152012-10-04 23:01:22 +0000356DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000357 unsigned pref_align, uint32_t bit_width) {
358 assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
359 assert(pref_align < (1 << 16) && "Alignment doesn't fit in bitfield");
360 assert(bit_width < (1 << 24) && "Bit width doesn't fit in bitfield");
361 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmow6d05e692012-10-05 17:02:14 +0000362 if (Alignments[i].AlignType == (unsigned)align_type &&
Micah Villmowac34b5c2012-10-04 22:08:14 +0000363 Alignments[i].TypeBitWidth == bit_width) {
364 // Update the abi, preferred alignments.
365 Alignments[i].ABIAlign = abi_align;
366 Alignments[i].PrefAlign = pref_align;
367 return;
368 }
369 }
370
Micah Villmowb4faa152012-10-04 23:01:22 +0000371 Alignments.push_back(LayoutAlignElem::get(align_type, abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000372 pref_align, bit_width));
373}
374
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000375void DataLayout::setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign,
376 unsigned PrefAlign,
377 uint32_t TypeByteWidth) {
378 assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
379 DenseMap<unsigned,PointerAlignElem>::iterator val = Pointers.find(AddrSpace);
Micah Villmow89021e42012-10-09 16:06:12 +0000380 if (val == Pointers.end()) {
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000381 Pointers[AddrSpace] =
382 PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign, TypeByteWidth);
Micah Villmow89021e42012-10-09 16:06:12 +0000383 } else {
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000384 val->second.ABIAlign = ABIAlign;
385 val->second.PrefAlign = PrefAlign;
386 val->second.TypeByteWidth = TypeByteWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000387 }
388}
389
Micah Villmowac34b5c2012-10-04 22:08:14 +0000390/// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
Micah Villmowb4faa152012-10-04 23:01:22 +0000391/// preferred if ABIInfo = false) the layout wants for the specified datatype.
392unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000393 uint32_t BitWidth, bool ABIInfo,
394 Type *Ty) const {
395 // Check to see if we have an exact match and remember the best match we see.
396 int BestMatchIdx = -1;
397 int LargestInt = -1;
398 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmow6d05e692012-10-05 17:02:14 +0000399 if (Alignments[i].AlignType == (unsigned)AlignType &&
Micah Villmowac34b5c2012-10-04 22:08:14 +0000400 Alignments[i].TypeBitWidth == BitWidth)
401 return ABIInfo ? Alignments[i].ABIAlign : Alignments[i].PrefAlign;
402
403 // The best match so far depends on what we're looking for.
404 if (AlignType == INTEGER_ALIGN &&
405 Alignments[i].AlignType == INTEGER_ALIGN) {
406 // The "best match" for integers is the smallest size that is larger than
407 // the BitWidth requested.
408 if (Alignments[i].TypeBitWidth > BitWidth && (BestMatchIdx == -1 ||
Eli Benderskyfaf5e3e2013-01-30 19:24:23 +0000409 Alignments[i].TypeBitWidth < Alignments[BestMatchIdx].TypeBitWidth))
Micah Villmowac34b5c2012-10-04 22:08:14 +0000410 BestMatchIdx = i;
411 // However, if there isn't one that's larger, then we must use the
412 // largest one we have (see below)
413 if (LargestInt == -1 ||
414 Alignments[i].TypeBitWidth > Alignments[LargestInt].TypeBitWidth)
415 LargestInt = i;
416 }
417 }
418
419 // Okay, we didn't find an exact solution. Fall back here depending on what
420 // is being looked for.
421 if (BestMatchIdx == -1) {
422 // If we didn't find an integer alignment, fall back on most conservative.
423 if (AlignType == INTEGER_ALIGN) {
424 BestMatchIdx = LargestInt;
425 } else {
426 assert(AlignType == VECTOR_ALIGN && "Unknown alignment type!");
427
428 // By default, use natural alignment for vector types. This is consistent
429 // with what clang and llvm-gcc do.
430 unsigned Align = getTypeAllocSize(cast<VectorType>(Ty)->getElementType());
431 Align *= cast<VectorType>(Ty)->getNumElements();
432 // If the alignment is not a power of 2, round up to the next power of 2.
433 // This happens for non-power-of-2 length vectors.
434 if (Align & (Align-1))
435 Align = NextPowerOf2(Align);
436 return Align;
437 }
438 }
439
440 // Since we got a "best match" index, just return it.
441 return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
442 : Alignments[BestMatchIdx].PrefAlign;
443}
444
445namespace {
446
447class StructLayoutMap {
448 typedef DenseMap<StructType*, StructLayout*> LayoutInfoTy;
449 LayoutInfoTy LayoutInfo;
450
451public:
452 virtual ~StructLayoutMap() {
453 // Remove any layouts.
454 for (LayoutInfoTy::iterator I = LayoutInfo.begin(), E = LayoutInfo.end();
455 I != E; ++I) {
456 StructLayout *Value = I->second;
457 Value->~StructLayout();
458 free(Value);
459 }
460 }
461
462 StructLayout *&operator[](StructType *STy) {
463 return LayoutInfo[STy];
464 }
465
466 // for debugging...
467 virtual void dump() const {}
468};
469
470} // end anonymous namespace
471
Micah Villmowb4faa152012-10-04 23:01:22 +0000472DataLayout::~DataLayout() {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000473 delete static_cast<StructLayoutMap*>(LayoutMap);
474}
475
Micah Villmowb4faa152012-10-04 23:01:22 +0000476const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000477 if (!LayoutMap)
478 LayoutMap = new StructLayoutMap();
479
480 StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
481 StructLayout *&SL = (*STM)[Ty];
482 if (SL) return SL;
483
484 // Otherwise, create the struct layout. Because it is variable length, we
485 // malloc it, then use placement new.
486 int NumElts = Ty->getNumElements();
487 StructLayout *L =
488 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t));
489
490 // Set SL before calling StructLayout's ctor. The ctor could cause other
491 // entries to be added to TheMap, invalidating our reference.
492 SL = L;
493
494 new (L) StructLayout(Ty, *this);
495
496 return L;
497}
498
Micah Villmowb4faa152012-10-04 23:01:22 +0000499std::string DataLayout::getStringRepresentation() const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000500 std::string Result;
501 raw_string_ostream OS(Result);
502
Micah Villmow89021e42012-10-09 16:06:12 +0000503 OS << (LittleEndian ? "e" : "E");
Rafael Espindola58873562014-01-03 19:21:54 +0000504
505 switch (ManglingMode) {
506 case MM_None:
507 break;
508 case MM_ELF:
509 OS << "-m:e";
510 break;
511 case MM_MachO:
512 OS << "-m:o";
513 break;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000514 case MM_WINCOFF:
515 OS << "-m:w";
Rafael Espindola58873562014-01-03 19:21:54 +0000516 break;
517 case MM_Mips:
518 OS << "-m:m";
519 break;
520 }
521
Micah Villmow89021e42012-10-09 16:06:12 +0000522 SmallVector<unsigned, 8> addrSpaces;
523 // Lets get all of the known address spaces and sort them
524 // into increasing order so that we can emit the string
525 // in a cleaner format.
526 for (DenseMap<unsigned, PointerAlignElem>::const_iterator
527 pib = Pointers.begin(), pie = Pointers.end();
528 pib != pie; ++pib) {
529 addrSpaces.push_back(pib->first);
530 }
531 std::sort(addrSpaces.begin(), addrSpaces.end());
Craig Topperaf0dea12013-07-04 01:31:24 +0000532 for (SmallVectorImpl<unsigned>::iterator asb = addrSpaces.begin(),
Micah Villmow89021e42012-10-09 16:06:12 +0000533 ase = addrSpaces.end(); asb != ase; ++asb) {
534 const PointerAlignElem &PI = Pointers.find(*asb)->second;
Rafael Espindola458a4852013-12-19 23:03:03 +0000535
536 // Skip default.
537 if (PI.AddressSpace == 0 && PI.ABIAlign == 8 && PI.PrefAlign == 8 &&
538 PI.TypeByteWidth == 8)
539 continue;
540
Micah Villmow89021e42012-10-09 16:06:12 +0000541 OS << "-p";
542 if (PI.AddressSpace) {
543 OS << PI.AddressSpace;
544 }
Rafael Espindola458a4852013-12-19 23:03:03 +0000545 OS << ":" << PI.TypeByteWidth*8 << ':' << PI.ABIAlign*8;
546 if (PI.PrefAlign != PI.ABIAlign)
547 OS << ':' << PI.PrefAlign*8;
Micah Villmow89021e42012-10-09 16:06:12 +0000548 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000549
Rafael Espindolae23b8772013-12-20 15:21:32 +0000550 const LayoutAlignElem *DefaultStart = DefaultAlignments;
551 const LayoutAlignElem *DefaultEnd =
Rafael Espindola458a4852013-12-19 23:03:03 +0000552 DefaultStart + array_lengthof(DefaultAlignments);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000553 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmowb4faa152012-10-04 23:01:22 +0000554 const LayoutAlignElem &AI = Alignments[i];
Rafael Espindola458a4852013-12-19 23:03:03 +0000555 if (std::find(DefaultStart, DefaultEnd, AI) != DefaultEnd)
556 continue;
557 OS << '-' << (char)AI.AlignType;
558 if (AI.TypeBitWidth)
559 OS << AI.TypeBitWidth;
560 OS << ':' << AI.ABIAlign*8;
561 if (AI.ABIAlign != AI.PrefAlign)
562 OS << ':' << AI.PrefAlign*8;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000563 }
564
565 if (!LegalIntWidths.empty()) {
566 OS << "-n" << (unsigned)LegalIntWidths[0];
567
568 for (unsigned i = 1, e = LegalIntWidths.size(); i != e; ++i)
569 OS << ':' << (unsigned)LegalIntWidths[i];
570 }
Rafael Espindola458a4852013-12-19 23:03:03 +0000571
572 if (StackNaturalAlign)
573 OS << "-S" << StackNaturalAlign*8;
574
Micah Villmowac34b5c2012-10-04 22:08:14 +0000575 return OS.str();
576}
577
Matt Arsenault6f4be902013-07-26 17:37:20 +0000578unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {
579 assert(Ty->isPtrOrPtrVectorTy() &&
580 "This should only be called with a pointer or pointer vector type");
581
582 if (Ty->isPointerTy())
583 return getTypeSizeInBits(Ty);
584
Matt Arsenault517cf482013-07-27 19:22:28 +0000585 return getTypeSizeInBits(Ty->getScalarType());
Matt Arsenault6f4be902013-07-26 17:37:20 +0000586}
Micah Villmowac34b5c2012-10-04 22:08:14 +0000587
Micah Villmowac34b5c2012-10-04 22:08:14 +0000588/*!
589 \param abi_or_pref Flag that determines which alignment is returned. true
590 returns the ABI alignment, false returns the preferred alignment.
591 \param Ty The underlying type for which alignment is determined.
592
593 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
594 == false) for the requested type \a Ty.
595 */
Micah Villmowb4faa152012-10-04 23:01:22 +0000596unsigned DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000597 int AlignType = -1;
598
599 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
600 switch (Ty->getTypeID()) {
601 // Early escape for the non-numeric types.
602 case Type::LabelTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000603 return (abi_or_pref
Micah Villmow89021e42012-10-09 16:06:12 +0000604 ? getPointerABIAlignment(0)
605 : getPointerPrefAlignment(0));
606 case Type::PointerTyID: {
607 unsigned AS = dyn_cast<PointerType>(Ty)->getAddressSpace();
608 return (abi_or_pref
609 ? getPointerABIAlignment(AS)
610 : getPointerPrefAlignment(AS));
611 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000612 case Type::ArrayTyID:
613 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
614
615 case Type::StructTyID: {
616 // Packed structure types always have an ABI alignment of one.
617 if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
618 return 1;
619
620 // Get the layout annotation... which is lazily created on demand.
621 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
622 unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty);
623 return std::max(Align, Layout->getAlignment());
624 }
625 case Type::IntegerTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000626 AlignType = INTEGER_ALIGN;
627 break;
628 case Type::HalfTyID:
629 case Type::FloatTyID:
630 case Type::DoubleTyID:
631 // PPC_FP128TyID and FP128TyID have different data contents, but the
632 // same size and alignment, so they look the same here.
633 case Type::PPC_FP128TyID:
634 case Type::FP128TyID:
635 case Type::X86_FP80TyID:
636 AlignType = FLOAT_ALIGN;
637 break;
638 case Type::X86_MMXTyID:
639 case Type::VectorTyID:
640 AlignType = VECTOR_ALIGN;
641 break;
642 default:
643 llvm_unreachable("Bad type for getAlignment!!!");
644 }
645
646 return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSizeInBits(Ty),
647 abi_or_pref, Ty);
648}
649
Micah Villmowb4faa152012-10-04 23:01:22 +0000650unsigned DataLayout::getABITypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000651 return getAlignment(Ty, true);
652}
653
654/// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
655/// an integer type of the specified bitwidth.
Micah Villmowb4faa152012-10-04 23:01:22 +0000656unsigned DataLayout::getABIIntegerTypeAlignment(unsigned BitWidth) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000657 return getAlignmentInfo(INTEGER_ALIGN, BitWidth, true, 0);
658}
659
Micah Villmowb4faa152012-10-04 23:01:22 +0000660unsigned DataLayout::getPrefTypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000661 return getAlignment(Ty, false);
662}
663
Micah Villmowb4faa152012-10-04 23:01:22 +0000664unsigned DataLayout::getPreferredTypeAlignmentShift(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000665 unsigned Align = getPrefTypeAlignment(Ty);
666 assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
667 return Log2_32(Align);
668}
669
Micah Villmow89021e42012-10-09 16:06:12 +0000670IntegerType *DataLayout::getIntPtrType(LLVMContext &C,
671 unsigned AddressSpace) const {
672 return IntegerType::get(C, getPointerSizeInBits(AddressSpace));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000673}
674
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000675Type *DataLayout::getIntPtrType(Type *Ty) const {
Chandler Carruth7ec50852012-11-01 08:07:29 +0000676 assert(Ty->isPtrOrPtrVectorTy() &&
677 "Expected a pointer or pointer vector type.");
Chandler Carruth7ec50852012-11-01 08:07:29 +0000678 unsigned NumBits = getTypeSizeInBits(Ty->getScalarType());
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000679 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
680 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
681 return VectorType::get(IntTy, VecTy->getNumElements());
682 return IntTy;
Micah Villmow12d91272012-10-24 15:52:52 +0000683}
684
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000685Type *DataLayout::getSmallestLegalIntType(LLVMContext &C, unsigned Width) const {
686 for (unsigned i = 0, e = (unsigned)LegalIntWidths.size(); i != e; ++i)
687 if (Width <= LegalIntWidths[i])
688 return Type::getIntNTy(C, LegalIntWidths[i]);
689 return 0;
690}
691
Matt Arsenault899f7d22013-09-16 22:43:16 +0000692unsigned DataLayout::getLargestLegalIntTypeSize() const {
693 unsigned MaxWidth = 0;
694 for (unsigned i = 0, e = (unsigned)LegalIntWidths.size(); i != e; ++i)
695 MaxWidth = std::max<unsigned>(MaxWidth, LegalIntWidths[i]);
696 return MaxWidth;
697}
698
Micah Villmowb4faa152012-10-04 23:01:22 +0000699uint64_t DataLayout::getIndexedOffset(Type *ptrTy,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000700 ArrayRef<Value *> Indices) const {
701 Type *Ty = ptrTy;
702 assert(Ty->isPointerTy() && "Illegal argument for getIndexedOffset()");
703 uint64_t Result = 0;
704
705 generic_gep_type_iterator<Value* const*>
706 TI = gep_type_begin(ptrTy, Indices);
707 for (unsigned CurIDX = 0, EndIDX = Indices.size(); CurIDX != EndIDX;
708 ++CurIDX, ++TI) {
709 if (StructType *STy = dyn_cast<StructType>(*TI)) {
710 assert(Indices[CurIDX]->getType() ==
711 Type::getInt32Ty(ptrTy->getContext()) &&
712 "Illegal struct idx");
713 unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
714
715 // Get structure layout information...
716 const StructLayout *Layout = getStructLayout(STy);
717
718 // Add in the offset, as calculated by the structure layout info...
719 Result += Layout->getElementOffset(FieldNo);
720
721 // Update Ty to refer to current element
722 Ty = STy->getElementType(FieldNo);
723 } else {
724 // Update Ty to refer to current element
725 Ty = cast<SequentialType>(Ty)->getElementType();
726
727 // Get the array index and the size of each array element.
728 if (int64_t arrayIdx = cast<ConstantInt>(Indices[CurIDX])->getSExtValue())
729 Result += (uint64_t)arrayIdx * getTypeAllocSize(Ty);
730 }
731 }
732
733 return Result;
734}
735
736/// getPreferredAlignment - Return the preferred alignment of the specified
737/// global. This includes an explicitly requested alignment (if the global
738/// has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000739unsigned DataLayout::getPreferredAlignment(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000740 Type *ElemType = GV->getType()->getElementType();
741 unsigned Alignment = getPrefTypeAlignment(ElemType);
742 unsigned GVAlignment = GV->getAlignment();
743 if (GVAlignment >= Alignment) {
744 Alignment = GVAlignment;
745 } else if (GVAlignment != 0) {
746 Alignment = std::max(GVAlignment, getABITypeAlignment(ElemType));
747 }
748
749 if (GV->hasInitializer() && GVAlignment == 0) {
750 if (Alignment < 16) {
751 // If the global is not external, see if it is large. If so, give it a
752 // larger alignment.
753 if (getTypeSizeInBits(ElemType) > 128)
754 Alignment = 16; // 16-byte alignment.
755 }
756 }
757 return Alignment;
758}
759
760/// getPreferredAlignmentLog - Return the preferred alignment of the
761/// specified global, returned in log form. This includes an explicitly
762/// requested alignment (if the global has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000763unsigned DataLayout::getPreferredAlignmentLog(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000764 return Log2_32(getPreferredAlignment(GV));
765}
Rafael Espindola93512512014-02-25 17:30:31 +0000766
767DataLayoutPass::DataLayoutPass() : ImmutablePass(ID), DL("") {
768 report_fatal_error("Bad DataLayoutPass ctor used. Tool did not specify a "
769 "DataLayout to use?");
770}
771
772DataLayoutPass::~DataLayoutPass() {}
773
774DataLayoutPass::DataLayoutPass(const DataLayout &DL)
775 : ImmutablePass(ID), DL(DL) {
776 initializeDataLayoutPassPass(*PassRegistry::getPassRegistry());
777}
778
779DataLayoutPass::DataLayoutPass(StringRef Str) : ImmutablePass(ID), DL(Str) {
780 initializeDataLayoutPassPass(*PassRegistry::getPassRegistry());
781}
782
783DataLayoutPass::DataLayoutPass(const Module *M) : ImmutablePass(ID), DL(M) {
784 initializeDataLayoutPassPass(*PassRegistry::getPassRegistry());
785}