blob: 8230f429b05fd04a36ebf353b835d3814b0417fe [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 Villmowac34b5c2012-10-04 22:08:14 +000036//===----------------------------------------------------------------------===//
37// Support for StructLayout
38//===----------------------------------------------------------------------===//
39
Pete Cooper0ae73932015-07-27 17:15:28 +000040StructLayout::StructLayout(StructType *ST, const DataLayout &DL) {
Micah Villmowac34b5c2012-10-04 22:08:14 +000041 assert(!ST->isOpaque() && "Cannot get layout of opaque structs");
42 StructAlignment = 0;
43 StructSize = 0;
Mehdi Amini1c131b32015-12-15 01:44:07 +000044 IsPadded = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +000045 NumElements = ST->getNumElements();
46
47 // Loop over each of the elements, placing them in memory.
48 for (unsigned i = 0, e = NumElements; i != e; ++i) {
49 Type *Ty = ST->getElementType(i);
Eli Bendersky41913c72013-04-16 15:41:18 +000050 unsigned TyAlign = ST->isPacked() ? 1 : DL.getABITypeAlignment(Ty);
Micah Villmowac34b5c2012-10-04 22:08:14 +000051
52 // Add padding if necessary to align the data element properly.
Mehdi Amini1c131b32015-12-15 01:44:07 +000053 if ((StructSize & (TyAlign-1)) != 0) {
54 IsPadded = true;
Rui Ueyamada00f2f2016-01-14 21:06:47 +000055 StructSize = alignTo(StructSize, TyAlign);
Mehdi Amini1c131b32015-12-15 01:44:07 +000056 }
Micah Villmowac34b5c2012-10-04 22:08:14 +000057
58 // Keep track of maximum alignment constraint.
59 StructAlignment = std::max(TyAlign, StructAlignment);
60
61 MemberOffsets[i] = StructSize;
Eli Bendersky41913c72013-04-16 15:41:18 +000062 StructSize += DL.getTypeAllocSize(Ty); // Consume space for this data item
Micah Villmowac34b5c2012-10-04 22:08:14 +000063 }
64
65 // Empty structures have alignment of 1 byte.
66 if (StructAlignment == 0) StructAlignment = 1;
67
68 // Add padding to the end of the struct so that it could be put in an array
69 // and all array elements would be aligned correctly.
Mehdi Amini1c131b32015-12-15 01:44:07 +000070 if ((StructSize & (StructAlignment-1)) != 0) {
71 IsPadded = true;
Rui Ueyamada00f2f2016-01-14 21:06:47 +000072 StructSize = alignTo(StructSize, StructAlignment);
Mehdi Amini1c131b32015-12-15 01:44:07 +000073 }
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";
David Majnemer7db449a2015-03-17 23:54:51 +0000158 if (T.isOSWindows() && T.isOSBinFormatCOFF())
159 return T.getArch() == Triple::x86 ? "-m:x" : "-m:w";
Saleem Abdulrasoolcd130822014-04-02 20:32:05 +0000160 return "-m:e";
Rafael Espindola58873562014-01-03 19:21:54 +0000161}
162
Rafael Espindolae23b8772013-12-20 15:21:32 +0000163static const LayoutAlignElem DefaultAlignments[] = {
Rafael Espindola458a4852013-12-19 23:03:03 +0000164 { INTEGER_ALIGN, 1, 1, 1 }, // i1
165 { INTEGER_ALIGN, 8, 1, 1 }, // i8
166 { INTEGER_ALIGN, 16, 2, 2 }, // i16
167 { INTEGER_ALIGN, 32, 4, 4 }, // i32
168 { INTEGER_ALIGN, 64, 4, 8 }, // i64
169 { FLOAT_ALIGN, 16, 2, 2 }, // half
170 { FLOAT_ALIGN, 32, 4, 4 }, // float
171 { FLOAT_ALIGN, 64, 8, 8 }, // double
172 { FLOAT_ALIGN, 128, 16, 16 }, // ppcf128, quad, ...
173 { VECTOR_ALIGN, 64, 8, 8 }, // v2i32, v1i64, ...
174 { VECTOR_ALIGN, 128, 16, 16 }, // v16i8, v8i16, v4i32, ...
175 { AGGREGATE_ALIGN, 0, 0, 8 } // struct
176};
177
Rafael Espindola248ac132014-02-25 22:23:04 +0000178void DataLayout::reset(StringRef Desc) {
179 clear();
180
Craig Topperc6207612014-04-09 06:08:46 +0000181 LayoutMap = nullptr;
Chandler Carruthf67321c2014-10-20 10:41:29 +0000182 BigEndian = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000183 StackNaturalAlign = 0;
Rafael Espindola58873562014-01-03 19:21:54 +0000184 ManglingMode = MM_None;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000185
186 // Default alignments
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000187 for (const LayoutAlignElem &E : DefaultAlignments) {
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);
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000200 if (Split.second.empty() && Split.first != Str)
201 report_fatal_error("Trailing separator in datalayout string");
David Majnemer612f3122014-12-10 02:36:41 +0000202 if (!Split.second.empty() && Split.first.empty())
203 report_fatal_error("Expected token before separator in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000204 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) {
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000218 if (Bits % 8)
219 report_fatal_error("number of bits must be a byte width multiple");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000220 return Bits / 8;
221}
222
223void DataLayout::parseSpecifier(StringRef Desc) {
Mehdi Amini46a43552015-03-04 18:43:29 +0000224 StringRepresentation = Desc;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000225 while (!Desc.empty()) {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000226 // Split at '-'.
227 std::pair<StringRef, StringRef> Split = split(Desc, '-');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000228 Desc = Split.second;
229
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000230 // Split at ':'.
231 Split = split(Split.first, ':');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000232
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000233 // Aliases used below.
234 StringRef &Tok = Split.first; // Current token.
235 StringRef &Rest = Split.second; // The rest of the string.
Micah Villmowac34b5c2012-10-04 22:08:14 +0000236
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000237 char Specifier = Tok.front();
238 Tok = Tok.substr(1);
239
240 switch (Specifier) {
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000241 case 's':
242 // Ignored for backward compatibility.
243 // FIXME: remove this on LLVM 4.0.
244 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000245 case 'E':
Chandler Carruthf67321c2014-10-20 10:41:29 +0000246 BigEndian = true;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000247 break;
248 case 'e':
Chandler Carruthf67321c2014-10-20 10:41:29 +0000249 BigEndian = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000250 break;
251 case 'p': {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000252 // Address space.
253 unsigned AddrSpace = Tok.empty() ? 0 : getInt(Tok);
David Majnemer5330c692014-12-10 01:17:08 +0000254 if (!isUInt<24>(AddrSpace))
255 report_fatal_error("Invalid address space, must be a 24bit integer");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000256
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000257 // Size.
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000258 if (Rest.empty())
259 report_fatal_error(
260 "Missing size specification for pointer in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000261 Split = split(Rest, ':');
262 unsigned PointerMemSize = inBytes(getInt(Tok));
Owen Anderson5bc2bbe2015-03-02 06:00:02 +0000263 if (!PointerMemSize)
264 report_fatal_error("Invalid pointer size of 0 bytes");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000265
266 // ABI alignment.
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000267 if (Rest.empty())
268 report_fatal_error(
269 "Missing alignment specification for pointer in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000270 Split = split(Rest, ':');
271 unsigned PointerABIAlign = inBytes(getInt(Tok));
Owen Anderson040f2f82015-03-02 06:33:51 +0000272 if (!isPowerOf2_64(PointerABIAlign))
273 report_fatal_error(
274 "Pointer ABI alignment must be a power of 2");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000275
276 // Preferred alignment.
277 unsigned PointerPrefAlign = PointerABIAlign;
278 if (!Rest.empty()) {
279 Split = split(Rest, ':');
280 PointerPrefAlign = inBytes(getInt(Tok));
Owen Anderson040f2f82015-03-02 06:33:51 +0000281 if (!isPowerOf2_64(PointerPrefAlign))
282 report_fatal_error(
283 "Pointer preferred alignment must be a power of 2");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000284 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000285
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000286 setPointerAlignment(AddrSpace, PointerABIAlign, PointerPrefAlign,
287 PointerMemSize);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000288 break;
289 }
290 case 'i':
291 case 'v':
292 case 'f':
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000293 case 'a': {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000294 AlignTypeEnum AlignType;
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000295 switch (Specifier) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000296 default:
297 case 'i': AlignType = INTEGER_ALIGN; break;
298 case 'v': AlignType = VECTOR_ALIGN; break;
299 case 'f': AlignType = FLOAT_ALIGN; break;
300 case 'a': AlignType = AGGREGATE_ALIGN; break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000301 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000302
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000303 // Bit size.
304 unsigned Size = Tok.empty() ? 0 : getInt(Tok);
305
David Majnemer5330c692014-12-10 01:17:08 +0000306 if (AlignType == AGGREGATE_ALIGN && Size != 0)
307 report_fatal_error(
308 "Sized aggregate specification in datalayout string");
Rafael Espindolaabdd7262014-01-06 21:40:24 +0000309
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000310 // ABI alignment.
David Majnemer612f3122014-12-10 02:36:41 +0000311 if (Rest.empty())
312 report_fatal_error(
313 "Missing alignment specification in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000314 Split = split(Rest, ':');
315 unsigned ABIAlign = inBytes(getInt(Tok));
Owen Andersonab1c7a72015-03-02 09:34:59 +0000316 if (AlignType != AGGREGATE_ALIGN && !ABIAlign)
317 report_fatal_error(
318 "ABI alignment specification must be >0 for non-aggregate types");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000319
320 // Preferred alignment.
321 unsigned PrefAlign = ABIAlign;
322 if (!Rest.empty()) {
323 Split = split(Rest, ':');
324 PrefAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000325 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000326
Patrik Hägglund01860a62012-11-14 09:04:56 +0000327 setAlignment(AlignType, ABIAlign, PrefAlign, Size);
Micah Villmowb4faa152012-10-04 23:01:22 +0000328
Micah Villmowac34b5c2012-10-04 22:08:14 +0000329 break;
330 }
331 case 'n': // Native integer types.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000332 for (;;) {
333 unsigned Width = getInt(Tok);
David Majnemer5330c692014-12-10 01:17:08 +0000334 if (Width == 0)
335 report_fatal_error(
336 "Zero width native integer type in datalayout string");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000337 LegalIntWidths.push_back(Width);
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000338 if (Rest.empty())
339 break;
340 Split = split(Rest, ':');
341 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000342 break;
343 case 'S': { // Stack natural alignment.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000344 StackNaturalAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000345 break;
346 }
Rafael Espindola58873562014-01-03 19:21:54 +0000347 case 'm':
David Majnemer612f3122014-12-10 02:36:41 +0000348 if (!Tok.empty())
349 report_fatal_error("Unexpected trailing characters after mangling specifier in datalayout string");
350 if (Rest.empty())
351 report_fatal_error("Expected mangling specifier in datalayout string");
352 if (Rest.size() > 1)
353 report_fatal_error("Unknown mangling specifier in datalayout string");
Rafael Espindola58873562014-01-03 19:21:54 +0000354 switch(Rest[0]) {
355 default:
David Majnemer5330c692014-12-10 01:17:08 +0000356 report_fatal_error("Unknown mangling in datalayout string");
Rafael Espindola58873562014-01-03 19:21:54 +0000357 case 'e':
358 ManglingMode = MM_ELF;
359 break;
360 case 'o':
361 ManglingMode = MM_MachO;
362 break;
363 case 'm':
364 ManglingMode = MM_Mips;
365 break;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000366 case 'w':
David Majnemer7db449a2015-03-17 23:54:51 +0000367 ManglingMode = MM_WinCOFF;
368 break;
369 case 'x':
370 ManglingMode = MM_WinCOFFX86;
Rafael Espindola58873562014-01-03 19:21:54 +0000371 break;
372 }
373 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000374 default:
David Majnemer5330c692014-12-10 01:17:08 +0000375 report_fatal_error("Unknown specifier in datalayout string");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000376 break;
377 }
378 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000379}
380
Craig Topperc6207612014-04-09 06:08:46 +0000381DataLayout::DataLayout(const Module *M) : LayoutMap(nullptr) {
Rafael Espindolac435adc2014-09-10 21:27:43 +0000382 init(M);
383}
384
Mehdi Amini46a43552015-03-04 18:43:29 +0000385void DataLayout::init(const Module *M) { *this = M->getDataLayout(); }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000386
Rafael Espindolaae593f12014-02-26 17:02:08 +0000387bool DataLayout::operator==(const DataLayout &Other) const {
Chandler Carruthf67321c2014-10-20 10:41:29 +0000388 bool Ret = BigEndian == Other.BigEndian &&
Rafael Espindolaae593f12014-02-26 17:02:08 +0000389 StackNaturalAlign == Other.StackNaturalAlign &&
390 ManglingMode == Other.ManglingMode &&
391 LegalIntWidths == Other.LegalIntWidths &&
Rafael Espindola89992b02014-04-22 17:47:03 +0000392 Alignments == Other.Alignments && Pointers == Other.Pointers;
Mehdi Amini46a43552015-03-04 18:43:29 +0000393 // Note: getStringRepresentation() might differs, it is not canonicalized
Rafael Espindolaae593f12014-02-26 17:02:08 +0000394 return Ret;
395}
396
Micah Villmowac34b5c2012-10-04 22:08:14 +0000397void
Micah Villmowb4faa152012-10-04 23:01:22 +0000398DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000399 unsigned pref_align, uint32_t bit_width) {
David Majnemer1b9fc3a2015-02-16 05:41:53 +0000400 if (!isUInt<24>(bit_width))
401 report_fatal_error("Invalid bit width, must be a 24bit integer");
402 if (!isUInt<16>(abi_align))
403 report_fatal_error("Invalid ABI alignment, must be a 16bit integer");
404 if (!isUInt<16>(pref_align))
405 report_fatal_error("Invalid preferred alignment, must be a 16bit integer");
Owen Anderson5af4b212015-03-02 09:35:03 +0000406 if (abi_align != 0 && !isPowerOf2_64(abi_align))
407 report_fatal_error("Invalid ABI alignment, must be a power of 2");
408 if (pref_align != 0 && !isPowerOf2_64(pref_align))
409 report_fatal_error("Invalid preferred alignment, must be a power of 2");
David Majnemer1b9fc3a2015-02-16 05:41:53 +0000410
411 if (pref_align < abi_align)
412 report_fatal_error(
413 "Preferred alignment cannot be less than the ABI alignment");
414
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000415 for (LayoutAlignElem &Elem : Alignments) {
416 if (Elem.AlignType == (unsigned)align_type &&
417 Elem.TypeBitWidth == bit_width) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000418 // Update the abi, preferred alignments.
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000419 Elem.ABIAlign = abi_align;
420 Elem.PrefAlign = pref_align;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000421 return;
422 }
423 }
424
Micah Villmowb4faa152012-10-04 23:01:22 +0000425 Alignments.push_back(LayoutAlignElem::get(align_type, abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000426 pref_align, bit_width));
427}
428
Rafael Espindola667fcb82014-02-26 16:58:35 +0000429DataLayout::PointersTy::iterator
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000430DataLayout::findPointerLowerBound(uint32_t AddressSpace) {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000431 return std::lower_bound(Pointers.begin(), Pointers.end(), AddressSpace,
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000432 [](const PointerAlignElem &A, uint32_t AddressSpace) {
433 return A.AddressSpace < AddressSpace;
434 });
Rafael Espindola667fcb82014-02-26 16:58:35 +0000435}
436
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000437void DataLayout::setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign,
438 unsigned PrefAlign,
439 uint32_t TypeByteWidth) {
David Majnemer4b042922015-02-16 05:41:55 +0000440 if (PrefAlign < ABIAlign)
441 report_fatal_error(
442 "Preferred alignment cannot be less than the ABI alignment");
443
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000444 PointersTy::iterator I = findPointerLowerBound(AddrSpace);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000445 if (I == Pointers.end() || I->AddressSpace != AddrSpace) {
446 Pointers.insert(I, PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign,
447 TypeByteWidth));
Micah Villmow89021e42012-10-09 16:06:12 +0000448 } else {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000449 I->ABIAlign = ABIAlign;
450 I->PrefAlign = PrefAlign;
451 I->TypeByteWidth = TypeByteWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000452 }
453}
454
Micah Villmowac34b5c2012-10-04 22:08:14 +0000455/// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
Micah Villmowb4faa152012-10-04 23:01:22 +0000456/// preferred if ABIInfo = false) the layout wants for the specified datatype.
457unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000458 uint32_t BitWidth, bool ABIInfo,
Pete Cooper0ae73932015-07-27 17:15:28 +0000459 Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000460 // Check to see if we have an exact match and remember the best match we see.
461 int BestMatchIdx = -1;
462 int LargestInt = -1;
463 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmow6d05e692012-10-05 17:02:14 +0000464 if (Alignments[i].AlignType == (unsigned)AlignType &&
Micah Villmowac34b5c2012-10-04 22:08:14 +0000465 Alignments[i].TypeBitWidth == BitWidth)
466 return ABIInfo ? Alignments[i].ABIAlign : Alignments[i].PrefAlign;
467
468 // The best match so far depends on what we're looking for.
Sanjay Patel42af5c62015-07-21 16:09:58 +0000469 if (AlignType == INTEGER_ALIGN &&
470 Alignments[i].AlignType == INTEGER_ALIGN) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000471 // The "best match" for integers is the smallest size that is larger than
472 // the BitWidth requested.
473 if (Alignments[i].TypeBitWidth > BitWidth && (BestMatchIdx == -1 ||
Eli Benderskyfaf5e3e2013-01-30 19:24:23 +0000474 Alignments[i].TypeBitWidth < Alignments[BestMatchIdx].TypeBitWidth))
Micah Villmowac34b5c2012-10-04 22:08:14 +0000475 BestMatchIdx = i;
476 // However, if there isn't one that's larger, then we must use the
477 // largest one we have (see below)
478 if (LargestInt == -1 ||
479 Alignments[i].TypeBitWidth > Alignments[LargestInt].TypeBitWidth)
480 LargestInt = i;
481 }
482 }
483
484 // Okay, we didn't find an exact solution. Fall back here depending on what
485 // is being looked for.
486 if (BestMatchIdx == -1) {
487 // If we didn't find an integer alignment, fall back on most conservative.
488 if (AlignType == INTEGER_ALIGN) {
489 BestMatchIdx = LargestInt;
Owen Anderson7e621e92015-03-08 21:53:59 +0000490 } else if (AlignType == VECTOR_ALIGN) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000491 // By default, use natural alignment for vector types. This is consistent
492 // with what clang and llvm-gcc do.
493 unsigned Align = getTypeAllocSize(cast<VectorType>(Ty)->getElementType());
494 Align *= cast<VectorType>(Ty)->getNumElements();
495 // If the alignment is not a power of 2, round up to the next power of 2.
496 // This happens for non-power-of-2 length vectors.
497 if (Align & (Align-1))
498 Align = NextPowerOf2(Align);
499 return Align;
500 }
501 }
502
Owen Anderson7e621e92015-03-08 21:53:59 +0000503 // If we still couldn't find a reasonable default alignment, fall back
504 // to a simple heuristic that the alignment is the first power of two
505 // greater-or-equal to the store size of the type. This is a reasonable
506 // approximation of reality, and if the user wanted something less
507 // less conservative, they should have specified it explicitly in the data
508 // layout.
509 if (BestMatchIdx == -1) {
510 unsigned Align = getTypeStoreSize(Ty);
511 if (Align & (Align-1))
512 Align = NextPowerOf2(Align);
513 return Align;
514 }
515
Micah Villmowac34b5c2012-10-04 22:08:14 +0000516 // Since we got a "best match" index, just return it.
517 return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
518 : Alignments[BestMatchIdx].PrefAlign;
519}
520
521namespace {
522
523class StructLayoutMap {
Pete Cooper0ae73932015-07-27 17:15:28 +0000524 typedef DenseMap<StructType*, StructLayout*> LayoutInfoTy;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000525 LayoutInfoTy LayoutInfo;
526
527public:
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000528 ~StructLayoutMap() {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000529 // Remove any layouts.
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000530 for (const auto &I : LayoutInfo) {
531 StructLayout *Value = I.second;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000532 Value->~StructLayout();
533 free(Value);
534 }
535 }
536
Pete Cooper0ae73932015-07-27 17:15:28 +0000537 StructLayout *&operator[](StructType *STy) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000538 return LayoutInfo[STy];
539 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000540};
541
542} // end anonymous namespace
543
Rafael Espindola248ac132014-02-25 22:23:04 +0000544void DataLayout::clear() {
545 LegalIntWidths.clear();
546 Alignments.clear();
547 Pointers.clear();
548 delete static_cast<StructLayoutMap *>(LayoutMap);
Craig Topperc6207612014-04-09 06:08:46 +0000549 LayoutMap = nullptr;
Rafael Espindola248ac132014-02-25 22:23:04 +0000550}
551
Micah Villmowb4faa152012-10-04 23:01:22 +0000552DataLayout::~DataLayout() {
Rafael Espindola248ac132014-02-25 22:23:04 +0000553 clear();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000554}
555
Pete Cooper0ae73932015-07-27 17:15:28 +0000556const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000557 if (!LayoutMap)
558 LayoutMap = new StructLayoutMap();
559
560 StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
561 StructLayout *&SL = (*STM)[Ty];
562 if (SL) return SL;
563
564 // Otherwise, create the struct layout. Because it is variable length, we
565 // malloc it, then use placement new.
566 int NumElts = Ty->getNumElements();
567 StructLayout *L =
568 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t));
569
570 // Set SL before calling StructLayout's ctor. The ctor could cause other
571 // entries to be added to TheMap, invalidating our reference.
572 SL = L;
573
574 new (L) StructLayout(Ty, *this);
575
576 return L;
577}
578
Micah Villmowac34b5c2012-10-04 22:08:14 +0000579
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000580unsigned DataLayout::getPointerABIAlignment(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000581 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000582 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000583 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000584 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000585 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000586 return I->ABIAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000587}
588
589unsigned DataLayout::getPointerPrefAlignment(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000590 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000591 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000592 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000593 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000594 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000595 return I->PrefAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000596}
597
598unsigned DataLayout::getPointerSize(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000599 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000600 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000601 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000602 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000603 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000604 return I->TypeByteWidth;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000605}
606
Pete Cooper0ae73932015-07-27 17:15:28 +0000607unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {
Matt Arsenault6f4be902013-07-26 17:37:20 +0000608 assert(Ty->isPtrOrPtrVectorTy() &&
609 "This should only be called with a pointer or pointer vector type");
610
611 if (Ty->isPointerTy())
612 return getTypeSizeInBits(Ty);
613
Matt Arsenault517cf482013-07-27 19:22:28 +0000614 return getTypeSizeInBits(Ty->getScalarType());
Matt Arsenault6f4be902013-07-26 17:37:20 +0000615}
Micah Villmowac34b5c2012-10-04 22:08:14 +0000616
Micah Villmowac34b5c2012-10-04 22:08:14 +0000617/*!
618 \param abi_or_pref Flag that determines which alignment is returned. true
619 returns the ABI alignment, false returns the preferred alignment.
620 \param Ty The underlying type for which alignment is determined.
621
622 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
623 == false) for the requested type \a Ty.
624 */
Pete Cooper0ae73932015-07-27 17:15:28 +0000625unsigned DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000626 int AlignType = -1;
627
628 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
629 switch (Ty->getTypeID()) {
630 // Early escape for the non-numeric types.
631 case Type::LabelTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000632 return (abi_or_pref
Micah Villmow89021e42012-10-09 16:06:12 +0000633 ? getPointerABIAlignment(0)
634 : getPointerPrefAlignment(0));
635 case Type::PointerTyID: {
Matt Arsenaultc1728972014-09-18 22:28:56 +0000636 unsigned AS = cast<PointerType>(Ty)->getAddressSpace();
Micah Villmow89021e42012-10-09 16:06:12 +0000637 return (abi_or_pref
638 ? getPointerABIAlignment(AS)
639 : getPointerPrefAlignment(AS));
640 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000641 case Type::ArrayTyID:
642 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
643
644 case Type::StructTyID: {
645 // Packed structure types always have an ABI alignment of one.
646 if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
647 return 1;
648
649 // Get the layout annotation... which is lazily created on demand.
650 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
651 unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty);
652 return std::max(Align, Layout->getAlignment());
653 }
654 case Type::IntegerTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000655 AlignType = INTEGER_ALIGN;
656 break;
657 case Type::HalfTyID:
658 case Type::FloatTyID:
659 case Type::DoubleTyID:
660 // PPC_FP128TyID and FP128TyID have different data contents, but the
661 // same size and alignment, so they look the same here.
662 case Type::PPC_FP128TyID:
663 case Type::FP128TyID:
664 case Type::X86_FP80TyID:
665 AlignType = FLOAT_ALIGN;
666 break;
667 case Type::X86_MMXTyID:
668 case Type::VectorTyID:
669 AlignType = VECTOR_ALIGN;
670 break;
671 default:
672 llvm_unreachable("Bad type for getAlignment!!!");
673 }
674
675 return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSizeInBits(Ty),
676 abi_or_pref, Ty);
677}
678
Pete Cooper0ae73932015-07-27 17:15:28 +0000679unsigned DataLayout::getABITypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000680 return getAlignment(Ty, true);
681}
682
683/// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
684/// an integer type of the specified bitwidth.
Micah Villmowb4faa152012-10-04 23:01:22 +0000685unsigned DataLayout::getABIIntegerTypeAlignment(unsigned BitWidth) const {
Craig Topperc6207612014-04-09 06:08:46 +0000686 return getAlignmentInfo(INTEGER_ALIGN, BitWidth, true, nullptr);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000687}
688
Pete Cooper0ae73932015-07-27 17:15:28 +0000689unsigned DataLayout::getPrefTypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000690 return getAlignment(Ty, false);
691}
692
Pete Cooper0ae73932015-07-27 17:15:28 +0000693unsigned DataLayout::getPreferredTypeAlignmentShift(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000694 unsigned Align = getPrefTypeAlignment(Ty);
695 assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
696 return Log2_32(Align);
697}
698
Micah Villmow89021e42012-10-09 16:06:12 +0000699IntegerType *DataLayout::getIntPtrType(LLVMContext &C,
700 unsigned AddressSpace) const {
701 return IntegerType::get(C, getPointerSizeInBits(AddressSpace));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000702}
703
Pete Cooper0ae73932015-07-27 17:15:28 +0000704Type *DataLayout::getIntPtrType(Type *Ty) const {
Chandler Carruth7ec50852012-11-01 08:07:29 +0000705 assert(Ty->isPtrOrPtrVectorTy() &&
706 "Expected a pointer or pointer vector type.");
Matt Arsenault4dbd4892014-04-23 21:10:15 +0000707 unsigned NumBits = getPointerTypeSizeInBits(Ty);
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000708 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
Pete Cooper0ae73932015-07-27 17:15:28 +0000709 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000710 return VectorType::get(IntTy, VecTy->getNumElements());
711 return IntTy;
Micah Villmow12d91272012-10-24 15:52:52 +0000712}
713
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000714Type *DataLayout::getSmallestLegalIntType(LLVMContext &C, unsigned Width) const {
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000715 for (unsigned LegalIntWidth : LegalIntWidths)
716 if (Width <= LegalIntWidth)
717 return Type::getIntNTy(C, LegalIntWidth);
Craig Topperc6207612014-04-09 06:08:46 +0000718 return nullptr;
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000719}
720
Matt Arsenault899f7d22013-09-16 22:43:16 +0000721unsigned DataLayout::getLargestLegalIntTypeSize() const {
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000722 auto Max = std::max_element(LegalIntWidths.begin(), LegalIntWidths.end());
723 return Max != LegalIntWidths.end() ? *Max : 0;
Matt Arsenault899f7d22013-09-16 22:43:16 +0000724}
725
Micah Villmowb4faa152012-10-04 23:01:22 +0000726uint64_t DataLayout::getIndexedOffset(Type *ptrTy,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000727 ArrayRef<Value *> Indices) const {
Pete Cooper0ae73932015-07-27 17:15:28 +0000728 Type *Ty = ptrTy;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000729 assert(Ty->isPointerTy() && "Illegal argument for getIndexedOffset()");
730 uint64_t Result = 0;
731
732 generic_gep_type_iterator<Value* const*>
733 TI = gep_type_begin(ptrTy, Indices);
734 for (unsigned CurIDX = 0, EndIDX = Indices.size(); CurIDX != EndIDX;
735 ++CurIDX, ++TI) {
736 if (StructType *STy = dyn_cast<StructType>(*TI)) {
737 assert(Indices[CurIDX]->getType() ==
738 Type::getInt32Ty(ptrTy->getContext()) &&
739 "Illegal struct idx");
740 unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
741
742 // Get structure layout information...
743 const StructLayout *Layout = getStructLayout(STy);
744
745 // Add in the offset, as calculated by the structure layout info...
746 Result += Layout->getElementOffset(FieldNo);
747
748 // Update Ty to refer to current element
749 Ty = STy->getElementType(FieldNo);
750 } else {
751 // Update Ty to refer to current element
752 Ty = cast<SequentialType>(Ty)->getElementType();
753
754 // Get the array index and the size of each array element.
755 if (int64_t arrayIdx = cast<ConstantInt>(Indices[CurIDX])->getSExtValue())
756 Result += (uint64_t)arrayIdx * getTypeAllocSize(Ty);
757 }
758 }
759
760 return Result;
761}
762
763/// getPreferredAlignment - Return the preferred alignment of the specified
764/// global. This includes an explicitly requested alignment (if the global
765/// has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000766unsigned DataLayout::getPreferredAlignment(const GlobalVariable *GV) const {
Manuel Jacob5f6eaac2016-01-16 20:30:46 +0000767 Type *ElemType = GV->getValueType();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000768 unsigned Alignment = getPrefTypeAlignment(ElemType);
769 unsigned GVAlignment = GV->getAlignment();
770 if (GVAlignment >= Alignment) {
771 Alignment = GVAlignment;
772 } else if (GVAlignment != 0) {
773 Alignment = std::max(GVAlignment, getABITypeAlignment(ElemType));
774 }
775
776 if (GV->hasInitializer() && GVAlignment == 0) {
777 if (Alignment < 16) {
778 // If the global is not external, see if it is large. If so, give it a
779 // larger alignment.
780 if (getTypeSizeInBits(ElemType) > 128)
781 Alignment = 16; // 16-byte alignment.
782 }
783 }
784 return Alignment;
785}
786
787/// getPreferredAlignmentLog - Return the preferred alignment of the
788/// specified global, returned in log form. This includes an explicitly
789/// requested alignment (if the global has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000790unsigned DataLayout::getPreferredAlignmentLog(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000791 return Log2_32(getPreferredAlignment(GV));
792}
Rafael Espindola93512512014-02-25 17:30:31 +0000793