blob: f4dddeb30d0b50afee683b80f2b731a8d9589f2a [file] [log] [blame]
Eugene Zelenkof53a7b42017-05-05 22:30:37 +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 Carruth6bda14b2017-06-06 11:49:48 +000019#include "llvm/IR/DataLayout.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000020#include "llvm/ADT/DenseMap.h"
Eugene Zelenkof53a7b42017-05-05 22:30:37 +000021#include "llvm/ADT/StringRef.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"
Eugene Zelenkof53a7b42017-05-05 22:30:37 +000026#include "llvm/IR/GlobalVariable.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000027#include "llvm/IR/Module.h"
Eugene Zelenkof53a7b42017-05-05 22:30:37 +000028#include "llvm/IR/Type.h"
29#include "llvm/IR/Value.h"
30#include "llvm/Support/Casting.h"
Micah Villmowac34b5c2012-10-04 22:08:14 +000031#include "llvm/Support/ErrorHandling.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000032#include "llvm/Support/MathExtras.h"
Micah Villmowac34b5c2012-10-04 22:08:14 +000033#include <algorithm>
Eugene Zelenkof53a7b42017-05-05 22:30:37 +000034#include <cassert>
35#include <cstdint>
Micah Villmowac34b5c2012-10-04 22:08:14 +000036#include <cstdlib>
Eugene Zelenkof53a7b42017-05-05 22:30:37 +000037#include <tuple>
38#include <utility>
39
Micah Villmowac34b5c2012-10-04 22:08:14 +000040using namespace llvm;
41
Micah Villmowac34b5c2012-10-04 22:08:14 +000042//===----------------------------------------------------------------------===//
43// Support for StructLayout
44//===----------------------------------------------------------------------===//
45
Pete Cooper0ae73932015-07-27 17:15:28 +000046StructLayout::StructLayout(StructType *ST, const DataLayout &DL) {
Micah Villmowac34b5c2012-10-04 22:08:14 +000047 assert(!ST->isOpaque() && "Cannot get layout of opaque structs");
48 StructAlignment = 0;
49 StructSize = 0;
Mehdi Amini1c131b32015-12-15 01:44:07 +000050 IsPadded = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +000051 NumElements = ST->getNumElements();
52
53 // Loop over each of the elements, placing them in memory.
54 for (unsigned i = 0, e = NumElements; i != e; ++i) {
55 Type *Ty = ST->getElementType(i);
Eli Bendersky41913c72013-04-16 15:41:18 +000056 unsigned TyAlign = ST->isPacked() ? 1 : DL.getABITypeAlignment(Ty);
Micah Villmowac34b5c2012-10-04 22:08:14 +000057
58 // Add padding if necessary to align the data element properly.
Mehdi Amini1c131b32015-12-15 01:44:07 +000059 if ((StructSize & (TyAlign-1)) != 0) {
60 IsPadded = true;
Rui Ueyamada00f2f2016-01-14 21:06:47 +000061 StructSize = alignTo(StructSize, TyAlign);
Mehdi Amini1c131b32015-12-15 01:44:07 +000062 }
Micah Villmowac34b5c2012-10-04 22:08:14 +000063
64 // Keep track of maximum alignment constraint.
65 StructAlignment = std::max(TyAlign, StructAlignment);
66
67 MemberOffsets[i] = StructSize;
Eli Bendersky41913c72013-04-16 15:41:18 +000068 StructSize += DL.getTypeAllocSize(Ty); // Consume space for this data item
Micah Villmowac34b5c2012-10-04 22:08:14 +000069 }
70
71 // Empty structures have alignment of 1 byte.
72 if (StructAlignment == 0) StructAlignment = 1;
73
74 // Add padding to the end of the struct so that it could be put in an array
75 // and all array elements would be aligned correctly.
Mehdi Amini1c131b32015-12-15 01:44:07 +000076 if ((StructSize & (StructAlignment-1)) != 0) {
77 IsPadded = true;
Rui Ueyamada00f2f2016-01-14 21:06:47 +000078 StructSize = alignTo(StructSize, StructAlignment);
Mehdi Amini1c131b32015-12-15 01:44:07 +000079 }
Micah Villmowac34b5c2012-10-04 22:08:14 +000080}
81
Micah Villmowac34b5c2012-10-04 22:08:14 +000082/// getElementContainingOffset - Given a valid offset into the structure,
83/// return the structure index that contains it.
84unsigned StructLayout::getElementContainingOffset(uint64_t Offset) const {
85 const uint64_t *SI =
86 std::upper_bound(&MemberOffsets[0], &MemberOffsets[NumElements], Offset);
87 assert(SI != &MemberOffsets[0] && "Offset not in structure type!");
88 --SI;
89 assert(*SI <= Offset && "upper_bound didn't work");
90 assert((SI == &MemberOffsets[0] || *(SI-1) <= Offset) &&
91 (SI+1 == &MemberOffsets[NumElements] || *(SI+1) > Offset) &&
92 "Upper bound didn't work!");
93
94 // Multiple fields can have the same offset if any of them are zero sized.
95 // For example, in { i32, [0 x i32], i32 }, searching for offset 4 will stop
96 // at the i32 element, because it is the last element at that offset. This is
97 // the right one to return, because anything after it will have a higher
98 // offset, implying that this element is non-empty.
99 return SI-&MemberOffsets[0];
100}
101
102//===----------------------------------------------------------------------===//
Micah Villmowb4faa152012-10-04 23:01:22 +0000103// LayoutAlignElem, LayoutAlign support
Micah Villmowac34b5c2012-10-04 22:08:14 +0000104//===----------------------------------------------------------------------===//
105
Micah Villmowb4faa152012-10-04 23:01:22 +0000106LayoutAlignElem
107LayoutAlignElem::get(AlignTypeEnum align_type, unsigned abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000108 unsigned pref_align, uint32_t bit_width) {
109 assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
Micah Villmowb4faa152012-10-04 23:01:22 +0000110 LayoutAlignElem retval;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000111 retval.AlignType = align_type;
112 retval.ABIAlign = abi_align;
113 retval.PrefAlign = pref_align;
114 retval.TypeBitWidth = bit_width;
115 return retval;
116}
117
118bool
Micah Villmowb4faa152012-10-04 23:01:22 +0000119LayoutAlignElem::operator==(const LayoutAlignElem &rhs) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000120 return (AlignType == rhs.AlignType
121 && ABIAlign == rhs.ABIAlign
122 && PrefAlign == rhs.PrefAlign
123 && TypeBitWidth == rhs.TypeBitWidth);
124}
125
Micah Villmow89021e42012-10-09 16:06:12 +0000126//===----------------------------------------------------------------------===//
127// PointerAlignElem, PointerAlign support
128//===----------------------------------------------------------------------===//
129
130PointerAlignElem
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000131PointerAlignElem::get(uint32_t AddressSpace, unsigned ABIAlign,
132 unsigned PrefAlign, uint32_t TypeByteWidth) {
133 assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
Micah Villmow89021e42012-10-09 16:06:12 +0000134 PointerAlignElem retval;
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000135 retval.AddressSpace = AddressSpace;
136 retval.ABIAlign = ABIAlign;
137 retval.PrefAlign = PrefAlign;
138 retval.TypeByteWidth = TypeByteWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000139 return retval;
140}
141
142bool
143PointerAlignElem::operator==(const PointerAlignElem &rhs) const {
144 return (ABIAlign == rhs.ABIAlign
145 && AddressSpace == rhs.AddressSpace
146 && PrefAlign == rhs.PrefAlign
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000147 && TypeByteWidth == rhs.TypeByteWidth);
Micah Villmow89021e42012-10-09 16:06:12 +0000148}
149
Micah Villmowac34b5c2012-10-04 22:08:14 +0000150//===----------------------------------------------------------------------===//
Micah Villmowb4faa152012-10-04 23:01:22 +0000151// DataLayout Class Implementation
Micah Villmowac34b5c2012-10-04 22:08:14 +0000152//===----------------------------------------------------------------------===//
153
Rafael Espindola58873562014-01-03 19:21:54 +0000154const char *DataLayout::getManglingComponent(const Triple &T) {
155 if (T.isOSBinFormatMachO())
156 return "-m:o";
David Majnemer7db449a2015-03-17 23:54:51 +0000157 if (T.isOSWindows() && T.isOSBinFormatCOFF())
158 return T.getArch() == Triple::x86 ? "-m:x" : "-m:w";
Saleem Abdulrasoolcd130822014-04-02 20:32:05 +0000159 return "-m:e";
Rafael Espindola58873562014-01-03 19:21:54 +0000160}
161
Rafael Espindolae23b8772013-12-20 15:21:32 +0000162static const LayoutAlignElem DefaultAlignments[] = {
Rafael Espindola458a4852013-12-19 23:03:03 +0000163 { INTEGER_ALIGN, 1, 1, 1 }, // i1
164 { INTEGER_ALIGN, 8, 1, 1 }, // i8
165 { INTEGER_ALIGN, 16, 2, 2 }, // i16
166 { INTEGER_ALIGN, 32, 4, 4 }, // i32
167 { INTEGER_ALIGN, 64, 4, 8 }, // i64
168 { FLOAT_ALIGN, 16, 2, 2 }, // half
169 { FLOAT_ALIGN, 32, 4, 4 }, // float
170 { FLOAT_ALIGN, 64, 8, 8 }, // double
171 { FLOAT_ALIGN, 128, 16, 16 }, // ppcf128, quad, ...
172 { VECTOR_ALIGN, 64, 8, 8 }, // v2i32, v1i64, ...
173 { VECTOR_ALIGN, 128, 16, 16 }, // v16i8, v8i16, v4i32, ...
174 { AGGREGATE_ALIGN, 0, 0, 8 } // struct
175};
176
Rafael Espindola248ac132014-02-25 22:23:04 +0000177void DataLayout::reset(StringRef Desc) {
178 clear();
179
Craig Topperc6207612014-04-09 06:08:46 +0000180 LayoutMap = nullptr;
Chandler Carruthf67321c2014-10-20 10:41:29 +0000181 BigEndian = false;
Matt Arsenault3c1fc762017-04-10 22:27:50 +0000182 AllocaAddrSpace = 0;
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) {
Craig Topper64a65ec2017-05-22 19:28:36 +0000310 default: llvm_unreachable("Unexpected specifier!");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000311 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.
Eugene Zelenkof53a7b42017-05-05 22:30:37 +0000346 while (true) {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000347 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 }
Matt Arsenault3c1fc762017-04-10 22:27:50 +0000361 case 'A': { // Default stack/alloca address space.
362 AllocaAddrSpace = getInt(Tok);
363 if (!isUInt<24>(AllocaAddrSpace))
364 report_fatal_error("Invalid address space, must be a 24bit integer");
365 break;
366 }
Rafael Espindola58873562014-01-03 19:21:54 +0000367 case 'm':
David Majnemer612f3122014-12-10 02:36:41 +0000368 if (!Tok.empty())
369 report_fatal_error("Unexpected trailing characters after mangling specifier in datalayout string");
370 if (Rest.empty())
371 report_fatal_error("Expected mangling specifier in datalayout string");
372 if (Rest.size() > 1)
373 report_fatal_error("Unknown mangling specifier in datalayout string");
Rafael Espindola58873562014-01-03 19:21:54 +0000374 switch(Rest[0]) {
375 default:
David Majnemer5330c692014-12-10 01:17:08 +0000376 report_fatal_error("Unknown mangling in datalayout string");
Rafael Espindola58873562014-01-03 19:21:54 +0000377 case 'e':
378 ManglingMode = MM_ELF;
379 break;
380 case 'o':
381 ManglingMode = MM_MachO;
382 break;
383 case 'm':
384 ManglingMode = MM_Mips;
385 break;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000386 case 'w':
David Majnemer7db449a2015-03-17 23:54:51 +0000387 ManglingMode = MM_WinCOFF;
388 break;
389 case 'x':
390 ManglingMode = MM_WinCOFFX86;
Rafael Espindola58873562014-01-03 19:21:54 +0000391 break;
392 }
393 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000394 default:
David Majnemer5330c692014-12-10 01:17:08 +0000395 report_fatal_error("Unknown specifier in datalayout string");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000396 break;
397 }
398 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000399}
400
Eugene Zelenkof53a7b42017-05-05 22:30:37 +0000401DataLayout::DataLayout(const Module *M) {
Rafael Espindolac435adc2014-09-10 21:27:43 +0000402 init(M);
403}
404
Mehdi Amini46a43552015-03-04 18:43:29 +0000405void DataLayout::init(const Module *M) { *this = M->getDataLayout(); }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000406
Rafael Espindolaae593f12014-02-26 17:02:08 +0000407bool DataLayout::operator==(const DataLayout &Other) const {
Chandler Carruthf67321c2014-10-20 10:41:29 +0000408 bool Ret = BigEndian == Other.BigEndian &&
Matt Arsenault3c1fc762017-04-10 22:27:50 +0000409 AllocaAddrSpace == Other.AllocaAddrSpace &&
Rafael Espindolaae593f12014-02-26 17:02:08 +0000410 StackNaturalAlign == Other.StackNaturalAlign &&
411 ManglingMode == Other.ManglingMode &&
412 LegalIntWidths == Other.LegalIntWidths &&
Rafael Espindola89992b02014-04-22 17:47:03 +0000413 Alignments == Other.Alignments && Pointers == Other.Pointers;
Mehdi Amini46a43552015-03-04 18:43:29 +0000414 // Note: getStringRepresentation() might differs, it is not canonicalized
Rafael Espindolaae593f12014-02-26 17:02:08 +0000415 return Ret;
416}
417
Craig Topper490889c2017-03-23 06:15:56 +0000418DataLayout::AlignmentsTy::iterator
419DataLayout::findAlignmentLowerBound(AlignTypeEnum AlignType,
420 uint32_t BitWidth) {
421 auto Pair = std::make_pair((unsigned)AlignType, BitWidth);
422 return std::lower_bound(Alignments.begin(), Alignments.end(), Pair,
423 [](const LayoutAlignElem &LHS,
424 const std::pair<unsigned, uint32_t> &RHS) {
425 return std::tie(LHS.AlignType, LHS.TypeBitWidth) <
426 std::tie(RHS.first, RHS.second);
427 });
428}
429
Micah Villmowac34b5c2012-10-04 22:08:14 +0000430void
Micah Villmowb4faa152012-10-04 23:01:22 +0000431DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000432 unsigned pref_align, uint32_t bit_width) {
David Majnemer1b9fc3a2015-02-16 05:41:53 +0000433 if (!isUInt<24>(bit_width))
434 report_fatal_error("Invalid bit width, must be a 24bit integer");
435 if (!isUInt<16>(abi_align))
436 report_fatal_error("Invalid ABI alignment, must be a 16bit integer");
437 if (!isUInt<16>(pref_align))
438 report_fatal_error("Invalid preferred alignment, must be a 16bit integer");
Owen Anderson5af4b212015-03-02 09:35:03 +0000439 if (abi_align != 0 && !isPowerOf2_64(abi_align))
440 report_fatal_error("Invalid ABI alignment, must be a power of 2");
441 if (pref_align != 0 && !isPowerOf2_64(pref_align))
442 report_fatal_error("Invalid preferred alignment, must be a power of 2");
David Majnemer1b9fc3a2015-02-16 05:41:53 +0000443
444 if (pref_align < abi_align)
445 report_fatal_error(
446 "Preferred alignment cannot be less than the ABI alignment");
447
Craig Topper490889c2017-03-23 06:15:56 +0000448 AlignmentsTy::iterator I = findAlignmentLowerBound(align_type, bit_width);
449 if (I != Alignments.end() &&
450 I->AlignType == (unsigned)align_type && I->TypeBitWidth == bit_width) {
451 // Update the abi, preferred alignments.
452 I->ABIAlign = abi_align;
453 I->PrefAlign = pref_align;
454 } else {
455 // Insert before I to keep the vector sorted.
456 Alignments.insert(I, LayoutAlignElem::get(align_type, abi_align,
457 pref_align, bit_width));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000458 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000459}
460
Rafael Espindola667fcb82014-02-26 16:58:35 +0000461DataLayout::PointersTy::iterator
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000462DataLayout::findPointerLowerBound(uint32_t AddressSpace) {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000463 return std::lower_bound(Pointers.begin(), Pointers.end(), AddressSpace,
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000464 [](const PointerAlignElem &A, uint32_t AddressSpace) {
465 return A.AddressSpace < AddressSpace;
466 });
Rafael Espindola667fcb82014-02-26 16:58:35 +0000467}
468
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000469void DataLayout::setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign,
470 unsigned PrefAlign,
471 uint32_t TypeByteWidth) {
David Majnemer4b042922015-02-16 05:41:55 +0000472 if (PrefAlign < ABIAlign)
473 report_fatal_error(
474 "Preferred alignment cannot be less than the ABI alignment");
475
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000476 PointersTy::iterator I = findPointerLowerBound(AddrSpace);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000477 if (I == Pointers.end() || I->AddressSpace != AddrSpace) {
478 Pointers.insert(I, PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign,
479 TypeByteWidth));
Micah Villmow89021e42012-10-09 16:06:12 +0000480 } else {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000481 I->ABIAlign = ABIAlign;
482 I->PrefAlign = PrefAlign;
483 I->TypeByteWidth = TypeByteWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000484 }
485}
486
Micah Villmowac34b5c2012-10-04 22:08:14 +0000487/// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
Micah Villmowb4faa152012-10-04 23:01:22 +0000488/// preferred if ABIInfo = false) the layout wants for the specified datatype.
489unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000490 uint32_t BitWidth, bool ABIInfo,
Pete Cooper0ae73932015-07-27 17:15:28 +0000491 Type *Ty) const {
Craig Topper490889c2017-03-23 06:15:56 +0000492 AlignmentsTy::const_iterator I = findAlignmentLowerBound(AlignType, BitWidth);
493 // See if we found an exact match. Of if we are looking for an integer type,
494 // but don't have an exact match take the next largest integer. This is where
495 // the lower_bound will point to when it fails an exact match.
496 if (I != Alignments.end() && I->AlignType == (unsigned)AlignType &&
497 (I->TypeBitWidth == BitWidth || AlignType == INTEGER_ALIGN))
498 return ABIInfo ? I->ABIAlign : I->PrefAlign;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000499
Craig Topper490889c2017-03-23 06:15:56 +0000500 if (AlignType == INTEGER_ALIGN) {
501 // If we didn't have a larger value try the largest value we have.
502 if (I != Alignments.begin()) {
503 --I; // Go to the previous entry and see if its an integer.
504 if (I->AlignType == INTEGER_ALIGN)
505 return ABIInfo ? I->ABIAlign : I->PrefAlign;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000506 }
Craig Topper490889c2017-03-23 06:15:56 +0000507 } else if (AlignType == VECTOR_ALIGN) {
508 // By default, use natural alignment for vector types. This is consistent
509 // with what clang and llvm-gcc do.
510 unsigned Align = getTypeAllocSize(cast<VectorType>(Ty)->getElementType());
511 Align *= cast<VectorType>(Ty)->getNumElements();
512 Align = PowerOf2Ceil(Align);
513 return Align;
514 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000515
Owen Anderson7e621e92015-03-08 21:53:59 +0000516 // If we still couldn't find a reasonable default alignment, fall back
517 // to a simple heuristic that the alignment is the first power of two
518 // greater-or-equal to the store size of the type. This is a reasonable
519 // approximation of reality, and if the user wanted something less
520 // less conservative, they should have specified it explicitly in the data
521 // layout.
Craig Topper490889c2017-03-23 06:15:56 +0000522 unsigned Align = getTypeStoreSize(Ty);
523 Align = PowerOf2Ceil(Align);
524 return Align;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000525}
526
527namespace {
528
529class StructLayoutMap {
Eugene Zelenkof53a7b42017-05-05 22:30:37 +0000530 using LayoutInfoTy = DenseMap<StructType*, StructLayout*>;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000531 LayoutInfoTy LayoutInfo;
532
533public:
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000534 ~StructLayoutMap() {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000535 // Remove any layouts.
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000536 for (const auto &I : LayoutInfo) {
537 StructLayout *Value = I.second;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000538 Value->~StructLayout();
539 free(Value);
540 }
541 }
542
Pete Cooper0ae73932015-07-27 17:15:28 +0000543 StructLayout *&operator[](StructType *STy) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000544 return LayoutInfo[STy];
545 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000546};
547
548} // end anonymous namespace
549
Rafael Espindola248ac132014-02-25 22:23:04 +0000550void DataLayout::clear() {
551 LegalIntWidths.clear();
552 Alignments.clear();
553 Pointers.clear();
554 delete static_cast<StructLayoutMap *>(LayoutMap);
Craig Topperc6207612014-04-09 06:08:46 +0000555 LayoutMap = nullptr;
Rafael Espindola248ac132014-02-25 22:23:04 +0000556}
557
Micah Villmowb4faa152012-10-04 23:01:22 +0000558DataLayout::~DataLayout() {
Rafael Espindola248ac132014-02-25 22:23:04 +0000559 clear();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000560}
561
Pete Cooper0ae73932015-07-27 17:15:28 +0000562const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000563 if (!LayoutMap)
564 LayoutMap = new StructLayoutMap();
565
566 StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
567 StructLayout *&SL = (*STM)[Ty];
568 if (SL) return SL;
569
570 // Otherwise, create the struct layout. Because it is variable length, we
571 // malloc it, then use placement new.
572 int NumElts = Ty->getNumElements();
573 StructLayout *L =
574 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t));
Matthias Braunc20b3382017-07-20 01:30:39 +0000575 if (L == nullptr)
576 report_bad_alloc_error("Allocation of StructLayout elements failed.");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000577
578 // Set SL before calling StructLayout's ctor. The ctor could cause other
579 // entries to be added to TheMap, invalidating our reference.
580 SL = L;
581
582 new (L) StructLayout(Ty, *this);
583
584 return L;
585}
586
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000587unsigned DataLayout::getPointerABIAlignment(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000588 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000589 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000590 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000591 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000592 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000593 return I->ABIAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000594}
595
596unsigned DataLayout::getPointerPrefAlignment(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000597 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000598 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000599 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000600 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000601 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000602 return I->PrefAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000603}
604
605unsigned DataLayout::getPointerSize(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000606 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000607 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000608 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000609 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000610 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000611 return I->TypeByteWidth;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000612}
613
Pete Cooper0ae73932015-07-27 17:15:28 +0000614unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {
Matt Arsenault6f4be902013-07-26 17:37:20 +0000615 assert(Ty->isPtrOrPtrVectorTy() &&
616 "This should only be called with a pointer or pointer vector type");
Craig Topper5b4f5b02017-04-17 18:22:36 +0000617 Ty = Ty->getScalarType();
618 return getPointerSizeInBits(cast<PointerType>(Ty)->getAddressSpace());
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 {
Craig Topperff6922a2017-04-19 00:31:38 +0000630 AlignTypeEnum AlignType;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000631
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
Craig Topperff6922a2017-04-19 00:31:38 +0000679 return getAlignmentInfo(AlignType, getTypeSizeInBits(Ty), abi_or_pref, Ty);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000680}
681
Pete Cooper0ae73932015-07-27 17:15:28 +0000682unsigned DataLayout::getABITypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000683 return getAlignment(Ty, true);
684}
685
686/// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
687/// an integer type of the specified bitwidth.
Micah Villmowb4faa152012-10-04 23:01:22 +0000688unsigned DataLayout::getABIIntegerTypeAlignment(unsigned BitWidth) const {
Craig Topperc6207612014-04-09 06:08:46 +0000689 return getAlignmentInfo(INTEGER_ALIGN, BitWidth, true, nullptr);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000690}
691
Pete Cooper0ae73932015-07-27 17:15:28 +0000692unsigned DataLayout::getPrefTypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000693 return getAlignment(Ty, false);
694}
695
Pete Cooper0ae73932015-07-27 17:15:28 +0000696unsigned DataLayout::getPreferredTypeAlignmentShift(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000697 unsigned Align = getPrefTypeAlignment(Ty);
698 assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
699 return Log2_32(Align);
700}
701
Micah Villmow89021e42012-10-09 16:06:12 +0000702IntegerType *DataLayout::getIntPtrType(LLVMContext &C,
703 unsigned AddressSpace) const {
704 return IntegerType::get(C, getPointerSizeInBits(AddressSpace));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000705}
706
Pete Cooper0ae73932015-07-27 17:15:28 +0000707Type *DataLayout::getIntPtrType(Type *Ty) const {
Chandler Carruth7ec50852012-11-01 08:07:29 +0000708 assert(Ty->isPtrOrPtrVectorTy() &&
709 "Expected a pointer or pointer vector type.");
Matt Arsenault4dbd4892014-04-23 21:10:15 +0000710 unsigned NumBits = getPointerTypeSizeInBits(Ty);
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000711 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
Pete Cooper0ae73932015-07-27 17:15:28 +0000712 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000713 return VectorType::get(IntTy, VecTy->getNumElements());
714 return IntTy;
Micah Villmow12d91272012-10-24 15:52:52 +0000715}
716
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000717Type *DataLayout::getSmallestLegalIntType(LLVMContext &C, unsigned Width) const {
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000718 for (unsigned LegalIntWidth : LegalIntWidths)
719 if (Width <= LegalIntWidth)
720 return Type::getIntNTy(C, LegalIntWidth);
Craig Topperc6207612014-04-09 06:08:46 +0000721 return nullptr;
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000722}
723
Jun Bum Limbe11bdc2016-05-13 18:38:35 +0000724unsigned DataLayout::getLargestLegalIntTypeSizeInBits() const {
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000725 auto Max = std::max_element(LegalIntWidths.begin(), LegalIntWidths.end());
726 return Max != LegalIntWidths.end() ? *Max : 0;
Matt Arsenault899f7d22013-09-16 22:43:16 +0000727}
728
David Majnemer17bdf442016-07-13 03:42:38 +0000729int64_t DataLayout::getIndexedOffsetInType(Type *ElemTy,
730 ArrayRef<Value *> Indices) const {
731 int64_t Result = 0;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000732
733 generic_gep_type_iterator<Value* const*>
Peter Collingbourneab85225b2016-12-02 02:24:42 +0000734 GTI = gep_type_begin(ElemTy, Indices),
735 GTE = gep_type_end(ElemTy, Indices);
Eduard Burtescu68e7f492016-01-22 03:08:27 +0000736 for (; GTI != GTE; ++GTI) {
737 Value *Idx = GTI.getOperand();
Peter Collingbourneab85225b2016-12-02 02:24:42 +0000738 if (StructType *STy = GTI.getStructTypeOrNull()) {
Manuel Jacobcc13c2c2016-01-22 03:30:27 +0000739 assert(Idx->getType()->isIntegerTy(32) && "Illegal struct idx");
Eduard Burtescu68e7f492016-01-22 03:08:27 +0000740 unsigned FieldNo = cast<ConstantInt>(Idx)->getZExtValue();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000741
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);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000747 } else {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000748 // Get the array index and the size of each array element.
Eduard Burtescu68e7f492016-01-22 03:08:27 +0000749 if (int64_t arrayIdx = cast<ConstantInt>(Idx)->getSExtValue())
David Majnemer17bdf442016-07-13 03:42:38 +0000750 Result += arrayIdx * getTypeAllocSize(GTI.getIndexedType());
Micah Villmowac34b5c2012-10-04 22:08:14 +0000751 }
752 }
753
754 return Result;
755}
756
757/// getPreferredAlignment - Return the preferred alignment of the specified
758/// global. This includes an explicitly requested alignment (if the global
759/// has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000760unsigned DataLayout::getPreferredAlignment(const GlobalVariable *GV) const {
Manuel Jacob5f6eaac2016-01-16 20:30:46 +0000761 Type *ElemType = GV->getValueType();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000762 unsigned Alignment = getPrefTypeAlignment(ElemType);
763 unsigned GVAlignment = GV->getAlignment();
764 if (GVAlignment >= Alignment) {
765 Alignment = GVAlignment;
766 } else if (GVAlignment != 0) {
767 Alignment = std::max(GVAlignment, getABITypeAlignment(ElemType));
768 }
769
770 if (GV->hasInitializer() && GVAlignment == 0) {
771 if (Alignment < 16) {
772 // If the global is not external, see if it is large. If so, give it a
773 // larger alignment.
774 if (getTypeSizeInBits(ElemType) > 128)
775 Alignment = 16; // 16-byte alignment.
776 }
777 }
778 return Alignment;
779}
780
781/// getPreferredAlignmentLog - Return the preferred alignment of the
782/// specified global, returned in log form. This includes an explicitly
783/// requested alignment (if the global has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000784unsigned DataLayout::getPreferredAlignmentLog(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000785 return Log2_32(getPreferredAlignment(GV));
786}