blob: 5654e15ae30266826b199e68727eb99169942457 [file] [log] [blame]
Micah Villmowb4faa152012-10-04 23:01:22 +00001//===-- DataLayout.cpp - Data size & alignment routines --------------------==//
Micah Villmowac34b5c2012-10-04 22:08:14 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Micah Villmowb4faa152012-10-04 23:01:22 +000010// This file defines layout properties related to datatype size/offset/alignment
Micah Villmowac34b5c2012-10-04 22:08:14 +000011// information.
12//
13// This structure should be created once, filled in if the defaults are not
14// correct and then passed around by const&. None of the members functions
15// require modification to the object.
16//
17//===----------------------------------------------------------------------===//
18
Chandler Carruth9fb823b2013-01-02 11:36:10 +000019#include "llvm/IR/DataLayout.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000020#include "llvm/ADT/DenseMap.h"
Rafael Espindola458a4852013-12-19 23:03:03 +000021#include "llvm/ADT/STLExtras.h"
Rafael Espindola58873562014-01-03 19:21:54 +000022#include "llvm/ADT/Triple.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000023#include "llvm/IR/Constants.h"
24#include "llvm/IR/DerivedTypes.h"
Chandler Carruth03eb0de2014-03-04 10:40:04 +000025#include "llvm/IR/GetElementPtrTypeIterator.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000026#include "llvm/IR/Module.h"
Micah Villmowac34b5c2012-10-04 22:08:14 +000027#include "llvm/Support/ErrorHandling.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000028#include "llvm/Support/ManagedStatic.h"
29#include "llvm/Support/MathExtras.h"
Micah Villmowac34b5c2012-10-04 22:08:14 +000030#include "llvm/Support/Mutex.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000031#include "llvm/Support/raw_ostream.h"
Micah Villmowac34b5c2012-10-04 22:08:14 +000032#include <algorithm>
33#include <cstdlib>
34using namespace llvm;
35
Micah Villmowb4faa152012-10-04 23:01:22 +000036// Handle the Pass registration stuff necessary to use DataLayout's.
Micah Villmowac34b5c2012-10-04 22:08:14 +000037
Rafael Espindola93512512014-02-25 17:30:31 +000038INITIALIZE_PASS(DataLayoutPass, "datalayout", "Data Layout", false, true)
39char DataLayoutPass::ID = 0;
Micah Villmowac34b5c2012-10-04 22:08:14 +000040
41//===----------------------------------------------------------------------===//
42// Support for StructLayout
43//===----------------------------------------------------------------------===//
44
Eli Bendersky41913c72013-04-16 15:41:18 +000045StructLayout::StructLayout(StructType *ST, const DataLayout &DL) {
Micah Villmowac34b5c2012-10-04 22:08:14 +000046 assert(!ST->isOpaque() && "Cannot get layout of opaque structs");
47 StructAlignment = 0;
48 StructSize = 0;
49 NumElements = ST->getNumElements();
50
51 // Loop over each of the elements, placing them in memory.
52 for (unsigned i = 0, e = NumElements; i != e; ++i) {
53 Type *Ty = ST->getElementType(i);
Eli Bendersky41913c72013-04-16 15:41:18 +000054 unsigned TyAlign = ST->isPacked() ? 1 : DL.getABITypeAlignment(Ty);
Micah Villmowac34b5c2012-10-04 22:08:14 +000055
56 // Add padding if necessary to align the data element properly.
57 if ((StructSize & (TyAlign-1)) != 0)
Micah Villmowb4faa152012-10-04 23:01:22 +000058 StructSize = DataLayout::RoundUpAlignment(StructSize, TyAlign);
Micah Villmowac34b5c2012-10-04 22:08:14 +000059
60 // Keep track of maximum alignment constraint.
61 StructAlignment = std::max(TyAlign, StructAlignment);
62
63 MemberOffsets[i] = StructSize;
Eli Bendersky41913c72013-04-16 15:41:18 +000064 StructSize += DL.getTypeAllocSize(Ty); // Consume space for this data item
Micah Villmowac34b5c2012-10-04 22:08:14 +000065 }
66
67 // Empty structures have alignment of 1 byte.
68 if (StructAlignment == 0) StructAlignment = 1;
69
70 // Add padding to the end of the struct so that it could be put in an array
71 // and all array elements would be aligned correctly.
72 if ((StructSize & (StructAlignment-1)) != 0)
Micah Villmowb4faa152012-10-04 23:01:22 +000073 StructSize = DataLayout::RoundUpAlignment(StructSize, StructAlignment);
Micah Villmowac34b5c2012-10-04 22:08:14 +000074}
75
76
77/// getElementContainingOffset - Given a valid offset into the structure,
78/// return the structure index that contains it.
79unsigned StructLayout::getElementContainingOffset(uint64_t Offset) const {
80 const uint64_t *SI =
81 std::upper_bound(&MemberOffsets[0], &MemberOffsets[NumElements], Offset);
82 assert(SI != &MemberOffsets[0] && "Offset not in structure type!");
83 --SI;
84 assert(*SI <= Offset && "upper_bound didn't work");
85 assert((SI == &MemberOffsets[0] || *(SI-1) <= Offset) &&
86 (SI+1 == &MemberOffsets[NumElements] || *(SI+1) > Offset) &&
87 "Upper bound didn't work!");
88
89 // Multiple fields can have the same offset if any of them are zero sized.
90 // For example, in { i32, [0 x i32], i32 }, searching for offset 4 will stop
91 // at the i32 element, because it is the last element at that offset. This is
92 // the right one to return, because anything after it will have a higher
93 // offset, implying that this element is non-empty.
94 return SI-&MemberOffsets[0];
95}
96
97//===----------------------------------------------------------------------===//
Micah Villmowb4faa152012-10-04 23:01:22 +000098// LayoutAlignElem, LayoutAlign support
Micah Villmowac34b5c2012-10-04 22:08:14 +000099//===----------------------------------------------------------------------===//
100
Micah Villmowb4faa152012-10-04 23:01:22 +0000101LayoutAlignElem
102LayoutAlignElem::get(AlignTypeEnum align_type, unsigned abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000103 unsigned pref_align, uint32_t bit_width) {
104 assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
Micah Villmowb4faa152012-10-04 23:01:22 +0000105 LayoutAlignElem retval;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000106 retval.AlignType = align_type;
107 retval.ABIAlign = abi_align;
108 retval.PrefAlign = pref_align;
109 retval.TypeBitWidth = bit_width;
110 return retval;
111}
112
113bool
Micah Villmowb4faa152012-10-04 23:01:22 +0000114LayoutAlignElem::operator==(const LayoutAlignElem &rhs) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000115 return (AlignType == rhs.AlignType
116 && ABIAlign == rhs.ABIAlign
117 && PrefAlign == rhs.PrefAlign
118 && TypeBitWidth == rhs.TypeBitWidth);
119}
120
Micah Villmowb4faa152012-10-04 23:01:22 +0000121const LayoutAlignElem
Benjamin Kramer058f5b32013-11-19 20:28:04 +0000122DataLayout::InvalidAlignmentElem = { INVALID_ALIGN, 0, 0, 0 };
Micah Villmow89021e42012-10-09 16:06:12 +0000123
124//===----------------------------------------------------------------------===//
125// PointerAlignElem, PointerAlign support
126//===----------------------------------------------------------------------===//
127
128PointerAlignElem
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000129PointerAlignElem::get(uint32_t AddressSpace, unsigned ABIAlign,
130 unsigned PrefAlign, uint32_t TypeByteWidth) {
131 assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
Micah Villmow89021e42012-10-09 16:06:12 +0000132 PointerAlignElem retval;
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000133 retval.AddressSpace = AddressSpace;
134 retval.ABIAlign = ABIAlign;
135 retval.PrefAlign = PrefAlign;
136 retval.TypeByteWidth = TypeByteWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000137 return retval;
138}
139
140bool
141PointerAlignElem::operator==(const PointerAlignElem &rhs) const {
142 return (ABIAlign == rhs.ABIAlign
143 && AddressSpace == rhs.AddressSpace
144 && PrefAlign == rhs.PrefAlign
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000145 && TypeByteWidth == rhs.TypeByteWidth);
Micah Villmow89021e42012-10-09 16:06:12 +0000146}
147
148const PointerAlignElem
Benjamin Kramer058f5b32013-11-19 20:28:04 +0000149DataLayout::InvalidPointerElem = { 0U, 0U, 0U, ~0U };
Micah Villmowac34b5c2012-10-04 22:08:14 +0000150
151//===----------------------------------------------------------------------===//
Micah Villmowb4faa152012-10-04 23:01:22 +0000152// DataLayout Class Implementation
Micah Villmowac34b5c2012-10-04 22:08:14 +0000153//===----------------------------------------------------------------------===//
154
Rafael Espindola58873562014-01-03 19:21:54 +0000155const char *DataLayout::getManglingComponent(const Triple &T) {
156 if (T.isOSBinFormatMachO())
157 return "-m:o";
158 if (T.isOSBinFormatELF() || T.isArch64Bit())
159 return "-m:e";
160 assert(T.isOSBinFormatCOFF());
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000161 return "-m:w";
Rafael Espindola58873562014-01-03 19:21:54 +0000162}
163
Rafael Espindolae23b8772013-12-20 15:21:32 +0000164static const LayoutAlignElem DefaultAlignments[] = {
Rafael Espindola458a4852013-12-19 23:03:03 +0000165 { INTEGER_ALIGN, 1, 1, 1 }, // i1
166 { INTEGER_ALIGN, 8, 1, 1 }, // i8
167 { INTEGER_ALIGN, 16, 2, 2 }, // i16
168 { INTEGER_ALIGN, 32, 4, 4 }, // i32
169 { INTEGER_ALIGN, 64, 4, 8 }, // i64
170 { FLOAT_ALIGN, 16, 2, 2 }, // half
171 { FLOAT_ALIGN, 32, 4, 4 }, // float
172 { FLOAT_ALIGN, 64, 8, 8 }, // double
173 { FLOAT_ALIGN, 128, 16, 16 }, // ppcf128, quad, ...
174 { VECTOR_ALIGN, 64, 8, 8 }, // v2i32, v1i64, ...
175 { VECTOR_ALIGN, 128, 16, 16 }, // v16i8, v8i16, v4i32, ...
176 { AGGREGATE_ALIGN, 0, 0, 8 } // struct
177};
178
Rafael Espindola248ac132014-02-25 22:23:04 +0000179void DataLayout::reset(StringRef Desc) {
180 clear();
181
Micah Villmowac34b5c2012-10-04 22:08:14 +0000182 LayoutMap = 0;
183 LittleEndian = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000184 StackNaturalAlign = 0;
Rafael Espindola58873562014-01-03 19:21:54 +0000185 ManglingMode = MM_None;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000186
187 // Default alignments
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000188 for (const LayoutAlignElem &E : DefaultAlignments) {
Rafael Espindola458a4852013-12-19 23:03:03 +0000189 setAlignment((AlignTypeEnum)E.AlignType, E.ABIAlign, E.PrefAlign,
190 E.TypeBitWidth);
191 }
Micah Villmow89021e42012-10-09 16:06:12 +0000192 setPointerAlignment(0, 8, 8, 8);
Patrik Hägglund01860a62012-11-14 09:04:56 +0000193
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000194 parseSpecifier(Desc);
195}
196
197/// Checked version of split, to ensure mandatory subparts.
198static std::pair<StringRef, StringRef> split(StringRef Str, char Separator) {
199 assert(!Str.empty() && "parse error, string can't be empty here");
200 std::pair<StringRef, StringRef> Split = Str.split(Separator);
201 assert((!Split.second.empty() || Split.first == Str) &&
202 "a trailing separator is not allowed");
203 return Split;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000204}
205
Cameron McInally8af9eac2014-01-07 19:51:38 +0000206/// Get an unsigned integer, including error checks.
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000207static unsigned getInt(StringRef R) {
Cameron McInallyf0379fa2014-01-13 22:04:55 +0000208 unsigned Result;
Patrik Hägglund504f4782012-11-28 14:32:52 +0000209 bool error = R.getAsInteger(10, Result); (void)error;
Cameron McInallyf0379fa2014-01-13 22:04:55 +0000210 if (error)
211 report_fatal_error("not a number, or does not fit in an unsigned int");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000212 return Result;
213}
214
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000215/// Convert bits into bytes. Assert if not a byte width multiple.
216static unsigned inBytes(unsigned Bits) {
217 assert(Bits % 8 == 0 && "number of bits must be a byte width multiple");
218 return Bits / 8;
219}
220
221void DataLayout::parseSpecifier(StringRef Desc) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000222 while (!Desc.empty()) {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000223 // Split at '-'.
224 std::pair<StringRef, StringRef> Split = split(Desc, '-');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000225 Desc = Split.second;
226
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000227 // Split at ':'.
228 Split = split(Split.first, ':');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000229
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000230 // Aliases used below.
231 StringRef &Tok = Split.first; // Current token.
232 StringRef &Rest = Split.second; // The rest of the string.
Micah Villmowac34b5c2012-10-04 22:08:14 +0000233
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000234 char Specifier = Tok.front();
235 Tok = Tok.substr(1);
236
237 switch (Specifier) {
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000238 case 's':
239 // Ignored for backward compatibility.
240 // FIXME: remove this on LLVM 4.0.
241 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000242 case 'E':
Patrik Hägglund01860a62012-11-14 09:04:56 +0000243 LittleEndian = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000244 break;
245 case 'e':
Patrik Hägglund01860a62012-11-14 09:04:56 +0000246 LittleEndian = true;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000247 break;
248 case 'p': {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000249 // Address space.
250 unsigned AddrSpace = Tok.empty() ? 0 : getInt(Tok);
251 assert(AddrSpace < 1 << 24 &&
252 "Invalid address space, must be a 24bit integer");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000253
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000254 // Size.
255 Split = split(Rest, ':');
256 unsigned PointerMemSize = inBytes(getInt(Tok));
257
258 // ABI alignment.
259 Split = split(Rest, ':');
260 unsigned PointerABIAlign = inBytes(getInt(Tok));
261
262 // Preferred alignment.
263 unsigned PointerPrefAlign = PointerABIAlign;
264 if (!Rest.empty()) {
265 Split = split(Rest, ':');
266 PointerPrefAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000267 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000268
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000269 setPointerAlignment(AddrSpace, PointerABIAlign, PointerPrefAlign,
270 PointerMemSize);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000271 break;
272 }
273 case 'i':
274 case 'v':
275 case 'f':
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000276 case 'a': {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000277 AlignTypeEnum AlignType;
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000278 switch (Specifier) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000279 default:
280 case 'i': AlignType = INTEGER_ALIGN; break;
281 case 'v': AlignType = VECTOR_ALIGN; break;
282 case 'f': AlignType = FLOAT_ALIGN; break;
283 case 'a': AlignType = AGGREGATE_ALIGN; break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000284 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000285
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000286 // Bit size.
287 unsigned Size = Tok.empty() ? 0 : getInt(Tok);
288
Rafael Espindolaabdd7262014-01-06 21:40:24 +0000289 assert((AlignType != AGGREGATE_ALIGN || Size == 0) &&
290 "These specifications don't have a size");
291
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000292 // ABI alignment.
293 Split = split(Rest, ':');
294 unsigned ABIAlign = inBytes(getInt(Tok));
295
296 // Preferred alignment.
297 unsigned PrefAlign = ABIAlign;
298 if (!Rest.empty()) {
299 Split = split(Rest, ':');
300 PrefAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000301 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000302
Patrik Hägglund01860a62012-11-14 09:04:56 +0000303 setAlignment(AlignType, ABIAlign, PrefAlign, Size);
Micah Villmowb4faa152012-10-04 23:01:22 +0000304
Micah Villmowac34b5c2012-10-04 22:08:14 +0000305 break;
306 }
307 case 'n': // Native integer types.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000308 for (;;) {
309 unsigned Width = getInt(Tok);
310 assert(Width != 0 && "width must be non-zero");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000311 LegalIntWidths.push_back(Width);
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000312 if (Rest.empty())
313 break;
314 Split = split(Rest, ':');
315 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000316 break;
317 case 'S': { // Stack natural alignment.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000318 StackNaturalAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000319 break;
320 }
Rafael Espindola58873562014-01-03 19:21:54 +0000321 case 'm':
322 assert(Tok.empty());
323 assert(Rest.size() == 1);
324 switch(Rest[0]) {
325 default:
326 llvm_unreachable("Unknown mangling in datalayout string");
327 case 'e':
328 ManglingMode = MM_ELF;
329 break;
330 case 'o':
331 ManglingMode = MM_MachO;
332 break;
333 case 'm':
334 ManglingMode = MM_Mips;
335 break;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000336 case 'w':
337 ManglingMode = MM_WINCOFF;
Rafael Espindola58873562014-01-03 19:21:54 +0000338 break;
339 }
340 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000341 default:
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000342 llvm_unreachable("Unknown specifier in datalayout string");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000343 break;
344 }
345 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000346}
347
Rafael Espindola248ac132014-02-25 22:23:04 +0000348DataLayout::DataLayout(const Module *M) : LayoutMap(0) {
Rafael Espindolaf863ee22014-02-25 20:01:08 +0000349 const DataLayout *Other = M->getDataLayout();
350 if (Other)
351 *this = *Other;
352 else
Rafael Espindola248ac132014-02-25 22:23:04 +0000353 reset("");
Rafael Espindolaf863ee22014-02-25 20:01:08 +0000354}
Micah Villmowac34b5c2012-10-04 22:08:14 +0000355
Rafael Espindolaae593f12014-02-26 17:02:08 +0000356bool DataLayout::operator==(const DataLayout &Other) const {
357 bool Ret = LittleEndian == Other.LittleEndian &&
358 StackNaturalAlign == Other.StackNaturalAlign &&
359 ManglingMode == Other.ManglingMode &&
360 LegalIntWidths == Other.LegalIntWidths &&
361 Alignments == Other.Alignments && Pointers == Pointers;
362 assert(Ret == (getStringRepresentation() == Other.getStringRepresentation()));
363 return Ret;
364}
365
Micah Villmowac34b5c2012-10-04 22:08:14 +0000366void
Micah Villmowb4faa152012-10-04 23:01:22 +0000367DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000368 unsigned pref_align, uint32_t bit_width) {
369 assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
370 assert(pref_align < (1 << 16) && "Alignment doesn't fit in bitfield");
371 assert(bit_width < (1 << 24) && "Bit width doesn't fit in bitfield");
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000372 for (LayoutAlignElem &Elem : Alignments) {
373 if (Elem.AlignType == (unsigned)align_type &&
374 Elem.TypeBitWidth == bit_width) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000375 // Update the abi, preferred alignments.
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000376 Elem.ABIAlign = abi_align;
377 Elem.PrefAlign = pref_align;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000378 return;
379 }
380 }
381
Micah Villmowb4faa152012-10-04 23:01:22 +0000382 Alignments.push_back(LayoutAlignElem::get(align_type, abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000383 pref_align, bit_width));
384}
385
Rafael Espindola667fcb82014-02-26 16:58:35 +0000386DataLayout::PointersTy::iterator
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000387DataLayout::findPointerLowerBound(uint32_t AddressSpace) {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000388 return std::lower_bound(Pointers.begin(), Pointers.end(), AddressSpace,
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000389 [](const PointerAlignElem &A, uint32_t AddressSpace) {
390 return A.AddressSpace < AddressSpace;
391 });
Rafael Espindola667fcb82014-02-26 16:58:35 +0000392}
393
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000394void DataLayout::setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign,
395 unsigned PrefAlign,
396 uint32_t TypeByteWidth) {
397 assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000398 PointersTy::iterator I = findPointerLowerBound(AddrSpace);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000399 if (I == Pointers.end() || I->AddressSpace != AddrSpace) {
400 Pointers.insert(I, PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign,
401 TypeByteWidth));
Micah Villmow89021e42012-10-09 16:06:12 +0000402 } else {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000403 I->ABIAlign = ABIAlign;
404 I->PrefAlign = PrefAlign;
405 I->TypeByteWidth = TypeByteWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000406 }
407}
408
Micah Villmowac34b5c2012-10-04 22:08:14 +0000409/// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
Micah Villmowb4faa152012-10-04 23:01:22 +0000410/// preferred if ABIInfo = false) the layout wants for the specified datatype.
411unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000412 uint32_t BitWidth, bool ABIInfo,
413 Type *Ty) const {
414 // Check to see if we have an exact match and remember the best match we see.
415 int BestMatchIdx = -1;
416 int LargestInt = -1;
417 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmow6d05e692012-10-05 17:02:14 +0000418 if (Alignments[i].AlignType == (unsigned)AlignType &&
Micah Villmowac34b5c2012-10-04 22:08:14 +0000419 Alignments[i].TypeBitWidth == BitWidth)
420 return ABIInfo ? Alignments[i].ABIAlign : Alignments[i].PrefAlign;
421
422 // The best match so far depends on what we're looking for.
423 if (AlignType == INTEGER_ALIGN &&
424 Alignments[i].AlignType == INTEGER_ALIGN) {
425 // The "best match" for integers is the smallest size that is larger than
426 // the BitWidth requested.
427 if (Alignments[i].TypeBitWidth > BitWidth && (BestMatchIdx == -1 ||
Eli Benderskyfaf5e3e2013-01-30 19:24:23 +0000428 Alignments[i].TypeBitWidth < Alignments[BestMatchIdx].TypeBitWidth))
Micah Villmowac34b5c2012-10-04 22:08:14 +0000429 BestMatchIdx = i;
430 // However, if there isn't one that's larger, then we must use the
431 // largest one we have (see below)
432 if (LargestInt == -1 ||
433 Alignments[i].TypeBitWidth > Alignments[LargestInt].TypeBitWidth)
434 LargestInt = i;
435 }
436 }
437
438 // Okay, we didn't find an exact solution. Fall back here depending on what
439 // is being looked for.
440 if (BestMatchIdx == -1) {
441 // If we didn't find an integer alignment, fall back on most conservative.
442 if (AlignType == INTEGER_ALIGN) {
443 BestMatchIdx = LargestInt;
444 } else {
445 assert(AlignType == VECTOR_ALIGN && "Unknown alignment type!");
446
447 // By default, use natural alignment for vector types. This is consistent
448 // with what clang and llvm-gcc do.
449 unsigned Align = getTypeAllocSize(cast<VectorType>(Ty)->getElementType());
450 Align *= cast<VectorType>(Ty)->getNumElements();
451 // If the alignment is not a power of 2, round up to the next power of 2.
452 // This happens for non-power-of-2 length vectors.
453 if (Align & (Align-1))
454 Align = NextPowerOf2(Align);
455 return Align;
456 }
457 }
458
459 // Since we got a "best match" index, just return it.
460 return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
461 : Alignments[BestMatchIdx].PrefAlign;
462}
463
464namespace {
465
466class StructLayoutMap {
467 typedef DenseMap<StructType*, StructLayout*> LayoutInfoTy;
468 LayoutInfoTy LayoutInfo;
469
470public:
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000471 ~StructLayoutMap() {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000472 // Remove any layouts.
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000473 for (const auto &I : LayoutInfo) {
474 StructLayout *Value = I.second;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000475 Value->~StructLayout();
476 free(Value);
477 }
478 }
479
480 StructLayout *&operator[](StructType *STy) {
481 return LayoutInfo[STy];
482 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000483};
484
485} // end anonymous namespace
486
Rafael Espindola248ac132014-02-25 22:23:04 +0000487void DataLayout::clear() {
488 LegalIntWidths.clear();
489 Alignments.clear();
490 Pointers.clear();
491 delete static_cast<StructLayoutMap *>(LayoutMap);
492 LayoutMap = 0;
493}
494
Micah Villmowb4faa152012-10-04 23:01:22 +0000495DataLayout::~DataLayout() {
Rafael Espindola248ac132014-02-25 22:23:04 +0000496 clear();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000497}
498
Micah Villmowb4faa152012-10-04 23:01:22 +0000499const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000500 if (!LayoutMap)
501 LayoutMap = new StructLayoutMap();
502
503 StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
504 StructLayout *&SL = (*STM)[Ty];
505 if (SL) return SL;
506
507 // Otherwise, create the struct layout. Because it is variable length, we
508 // malloc it, then use placement new.
509 int NumElts = Ty->getNumElements();
510 StructLayout *L =
511 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t));
512
513 // Set SL before calling StructLayout's ctor. The ctor could cause other
514 // entries to be added to TheMap, invalidating our reference.
515 SL = L;
516
517 new (L) StructLayout(Ty, *this);
518
519 return L;
520}
521
Micah Villmowb4faa152012-10-04 23:01:22 +0000522std::string DataLayout::getStringRepresentation() const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000523 std::string Result;
524 raw_string_ostream OS(Result);
525
Micah Villmow89021e42012-10-09 16:06:12 +0000526 OS << (LittleEndian ? "e" : "E");
Rafael Espindola58873562014-01-03 19:21:54 +0000527
528 switch (ManglingMode) {
529 case MM_None:
530 break;
531 case MM_ELF:
532 OS << "-m:e";
533 break;
534 case MM_MachO:
535 OS << "-m:o";
536 break;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000537 case MM_WINCOFF:
538 OS << "-m:w";
Rafael Espindola58873562014-01-03 19:21:54 +0000539 break;
540 case MM_Mips:
541 OS << "-m:m";
542 break;
543 }
544
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000545 for (const PointerAlignElem &PI : Pointers) {
Rafael Espindola458a4852013-12-19 23:03:03 +0000546 // 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
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000560 for (const LayoutAlignElem &AI : Alignments) {
561 if (std::find(std::begin(DefaultAlignments), std::end(DefaultAlignments),
562 AI) != std::end(DefaultAlignments))
Rafael Espindola458a4852013-12-19 23:03:03 +0000563 continue;
564 OS << '-' << (char)AI.AlignType;
565 if (AI.TypeBitWidth)
566 OS << AI.TypeBitWidth;
567 OS << ':' << AI.ABIAlign*8;
568 if (AI.ABIAlign != AI.PrefAlign)
569 OS << ':' << AI.PrefAlign*8;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000570 }
571
572 if (!LegalIntWidths.empty()) {
573 OS << "-n" << (unsigned)LegalIntWidths[0];
574
575 for (unsigned i = 1, e = LegalIntWidths.size(); i != e; ++i)
576 OS << ':' << (unsigned)LegalIntWidths[i];
577 }
Rafael Espindola458a4852013-12-19 23:03:03 +0000578
579 if (StackNaturalAlign)
580 OS << "-S" << StackNaturalAlign*8;
581
Micah Villmowac34b5c2012-10-04 22:08:14 +0000582 return OS.str();
583}
584
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000585unsigned DataLayout::getPointerABIAlignment(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000586 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000587 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000588 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000589 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000590 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000591 return I->ABIAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000592}
593
594unsigned DataLayout::getPointerPrefAlignment(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000595 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000596 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000597 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000598 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000599 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000600 return I->PrefAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000601}
602
603unsigned DataLayout::getPointerSize(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000604 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000605 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000606 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000607 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000608 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000609 return I->TypeByteWidth;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000610}
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 {
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000720 for (unsigned LegalIntWidth : LegalIntWidths)
721 if (Width <= LegalIntWidth)
722 return Type::getIntNTy(C, LegalIntWidth);
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000723 return 0;
724}
725
Matt Arsenault899f7d22013-09-16 22:43:16 +0000726unsigned DataLayout::getLargestLegalIntTypeSize() const {
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000727 auto Max = std::max_element(LegalIntWidths.begin(), LegalIntWidths.end());
728 return Max != LegalIntWidths.end() ? *Max : 0;
Matt Arsenault899f7d22013-09-16 22:43:16 +0000729}
730
Micah Villmowb4faa152012-10-04 23:01:22 +0000731uint64_t DataLayout::getIndexedOffset(Type *ptrTy,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000732 ArrayRef<Value *> Indices) const {
733 Type *Ty = ptrTy;
734 assert(Ty->isPointerTy() && "Illegal argument for getIndexedOffset()");
735 uint64_t Result = 0;
736
737 generic_gep_type_iterator<Value* const*>
738 TI = gep_type_begin(ptrTy, Indices);
739 for (unsigned CurIDX = 0, EndIDX = Indices.size(); CurIDX != EndIDX;
740 ++CurIDX, ++TI) {
741 if (StructType *STy = dyn_cast<StructType>(*TI)) {
742 assert(Indices[CurIDX]->getType() ==
743 Type::getInt32Ty(ptrTy->getContext()) &&
744 "Illegal struct idx");
745 unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
746
747 // Get structure layout information...
748 const StructLayout *Layout = getStructLayout(STy);
749
750 // Add in the offset, as calculated by the structure layout info...
751 Result += Layout->getElementOffset(FieldNo);
752
753 // Update Ty to refer to current element
754 Ty = STy->getElementType(FieldNo);
755 } else {
756 // Update Ty to refer to current element
757 Ty = cast<SequentialType>(Ty)->getElementType();
758
759 // Get the array index and the size of each array element.
760 if (int64_t arrayIdx = cast<ConstantInt>(Indices[CurIDX])->getSExtValue())
761 Result += (uint64_t)arrayIdx * getTypeAllocSize(Ty);
762 }
763 }
764
765 return Result;
766}
767
768/// getPreferredAlignment - Return the preferred alignment of the specified
769/// global. This includes an explicitly requested alignment (if the global
770/// has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000771unsigned DataLayout::getPreferredAlignment(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000772 Type *ElemType = GV->getType()->getElementType();
773 unsigned Alignment = getPrefTypeAlignment(ElemType);
774 unsigned GVAlignment = GV->getAlignment();
775 if (GVAlignment >= Alignment) {
776 Alignment = GVAlignment;
777 } else if (GVAlignment != 0) {
778 Alignment = std::max(GVAlignment, getABITypeAlignment(ElemType));
779 }
780
781 if (GV->hasInitializer() && GVAlignment == 0) {
782 if (Alignment < 16) {
783 // If the global is not external, see if it is large. If so, give it a
784 // larger alignment.
785 if (getTypeSizeInBits(ElemType) > 128)
786 Alignment = 16; // 16-byte alignment.
787 }
788 }
789 return Alignment;
790}
791
792/// getPreferredAlignmentLog - Return the preferred alignment of the
793/// specified global, returned in log form. This includes an explicitly
794/// requested alignment (if the global has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000795unsigned DataLayout::getPreferredAlignmentLog(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000796 return Log2_32(getPreferredAlignment(GV));
797}
Rafael Espindola93512512014-02-25 17:30:31 +0000798
799DataLayoutPass::DataLayoutPass() : ImmutablePass(ID), DL("") {
800 report_fatal_error("Bad DataLayoutPass ctor used. Tool did not specify a "
801 "DataLayout to use?");
802}
803
804DataLayoutPass::~DataLayoutPass() {}
805
806DataLayoutPass::DataLayoutPass(const DataLayout &DL)
807 : ImmutablePass(ID), DL(DL) {
808 initializeDataLayoutPassPass(*PassRegistry::getPassRegistry());
809}
810
Rafael Espindola93512512014-02-25 17:30:31 +0000811DataLayoutPass::DataLayoutPass(const Module *M) : ImmutablePass(ID), DL(M) {
812 initializeDataLayoutPassPass(*PassRegistry::getPassRegistry());
813}