blob: 23b2de8df2b8f527b6b58e74f549149845b56a3d [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 Villmow89021e42012-10-09 16:06:12 +0000121//===----------------------------------------------------------------------===//
122// PointerAlignElem, PointerAlign support
123//===----------------------------------------------------------------------===//
124
125PointerAlignElem
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000126PointerAlignElem::get(uint32_t AddressSpace, unsigned ABIAlign,
127 unsigned PrefAlign, uint32_t TypeByteWidth) {
128 assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
Micah Villmow89021e42012-10-09 16:06:12 +0000129 PointerAlignElem retval;
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000130 retval.AddressSpace = AddressSpace;
131 retval.ABIAlign = ABIAlign;
132 retval.PrefAlign = PrefAlign;
133 retval.TypeByteWidth = TypeByteWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000134 return retval;
135}
136
137bool
138PointerAlignElem::operator==(const PointerAlignElem &rhs) const {
139 return (ABIAlign == rhs.ABIAlign
140 && AddressSpace == rhs.AddressSpace
141 && PrefAlign == rhs.PrefAlign
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000142 && TypeByteWidth == rhs.TypeByteWidth);
Micah Villmow89021e42012-10-09 16:06:12 +0000143}
144
Micah Villmowac34b5c2012-10-04 22:08:14 +0000145//===----------------------------------------------------------------------===//
Micah Villmowb4faa152012-10-04 23:01:22 +0000146// DataLayout Class Implementation
Micah Villmowac34b5c2012-10-04 22:08:14 +0000147//===----------------------------------------------------------------------===//
148
Rafael Espindola58873562014-01-03 19:21:54 +0000149const char *DataLayout::getManglingComponent(const Triple &T) {
150 if (T.isOSBinFormatMachO())
151 return "-m:o";
David Majnemer7db449a2015-03-17 23:54:51 +0000152 if (T.isOSWindows() && T.isOSBinFormatCOFF())
153 return T.getArch() == Triple::x86 ? "-m:x" : "-m:w";
Saleem Abdulrasoolcd130822014-04-02 20:32:05 +0000154 return "-m:e";
Rafael Espindola58873562014-01-03 19:21:54 +0000155}
156
Rafael Espindolae23b8772013-12-20 15:21:32 +0000157static const LayoutAlignElem DefaultAlignments[] = {
Rafael Espindola458a4852013-12-19 23:03:03 +0000158 { INTEGER_ALIGN, 1, 1, 1 }, // i1
159 { INTEGER_ALIGN, 8, 1, 1 }, // i8
160 { INTEGER_ALIGN, 16, 2, 2 }, // i16
161 { INTEGER_ALIGN, 32, 4, 4 }, // i32
162 { INTEGER_ALIGN, 64, 4, 8 }, // i64
163 { FLOAT_ALIGN, 16, 2, 2 }, // half
164 { FLOAT_ALIGN, 32, 4, 4 }, // float
165 { FLOAT_ALIGN, 64, 8, 8 }, // double
166 { FLOAT_ALIGN, 128, 16, 16 }, // ppcf128, quad, ...
167 { VECTOR_ALIGN, 64, 8, 8 }, // v2i32, v1i64, ...
168 { VECTOR_ALIGN, 128, 16, 16 }, // v16i8, v8i16, v4i32, ...
169 { AGGREGATE_ALIGN, 0, 0, 8 } // struct
170};
171
Rafael Espindola248ac132014-02-25 22:23:04 +0000172void DataLayout::reset(StringRef Desc) {
173 clear();
174
Craig Topperc6207612014-04-09 06:08:46 +0000175 LayoutMap = nullptr;
Chandler Carruthf67321c2014-10-20 10:41:29 +0000176 BigEndian = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000177 StackNaturalAlign = 0;
Rafael Espindola58873562014-01-03 19:21:54 +0000178 ManglingMode = MM_None;
Sanjoy Dasc6af5ea2016-07-28 23:43:38 +0000179 NonIntegralAddressSpaces.clear();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000180
181 // Default alignments
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000182 for (const LayoutAlignElem &E : DefaultAlignments) {
Rafael Espindola458a4852013-12-19 23:03:03 +0000183 setAlignment((AlignTypeEnum)E.AlignType, E.ABIAlign, E.PrefAlign,
184 E.TypeBitWidth);
185 }
Micah Villmow89021e42012-10-09 16:06:12 +0000186 setPointerAlignment(0, 8, 8, 8);
Patrik Hägglund01860a62012-11-14 09:04:56 +0000187
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000188 parseSpecifier(Desc);
189}
190
191/// Checked version of split, to ensure mandatory subparts.
192static std::pair<StringRef, StringRef> split(StringRef Str, char Separator) {
193 assert(!Str.empty() && "parse error, string can't be empty here");
194 std::pair<StringRef, StringRef> Split = Str.split(Separator);
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000195 if (Split.second.empty() && Split.first != Str)
196 report_fatal_error("Trailing separator in datalayout string");
David Majnemer612f3122014-12-10 02:36:41 +0000197 if (!Split.second.empty() && Split.first.empty())
198 report_fatal_error("Expected token before separator in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000199 return Split;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000200}
201
Cameron McInally8af9eac2014-01-07 19:51:38 +0000202/// Get an unsigned integer, including error checks.
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000203static unsigned getInt(StringRef R) {
Cameron McInallyf0379fa2014-01-13 22:04:55 +0000204 unsigned Result;
Patrik Hägglund504f4782012-11-28 14:32:52 +0000205 bool error = R.getAsInteger(10, Result); (void)error;
Cameron McInallyf0379fa2014-01-13 22:04:55 +0000206 if (error)
207 report_fatal_error("not a number, or does not fit in an unsigned int");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000208 return Result;
209}
210
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000211/// Convert bits into bytes. Assert if not a byte width multiple.
212static unsigned inBytes(unsigned Bits) {
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000213 if (Bits % 8)
214 report_fatal_error("number of bits must be a byte width multiple");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000215 return Bits / 8;
216}
217
218void DataLayout::parseSpecifier(StringRef Desc) {
Mehdi Amini46a43552015-03-04 18:43:29 +0000219 StringRepresentation = Desc;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000220 while (!Desc.empty()) {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000221 // Split at '-'.
222 std::pair<StringRef, StringRef> Split = split(Desc, '-');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000223 Desc = Split.second;
224
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000225 // Split at ':'.
226 Split = split(Split.first, ':');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000227
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000228 // Aliases used below.
229 StringRef &Tok = Split.first; // Current token.
230 StringRef &Rest = Split.second; // The rest of the string.
Micah Villmowac34b5c2012-10-04 22:08:14 +0000231
Sanjoy Dasc6af5ea2016-07-28 23:43:38 +0000232 if (Tok == "ni") {
233 do {
234 Split = split(Rest, ':');
235 Rest = Split.second;
236 unsigned AS = getInt(Split.first);
237 if (AS == 0)
238 report_fatal_error("Address space 0 can never be non-integral");
239 NonIntegralAddressSpaces.push_back(AS);
240 } while (!Rest.empty());
241
242 continue;
243 }
244
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000245 char Specifier = Tok.front();
246 Tok = Tok.substr(1);
247
248 switch (Specifier) {
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000249 case 's':
250 // Ignored for backward compatibility.
251 // FIXME: remove this on LLVM 4.0.
252 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000253 case 'E':
Chandler Carruthf67321c2014-10-20 10:41:29 +0000254 BigEndian = true;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000255 break;
256 case 'e':
Chandler Carruthf67321c2014-10-20 10:41:29 +0000257 BigEndian = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000258 break;
259 case 'p': {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000260 // Address space.
261 unsigned AddrSpace = Tok.empty() ? 0 : getInt(Tok);
David Majnemer5330c692014-12-10 01:17:08 +0000262 if (!isUInt<24>(AddrSpace))
263 report_fatal_error("Invalid address space, must be a 24bit integer");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000264
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000265 // Size.
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000266 if (Rest.empty())
267 report_fatal_error(
268 "Missing size specification for pointer in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000269 Split = split(Rest, ':');
270 unsigned PointerMemSize = inBytes(getInt(Tok));
Owen Anderson5bc2bbe2015-03-02 06:00:02 +0000271 if (!PointerMemSize)
272 report_fatal_error("Invalid pointer size of 0 bytes");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000273
274 // ABI alignment.
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000275 if (Rest.empty())
276 report_fatal_error(
277 "Missing alignment specification for pointer in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000278 Split = split(Rest, ':');
279 unsigned PointerABIAlign = inBytes(getInt(Tok));
Owen Anderson040f2f82015-03-02 06:33:51 +0000280 if (!isPowerOf2_64(PointerABIAlign))
281 report_fatal_error(
282 "Pointer ABI alignment must be a power of 2");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000283
284 // Preferred alignment.
285 unsigned PointerPrefAlign = PointerABIAlign;
286 if (!Rest.empty()) {
287 Split = split(Rest, ':');
288 PointerPrefAlign = inBytes(getInt(Tok));
Owen Anderson040f2f82015-03-02 06:33:51 +0000289 if (!isPowerOf2_64(PointerPrefAlign))
290 report_fatal_error(
291 "Pointer preferred alignment must be a power of 2");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000292 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000293
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000294 setPointerAlignment(AddrSpace, PointerABIAlign, PointerPrefAlign,
295 PointerMemSize);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000296 break;
297 }
298 case 'i':
299 case 'v':
300 case 'f':
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000301 case 'a': {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000302 AlignTypeEnum AlignType;
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000303 switch (Specifier) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000304 default:
305 case 'i': AlignType = INTEGER_ALIGN; break;
306 case 'v': AlignType = VECTOR_ALIGN; break;
307 case 'f': AlignType = FLOAT_ALIGN; break;
308 case 'a': AlignType = AGGREGATE_ALIGN; break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000309 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000310
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000311 // Bit size.
312 unsigned Size = Tok.empty() ? 0 : getInt(Tok);
313
David Majnemer5330c692014-12-10 01:17:08 +0000314 if (AlignType == AGGREGATE_ALIGN && Size != 0)
315 report_fatal_error(
316 "Sized aggregate specification in datalayout string");
Rafael Espindolaabdd7262014-01-06 21:40:24 +0000317
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000318 // ABI alignment.
David Majnemer612f3122014-12-10 02:36:41 +0000319 if (Rest.empty())
320 report_fatal_error(
321 "Missing alignment specification in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000322 Split = split(Rest, ':');
323 unsigned ABIAlign = inBytes(getInt(Tok));
Owen Andersonab1c7a72015-03-02 09:34:59 +0000324 if (AlignType != AGGREGATE_ALIGN && !ABIAlign)
325 report_fatal_error(
326 "ABI alignment specification must be >0 for non-aggregate types");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000327
328 // Preferred alignment.
329 unsigned PrefAlign = ABIAlign;
330 if (!Rest.empty()) {
331 Split = split(Rest, ':');
332 PrefAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000333 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000334
Patrik Hägglund01860a62012-11-14 09:04:56 +0000335 setAlignment(AlignType, ABIAlign, PrefAlign, Size);
Micah Villmowb4faa152012-10-04 23:01:22 +0000336
Micah Villmowac34b5c2012-10-04 22:08:14 +0000337 break;
338 }
339 case 'n': // Native integer types.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000340 for (;;) {
341 unsigned Width = getInt(Tok);
David Majnemer5330c692014-12-10 01:17:08 +0000342 if (Width == 0)
343 report_fatal_error(
344 "Zero width native integer type in datalayout string");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000345 LegalIntWidths.push_back(Width);
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000346 if (Rest.empty())
347 break;
348 Split = split(Rest, ':');
349 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000350 break;
351 case 'S': { // Stack natural alignment.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000352 StackNaturalAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000353 break;
354 }
Rafael Espindola58873562014-01-03 19:21:54 +0000355 case 'm':
David Majnemer612f3122014-12-10 02:36:41 +0000356 if (!Tok.empty())
357 report_fatal_error("Unexpected trailing characters after mangling specifier in datalayout string");
358 if (Rest.empty())
359 report_fatal_error("Expected mangling specifier in datalayout string");
360 if (Rest.size() > 1)
361 report_fatal_error("Unknown mangling specifier in datalayout string");
Rafael Espindola58873562014-01-03 19:21:54 +0000362 switch(Rest[0]) {
363 default:
David Majnemer5330c692014-12-10 01:17:08 +0000364 report_fatal_error("Unknown mangling in datalayout string");
Rafael Espindola58873562014-01-03 19:21:54 +0000365 case 'e':
366 ManglingMode = MM_ELF;
367 break;
368 case 'o':
369 ManglingMode = MM_MachO;
370 break;
371 case 'm':
372 ManglingMode = MM_Mips;
373 break;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000374 case 'w':
David Majnemer7db449a2015-03-17 23:54:51 +0000375 ManglingMode = MM_WinCOFF;
376 break;
377 case 'x':
378 ManglingMode = MM_WinCOFFX86;
Rafael Espindola58873562014-01-03 19:21:54 +0000379 break;
380 }
381 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000382 default:
David Majnemer5330c692014-12-10 01:17:08 +0000383 report_fatal_error("Unknown specifier in datalayout string");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000384 break;
385 }
386 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000387}
388
Craig Topperc6207612014-04-09 06:08:46 +0000389DataLayout::DataLayout(const Module *M) : LayoutMap(nullptr) {
Rafael Espindolac435adc2014-09-10 21:27:43 +0000390 init(M);
391}
392
Mehdi Amini46a43552015-03-04 18:43:29 +0000393void DataLayout::init(const Module *M) { *this = M->getDataLayout(); }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000394
Rafael Espindolaae593f12014-02-26 17:02:08 +0000395bool DataLayout::operator==(const DataLayout &Other) const {
Chandler Carruthf67321c2014-10-20 10:41:29 +0000396 bool Ret = BigEndian == Other.BigEndian &&
Rafael Espindolaae593f12014-02-26 17:02:08 +0000397 StackNaturalAlign == Other.StackNaturalAlign &&
398 ManglingMode == Other.ManglingMode &&
399 LegalIntWidths == Other.LegalIntWidths &&
Rafael Espindola89992b02014-04-22 17:47:03 +0000400 Alignments == Other.Alignments && Pointers == Other.Pointers;
Mehdi Amini46a43552015-03-04 18:43:29 +0000401 // Note: getStringRepresentation() might differs, it is not canonicalized
Rafael Espindolaae593f12014-02-26 17:02:08 +0000402 return Ret;
403}
404
Micah Villmowac34b5c2012-10-04 22:08:14 +0000405void
Micah Villmowb4faa152012-10-04 23:01:22 +0000406DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000407 unsigned pref_align, uint32_t bit_width) {
David Majnemer1b9fc3a2015-02-16 05:41:53 +0000408 if (!isUInt<24>(bit_width))
409 report_fatal_error("Invalid bit width, must be a 24bit integer");
410 if (!isUInt<16>(abi_align))
411 report_fatal_error("Invalid ABI alignment, must be a 16bit integer");
412 if (!isUInt<16>(pref_align))
413 report_fatal_error("Invalid preferred alignment, must be a 16bit integer");
Owen Anderson5af4b212015-03-02 09:35:03 +0000414 if (abi_align != 0 && !isPowerOf2_64(abi_align))
415 report_fatal_error("Invalid ABI alignment, must be a power of 2");
416 if (pref_align != 0 && !isPowerOf2_64(pref_align))
417 report_fatal_error("Invalid preferred alignment, must be a power of 2");
David Majnemer1b9fc3a2015-02-16 05:41:53 +0000418
419 if (pref_align < abi_align)
420 report_fatal_error(
421 "Preferred alignment cannot be less than the ABI alignment");
422
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000423 for (LayoutAlignElem &Elem : Alignments) {
424 if (Elem.AlignType == (unsigned)align_type &&
425 Elem.TypeBitWidth == bit_width) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000426 // Update the abi, preferred alignments.
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000427 Elem.ABIAlign = abi_align;
428 Elem.PrefAlign = pref_align;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000429 return;
430 }
431 }
432
Micah Villmowb4faa152012-10-04 23:01:22 +0000433 Alignments.push_back(LayoutAlignElem::get(align_type, abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000434 pref_align, bit_width));
435}
436
Rafael Espindola667fcb82014-02-26 16:58:35 +0000437DataLayout::PointersTy::iterator
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000438DataLayout::findPointerLowerBound(uint32_t AddressSpace) {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000439 return std::lower_bound(Pointers.begin(), Pointers.end(), AddressSpace,
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000440 [](const PointerAlignElem &A, uint32_t AddressSpace) {
441 return A.AddressSpace < AddressSpace;
442 });
Rafael Espindola667fcb82014-02-26 16:58:35 +0000443}
444
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000445void DataLayout::setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign,
446 unsigned PrefAlign,
447 uint32_t TypeByteWidth) {
David Majnemer4b042922015-02-16 05:41:55 +0000448 if (PrefAlign < ABIAlign)
449 report_fatal_error(
450 "Preferred alignment cannot be less than the ABI alignment");
451
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000452 PointersTy::iterator I = findPointerLowerBound(AddrSpace);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000453 if (I == Pointers.end() || I->AddressSpace != AddrSpace) {
454 Pointers.insert(I, PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign,
455 TypeByteWidth));
Micah Villmow89021e42012-10-09 16:06:12 +0000456 } else {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000457 I->ABIAlign = ABIAlign;
458 I->PrefAlign = PrefAlign;
459 I->TypeByteWidth = TypeByteWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000460 }
461}
462
Micah Villmowac34b5c2012-10-04 22:08:14 +0000463/// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
Micah Villmowb4faa152012-10-04 23:01:22 +0000464/// preferred if ABIInfo = false) the layout wants for the specified datatype.
465unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000466 uint32_t BitWidth, bool ABIInfo,
Pete Cooper0ae73932015-07-27 17:15:28 +0000467 Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000468 // Check to see if we have an exact match and remember the best match we see.
469 int BestMatchIdx = -1;
470 int LargestInt = -1;
471 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmow6d05e692012-10-05 17:02:14 +0000472 if (Alignments[i].AlignType == (unsigned)AlignType &&
Micah Villmowac34b5c2012-10-04 22:08:14 +0000473 Alignments[i].TypeBitWidth == BitWidth)
474 return ABIInfo ? Alignments[i].ABIAlign : Alignments[i].PrefAlign;
475
476 // The best match so far depends on what we're looking for.
Sanjay Patel42af5c62015-07-21 16:09:58 +0000477 if (AlignType == INTEGER_ALIGN &&
478 Alignments[i].AlignType == INTEGER_ALIGN) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000479 // The "best match" for integers is the smallest size that is larger than
480 // the BitWidth requested.
481 if (Alignments[i].TypeBitWidth > BitWidth && (BestMatchIdx == -1 ||
Eli Benderskyfaf5e3e2013-01-30 19:24:23 +0000482 Alignments[i].TypeBitWidth < Alignments[BestMatchIdx].TypeBitWidth))
Micah Villmowac34b5c2012-10-04 22:08:14 +0000483 BestMatchIdx = i;
484 // However, if there isn't one that's larger, then we must use the
485 // largest one we have (see below)
486 if (LargestInt == -1 ||
487 Alignments[i].TypeBitWidth > Alignments[LargestInt].TypeBitWidth)
488 LargestInt = i;
489 }
490 }
491
492 // Okay, we didn't find an exact solution. Fall back here depending on what
493 // is being looked for.
494 if (BestMatchIdx == -1) {
495 // If we didn't find an integer alignment, fall back on most conservative.
496 if (AlignType == INTEGER_ALIGN) {
497 BestMatchIdx = LargestInt;
Owen Anderson7e621e92015-03-08 21:53:59 +0000498 } else if (AlignType == VECTOR_ALIGN) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000499 // By default, use natural alignment for vector types. This is consistent
500 // with what clang and llvm-gcc do.
501 unsigned Align = getTypeAllocSize(cast<VectorType>(Ty)->getElementType());
502 Align *= cast<VectorType>(Ty)->getNumElements();
Davide Italiano5e327342016-11-11 03:00:00 +0000503 Align = PowerOf2Ceil(Align);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000504 return Align;
505 }
506 }
507
Owen Anderson7e621e92015-03-08 21:53:59 +0000508 // If we still couldn't find a reasonable default alignment, fall back
509 // to a simple heuristic that the alignment is the first power of two
510 // greater-or-equal to the store size of the type. This is a reasonable
511 // approximation of reality, and if the user wanted something less
512 // less conservative, they should have specified it explicitly in the data
513 // layout.
514 if (BestMatchIdx == -1) {
515 unsigned Align = getTypeStoreSize(Ty);
Davide Italiano5e327342016-11-11 03:00:00 +0000516 Align = PowerOf2Ceil(Align);
Owen Anderson7e621e92015-03-08 21:53:59 +0000517 return Align;
518 }
519
Micah Villmowac34b5c2012-10-04 22:08:14 +0000520 // Since we got a "best match" index, just return it.
521 return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
522 : Alignments[BestMatchIdx].PrefAlign;
523}
524
525namespace {
526
527class StructLayoutMap {
Pete Cooper0ae73932015-07-27 17:15:28 +0000528 typedef DenseMap<StructType*, StructLayout*> LayoutInfoTy;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000529 LayoutInfoTy LayoutInfo;
530
531public:
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000532 ~StructLayoutMap() {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000533 // Remove any layouts.
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000534 for (const auto &I : LayoutInfo) {
535 StructLayout *Value = I.second;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000536 Value->~StructLayout();
537 free(Value);
538 }
539 }
540
Pete Cooper0ae73932015-07-27 17:15:28 +0000541 StructLayout *&operator[](StructType *STy) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000542 return LayoutInfo[STy];
543 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000544};
545
546} // end anonymous namespace
547
Rafael Espindola248ac132014-02-25 22:23:04 +0000548void DataLayout::clear() {
549 LegalIntWidths.clear();
550 Alignments.clear();
551 Pointers.clear();
552 delete static_cast<StructLayoutMap *>(LayoutMap);
Craig Topperc6207612014-04-09 06:08:46 +0000553 LayoutMap = nullptr;
Rafael Espindola248ac132014-02-25 22:23:04 +0000554}
555
Micah Villmowb4faa152012-10-04 23:01:22 +0000556DataLayout::~DataLayout() {
Rafael Espindola248ac132014-02-25 22:23:04 +0000557 clear();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000558}
559
Pete Cooper0ae73932015-07-27 17:15:28 +0000560const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000561 if (!LayoutMap)
562 LayoutMap = new StructLayoutMap();
563
564 StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
565 StructLayout *&SL = (*STM)[Ty];
566 if (SL) return SL;
567
568 // Otherwise, create the struct layout. Because it is variable length, we
569 // malloc it, then use placement new.
570 int NumElts = Ty->getNumElements();
571 StructLayout *L =
572 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t));
573
574 // Set SL before calling StructLayout's ctor. The ctor could cause other
575 // entries to be added to TheMap, invalidating our reference.
576 SL = L;
577
578 new (L) StructLayout(Ty, *this);
579
580 return L;
581}
582
Micah Villmowac34b5c2012-10-04 22:08:14 +0000583
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000584unsigned DataLayout::getPointerABIAlignment(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000585 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000586 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000587 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000588 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000589 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000590 return I->ABIAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000591}
592
593unsigned DataLayout::getPointerPrefAlignment(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000594 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000595 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000596 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000597 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000598 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000599 return I->PrefAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000600}
601
602unsigned DataLayout::getPointerSize(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000603 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000604 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000605 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000606 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000607 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000608 return I->TypeByteWidth;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000609}
610
Pete Cooper0ae73932015-07-27 17:15:28 +0000611unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {
Matt Arsenault6f4be902013-07-26 17:37:20 +0000612 assert(Ty->isPtrOrPtrVectorTy() &&
613 "This should only be called with a pointer or pointer vector type");
614
615 if (Ty->isPointerTy())
616 return getTypeSizeInBits(Ty);
617
Matt Arsenault517cf482013-07-27 19:22:28 +0000618 return getTypeSizeInBits(Ty->getScalarType());
Matt Arsenault6f4be902013-07-26 17:37:20 +0000619}
Micah Villmowac34b5c2012-10-04 22:08:14 +0000620
Micah Villmowac34b5c2012-10-04 22:08:14 +0000621/*!
622 \param abi_or_pref Flag that determines which alignment is returned. true
623 returns the ABI alignment, false returns the preferred alignment.
624 \param Ty The underlying type for which alignment is determined.
625
626 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
627 == false) for the requested type \a Ty.
628 */
Pete Cooper0ae73932015-07-27 17:15:28 +0000629unsigned DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000630 int AlignType = -1;
631
632 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
633 switch (Ty->getTypeID()) {
634 // Early escape for the non-numeric types.
635 case Type::LabelTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000636 return (abi_or_pref
Micah Villmow89021e42012-10-09 16:06:12 +0000637 ? getPointerABIAlignment(0)
638 : getPointerPrefAlignment(0));
639 case Type::PointerTyID: {
Matt Arsenaultc1728972014-09-18 22:28:56 +0000640 unsigned AS = cast<PointerType>(Ty)->getAddressSpace();
Micah Villmow89021e42012-10-09 16:06:12 +0000641 return (abi_or_pref
642 ? getPointerABIAlignment(AS)
643 : getPointerPrefAlignment(AS));
644 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000645 case Type::ArrayTyID:
646 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
647
648 case Type::StructTyID: {
649 // Packed structure types always have an ABI alignment of one.
650 if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
651 return 1;
652
653 // Get the layout annotation... which is lazily created on demand.
654 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
655 unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty);
656 return std::max(Align, Layout->getAlignment());
657 }
658 case Type::IntegerTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000659 AlignType = INTEGER_ALIGN;
660 break;
661 case Type::HalfTyID:
662 case Type::FloatTyID:
663 case Type::DoubleTyID:
664 // PPC_FP128TyID and FP128TyID have different data contents, but the
665 // same size and alignment, so they look the same here.
666 case Type::PPC_FP128TyID:
667 case Type::FP128TyID:
668 case Type::X86_FP80TyID:
669 AlignType = FLOAT_ALIGN;
670 break;
671 case Type::X86_MMXTyID:
672 case Type::VectorTyID:
673 AlignType = VECTOR_ALIGN;
674 break;
675 default:
676 llvm_unreachable("Bad type for getAlignment!!!");
677 }
678
679 return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSizeInBits(Ty),
680 abi_or_pref, Ty);
681}
682
Pete Cooper0ae73932015-07-27 17:15:28 +0000683unsigned DataLayout::getABITypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000684 return getAlignment(Ty, true);
685}
686
687/// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
688/// an integer type of the specified bitwidth.
Micah Villmowb4faa152012-10-04 23:01:22 +0000689unsigned DataLayout::getABIIntegerTypeAlignment(unsigned BitWidth) const {
Craig Topperc6207612014-04-09 06:08:46 +0000690 return getAlignmentInfo(INTEGER_ALIGN, BitWidth, true, nullptr);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000691}
692
Pete Cooper0ae73932015-07-27 17:15:28 +0000693unsigned DataLayout::getPrefTypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000694 return getAlignment(Ty, false);
695}
696
Pete Cooper0ae73932015-07-27 17:15:28 +0000697unsigned DataLayout::getPreferredTypeAlignmentShift(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000698 unsigned Align = getPrefTypeAlignment(Ty);
699 assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
700 return Log2_32(Align);
701}
702
Micah Villmow89021e42012-10-09 16:06:12 +0000703IntegerType *DataLayout::getIntPtrType(LLVMContext &C,
704 unsigned AddressSpace) const {
705 return IntegerType::get(C, getPointerSizeInBits(AddressSpace));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000706}
707
Pete Cooper0ae73932015-07-27 17:15:28 +0000708Type *DataLayout::getIntPtrType(Type *Ty) const {
Chandler Carruth7ec50852012-11-01 08:07:29 +0000709 assert(Ty->isPtrOrPtrVectorTy() &&
710 "Expected a pointer or pointer vector type.");
Matt Arsenault4dbd4892014-04-23 21:10:15 +0000711 unsigned NumBits = getPointerTypeSizeInBits(Ty);
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000712 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
Pete Cooper0ae73932015-07-27 17:15:28 +0000713 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000714 return VectorType::get(IntTy, VecTy->getNumElements());
715 return IntTy;
Micah Villmow12d91272012-10-24 15:52:52 +0000716}
717
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000718Type *DataLayout::getSmallestLegalIntType(LLVMContext &C, unsigned Width) const {
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000719 for (unsigned LegalIntWidth : LegalIntWidths)
720 if (Width <= LegalIntWidth)
721 return Type::getIntNTy(C, LegalIntWidth);
Craig Topperc6207612014-04-09 06:08:46 +0000722 return nullptr;
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000723}
724
Jun Bum Limbe11bdc2016-05-13 18:38:35 +0000725unsigned DataLayout::getLargestLegalIntTypeSizeInBits() const {
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000726 auto Max = std::max_element(LegalIntWidths.begin(), LegalIntWidths.end());
727 return Max != LegalIntWidths.end() ? *Max : 0;
Matt Arsenault899f7d22013-09-16 22:43:16 +0000728}
729
David Majnemer17bdf442016-07-13 03:42:38 +0000730int64_t DataLayout::getIndexedOffsetInType(Type *ElemTy,
731 ArrayRef<Value *> Indices) const {
732 int64_t Result = 0;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000733
734 generic_gep_type_iterator<Value* const*>
Peter Collingbourneab85225b2016-12-02 02:24:42 +0000735 GTI = gep_type_begin(ElemTy, Indices),
736 GTE = gep_type_end(ElemTy, Indices);
Eduard Burtescu68e7f492016-01-22 03:08:27 +0000737 for (; GTI != GTE; ++GTI) {
738 Value *Idx = GTI.getOperand();
Peter Collingbourneab85225b2016-12-02 02:24:42 +0000739 if (StructType *STy = GTI.getStructTypeOrNull()) {
Manuel Jacobcc13c2c2016-01-22 03:30:27 +0000740 assert(Idx->getType()->isIntegerTy(32) && "Illegal struct idx");
Eduard Burtescu68e7f492016-01-22 03:08:27 +0000741 unsigned FieldNo = cast<ConstantInt>(Idx)->getZExtValue();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000742
743 // Get structure layout information...
744 const StructLayout *Layout = getStructLayout(STy);
745
746 // Add in the offset, as calculated by the structure layout info...
747 Result += Layout->getElementOffset(FieldNo);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000748 } else {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000749 // Get the array index and the size of each array element.
Eduard Burtescu68e7f492016-01-22 03:08:27 +0000750 if (int64_t arrayIdx = cast<ConstantInt>(Idx)->getSExtValue())
David Majnemer17bdf442016-07-13 03:42:38 +0000751 Result += arrayIdx * getTypeAllocSize(GTI.getIndexedType());
Micah Villmowac34b5c2012-10-04 22:08:14 +0000752 }
753 }
754
755 return Result;
756}
757
758/// getPreferredAlignment - Return the preferred alignment of the specified
759/// global. This includes an explicitly requested alignment (if the global
760/// has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000761unsigned DataLayout::getPreferredAlignment(const GlobalVariable *GV) const {
Manuel Jacob5f6eaac2016-01-16 20:30:46 +0000762 Type *ElemType = GV->getValueType();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000763 unsigned Alignment = getPrefTypeAlignment(ElemType);
764 unsigned GVAlignment = GV->getAlignment();
765 if (GVAlignment >= Alignment) {
766 Alignment = GVAlignment;
767 } else if (GVAlignment != 0) {
768 Alignment = std::max(GVAlignment, getABITypeAlignment(ElemType));
769 }
770
771 if (GV->hasInitializer() && GVAlignment == 0) {
772 if (Alignment < 16) {
773 // If the global is not external, see if it is large. If so, give it a
774 // larger alignment.
775 if (getTypeSizeInBits(ElemType) > 128)
776 Alignment = 16; // 16-byte alignment.
777 }
778 }
779 return Alignment;
780}
781
782/// getPreferredAlignmentLog - Return the preferred alignment of the
783/// specified global, returned in log form. This includes an explicitly
784/// requested alignment (if the global has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000785unsigned DataLayout::getPreferredAlignmentLog(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000786 return Log2_32(getPreferredAlignment(GV));
787}
Rafael Espindola93512512014-02-25 17:30:31 +0000788