blob: 289001d20205538c17f2ec53f8332be50200d5cd [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,
Elena Demikhovsky945b7e52018-02-14 06:58:08 +0000132 unsigned PrefAlign, uint32_t TypeByteWidth,
133 uint32_t IndexWidth) {
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000134 assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
Micah Villmow89021e42012-10-09 16:06:12 +0000135 PointerAlignElem retval;
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000136 retval.AddressSpace = AddressSpace;
137 retval.ABIAlign = ABIAlign;
138 retval.PrefAlign = PrefAlign;
139 retval.TypeByteWidth = TypeByteWidth;
Elena Demikhovsky945b7e52018-02-14 06:58:08 +0000140 retval.IndexWidth = IndexWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000141 return retval;
142}
143
144bool
145PointerAlignElem::operator==(const PointerAlignElem &rhs) const {
146 return (ABIAlign == rhs.ABIAlign
147 && AddressSpace == rhs.AddressSpace
148 && PrefAlign == rhs.PrefAlign
Elena Demikhovsky945b7e52018-02-14 06:58:08 +0000149 && TypeByteWidth == rhs.TypeByteWidth
150 && IndexWidth == rhs.IndexWidth);
Micah Villmow89021e42012-10-09 16:06:12 +0000151}
152
Micah Villmowac34b5c2012-10-04 22:08:14 +0000153//===----------------------------------------------------------------------===//
Micah Villmowb4faa152012-10-04 23:01:22 +0000154// DataLayout Class Implementation
Micah Villmowac34b5c2012-10-04 22:08:14 +0000155//===----------------------------------------------------------------------===//
156
Rafael Espindola58873562014-01-03 19:21:54 +0000157const char *DataLayout::getManglingComponent(const Triple &T) {
158 if (T.isOSBinFormatMachO())
159 return "-m:o";
David Majnemer7db449a2015-03-17 23:54:51 +0000160 if (T.isOSWindows() && T.isOSBinFormatCOFF())
161 return T.getArch() == Triple::x86 ? "-m:x" : "-m:w";
Saleem Abdulrasoolcd130822014-04-02 20:32:05 +0000162 return "-m:e";
Rafael Espindola58873562014-01-03 19:21:54 +0000163}
164
Rafael Espindolae23b8772013-12-20 15:21:32 +0000165static const LayoutAlignElem DefaultAlignments[] = {
Rafael Espindola458a4852013-12-19 23:03:03 +0000166 { INTEGER_ALIGN, 1, 1, 1 }, // i1
167 { INTEGER_ALIGN, 8, 1, 1 }, // i8
168 { INTEGER_ALIGN, 16, 2, 2 }, // i16
169 { INTEGER_ALIGN, 32, 4, 4 }, // i32
170 { INTEGER_ALIGN, 64, 4, 8 }, // i64
171 { FLOAT_ALIGN, 16, 2, 2 }, // half
172 { FLOAT_ALIGN, 32, 4, 4 }, // float
173 { FLOAT_ALIGN, 64, 8, 8 }, // double
174 { FLOAT_ALIGN, 128, 16, 16 }, // ppcf128, quad, ...
175 { VECTOR_ALIGN, 64, 8, 8 }, // v2i32, v1i64, ...
176 { VECTOR_ALIGN, 128, 16, 16 }, // v16i8, v8i16, v4i32, ...
177 { AGGREGATE_ALIGN, 0, 0, 8 } // struct
178};
179
Rafael Espindola248ac132014-02-25 22:23:04 +0000180void DataLayout::reset(StringRef Desc) {
181 clear();
182
Craig Topperc6207612014-04-09 06:08:46 +0000183 LayoutMap = nullptr;
Chandler Carruthf67321c2014-10-20 10:41:29 +0000184 BigEndian = false;
Matt Arsenault3c1fc762017-04-10 22:27:50 +0000185 AllocaAddrSpace = 0;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000186 StackNaturalAlign = 0;
Rafael Espindola58873562014-01-03 19:21:54 +0000187 ManglingMode = MM_None;
Sanjoy Dasc6af5ea2016-07-28 23:43:38 +0000188 NonIntegralAddressSpaces.clear();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000189
190 // Default alignments
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000191 for (const LayoutAlignElem &E : DefaultAlignments) {
Rafael Espindola458a4852013-12-19 23:03:03 +0000192 setAlignment((AlignTypeEnum)E.AlignType, E.ABIAlign, E.PrefAlign,
193 E.TypeBitWidth);
194 }
Elena Demikhovsky945b7e52018-02-14 06:58:08 +0000195 setPointerAlignment(0, 8, 8, 8, 8);
Patrik Hägglund01860a62012-11-14 09:04:56 +0000196
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000197 parseSpecifier(Desc);
198}
199
200/// Checked version of split, to ensure mandatory subparts.
201static std::pair<StringRef, StringRef> split(StringRef Str, char Separator) {
202 assert(!Str.empty() && "parse error, string can't be empty here");
203 std::pair<StringRef, StringRef> Split = Str.split(Separator);
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000204 if (Split.second.empty() && Split.first != Str)
205 report_fatal_error("Trailing separator in datalayout string");
David Majnemer612f3122014-12-10 02:36:41 +0000206 if (!Split.second.empty() && Split.first.empty())
207 report_fatal_error("Expected token before separator in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000208 return Split;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000209}
210
Cameron McInally8af9eac2014-01-07 19:51:38 +0000211/// Get an unsigned integer, including error checks.
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000212static unsigned getInt(StringRef R) {
Cameron McInallyf0379fa2014-01-13 22:04:55 +0000213 unsigned Result;
Patrik Hägglund504f4782012-11-28 14:32:52 +0000214 bool error = R.getAsInteger(10, Result); (void)error;
Cameron McInallyf0379fa2014-01-13 22:04:55 +0000215 if (error)
216 report_fatal_error("not a number, or does not fit in an unsigned int");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000217 return Result;
218}
219
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000220/// Convert bits into bytes. Assert if not a byte width multiple.
221static unsigned inBytes(unsigned Bits) {
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000222 if (Bits % 8)
223 report_fatal_error("number of bits must be a byte width multiple");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000224 return Bits / 8;
225}
226
227void DataLayout::parseSpecifier(StringRef Desc) {
Mehdi Amini46a43552015-03-04 18:43:29 +0000228 StringRepresentation = Desc;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000229 while (!Desc.empty()) {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000230 // Split at '-'.
231 std::pair<StringRef, StringRef> Split = split(Desc, '-');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000232 Desc = Split.second;
233
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000234 // Split at ':'.
235 Split = split(Split.first, ':');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000236
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000237 // Aliases used below.
238 StringRef &Tok = Split.first; // Current token.
239 StringRef &Rest = Split.second; // The rest of the string.
Micah Villmowac34b5c2012-10-04 22:08:14 +0000240
Sanjoy Dasc6af5ea2016-07-28 23:43:38 +0000241 if (Tok == "ni") {
242 do {
243 Split = split(Rest, ':');
244 Rest = Split.second;
245 unsigned AS = getInt(Split.first);
246 if (AS == 0)
247 report_fatal_error("Address space 0 can never be non-integral");
248 NonIntegralAddressSpaces.push_back(AS);
249 } while (!Rest.empty());
250
251 continue;
252 }
253
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000254 char Specifier = Tok.front();
255 Tok = Tok.substr(1);
256
257 switch (Specifier) {
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000258 case 's':
259 // Ignored for backward compatibility.
260 // FIXME: remove this on LLVM 4.0.
261 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000262 case 'E':
Chandler Carruthf67321c2014-10-20 10:41:29 +0000263 BigEndian = true;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000264 break;
265 case 'e':
Chandler Carruthf67321c2014-10-20 10:41:29 +0000266 BigEndian = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000267 break;
268 case 'p': {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000269 // Address space.
270 unsigned AddrSpace = Tok.empty() ? 0 : getInt(Tok);
David Majnemer5330c692014-12-10 01:17:08 +0000271 if (!isUInt<24>(AddrSpace))
272 report_fatal_error("Invalid address space, must be a 24bit integer");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000273
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000274 // Size.
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000275 if (Rest.empty())
276 report_fatal_error(
277 "Missing size specification for pointer in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000278 Split = split(Rest, ':');
279 unsigned PointerMemSize = inBytes(getInt(Tok));
Owen Anderson5bc2bbe2015-03-02 06:00:02 +0000280 if (!PointerMemSize)
281 report_fatal_error("Invalid pointer size of 0 bytes");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000282
283 // ABI alignment.
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000284 if (Rest.empty())
285 report_fatal_error(
286 "Missing alignment specification for pointer in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000287 Split = split(Rest, ':');
288 unsigned PointerABIAlign = inBytes(getInt(Tok));
Owen Anderson040f2f82015-03-02 06:33:51 +0000289 if (!isPowerOf2_64(PointerABIAlign))
290 report_fatal_error(
291 "Pointer ABI alignment must be a power of 2");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000292
Elena Demikhovsky945b7e52018-02-14 06:58:08 +0000293 // Size of index used in GEP for address calculation.
294 // The parameter is optional. By default it is equal to size of pointer.
295 unsigned IndexSize = PointerMemSize;
296
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000297 // Preferred alignment.
298 unsigned PointerPrefAlign = PointerABIAlign;
299 if (!Rest.empty()) {
300 Split = split(Rest, ':');
301 PointerPrefAlign = inBytes(getInt(Tok));
Owen Anderson040f2f82015-03-02 06:33:51 +0000302 if (!isPowerOf2_64(PointerPrefAlign))
303 report_fatal_error(
304 "Pointer preferred alignment must be a power of 2");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000305
Elena Demikhovsky945b7e52018-02-14 06:58:08 +0000306 // Now read the index. It is the second optional parameter here.
307 if (!Rest.empty()) {
308 Split = split(Rest, ':');
309 IndexSize = inBytes(getInt(Tok));
310 if (!IndexSize)
311 report_fatal_error("Invalid index size of 0 bytes");
312 }
313 }
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000314 setPointerAlignment(AddrSpace, PointerABIAlign, PointerPrefAlign,
Elena Demikhovsky945b7e52018-02-14 06:58:08 +0000315 PointerMemSize, IndexSize);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000316 break;
317 }
318 case 'i':
319 case 'v':
320 case 'f':
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000321 case 'a': {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000322 AlignTypeEnum AlignType;
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000323 switch (Specifier) {
Craig Topper64a65ec2017-05-22 19:28:36 +0000324 default: llvm_unreachable("Unexpected specifier!");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000325 case 'i': AlignType = INTEGER_ALIGN; break;
326 case 'v': AlignType = VECTOR_ALIGN; break;
327 case 'f': AlignType = FLOAT_ALIGN; break;
328 case 'a': AlignType = AGGREGATE_ALIGN; break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000329 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000330
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000331 // Bit size.
332 unsigned Size = Tok.empty() ? 0 : getInt(Tok);
333
David Majnemer5330c692014-12-10 01:17:08 +0000334 if (AlignType == AGGREGATE_ALIGN && Size != 0)
335 report_fatal_error(
336 "Sized aggregate specification in datalayout string");
Rafael Espindolaabdd7262014-01-06 21:40:24 +0000337
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000338 // ABI alignment.
David Majnemer612f3122014-12-10 02:36:41 +0000339 if (Rest.empty())
340 report_fatal_error(
341 "Missing alignment specification in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000342 Split = split(Rest, ':');
343 unsigned ABIAlign = inBytes(getInt(Tok));
Owen Andersonab1c7a72015-03-02 09:34:59 +0000344 if (AlignType != AGGREGATE_ALIGN && !ABIAlign)
345 report_fatal_error(
346 "ABI alignment specification must be >0 for non-aggregate types");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000347
348 // Preferred alignment.
349 unsigned PrefAlign = ABIAlign;
350 if (!Rest.empty()) {
351 Split = split(Rest, ':');
352 PrefAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000353 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000354
Patrik Hägglund01860a62012-11-14 09:04:56 +0000355 setAlignment(AlignType, ABIAlign, PrefAlign, Size);
Micah Villmowb4faa152012-10-04 23:01:22 +0000356
Micah Villmowac34b5c2012-10-04 22:08:14 +0000357 break;
358 }
359 case 'n': // Native integer types.
Eugene Zelenkof53a7b42017-05-05 22:30:37 +0000360 while (true) {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000361 unsigned Width = getInt(Tok);
David Majnemer5330c692014-12-10 01:17:08 +0000362 if (Width == 0)
363 report_fatal_error(
364 "Zero width native integer type in datalayout string");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000365 LegalIntWidths.push_back(Width);
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000366 if (Rest.empty())
367 break;
368 Split = split(Rest, ':');
369 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000370 break;
371 case 'S': { // Stack natural alignment.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000372 StackNaturalAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000373 break;
374 }
Matt Arsenault3c1fc762017-04-10 22:27:50 +0000375 case 'A': { // Default stack/alloca address space.
376 AllocaAddrSpace = getInt(Tok);
377 if (!isUInt<24>(AllocaAddrSpace))
378 report_fatal_error("Invalid address space, must be a 24bit integer");
379 break;
380 }
Rafael Espindola58873562014-01-03 19:21:54 +0000381 case 'm':
David Majnemer612f3122014-12-10 02:36:41 +0000382 if (!Tok.empty())
383 report_fatal_error("Unexpected trailing characters after mangling specifier in datalayout string");
384 if (Rest.empty())
385 report_fatal_error("Expected mangling specifier in datalayout string");
386 if (Rest.size() > 1)
387 report_fatal_error("Unknown mangling specifier in datalayout string");
Rafael Espindola58873562014-01-03 19:21:54 +0000388 switch(Rest[0]) {
389 default:
David Majnemer5330c692014-12-10 01:17:08 +0000390 report_fatal_error("Unknown mangling in datalayout string");
Rafael Espindola58873562014-01-03 19:21:54 +0000391 case 'e':
392 ManglingMode = MM_ELF;
393 break;
394 case 'o':
395 ManglingMode = MM_MachO;
396 break;
397 case 'm':
398 ManglingMode = MM_Mips;
399 break;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000400 case 'w':
David Majnemer7db449a2015-03-17 23:54:51 +0000401 ManglingMode = MM_WinCOFF;
402 break;
403 case 'x':
404 ManglingMode = MM_WinCOFFX86;
Rafael Espindola58873562014-01-03 19:21:54 +0000405 break;
406 }
407 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000408 default:
David Majnemer5330c692014-12-10 01:17:08 +0000409 report_fatal_error("Unknown specifier in datalayout string");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000410 break;
411 }
412 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000413}
414
Eugene Zelenkof53a7b42017-05-05 22:30:37 +0000415DataLayout::DataLayout(const Module *M) {
Rafael Espindolac435adc2014-09-10 21:27:43 +0000416 init(M);
417}
418
Mehdi Amini46a43552015-03-04 18:43:29 +0000419void DataLayout::init(const Module *M) { *this = M->getDataLayout(); }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000420
Rafael Espindolaae593f12014-02-26 17:02:08 +0000421bool DataLayout::operator==(const DataLayout &Other) const {
Chandler Carruthf67321c2014-10-20 10:41:29 +0000422 bool Ret = BigEndian == Other.BigEndian &&
Matt Arsenault3c1fc762017-04-10 22:27:50 +0000423 AllocaAddrSpace == Other.AllocaAddrSpace &&
Rafael Espindolaae593f12014-02-26 17:02:08 +0000424 StackNaturalAlign == Other.StackNaturalAlign &&
425 ManglingMode == Other.ManglingMode &&
426 LegalIntWidths == Other.LegalIntWidths &&
Rafael Espindola89992b02014-04-22 17:47:03 +0000427 Alignments == Other.Alignments && Pointers == Other.Pointers;
Mehdi Amini46a43552015-03-04 18:43:29 +0000428 // Note: getStringRepresentation() might differs, it is not canonicalized
Rafael Espindolaae593f12014-02-26 17:02:08 +0000429 return Ret;
430}
431
Craig Topper490889c2017-03-23 06:15:56 +0000432DataLayout::AlignmentsTy::iterator
433DataLayout::findAlignmentLowerBound(AlignTypeEnum AlignType,
434 uint32_t BitWidth) {
435 auto Pair = std::make_pair((unsigned)AlignType, BitWidth);
436 return std::lower_bound(Alignments.begin(), Alignments.end(), Pair,
437 [](const LayoutAlignElem &LHS,
438 const std::pair<unsigned, uint32_t> &RHS) {
439 return std::tie(LHS.AlignType, LHS.TypeBitWidth) <
440 std::tie(RHS.first, RHS.second);
441 });
442}
443
Micah Villmowac34b5c2012-10-04 22:08:14 +0000444void
Micah Villmowb4faa152012-10-04 23:01:22 +0000445DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000446 unsigned pref_align, uint32_t bit_width) {
David Majnemer1b9fc3a2015-02-16 05:41:53 +0000447 if (!isUInt<24>(bit_width))
448 report_fatal_error("Invalid bit width, must be a 24bit integer");
449 if (!isUInt<16>(abi_align))
450 report_fatal_error("Invalid ABI alignment, must be a 16bit integer");
451 if (!isUInt<16>(pref_align))
452 report_fatal_error("Invalid preferred alignment, must be a 16bit integer");
Owen Anderson5af4b212015-03-02 09:35:03 +0000453 if (abi_align != 0 && !isPowerOf2_64(abi_align))
454 report_fatal_error("Invalid ABI alignment, must be a power of 2");
455 if (pref_align != 0 && !isPowerOf2_64(pref_align))
456 report_fatal_error("Invalid preferred alignment, must be a power of 2");
David Majnemer1b9fc3a2015-02-16 05:41:53 +0000457
458 if (pref_align < abi_align)
459 report_fatal_error(
460 "Preferred alignment cannot be less than the ABI alignment");
461
Craig Topper490889c2017-03-23 06:15:56 +0000462 AlignmentsTy::iterator I = findAlignmentLowerBound(align_type, bit_width);
463 if (I != Alignments.end() &&
464 I->AlignType == (unsigned)align_type && I->TypeBitWidth == bit_width) {
465 // Update the abi, preferred alignments.
466 I->ABIAlign = abi_align;
467 I->PrefAlign = pref_align;
468 } else {
469 // Insert before I to keep the vector sorted.
470 Alignments.insert(I, LayoutAlignElem::get(align_type, abi_align,
471 pref_align, bit_width));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000472 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000473}
474
Rafael Espindola667fcb82014-02-26 16:58:35 +0000475DataLayout::PointersTy::iterator
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000476DataLayout::findPointerLowerBound(uint32_t AddressSpace) {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000477 return std::lower_bound(Pointers.begin(), Pointers.end(), AddressSpace,
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000478 [](const PointerAlignElem &A, uint32_t AddressSpace) {
479 return A.AddressSpace < AddressSpace;
480 });
Rafael Espindola667fcb82014-02-26 16:58:35 +0000481}
482
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000483void DataLayout::setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign,
Elena Demikhovsky945b7e52018-02-14 06:58:08 +0000484 unsigned PrefAlign, uint32_t TypeByteWidth,
485 uint32_t IndexWidth) {
David Majnemer4b042922015-02-16 05:41:55 +0000486 if (PrefAlign < ABIAlign)
487 report_fatal_error(
488 "Preferred alignment cannot be less than the ABI alignment");
489
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000490 PointersTy::iterator I = findPointerLowerBound(AddrSpace);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000491 if (I == Pointers.end() || I->AddressSpace != AddrSpace) {
492 Pointers.insert(I, PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign,
Elena Demikhovsky945b7e52018-02-14 06:58:08 +0000493 TypeByteWidth, IndexWidth));
Micah Villmow89021e42012-10-09 16:06:12 +0000494 } else {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000495 I->ABIAlign = ABIAlign;
496 I->PrefAlign = PrefAlign;
497 I->TypeByteWidth = TypeByteWidth;
Elena Demikhovsky945b7e52018-02-14 06:58:08 +0000498 I->IndexWidth = IndexWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000499 }
500}
501
Micah Villmowac34b5c2012-10-04 22:08:14 +0000502/// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
Micah Villmowb4faa152012-10-04 23:01:22 +0000503/// preferred if ABIInfo = false) the layout wants for the specified datatype.
504unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000505 uint32_t BitWidth, bool ABIInfo,
Pete Cooper0ae73932015-07-27 17:15:28 +0000506 Type *Ty) const {
Craig Topper490889c2017-03-23 06:15:56 +0000507 AlignmentsTy::const_iterator I = findAlignmentLowerBound(AlignType, BitWidth);
508 // See if we found an exact match. Of if we are looking for an integer type,
509 // but don't have an exact match take the next largest integer. This is where
510 // the lower_bound will point to when it fails an exact match.
511 if (I != Alignments.end() && I->AlignType == (unsigned)AlignType &&
512 (I->TypeBitWidth == BitWidth || AlignType == INTEGER_ALIGN))
513 return ABIInfo ? I->ABIAlign : I->PrefAlign;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000514
Craig Topper490889c2017-03-23 06:15:56 +0000515 if (AlignType == INTEGER_ALIGN) {
516 // If we didn't have a larger value try the largest value we have.
517 if (I != Alignments.begin()) {
518 --I; // Go to the previous entry and see if its an integer.
519 if (I->AlignType == INTEGER_ALIGN)
520 return ABIInfo ? I->ABIAlign : I->PrefAlign;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000521 }
Craig Topper490889c2017-03-23 06:15:56 +0000522 } else if (AlignType == VECTOR_ALIGN) {
523 // By default, use natural alignment for vector types. This is consistent
524 // with what clang and llvm-gcc do.
525 unsigned Align = getTypeAllocSize(cast<VectorType>(Ty)->getElementType());
526 Align *= cast<VectorType>(Ty)->getNumElements();
527 Align = PowerOf2Ceil(Align);
528 return Align;
529 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000530
Owen Anderson7e621e92015-03-08 21:53:59 +0000531 // If we still couldn't find a reasonable default alignment, fall back
532 // to a simple heuristic that the alignment is the first power of two
533 // greater-or-equal to the store size of the type. This is a reasonable
534 // approximation of reality, and if the user wanted something less
535 // less conservative, they should have specified it explicitly in the data
536 // layout.
Craig Topper490889c2017-03-23 06:15:56 +0000537 unsigned Align = getTypeStoreSize(Ty);
538 Align = PowerOf2Ceil(Align);
539 return Align;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000540}
541
542namespace {
543
544class StructLayoutMap {
Eugene Zelenkof53a7b42017-05-05 22:30:37 +0000545 using LayoutInfoTy = DenseMap<StructType*, StructLayout*>;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000546 LayoutInfoTy LayoutInfo;
547
548public:
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000549 ~StructLayoutMap() {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000550 // Remove any layouts.
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000551 for (const auto &I : LayoutInfo) {
552 StructLayout *Value = I.second;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000553 Value->~StructLayout();
554 free(Value);
555 }
556 }
557
Pete Cooper0ae73932015-07-27 17:15:28 +0000558 StructLayout *&operator[](StructType *STy) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000559 return LayoutInfo[STy];
560 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000561};
562
563} // end anonymous namespace
564
Rafael Espindola248ac132014-02-25 22:23:04 +0000565void DataLayout::clear() {
566 LegalIntWidths.clear();
567 Alignments.clear();
568 Pointers.clear();
569 delete static_cast<StructLayoutMap *>(LayoutMap);
Craig Topperc6207612014-04-09 06:08:46 +0000570 LayoutMap = nullptr;
Rafael Espindola248ac132014-02-25 22:23:04 +0000571}
572
Micah Villmowb4faa152012-10-04 23:01:22 +0000573DataLayout::~DataLayout() {
Rafael Espindola248ac132014-02-25 22:23:04 +0000574 clear();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000575}
576
Pete Cooper0ae73932015-07-27 17:15:28 +0000577const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000578 if (!LayoutMap)
579 LayoutMap = new StructLayoutMap();
580
581 StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
582 StructLayout *&SL = (*STM)[Ty];
583 if (SL) return SL;
584
585 // Otherwise, create the struct layout. Because it is variable length, we
586 // malloc it, then use placement new.
587 int NumElts = Ty->getNumElements();
588 StructLayout *L =
589 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t));
Matthias Braunc20b3382017-07-20 01:30:39 +0000590 if (L == nullptr)
591 report_bad_alloc_error("Allocation of StructLayout elements failed.");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000592
593 // Set SL before calling StructLayout's ctor. The ctor could cause other
594 // entries to be added to TheMap, invalidating our reference.
595 SL = L;
596
597 new (L) StructLayout(Ty, *this);
598
599 return L;
600}
601
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000602unsigned DataLayout::getPointerABIAlignment(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->ABIAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000609}
610
611unsigned DataLayout::getPointerPrefAlignment(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000612 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000613 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000614 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000615 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000616 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000617 return I->PrefAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000618}
619
620unsigned DataLayout::getPointerSize(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000621 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000622 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000623 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000624 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000625 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000626 return I->TypeByteWidth;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000627}
628
Pete Cooper0ae73932015-07-27 17:15:28 +0000629unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {
Matt Arsenault6f4be902013-07-26 17:37:20 +0000630 assert(Ty->isPtrOrPtrVectorTy() &&
631 "This should only be called with a pointer or pointer vector type");
Craig Topper5b4f5b02017-04-17 18:22:36 +0000632 Ty = Ty->getScalarType();
633 return getPointerSizeInBits(cast<PointerType>(Ty)->getAddressSpace());
Matt Arsenault6f4be902013-07-26 17:37:20 +0000634}
Micah Villmowac34b5c2012-10-04 22:08:14 +0000635
Elena Demikhovsky945b7e52018-02-14 06:58:08 +0000636unsigned DataLayout::getIndexSize(unsigned AS) const {
637 PointersTy::const_iterator I = findPointerLowerBound(AS);
638 if (I == Pointers.end() || I->AddressSpace != AS) {
639 I = findPointerLowerBound(0);
640 assert(I->AddressSpace == 0);
641 }
642 return I->IndexWidth;
643}
644
645unsigned DataLayout::getIndexTypeSizeInBits(Type *Ty) const {
646 assert(Ty->isPtrOrPtrVectorTy() &&
647 "This should only be called with a pointer or pointer vector type");
648 Ty = Ty->getScalarType();
649 return getIndexSizeInBits(cast<PointerType>(Ty)->getAddressSpace());
650}
651
Micah Villmowac34b5c2012-10-04 22:08:14 +0000652/*!
653 \param abi_or_pref Flag that determines which alignment is returned. true
654 returns the ABI alignment, false returns the preferred alignment.
655 \param Ty The underlying type for which alignment is determined.
656
657 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
658 == false) for the requested type \a Ty.
659 */
Pete Cooper0ae73932015-07-27 17:15:28 +0000660unsigned DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
Craig Topperff6922a2017-04-19 00:31:38 +0000661 AlignTypeEnum AlignType;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000662
663 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
664 switch (Ty->getTypeID()) {
665 // Early escape for the non-numeric types.
666 case Type::LabelTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000667 return (abi_or_pref
Micah Villmow89021e42012-10-09 16:06:12 +0000668 ? getPointerABIAlignment(0)
669 : getPointerPrefAlignment(0));
670 case Type::PointerTyID: {
Matt Arsenaultc1728972014-09-18 22:28:56 +0000671 unsigned AS = cast<PointerType>(Ty)->getAddressSpace();
Micah Villmow89021e42012-10-09 16:06:12 +0000672 return (abi_or_pref
673 ? getPointerABIAlignment(AS)
674 : getPointerPrefAlignment(AS));
675 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000676 case Type::ArrayTyID:
677 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
678
679 case Type::StructTyID: {
680 // Packed structure types always have an ABI alignment of one.
681 if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
682 return 1;
683
684 // Get the layout annotation... which is lazily created on demand.
685 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
686 unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty);
687 return std::max(Align, Layout->getAlignment());
688 }
689 case Type::IntegerTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000690 AlignType = INTEGER_ALIGN;
691 break;
692 case Type::HalfTyID:
693 case Type::FloatTyID:
694 case Type::DoubleTyID:
695 // PPC_FP128TyID and FP128TyID have different data contents, but the
696 // same size and alignment, so they look the same here.
697 case Type::PPC_FP128TyID:
698 case Type::FP128TyID:
699 case Type::X86_FP80TyID:
700 AlignType = FLOAT_ALIGN;
701 break;
702 case Type::X86_MMXTyID:
703 case Type::VectorTyID:
704 AlignType = VECTOR_ALIGN;
705 break;
706 default:
707 llvm_unreachable("Bad type for getAlignment!!!");
708 }
709
Craig Topperff6922a2017-04-19 00:31:38 +0000710 return getAlignmentInfo(AlignType, getTypeSizeInBits(Ty), abi_or_pref, Ty);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000711}
712
Pete Cooper0ae73932015-07-27 17:15:28 +0000713unsigned DataLayout::getABITypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000714 return getAlignment(Ty, true);
715}
716
717/// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
718/// an integer type of the specified bitwidth.
Micah Villmowb4faa152012-10-04 23:01:22 +0000719unsigned DataLayout::getABIIntegerTypeAlignment(unsigned BitWidth) const {
Craig Topperc6207612014-04-09 06:08:46 +0000720 return getAlignmentInfo(INTEGER_ALIGN, BitWidth, true, nullptr);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000721}
722
Pete Cooper0ae73932015-07-27 17:15:28 +0000723unsigned DataLayout::getPrefTypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000724 return getAlignment(Ty, false);
725}
726
Pete Cooper0ae73932015-07-27 17:15:28 +0000727unsigned DataLayout::getPreferredTypeAlignmentShift(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000728 unsigned Align = getPrefTypeAlignment(Ty);
729 assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
730 return Log2_32(Align);
731}
732
Micah Villmow89021e42012-10-09 16:06:12 +0000733IntegerType *DataLayout::getIntPtrType(LLVMContext &C,
734 unsigned AddressSpace) const {
Elena Demikhovsky945b7e52018-02-14 06:58:08 +0000735 return IntegerType::get(C, getIndexSizeInBits(AddressSpace));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000736}
737
Pete Cooper0ae73932015-07-27 17:15:28 +0000738Type *DataLayout::getIntPtrType(Type *Ty) const {
Chandler Carruth7ec50852012-11-01 08:07:29 +0000739 assert(Ty->isPtrOrPtrVectorTy() &&
740 "Expected a pointer or pointer vector type.");
Elena Demikhovsky945b7e52018-02-14 06:58:08 +0000741 unsigned NumBits = getIndexTypeSizeInBits(Ty);
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000742 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
Pete Cooper0ae73932015-07-27 17:15:28 +0000743 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000744 return VectorType::get(IntTy, VecTy->getNumElements());
745 return IntTy;
Micah Villmow12d91272012-10-24 15:52:52 +0000746}
747
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000748Type *DataLayout::getSmallestLegalIntType(LLVMContext &C, unsigned Width) const {
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000749 for (unsigned LegalIntWidth : LegalIntWidths)
750 if (Width <= LegalIntWidth)
751 return Type::getIntNTy(C, LegalIntWidth);
Craig Topperc6207612014-04-09 06:08:46 +0000752 return nullptr;
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000753}
754
Jun Bum Limbe11bdc2016-05-13 18:38:35 +0000755unsigned DataLayout::getLargestLegalIntTypeSizeInBits() const {
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000756 auto Max = std::max_element(LegalIntWidths.begin(), LegalIntWidths.end());
757 return Max != LegalIntWidths.end() ? *Max : 0;
Matt Arsenault899f7d22013-09-16 22:43:16 +0000758}
759
Elena Demikhovsky945b7e52018-02-14 06:58:08 +0000760Type *DataLayout::getIndexType(Type *Ty) const {
761 assert(Ty->isPtrOrPtrVectorTy() &&
762 "Expected a pointer or pointer vector type.");
763 unsigned NumBits = getIndexTypeSizeInBits(Ty);
764 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
765 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
766 return VectorType::get(IntTy, VecTy->getNumElements());
767 return IntTy;
768}
769
David Majnemer17bdf442016-07-13 03:42:38 +0000770int64_t DataLayout::getIndexedOffsetInType(Type *ElemTy,
771 ArrayRef<Value *> Indices) const {
772 int64_t Result = 0;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000773
774 generic_gep_type_iterator<Value* const*>
Peter Collingbourneab85225b2016-12-02 02:24:42 +0000775 GTI = gep_type_begin(ElemTy, Indices),
776 GTE = gep_type_end(ElemTy, Indices);
Eduard Burtescu68e7f492016-01-22 03:08:27 +0000777 for (; GTI != GTE; ++GTI) {
778 Value *Idx = GTI.getOperand();
Peter Collingbourneab85225b2016-12-02 02:24:42 +0000779 if (StructType *STy = GTI.getStructTypeOrNull()) {
Manuel Jacobcc13c2c2016-01-22 03:30:27 +0000780 assert(Idx->getType()->isIntegerTy(32) && "Illegal struct idx");
Eduard Burtescu68e7f492016-01-22 03:08:27 +0000781 unsigned FieldNo = cast<ConstantInt>(Idx)->getZExtValue();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000782
783 // Get structure layout information...
784 const StructLayout *Layout = getStructLayout(STy);
785
786 // Add in the offset, as calculated by the structure layout info...
787 Result += Layout->getElementOffset(FieldNo);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000788 } else {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000789 // Get the array index and the size of each array element.
Eduard Burtescu68e7f492016-01-22 03:08:27 +0000790 if (int64_t arrayIdx = cast<ConstantInt>(Idx)->getSExtValue())
David Majnemer17bdf442016-07-13 03:42:38 +0000791 Result += arrayIdx * getTypeAllocSize(GTI.getIndexedType());
Micah Villmowac34b5c2012-10-04 22:08:14 +0000792 }
793 }
794
795 return Result;
796}
797
798/// getPreferredAlignment - Return the preferred alignment of the specified
799/// global. This includes an explicitly requested alignment (if the global
800/// has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000801unsigned DataLayout::getPreferredAlignment(const GlobalVariable *GV) const {
Manuel Jacob5f6eaac2016-01-16 20:30:46 +0000802 Type *ElemType = GV->getValueType();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000803 unsigned Alignment = getPrefTypeAlignment(ElemType);
804 unsigned GVAlignment = GV->getAlignment();
805 if (GVAlignment >= Alignment) {
806 Alignment = GVAlignment;
807 } else if (GVAlignment != 0) {
808 Alignment = std::max(GVAlignment, getABITypeAlignment(ElemType));
809 }
810
811 if (GV->hasInitializer() && GVAlignment == 0) {
812 if (Alignment < 16) {
813 // If the global is not external, see if it is large. If so, give it a
814 // larger alignment.
815 if (getTypeSizeInBits(ElemType) > 128)
816 Alignment = 16; // 16-byte alignment.
817 }
818 }
819 return Alignment;
820}
821
822/// getPreferredAlignmentLog - Return the preferred alignment of the
823/// specified global, returned in log form. This includes an explicitly
824/// requested alignment (if the global has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000825unsigned DataLayout::getPreferredAlignmentLog(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000826 return Log2_32(getPreferredAlignment(GV));
827}