blob: d7ed73015ee4d5edc417599ee5d80243f3deceeb [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;
Sanjoy Dasc6af5ea2016-07-28 23:43:38 +0000185 NonIntegralAddressSpaces.clear();
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);
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000201 if (Split.second.empty() && Split.first != Str)
202 report_fatal_error("Trailing separator in datalayout string");
David Majnemer612f3122014-12-10 02:36:41 +0000203 if (!Split.second.empty() && Split.first.empty())
204 report_fatal_error("Expected token before separator in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000205 return Split;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000206}
207
Cameron McInally8af9eac2014-01-07 19:51:38 +0000208/// Get an unsigned integer, including error checks.
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000209static unsigned getInt(StringRef R) {
Cameron McInallyf0379fa2014-01-13 22:04:55 +0000210 unsigned Result;
Patrik Hägglund504f4782012-11-28 14:32:52 +0000211 bool error = R.getAsInteger(10, Result); (void)error;
Cameron McInallyf0379fa2014-01-13 22:04:55 +0000212 if (error)
213 report_fatal_error("not a number, or does not fit in an unsigned int");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000214 return Result;
215}
216
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000217/// Convert bits into bytes. Assert if not a byte width multiple.
218static unsigned inBytes(unsigned Bits) {
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000219 if (Bits % 8)
220 report_fatal_error("number of bits must be a byte width multiple");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000221 return Bits / 8;
222}
223
224void DataLayout::parseSpecifier(StringRef Desc) {
Mehdi Amini46a43552015-03-04 18:43:29 +0000225 StringRepresentation = Desc;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000226 while (!Desc.empty()) {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000227 // Split at '-'.
228 std::pair<StringRef, StringRef> Split = split(Desc, '-');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000229 Desc = Split.second;
230
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000231 // Split at ':'.
232 Split = split(Split.first, ':');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000233
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000234 // Aliases used below.
235 StringRef &Tok = Split.first; // Current token.
236 StringRef &Rest = Split.second; // The rest of the string.
Micah Villmowac34b5c2012-10-04 22:08:14 +0000237
Sanjoy Dasc6af5ea2016-07-28 23:43:38 +0000238 if (Tok == "ni") {
239 do {
240 Split = split(Rest, ':');
241 Rest = Split.second;
242 unsigned AS = getInt(Split.first);
243 if (AS == 0)
244 report_fatal_error("Address space 0 can never be non-integral");
245 NonIntegralAddressSpaces.push_back(AS);
246 } while (!Rest.empty());
247
248 continue;
249 }
250
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000251 char Specifier = Tok.front();
252 Tok = Tok.substr(1);
253
254 switch (Specifier) {
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000255 case 's':
256 // Ignored for backward compatibility.
257 // FIXME: remove this on LLVM 4.0.
258 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000259 case 'E':
Chandler Carruthf67321c2014-10-20 10:41:29 +0000260 BigEndian = true;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000261 break;
262 case 'e':
Chandler Carruthf67321c2014-10-20 10:41:29 +0000263 BigEndian = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000264 break;
265 case 'p': {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000266 // Address space.
267 unsigned AddrSpace = Tok.empty() ? 0 : getInt(Tok);
David Majnemer5330c692014-12-10 01:17:08 +0000268 if (!isUInt<24>(AddrSpace))
269 report_fatal_error("Invalid address space, must be a 24bit integer");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000270
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000271 // Size.
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000272 if (Rest.empty())
273 report_fatal_error(
274 "Missing size specification for pointer in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000275 Split = split(Rest, ':');
276 unsigned PointerMemSize = inBytes(getInt(Tok));
Owen Anderson5bc2bbe2015-03-02 06:00:02 +0000277 if (!PointerMemSize)
278 report_fatal_error("Invalid pointer size of 0 bytes");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000279
280 // ABI alignment.
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000281 if (Rest.empty())
282 report_fatal_error(
283 "Missing alignment specification for pointer in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000284 Split = split(Rest, ':');
285 unsigned PointerABIAlign = inBytes(getInt(Tok));
Owen Anderson040f2f82015-03-02 06:33:51 +0000286 if (!isPowerOf2_64(PointerABIAlign))
287 report_fatal_error(
288 "Pointer ABI alignment must be a power of 2");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000289
290 // Preferred alignment.
291 unsigned PointerPrefAlign = PointerABIAlign;
292 if (!Rest.empty()) {
293 Split = split(Rest, ':');
294 PointerPrefAlign = inBytes(getInt(Tok));
Owen Anderson040f2f82015-03-02 06:33:51 +0000295 if (!isPowerOf2_64(PointerPrefAlign))
296 report_fatal_error(
297 "Pointer preferred alignment must be a power of 2");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000298 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000299
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000300 setPointerAlignment(AddrSpace, PointerABIAlign, PointerPrefAlign,
301 PointerMemSize);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000302 break;
303 }
304 case 'i':
305 case 'v':
306 case 'f':
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000307 case 'a': {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000308 AlignTypeEnum AlignType;
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000309 switch (Specifier) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000310 default:
311 case 'i': AlignType = INTEGER_ALIGN; break;
312 case 'v': AlignType = VECTOR_ALIGN; break;
313 case 'f': AlignType = FLOAT_ALIGN; break;
314 case 'a': AlignType = AGGREGATE_ALIGN; break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000315 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000316
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000317 // Bit size.
318 unsigned Size = Tok.empty() ? 0 : getInt(Tok);
319
David Majnemer5330c692014-12-10 01:17:08 +0000320 if (AlignType == AGGREGATE_ALIGN && Size != 0)
321 report_fatal_error(
322 "Sized aggregate specification in datalayout string");
Rafael Espindolaabdd7262014-01-06 21:40:24 +0000323
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000324 // ABI alignment.
David Majnemer612f3122014-12-10 02:36:41 +0000325 if (Rest.empty())
326 report_fatal_error(
327 "Missing alignment specification in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000328 Split = split(Rest, ':');
329 unsigned ABIAlign = inBytes(getInt(Tok));
Owen Andersonab1c7a72015-03-02 09:34:59 +0000330 if (AlignType != AGGREGATE_ALIGN && !ABIAlign)
331 report_fatal_error(
332 "ABI alignment specification must be >0 for non-aggregate types");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000333
334 // Preferred alignment.
335 unsigned PrefAlign = ABIAlign;
336 if (!Rest.empty()) {
337 Split = split(Rest, ':');
338 PrefAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000339 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000340
Patrik Hägglund01860a62012-11-14 09:04:56 +0000341 setAlignment(AlignType, ABIAlign, PrefAlign, Size);
Micah Villmowb4faa152012-10-04 23:01:22 +0000342
Micah Villmowac34b5c2012-10-04 22:08:14 +0000343 break;
344 }
345 case 'n': // Native integer types.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000346 for (;;) {
347 unsigned Width = getInt(Tok);
David Majnemer5330c692014-12-10 01:17:08 +0000348 if (Width == 0)
349 report_fatal_error(
350 "Zero width native integer type in datalayout string");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000351 LegalIntWidths.push_back(Width);
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000352 if (Rest.empty())
353 break;
354 Split = split(Rest, ':');
355 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000356 break;
357 case 'S': { // Stack natural alignment.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000358 StackNaturalAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000359 break;
360 }
Rafael Espindola58873562014-01-03 19:21:54 +0000361 case 'm':
David Majnemer612f3122014-12-10 02:36:41 +0000362 if (!Tok.empty())
363 report_fatal_error("Unexpected trailing characters after mangling specifier in datalayout string");
364 if (Rest.empty())
365 report_fatal_error("Expected mangling specifier in datalayout string");
366 if (Rest.size() > 1)
367 report_fatal_error("Unknown mangling specifier in datalayout string");
Rafael Espindola58873562014-01-03 19:21:54 +0000368 switch(Rest[0]) {
369 default:
David Majnemer5330c692014-12-10 01:17:08 +0000370 report_fatal_error("Unknown mangling in datalayout string");
Rafael Espindola58873562014-01-03 19:21:54 +0000371 case 'e':
372 ManglingMode = MM_ELF;
373 break;
374 case 'o':
375 ManglingMode = MM_MachO;
376 break;
377 case 'm':
378 ManglingMode = MM_Mips;
379 break;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000380 case 'w':
David Majnemer7db449a2015-03-17 23:54:51 +0000381 ManglingMode = MM_WinCOFF;
382 break;
383 case 'x':
384 ManglingMode = MM_WinCOFFX86;
Rafael Espindola58873562014-01-03 19:21:54 +0000385 break;
386 }
387 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000388 default:
David Majnemer5330c692014-12-10 01:17:08 +0000389 report_fatal_error("Unknown specifier in datalayout string");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000390 break;
391 }
392 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000393}
394
Craig Topperc6207612014-04-09 06:08:46 +0000395DataLayout::DataLayout(const Module *M) : LayoutMap(nullptr) {
Rafael Espindolac435adc2014-09-10 21:27:43 +0000396 init(M);
397}
398
Mehdi Amini46a43552015-03-04 18:43:29 +0000399void DataLayout::init(const Module *M) { *this = M->getDataLayout(); }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000400
Rafael Espindolaae593f12014-02-26 17:02:08 +0000401bool DataLayout::operator==(const DataLayout &Other) const {
Chandler Carruthf67321c2014-10-20 10:41:29 +0000402 bool Ret = BigEndian == Other.BigEndian &&
Rafael Espindolaae593f12014-02-26 17:02:08 +0000403 StackNaturalAlign == Other.StackNaturalAlign &&
404 ManglingMode == Other.ManglingMode &&
405 LegalIntWidths == Other.LegalIntWidths &&
Rafael Espindola89992b02014-04-22 17:47:03 +0000406 Alignments == Other.Alignments && Pointers == Other.Pointers;
Mehdi Amini46a43552015-03-04 18:43:29 +0000407 // Note: getStringRepresentation() might differs, it is not canonicalized
Rafael Espindolaae593f12014-02-26 17:02:08 +0000408 return Ret;
409}
410
Micah Villmowac34b5c2012-10-04 22:08:14 +0000411void
Micah Villmowb4faa152012-10-04 23:01:22 +0000412DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000413 unsigned pref_align, uint32_t bit_width) {
David Majnemer1b9fc3a2015-02-16 05:41:53 +0000414 if (!isUInt<24>(bit_width))
415 report_fatal_error("Invalid bit width, must be a 24bit integer");
416 if (!isUInt<16>(abi_align))
417 report_fatal_error("Invalid ABI alignment, must be a 16bit integer");
418 if (!isUInt<16>(pref_align))
419 report_fatal_error("Invalid preferred alignment, must be a 16bit integer");
Owen Anderson5af4b212015-03-02 09:35:03 +0000420 if (abi_align != 0 && !isPowerOf2_64(abi_align))
421 report_fatal_error("Invalid ABI alignment, must be a power of 2");
422 if (pref_align != 0 && !isPowerOf2_64(pref_align))
423 report_fatal_error("Invalid preferred alignment, must be a power of 2");
David Majnemer1b9fc3a2015-02-16 05:41:53 +0000424
425 if (pref_align < abi_align)
426 report_fatal_error(
427 "Preferred alignment cannot be less than the ABI alignment");
428
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000429 for (LayoutAlignElem &Elem : Alignments) {
430 if (Elem.AlignType == (unsigned)align_type &&
431 Elem.TypeBitWidth == bit_width) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000432 // Update the abi, preferred alignments.
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000433 Elem.ABIAlign = abi_align;
434 Elem.PrefAlign = pref_align;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000435 return;
436 }
437 }
438
Micah Villmowb4faa152012-10-04 23:01:22 +0000439 Alignments.push_back(LayoutAlignElem::get(align_type, abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000440 pref_align, bit_width));
441}
442
Rafael Espindola667fcb82014-02-26 16:58:35 +0000443DataLayout::PointersTy::iterator
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000444DataLayout::findPointerLowerBound(uint32_t AddressSpace) {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000445 return std::lower_bound(Pointers.begin(), Pointers.end(), AddressSpace,
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000446 [](const PointerAlignElem &A, uint32_t AddressSpace) {
447 return A.AddressSpace < AddressSpace;
448 });
Rafael Espindola667fcb82014-02-26 16:58:35 +0000449}
450
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000451void DataLayout::setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign,
452 unsigned PrefAlign,
453 uint32_t TypeByteWidth) {
David Majnemer4b042922015-02-16 05:41:55 +0000454 if (PrefAlign < ABIAlign)
455 report_fatal_error(
456 "Preferred alignment cannot be less than the ABI alignment");
457
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000458 PointersTy::iterator I = findPointerLowerBound(AddrSpace);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000459 if (I == Pointers.end() || I->AddressSpace != AddrSpace) {
460 Pointers.insert(I, PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign,
461 TypeByteWidth));
Micah Villmow89021e42012-10-09 16:06:12 +0000462 } else {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000463 I->ABIAlign = ABIAlign;
464 I->PrefAlign = PrefAlign;
465 I->TypeByteWidth = TypeByteWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000466 }
467}
468
Micah Villmowac34b5c2012-10-04 22:08:14 +0000469/// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
Micah Villmowb4faa152012-10-04 23:01:22 +0000470/// preferred if ABIInfo = false) the layout wants for the specified datatype.
471unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000472 uint32_t BitWidth, bool ABIInfo,
Pete Cooper0ae73932015-07-27 17:15:28 +0000473 Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000474 // Check to see if we have an exact match and remember the best match we see.
475 int BestMatchIdx = -1;
476 int LargestInt = -1;
477 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmow6d05e692012-10-05 17:02:14 +0000478 if (Alignments[i].AlignType == (unsigned)AlignType &&
Micah Villmowac34b5c2012-10-04 22:08:14 +0000479 Alignments[i].TypeBitWidth == BitWidth)
480 return ABIInfo ? Alignments[i].ABIAlign : Alignments[i].PrefAlign;
481
482 // The best match so far depends on what we're looking for.
Sanjay Patel42af5c62015-07-21 16:09:58 +0000483 if (AlignType == INTEGER_ALIGN &&
484 Alignments[i].AlignType == INTEGER_ALIGN) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000485 // The "best match" for integers is the smallest size that is larger than
486 // the BitWidth requested.
487 if (Alignments[i].TypeBitWidth > BitWidth && (BestMatchIdx == -1 ||
Eli Benderskyfaf5e3e2013-01-30 19:24:23 +0000488 Alignments[i].TypeBitWidth < Alignments[BestMatchIdx].TypeBitWidth))
Micah Villmowac34b5c2012-10-04 22:08:14 +0000489 BestMatchIdx = i;
490 // However, if there isn't one that's larger, then we must use the
491 // largest one we have (see below)
492 if (LargestInt == -1 ||
493 Alignments[i].TypeBitWidth > Alignments[LargestInt].TypeBitWidth)
494 LargestInt = i;
495 }
496 }
497
498 // Okay, we didn't find an exact solution. Fall back here depending on what
499 // is being looked for.
500 if (BestMatchIdx == -1) {
501 // If we didn't find an integer alignment, fall back on most conservative.
502 if (AlignType == INTEGER_ALIGN) {
503 BestMatchIdx = LargestInt;
Owen Anderson7e621e92015-03-08 21:53:59 +0000504 } else if (AlignType == VECTOR_ALIGN) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000505 // By default, use natural alignment for vector types. This is consistent
506 // with what clang and llvm-gcc do.
507 unsigned Align = getTypeAllocSize(cast<VectorType>(Ty)->getElementType());
508 Align *= cast<VectorType>(Ty)->getNumElements();
509 // If the alignment is not a power of 2, round up to the next power of 2.
510 // This happens for non-power-of-2 length vectors.
511 if (Align & (Align-1))
512 Align = NextPowerOf2(Align);
513 return Align;
514 }
515 }
516
Owen Anderson7e621e92015-03-08 21:53:59 +0000517 // If we still couldn't find a reasonable default alignment, fall back
518 // to a simple heuristic that the alignment is the first power of two
519 // greater-or-equal to the store size of the type. This is a reasonable
520 // approximation of reality, and if the user wanted something less
521 // less conservative, they should have specified it explicitly in the data
522 // layout.
523 if (BestMatchIdx == -1) {
524 unsigned Align = getTypeStoreSize(Ty);
525 if (Align & (Align-1))
526 Align = NextPowerOf2(Align);
527 return Align;
528 }
529
Micah Villmowac34b5c2012-10-04 22:08:14 +0000530 // Since we got a "best match" index, just return it.
531 return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
532 : Alignments[BestMatchIdx].PrefAlign;
533}
534
535namespace {
536
537class StructLayoutMap {
Pete Cooper0ae73932015-07-27 17:15:28 +0000538 typedef DenseMap<StructType*, StructLayout*> LayoutInfoTy;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000539 LayoutInfoTy LayoutInfo;
540
541public:
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000542 ~StructLayoutMap() {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000543 // Remove any layouts.
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000544 for (const auto &I : LayoutInfo) {
545 StructLayout *Value = I.second;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000546 Value->~StructLayout();
547 free(Value);
548 }
549 }
550
Pete Cooper0ae73932015-07-27 17:15:28 +0000551 StructLayout *&operator[](StructType *STy) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000552 return LayoutInfo[STy];
553 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000554};
555
556} // end anonymous namespace
557
Rafael Espindola248ac132014-02-25 22:23:04 +0000558void DataLayout::clear() {
559 LegalIntWidths.clear();
560 Alignments.clear();
561 Pointers.clear();
562 delete static_cast<StructLayoutMap *>(LayoutMap);
Craig Topperc6207612014-04-09 06:08:46 +0000563 LayoutMap = nullptr;
Rafael Espindola248ac132014-02-25 22:23:04 +0000564}
565
Micah Villmowb4faa152012-10-04 23:01:22 +0000566DataLayout::~DataLayout() {
Rafael Espindola248ac132014-02-25 22:23:04 +0000567 clear();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000568}
569
Pete Cooper0ae73932015-07-27 17:15:28 +0000570const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000571 if (!LayoutMap)
572 LayoutMap = new StructLayoutMap();
573
574 StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
575 StructLayout *&SL = (*STM)[Ty];
576 if (SL) return SL;
577
578 // Otherwise, create the struct layout. Because it is variable length, we
579 // malloc it, then use placement new.
580 int NumElts = Ty->getNumElements();
581 StructLayout *L =
582 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t));
583
584 // Set SL before calling StructLayout's ctor. The ctor could cause other
585 // entries to be added to TheMap, invalidating our reference.
586 SL = L;
587
588 new (L) StructLayout(Ty, *this);
589
590 return L;
591}
592
Micah Villmowac34b5c2012-10-04 22:08:14 +0000593
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000594unsigned DataLayout::getPointerABIAlignment(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->ABIAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000601}
602
603unsigned DataLayout::getPointerPrefAlignment(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->PrefAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000610}
611
612unsigned DataLayout::getPointerSize(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000613 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000614 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000615 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000616 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000617 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000618 return I->TypeByteWidth;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000619}
620
Pete Cooper0ae73932015-07-27 17:15:28 +0000621unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {
Matt Arsenault6f4be902013-07-26 17:37:20 +0000622 assert(Ty->isPtrOrPtrVectorTy() &&
623 "This should only be called with a pointer or pointer vector type");
624
625 if (Ty->isPointerTy())
626 return getTypeSizeInBits(Ty);
627
Matt Arsenault517cf482013-07-27 19:22:28 +0000628 return getTypeSizeInBits(Ty->getScalarType());
Matt Arsenault6f4be902013-07-26 17:37:20 +0000629}
Micah Villmowac34b5c2012-10-04 22:08:14 +0000630
Micah Villmowac34b5c2012-10-04 22:08:14 +0000631/*!
632 \param abi_or_pref Flag that determines which alignment is returned. true
633 returns the ABI alignment, false returns the preferred alignment.
634 \param Ty The underlying type for which alignment is determined.
635
636 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
637 == false) for the requested type \a Ty.
638 */
Pete Cooper0ae73932015-07-27 17:15:28 +0000639unsigned DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000640 int AlignType = -1;
641
642 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
643 switch (Ty->getTypeID()) {
644 // Early escape for the non-numeric types.
645 case Type::LabelTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000646 return (abi_or_pref
Micah Villmow89021e42012-10-09 16:06:12 +0000647 ? getPointerABIAlignment(0)
648 : getPointerPrefAlignment(0));
649 case Type::PointerTyID: {
Matt Arsenaultc1728972014-09-18 22:28:56 +0000650 unsigned AS = cast<PointerType>(Ty)->getAddressSpace();
Micah Villmow89021e42012-10-09 16:06:12 +0000651 return (abi_or_pref
652 ? getPointerABIAlignment(AS)
653 : getPointerPrefAlignment(AS));
654 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000655 case Type::ArrayTyID:
656 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
657
658 case Type::StructTyID: {
659 // Packed structure types always have an ABI alignment of one.
660 if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
661 return 1;
662
663 // Get the layout annotation... which is lazily created on demand.
664 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
665 unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty);
666 return std::max(Align, Layout->getAlignment());
667 }
668 case Type::IntegerTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000669 AlignType = INTEGER_ALIGN;
670 break;
671 case Type::HalfTyID:
672 case Type::FloatTyID:
673 case Type::DoubleTyID:
674 // PPC_FP128TyID and FP128TyID have different data contents, but the
675 // same size and alignment, so they look the same here.
676 case Type::PPC_FP128TyID:
677 case Type::FP128TyID:
678 case Type::X86_FP80TyID:
679 AlignType = FLOAT_ALIGN;
680 break;
681 case Type::X86_MMXTyID:
682 case Type::VectorTyID:
683 AlignType = VECTOR_ALIGN;
684 break;
685 default:
686 llvm_unreachable("Bad type for getAlignment!!!");
687 }
688
689 return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSizeInBits(Ty),
690 abi_or_pref, Ty);
691}
692
Pete Cooper0ae73932015-07-27 17:15:28 +0000693unsigned DataLayout::getABITypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000694 return getAlignment(Ty, true);
695}
696
697/// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
698/// an integer type of the specified bitwidth.
Micah Villmowb4faa152012-10-04 23:01:22 +0000699unsigned DataLayout::getABIIntegerTypeAlignment(unsigned BitWidth) const {
Craig Topperc6207612014-04-09 06:08:46 +0000700 return getAlignmentInfo(INTEGER_ALIGN, BitWidth, true, nullptr);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000701}
702
Pete Cooper0ae73932015-07-27 17:15:28 +0000703unsigned DataLayout::getPrefTypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000704 return getAlignment(Ty, false);
705}
706
Pete Cooper0ae73932015-07-27 17:15:28 +0000707unsigned DataLayout::getPreferredTypeAlignmentShift(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000708 unsigned Align = getPrefTypeAlignment(Ty);
709 assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
710 return Log2_32(Align);
711}
712
Micah Villmow89021e42012-10-09 16:06:12 +0000713IntegerType *DataLayout::getIntPtrType(LLVMContext &C,
714 unsigned AddressSpace) const {
715 return IntegerType::get(C, getPointerSizeInBits(AddressSpace));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000716}
717
Pete Cooper0ae73932015-07-27 17:15:28 +0000718Type *DataLayout::getIntPtrType(Type *Ty) const {
Chandler Carruth7ec50852012-11-01 08:07:29 +0000719 assert(Ty->isPtrOrPtrVectorTy() &&
720 "Expected a pointer or pointer vector type.");
Matt Arsenault4dbd4892014-04-23 21:10:15 +0000721 unsigned NumBits = getPointerTypeSizeInBits(Ty);
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000722 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
Pete Cooper0ae73932015-07-27 17:15:28 +0000723 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000724 return VectorType::get(IntTy, VecTy->getNumElements());
725 return IntTy;
Micah Villmow12d91272012-10-24 15:52:52 +0000726}
727
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000728Type *DataLayout::getSmallestLegalIntType(LLVMContext &C, unsigned Width) const {
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000729 for (unsigned LegalIntWidth : LegalIntWidths)
730 if (Width <= LegalIntWidth)
731 return Type::getIntNTy(C, LegalIntWidth);
Craig Topperc6207612014-04-09 06:08:46 +0000732 return nullptr;
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000733}
734
Jun Bum Limbe11bdc2016-05-13 18:38:35 +0000735unsigned DataLayout::getLargestLegalIntTypeSizeInBits() const {
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000736 auto Max = std::max_element(LegalIntWidths.begin(), LegalIntWidths.end());
737 return Max != LegalIntWidths.end() ? *Max : 0;
Matt Arsenault899f7d22013-09-16 22:43:16 +0000738}
739
David Majnemer17bdf442016-07-13 03:42:38 +0000740int64_t DataLayout::getIndexedOffsetInType(Type *ElemTy,
741 ArrayRef<Value *> Indices) const {
742 int64_t Result = 0;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000743
Eduard Burtescu093ae492016-01-22 01:33:43 +0000744 // We can use 0 as the address space as we don't need
745 // to get pointer types back from gep_type_iterator.
746 unsigned AS = 0;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000747 generic_gep_type_iterator<Value* const*>
Eduard Burtescu68e7f492016-01-22 03:08:27 +0000748 GTI = gep_type_begin(ElemTy, AS, Indices),
749 GTE = gep_type_end(ElemTy, AS, Indices);
750 for (; GTI != GTE; ++GTI) {
751 Value *Idx = GTI.getOperand();
David Majnemer17bdf442016-07-13 03:42:38 +0000752 if (auto *STy = dyn_cast<StructType>(*GTI)) {
Manuel Jacobcc13c2c2016-01-22 03:30:27 +0000753 assert(Idx->getType()->isIntegerTy(32) && "Illegal struct idx");
Eduard Burtescu68e7f492016-01-22 03:08:27 +0000754 unsigned FieldNo = cast<ConstantInt>(Idx)->getZExtValue();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000755
756 // Get structure layout information...
757 const StructLayout *Layout = getStructLayout(STy);
758
759 // Add in the offset, as calculated by the structure layout info...
760 Result += Layout->getElementOffset(FieldNo);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000761 } else {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000762 // Get the array index and the size of each array element.
Eduard Burtescu68e7f492016-01-22 03:08:27 +0000763 if (int64_t arrayIdx = cast<ConstantInt>(Idx)->getSExtValue())
David Majnemer17bdf442016-07-13 03:42:38 +0000764 Result += arrayIdx * getTypeAllocSize(GTI.getIndexedType());
Micah Villmowac34b5c2012-10-04 22:08:14 +0000765 }
766 }
767
768 return Result;
769}
770
771/// getPreferredAlignment - Return the preferred alignment of the specified
772/// global. This includes an explicitly requested alignment (if the global
773/// has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000774unsigned DataLayout::getPreferredAlignment(const GlobalVariable *GV) const {
Manuel Jacob5f6eaac2016-01-16 20:30:46 +0000775 Type *ElemType = GV->getValueType();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000776 unsigned Alignment = getPrefTypeAlignment(ElemType);
777 unsigned GVAlignment = GV->getAlignment();
778 if (GVAlignment >= Alignment) {
779 Alignment = GVAlignment;
780 } else if (GVAlignment != 0) {
781 Alignment = std::max(GVAlignment, getABITypeAlignment(ElemType));
782 }
783
784 if (GV->hasInitializer() && GVAlignment == 0) {
785 if (Alignment < 16) {
786 // If the global is not external, see if it is large. If so, give it a
787 // larger alignment.
788 if (getTypeSizeInBits(ElemType) > 128)
789 Alignment = 16; // 16-byte alignment.
790 }
791 }
792 return Alignment;
793}
794
795/// getPreferredAlignmentLog - Return the preferred alignment of the
796/// specified global, returned in log form. This includes an explicitly
797/// requested alignment (if the global has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000798unsigned DataLayout::getPreferredAlignmentLog(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000799 return Log2_32(getPreferredAlignment(GV));
800}
Rafael Espindola93512512014-02-25 17:30:31 +0000801