blob: 4e0c066b1c8e0cf6540a94a342c66389ff95624e [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 Villmowb4faa152012-10-04 23:01:22 +000036// Handle the Pass registration stuff necessary to use DataLayout's.
Micah Villmowac34b5c2012-10-04 22:08:14 +000037
Rafael Espindola93512512014-02-25 17:30:31 +000038INITIALIZE_PASS(DataLayoutPass, "datalayout", "Data Layout", false, true)
39char DataLayoutPass::ID = 0;
Micah Villmowac34b5c2012-10-04 22:08:14 +000040
41//===----------------------------------------------------------------------===//
42// Support for StructLayout
43//===----------------------------------------------------------------------===//
44
Eli Bendersky41913c72013-04-16 15:41:18 +000045StructLayout::StructLayout(StructType *ST, const DataLayout &DL) {
Micah Villmowac34b5c2012-10-04 22:08:14 +000046 assert(!ST->isOpaque() && "Cannot get layout of opaque structs");
47 StructAlignment = 0;
48 StructSize = 0;
49 NumElements = ST->getNumElements();
50
51 // Loop over each of the elements, placing them in memory.
52 for (unsigned i = 0, e = NumElements; i != e; ++i) {
53 Type *Ty = ST->getElementType(i);
Eli Bendersky41913c72013-04-16 15:41:18 +000054 unsigned TyAlign = ST->isPacked() ? 1 : DL.getABITypeAlignment(Ty);
Micah Villmowac34b5c2012-10-04 22:08:14 +000055
56 // Add padding if necessary to align the data element properly.
57 if ((StructSize & (TyAlign-1)) != 0)
David Majnemerf3cadce2014-10-20 06:13:33 +000058 StructSize = RoundUpToAlignment(StructSize, TyAlign);
Micah Villmowac34b5c2012-10-04 22:08:14 +000059
60 // Keep track of maximum alignment constraint.
61 StructAlignment = std::max(TyAlign, StructAlignment);
62
63 MemberOffsets[i] = StructSize;
Eli Bendersky41913c72013-04-16 15:41:18 +000064 StructSize += DL.getTypeAllocSize(Ty); // Consume space for this data item
Micah Villmowac34b5c2012-10-04 22:08:14 +000065 }
66
67 // Empty structures have alignment of 1 byte.
68 if (StructAlignment == 0) StructAlignment = 1;
69
70 // Add padding to the end of the struct so that it could be put in an array
71 // and all array elements would be aligned correctly.
72 if ((StructSize & (StructAlignment-1)) != 0)
David Majnemerf3cadce2014-10-20 06:13:33 +000073 StructSize = RoundUpToAlignment(StructSize, StructAlignment);
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";
Saleem Abdulrasoolcd130822014-04-02 20:32:05 +0000158 if (T.isOSWindows() && T.getArch() == Triple::x86 && T.isOSBinFormatCOFF())
159 return "-m:w";
160 return "-m:e";
Rafael Espindola58873562014-01-03 19:21:54 +0000161}
162
Rafael Espindolae23b8772013-12-20 15:21:32 +0000163static const LayoutAlignElem DefaultAlignments[] = {
Rafael Espindola458a4852013-12-19 23:03:03 +0000164 { INTEGER_ALIGN, 1, 1, 1 }, // i1
165 { INTEGER_ALIGN, 8, 1, 1 }, // i8
166 { INTEGER_ALIGN, 16, 2, 2 }, // i16
167 { INTEGER_ALIGN, 32, 4, 4 }, // i32
168 { INTEGER_ALIGN, 64, 4, 8 }, // i64
169 { FLOAT_ALIGN, 16, 2, 2 }, // half
170 { FLOAT_ALIGN, 32, 4, 4 }, // float
171 { FLOAT_ALIGN, 64, 8, 8 }, // double
172 { FLOAT_ALIGN, 128, 16, 16 }, // ppcf128, quad, ...
173 { VECTOR_ALIGN, 64, 8, 8 }, // v2i32, v1i64, ...
174 { VECTOR_ALIGN, 128, 16, 16 }, // v16i8, v8i16, v4i32, ...
175 { AGGREGATE_ALIGN, 0, 0, 8 } // struct
176};
177
Rafael Espindola248ac132014-02-25 22:23:04 +0000178void DataLayout::reset(StringRef Desc) {
179 clear();
180
Craig Topperc6207612014-04-09 06:08:46 +0000181 LayoutMap = nullptr;
Chandler Carruthf67321c2014-10-20 10:41:29 +0000182 BigEndian = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000183 StackNaturalAlign = 0;
Rafael Espindola58873562014-01-03 19:21:54 +0000184 ManglingMode = MM_None;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000185
186 // Default alignments
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000187 for (const LayoutAlignElem &E : DefaultAlignments) {
Rafael Espindola458a4852013-12-19 23:03:03 +0000188 setAlignment((AlignTypeEnum)E.AlignType, E.ABIAlign, E.PrefAlign,
189 E.TypeBitWidth);
190 }
Micah Villmow89021e42012-10-09 16:06:12 +0000191 setPointerAlignment(0, 8, 8, 8);
Patrik Hägglund01860a62012-11-14 09:04:56 +0000192
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000193 parseSpecifier(Desc);
194}
195
196/// Checked version of split, to ensure mandatory subparts.
197static std::pair<StringRef, StringRef> split(StringRef Str, char Separator) {
198 assert(!Str.empty() && "parse error, string can't be empty here");
199 std::pair<StringRef, StringRef> Split = Str.split(Separator);
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000200 if (Split.second.empty() && Split.first != Str)
201 report_fatal_error("Trailing separator in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000202 return Split;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000203}
204
Cameron McInally8af9eac2014-01-07 19:51:38 +0000205/// Get an unsigned integer, including error checks.
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000206static unsigned getInt(StringRef R) {
Cameron McInallyf0379fa2014-01-13 22:04:55 +0000207 unsigned Result;
Patrik Hägglund504f4782012-11-28 14:32:52 +0000208 bool error = R.getAsInteger(10, Result); (void)error;
Cameron McInallyf0379fa2014-01-13 22:04:55 +0000209 if (error)
210 report_fatal_error("not a number, or does not fit in an unsigned int");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000211 return Result;
212}
213
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000214/// Convert bits into bytes. Assert if not a byte width multiple.
215static unsigned inBytes(unsigned Bits) {
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000216 if (Bits % 8)
217 report_fatal_error("number of bits must be a byte width multiple");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000218 return Bits / 8;
219}
220
221void DataLayout::parseSpecifier(StringRef Desc) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000222 while (!Desc.empty()) {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000223 // Split at '-'.
224 std::pair<StringRef, StringRef> Split = split(Desc, '-');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000225 Desc = Split.second;
226
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000227 // Split at ':'.
228 Split = split(Split.first, ':');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000229
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000230 // Aliases used below.
231 StringRef &Tok = Split.first; // Current token.
232 StringRef &Rest = Split.second; // The rest of the string.
Micah Villmowac34b5c2012-10-04 22:08:14 +0000233
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000234 char Specifier = Tok.front();
235 Tok = Tok.substr(1);
236
237 switch (Specifier) {
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000238 case 's':
239 // Ignored for backward compatibility.
240 // FIXME: remove this on LLVM 4.0.
241 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000242 case 'E':
Chandler Carruthf67321c2014-10-20 10:41:29 +0000243 BigEndian = true;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000244 break;
245 case 'e':
Chandler Carruthf67321c2014-10-20 10:41:29 +0000246 BigEndian = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000247 break;
248 case 'p': {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000249 // Address space.
250 unsigned AddrSpace = Tok.empty() ? 0 : getInt(Tok);
David Majnemer5330c692014-12-10 01:17:08 +0000251 if (!isUInt<24>(AddrSpace))
252 report_fatal_error("Invalid address space, must be a 24bit integer");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000253
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000254 // Size.
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000255 if (Rest.empty())
256 report_fatal_error(
257 "Missing size specification for pointer in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000258 Split = split(Rest, ':');
259 unsigned PointerMemSize = inBytes(getInt(Tok));
260
261 // ABI alignment.
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000262 if (Rest.empty())
263 report_fatal_error(
264 "Missing alignment specification for pointer in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000265 Split = split(Rest, ':');
266 unsigned PointerABIAlign = inBytes(getInt(Tok));
267
268 // Preferred alignment.
269 unsigned PointerPrefAlign = PointerABIAlign;
270 if (!Rest.empty()) {
271 Split = split(Rest, ':');
272 PointerPrefAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000273 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000274
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000275 setPointerAlignment(AddrSpace, PointerABIAlign, PointerPrefAlign,
276 PointerMemSize);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000277 break;
278 }
279 case 'i':
280 case 'v':
281 case 'f':
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000282 case 'a': {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000283 AlignTypeEnum AlignType;
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000284 switch (Specifier) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000285 default:
286 case 'i': AlignType = INTEGER_ALIGN; break;
287 case 'v': AlignType = VECTOR_ALIGN; break;
288 case 'f': AlignType = FLOAT_ALIGN; break;
289 case 'a': AlignType = AGGREGATE_ALIGN; break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000290 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000291
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000292 // Bit size.
293 unsigned Size = Tok.empty() ? 0 : getInt(Tok);
294
David Majnemer5330c692014-12-10 01:17:08 +0000295 if (AlignType == AGGREGATE_ALIGN && Size != 0)
296 report_fatal_error(
297 "Sized aggregate specification in datalayout string");
Rafael Espindolaabdd7262014-01-06 21:40:24 +0000298
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000299 // ABI alignment.
300 Split = split(Rest, ':');
301 unsigned ABIAlign = inBytes(getInt(Tok));
302
303 // Preferred alignment.
304 unsigned PrefAlign = ABIAlign;
305 if (!Rest.empty()) {
306 Split = split(Rest, ':');
307 PrefAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000308 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000309
Patrik Hägglund01860a62012-11-14 09:04:56 +0000310 setAlignment(AlignType, ABIAlign, PrefAlign, Size);
Micah Villmowb4faa152012-10-04 23:01:22 +0000311
Micah Villmowac34b5c2012-10-04 22:08:14 +0000312 break;
313 }
314 case 'n': // Native integer types.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000315 for (;;) {
316 unsigned Width = getInt(Tok);
David Majnemer5330c692014-12-10 01:17:08 +0000317 if (Width == 0)
318 report_fatal_error(
319 "Zero width native integer type in datalayout string");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000320 LegalIntWidths.push_back(Width);
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000321 if (Rest.empty())
322 break;
323 Split = split(Rest, ':');
324 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000325 break;
326 case 'S': { // Stack natural alignment.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000327 StackNaturalAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000328 break;
329 }
Rafael Espindola58873562014-01-03 19:21:54 +0000330 case 'm':
331 assert(Tok.empty());
332 assert(Rest.size() == 1);
333 switch(Rest[0]) {
334 default:
David Majnemer5330c692014-12-10 01:17:08 +0000335 report_fatal_error("Unknown mangling in datalayout string");
Rafael Espindola58873562014-01-03 19:21:54 +0000336 case 'e':
337 ManglingMode = MM_ELF;
338 break;
339 case 'o':
340 ManglingMode = MM_MachO;
341 break;
342 case 'm':
343 ManglingMode = MM_Mips;
344 break;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000345 case 'w':
346 ManglingMode = MM_WINCOFF;
Rafael Espindola58873562014-01-03 19:21:54 +0000347 break;
348 }
349 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000350 default:
David Majnemer5330c692014-12-10 01:17:08 +0000351 report_fatal_error("Unknown specifier in datalayout string");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000352 break;
353 }
354 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000355}
356
Craig Topperc6207612014-04-09 06:08:46 +0000357DataLayout::DataLayout(const Module *M) : LayoutMap(nullptr) {
Rafael Espindolac435adc2014-09-10 21:27:43 +0000358 init(M);
359}
360
361void DataLayout::init(const Module *M) {
Rafael Espindolaf863ee22014-02-25 20:01:08 +0000362 const DataLayout *Other = M->getDataLayout();
363 if (Other)
364 *this = *Other;
365 else
Rafael Espindola248ac132014-02-25 22:23:04 +0000366 reset("");
Rafael Espindolaf863ee22014-02-25 20:01:08 +0000367}
Micah Villmowac34b5c2012-10-04 22:08:14 +0000368
Rafael Espindolaae593f12014-02-26 17:02:08 +0000369bool DataLayout::operator==(const DataLayout &Other) const {
Chandler Carruthf67321c2014-10-20 10:41:29 +0000370 bool Ret = BigEndian == Other.BigEndian &&
Rafael Espindolaae593f12014-02-26 17:02:08 +0000371 StackNaturalAlign == Other.StackNaturalAlign &&
372 ManglingMode == Other.ManglingMode &&
373 LegalIntWidths == Other.LegalIntWidths &&
Rafael Espindola89992b02014-04-22 17:47:03 +0000374 Alignments == Other.Alignments && Pointers == Other.Pointers;
Rafael Espindolaae593f12014-02-26 17:02:08 +0000375 assert(Ret == (getStringRepresentation() == Other.getStringRepresentation()));
376 return Ret;
377}
378
Micah Villmowac34b5c2012-10-04 22:08:14 +0000379void
Micah Villmowb4faa152012-10-04 23:01:22 +0000380DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000381 unsigned pref_align, uint32_t bit_width) {
382 assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
383 assert(pref_align < (1 << 16) && "Alignment doesn't fit in bitfield");
384 assert(bit_width < (1 << 24) && "Bit width doesn't fit in bitfield");
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000385 for (LayoutAlignElem &Elem : Alignments) {
386 if (Elem.AlignType == (unsigned)align_type &&
387 Elem.TypeBitWidth == bit_width) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000388 // Update the abi, preferred alignments.
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000389 Elem.ABIAlign = abi_align;
390 Elem.PrefAlign = pref_align;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000391 return;
392 }
393 }
394
Micah Villmowb4faa152012-10-04 23:01:22 +0000395 Alignments.push_back(LayoutAlignElem::get(align_type, abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000396 pref_align, bit_width));
397}
398
Rafael Espindola667fcb82014-02-26 16:58:35 +0000399DataLayout::PointersTy::iterator
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000400DataLayout::findPointerLowerBound(uint32_t AddressSpace) {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000401 return std::lower_bound(Pointers.begin(), Pointers.end(), AddressSpace,
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000402 [](const PointerAlignElem &A, uint32_t AddressSpace) {
403 return A.AddressSpace < AddressSpace;
404 });
Rafael Espindola667fcb82014-02-26 16:58:35 +0000405}
406
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000407void DataLayout::setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign,
408 unsigned PrefAlign,
409 uint32_t TypeByteWidth) {
410 assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000411 PointersTy::iterator I = findPointerLowerBound(AddrSpace);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000412 if (I == Pointers.end() || I->AddressSpace != AddrSpace) {
413 Pointers.insert(I, PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign,
414 TypeByteWidth));
Micah Villmow89021e42012-10-09 16:06:12 +0000415 } else {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000416 I->ABIAlign = ABIAlign;
417 I->PrefAlign = PrefAlign;
418 I->TypeByteWidth = TypeByteWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000419 }
420}
421
Micah Villmowac34b5c2012-10-04 22:08:14 +0000422/// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
Micah Villmowb4faa152012-10-04 23:01:22 +0000423/// preferred if ABIInfo = false) the layout wants for the specified datatype.
424unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000425 uint32_t BitWidth, bool ABIInfo,
426 Type *Ty) const {
427 // Check to see if we have an exact match and remember the best match we see.
428 int BestMatchIdx = -1;
429 int LargestInt = -1;
430 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmow6d05e692012-10-05 17:02:14 +0000431 if (Alignments[i].AlignType == (unsigned)AlignType &&
Micah Villmowac34b5c2012-10-04 22:08:14 +0000432 Alignments[i].TypeBitWidth == BitWidth)
433 return ABIInfo ? Alignments[i].ABIAlign : Alignments[i].PrefAlign;
434
435 // The best match so far depends on what we're looking for.
436 if (AlignType == INTEGER_ALIGN &&
437 Alignments[i].AlignType == INTEGER_ALIGN) {
438 // The "best match" for integers is the smallest size that is larger than
439 // the BitWidth requested.
440 if (Alignments[i].TypeBitWidth > BitWidth && (BestMatchIdx == -1 ||
Eli Benderskyfaf5e3e2013-01-30 19:24:23 +0000441 Alignments[i].TypeBitWidth < Alignments[BestMatchIdx].TypeBitWidth))
Micah Villmowac34b5c2012-10-04 22:08:14 +0000442 BestMatchIdx = i;
443 // However, if there isn't one that's larger, then we must use the
444 // largest one we have (see below)
445 if (LargestInt == -1 ||
446 Alignments[i].TypeBitWidth > Alignments[LargestInt].TypeBitWidth)
447 LargestInt = i;
448 }
449 }
450
451 // Okay, we didn't find an exact solution. Fall back here depending on what
452 // is being looked for.
453 if (BestMatchIdx == -1) {
454 // If we didn't find an integer alignment, fall back on most conservative.
455 if (AlignType == INTEGER_ALIGN) {
456 BestMatchIdx = LargestInt;
457 } else {
458 assert(AlignType == VECTOR_ALIGN && "Unknown alignment type!");
459
460 // By default, use natural alignment for vector types. This is consistent
461 // with what clang and llvm-gcc do.
462 unsigned Align = getTypeAllocSize(cast<VectorType>(Ty)->getElementType());
463 Align *= cast<VectorType>(Ty)->getNumElements();
464 // If the alignment is not a power of 2, round up to the next power of 2.
465 // This happens for non-power-of-2 length vectors.
466 if (Align & (Align-1))
467 Align = NextPowerOf2(Align);
468 return Align;
469 }
470 }
471
472 // Since we got a "best match" index, just return it.
473 return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
474 : Alignments[BestMatchIdx].PrefAlign;
475}
476
477namespace {
478
479class StructLayoutMap {
480 typedef DenseMap<StructType*, StructLayout*> LayoutInfoTy;
481 LayoutInfoTy LayoutInfo;
482
483public:
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000484 ~StructLayoutMap() {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000485 // Remove any layouts.
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000486 for (const auto &I : LayoutInfo) {
487 StructLayout *Value = I.second;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000488 Value->~StructLayout();
489 free(Value);
490 }
491 }
492
493 StructLayout *&operator[](StructType *STy) {
494 return LayoutInfo[STy];
495 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000496};
497
498} // end anonymous namespace
499
Rafael Espindola248ac132014-02-25 22:23:04 +0000500void DataLayout::clear() {
501 LegalIntWidths.clear();
502 Alignments.clear();
503 Pointers.clear();
504 delete static_cast<StructLayoutMap *>(LayoutMap);
Craig Topperc6207612014-04-09 06:08:46 +0000505 LayoutMap = nullptr;
Rafael Espindola248ac132014-02-25 22:23:04 +0000506}
507
Micah Villmowb4faa152012-10-04 23:01:22 +0000508DataLayout::~DataLayout() {
Rafael Espindola248ac132014-02-25 22:23:04 +0000509 clear();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000510}
511
Micah Villmowb4faa152012-10-04 23:01:22 +0000512const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000513 if (!LayoutMap)
514 LayoutMap = new StructLayoutMap();
515
516 StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
517 StructLayout *&SL = (*STM)[Ty];
518 if (SL) return SL;
519
520 // Otherwise, create the struct layout. Because it is variable length, we
521 // malloc it, then use placement new.
522 int NumElts = Ty->getNumElements();
523 StructLayout *L =
524 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t));
525
526 // Set SL before calling StructLayout's ctor. The ctor could cause other
527 // entries to be added to TheMap, invalidating our reference.
528 SL = L;
529
530 new (L) StructLayout(Ty, *this);
531
532 return L;
533}
534
Micah Villmowb4faa152012-10-04 23:01:22 +0000535std::string DataLayout::getStringRepresentation() const {
Alp Tokere69170a2014-06-26 22:52:05 +0000536 std::string Result;
537 raw_string_ostream OS(Result);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000538
Chandler Carruthf67321c2014-10-20 10:41:29 +0000539 OS << (BigEndian ? "E" : "e");
Rafael Espindola58873562014-01-03 19:21:54 +0000540
541 switch (ManglingMode) {
542 case MM_None:
543 break;
544 case MM_ELF:
545 OS << "-m:e";
546 break;
547 case MM_MachO:
548 OS << "-m:o";
549 break;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000550 case MM_WINCOFF:
551 OS << "-m:w";
Rafael Espindola58873562014-01-03 19:21:54 +0000552 break;
553 case MM_Mips:
554 OS << "-m:m";
555 break;
556 }
557
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000558 for (const PointerAlignElem &PI : Pointers) {
Rafael Espindola458a4852013-12-19 23:03:03 +0000559 // Skip default.
560 if (PI.AddressSpace == 0 && PI.ABIAlign == 8 && PI.PrefAlign == 8 &&
561 PI.TypeByteWidth == 8)
562 continue;
563
Micah Villmow89021e42012-10-09 16:06:12 +0000564 OS << "-p";
565 if (PI.AddressSpace) {
566 OS << PI.AddressSpace;
567 }
Rafael Espindola458a4852013-12-19 23:03:03 +0000568 OS << ":" << PI.TypeByteWidth*8 << ':' << PI.ABIAlign*8;
569 if (PI.PrefAlign != PI.ABIAlign)
570 OS << ':' << PI.PrefAlign*8;
Micah Villmow89021e42012-10-09 16:06:12 +0000571 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000572
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000573 for (const LayoutAlignElem &AI : Alignments) {
574 if (std::find(std::begin(DefaultAlignments), std::end(DefaultAlignments),
575 AI) != std::end(DefaultAlignments))
Rafael Espindola458a4852013-12-19 23:03:03 +0000576 continue;
577 OS << '-' << (char)AI.AlignType;
578 if (AI.TypeBitWidth)
579 OS << AI.TypeBitWidth;
580 OS << ':' << AI.ABIAlign*8;
581 if (AI.ABIAlign != AI.PrefAlign)
582 OS << ':' << AI.PrefAlign*8;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000583 }
584
585 if (!LegalIntWidths.empty()) {
586 OS << "-n" << (unsigned)LegalIntWidths[0];
587
588 for (unsigned i = 1, e = LegalIntWidths.size(); i != e; ++i)
589 OS << ':' << (unsigned)LegalIntWidths[i];
590 }
Rafael Espindola458a4852013-12-19 23:03:03 +0000591
592 if (StackNaturalAlign)
593 OS << "-S" << StackNaturalAlign*8;
594
Micah Villmowac34b5c2012-10-04 22:08:14 +0000595 return OS.str();
596}
597
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000598unsigned DataLayout::getPointerABIAlignment(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000599 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000600 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000601 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000602 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000603 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000604 return I->ABIAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000605}
606
607unsigned DataLayout::getPointerPrefAlignment(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000608 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000609 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000610 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000611 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000612 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000613 return I->PrefAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000614}
615
616unsigned DataLayout::getPointerSize(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000617 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000618 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000619 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000620 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000621 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000622 return I->TypeByteWidth;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000623}
624
Matt Arsenault6f4be902013-07-26 17:37:20 +0000625unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {
626 assert(Ty->isPtrOrPtrVectorTy() &&
627 "This should only be called with a pointer or pointer vector type");
628
629 if (Ty->isPointerTy())
630 return getTypeSizeInBits(Ty);
631
Matt Arsenault517cf482013-07-27 19:22:28 +0000632 return getTypeSizeInBits(Ty->getScalarType());
Matt Arsenault6f4be902013-07-26 17:37:20 +0000633}
Micah Villmowac34b5c2012-10-04 22:08:14 +0000634
Micah Villmowac34b5c2012-10-04 22:08:14 +0000635/*!
636 \param abi_or_pref Flag that determines which alignment is returned. true
637 returns the ABI alignment, false returns the preferred alignment.
638 \param Ty The underlying type for which alignment is determined.
639
640 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
641 == false) for the requested type \a Ty.
642 */
Micah Villmowb4faa152012-10-04 23:01:22 +0000643unsigned DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000644 int AlignType = -1;
645
646 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
647 switch (Ty->getTypeID()) {
648 // Early escape for the non-numeric types.
649 case Type::LabelTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000650 return (abi_or_pref
Micah Villmow89021e42012-10-09 16:06:12 +0000651 ? getPointerABIAlignment(0)
652 : getPointerPrefAlignment(0));
653 case Type::PointerTyID: {
Matt Arsenaultc1728972014-09-18 22:28:56 +0000654 unsigned AS = cast<PointerType>(Ty)->getAddressSpace();
Micah Villmow89021e42012-10-09 16:06:12 +0000655 return (abi_or_pref
656 ? getPointerABIAlignment(AS)
657 : getPointerPrefAlignment(AS));
658 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000659 case Type::ArrayTyID:
660 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
661
662 case Type::StructTyID: {
663 // Packed structure types always have an ABI alignment of one.
664 if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
665 return 1;
666
667 // Get the layout annotation... which is lazily created on demand.
668 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
669 unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty);
670 return std::max(Align, Layout->getAlignment());
671 }
672 case Type::IntegerTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000673 AlignType = INTEGER_ALIGN;
674 break;
675 case Type::HalfTyID:
676 case Type::FloatTyID:
677 case Type::DoubleTyID:
678 // PPC_FP128TyID and FP128TyID have different data contents, but the
679 // same size and alignment, so they look the same here.
680 case Type::PPC_FP128TyID:
681 case Type::FP128TyID:
682 case Type::X86_FP80TyID:
683 AlignType = FLOAT_ALIGN;
684 break;
685 case Type::X86_MMXTyID:
686 case Type::VectorTyID:
687 AlignType = VECTOR_ALIGN;
688 break;
689 default:
690 llvm_unreachable("Bad type for getAlignment!!!");
691 }
692
693 return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSizeInBits(Ty),
694 abi_or_pref, Ty);
695}
696
Micah Villmowb4faa152012-10-04 23:01:22 +0000697unsigned DataLayout::getABITypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000698 return getAlignment(Ty, true);
699}
700
701/// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
702/// an integer type of the specified bitwidth.
Micah Villmowb4faa152012-10-04 23:01:22 +0000703unsigned DataLayout::getABIIntegerTypeAlignment(unsigned BitWidth) const {
Craig Topperc6207612014-04-09 06:08:46 +0000704 return getAlignmentInfo(INTEGER_ALIGN, BitWidth, true, nullptr);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000705}
706
Micah Villmowb4faa152012-10-04 23:01:22 +0000707unsigned DataLayout::getPrefTypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000708 return getAlignment(Ty, false);
709}
710
Micah Villmowb4faa152012-10-04 23:01:22 +0000711unsigned DataLayout::getPreferredTypeAlignmentShift(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000712 unsigned Align = getPrefTypeAlignment(Ty);
713 assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
714 return Log2_32(Align);
715}
716
Micah Villmow89021e42012-10-09 16:06:12 +0000717IntegerType *DataLayout::getIntPtrType(LLVMContext &C,
718 unsigned AddressSpace) const {
719 return IntegerType::get(C, getPointerSizeInBits(AddressSpace));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000720}
721
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000722Type *DataLayout::getIntPtrType(Type *Ty) const {
Chandler Carruth7ec50852012-11-01 08:07:29 +0000723 assert(Ty->isPtrOrPtrVectorTy() &&
724 "Expected a pointer or pointer vector type.");
Matt Arsenault4dbd4892014-04-23 21:10:15 +0000725 unsigned NumBits = getPointerTypeSizeInBits(Ty);
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000726 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
727 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
728 return VectorType::get(IntTy, VecTy->getNumElements());
729 return IntTy;
Micah Villmow12d91272012-10-24 15:52:52 +0000730}
731
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000732Type *DataLayout::getSmallestLegalIntType(LLVMContext &C, unsigned Width) const {
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000733 for (unsigned LegalIntWidth : LegalIntWidths)
734 if (Width <= LegalIntWidth)
735 return Type::getIntNTy(C, LegalIntWidth);
Craig Topperc6207612014-04-09 06:08:46 +0000736 return nullptr;
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000737}
738
Matt Arsenault899f7d22013-09-16 22:43:16 +0000739unsigned DataLayout::getLargestLegalIntTypeSize() const {
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000740 auto Max = std::max_element(LegalIntWidths.begin(), LegalIntWidths.end());
741 return Max != LegalIntWidths.end() ? *Max : 0;
Matt Arsenault899f7d22013-09-16 22:43:16 +0000742}
743
Micah Villmowb4faa152012-10-04 23:01:22 +0000744uint64_t DataLayout::getIndexedOffset(Type *ptrTy,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000745 ArrayRef<Value *> Indices) const {
746 Type *Ty = ptrTy;
747 assert(Ty->isPointerTy() && "Illegal argument for getIndexedOffset()");
748 uint64_t Result = 0;
749
750 generic_gep_type_iterator<Value* const*>
751 TI = gep_type_begin(ptrTy, Indices);
752 for (unsigned CurIDX = 0, EndIDX = Indices.size(); CurIDX != EndIDX;
753 ++CurIDX, ++TI) {
754 if (StructType *STy = dyn_cast<StructType>(*TI)) {
755 assert(Indices[CurIDX]->getType() ==
756 Type::getInt32Ty(ptrTy->getContext()) &&
757 "Illegal struct idx");
758 unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
759
760 // Get structure layout information...
761 const StructLayout *Layout = getStructLayout(STy);
762
763 // Add in the offset, as calculated by the structure layout info...
764 Result += Layout->getElementOffset(FieldNo);
765
766 // Update Ty to refer to current element
767 Ty = STy->getElementType(FieldNo);
768 } else {
769 // Update Ty to refer to current element
770 Ty = cast<SequentialType>(Ty)->getElementType();
771
772 // Get the array index and the size of each array element.
773 if (int64_t arrayIdx = cast<ConstantInt>(Indices[CurIDX])->getSExtValue())
774 Result += (uint64_t)arrayIdx * getTypeAllocSize(Ty);
775 }
776 }
777
778 return Result;
779}
780
781/// getPreferredAlignment - Return the preferred alignment of the specified
782/// global. This includes an explicitly requested alignment (if the global
783/// has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000784unsigned DataLayout::getPreferredAlignment(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000785 Type *ElemType = GV->getType()->getElementType();
786 unsigned Alignment = getPrefTypeAlignment(ElemType);
787 unsigned GVAlignment = GV->getAlignment();
788 if (GVAlignment >= Alignment) {
789 Alignment = GVAlignment;
790 } else if (GVAlignment != 0) {
791 Alignment = std::max(GVAlignment, getABITypeAlignment(ElemType));
792 }
793
794 if (GV->hasInitializer() && GVAlignment == 0) {
795 if (Alignment < 16) {
796 // If the global is not external, see if it is large. If so, give it a
797 // larger alignment.
798 if (getTypeSizeInBits(ElemType) > 128)
799 Alignment = 16; // 16-byte alignment.
800 }
801 }
802 return Alignment;
803}
804
805/// getPreferredAlignmentLog - Return the preferred alignment of the
806/// specified global, returned in log form. This includes an explicitly
807/// requested alignment (if the global has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000808unsigned DataLayout::getPreferredAlignmentLog(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000809 return Log2_32(getPreferredAlignment(GV));
810}
Rafael Espindola93512512014-02-25 17:30:31 +0000811
812DataLayoutPass::DataLayoutPass() : ImmutablePass(ID), DL("") {
Rafael Espindolac435adc2014-09-10 21:27:43 +0000813 initializeDataLayoutPassPass(*PassRegistry::getPassRegistry());
Rafael Espindola93512512014-02-25 17:30:31 +0000814}
815
816DataLayoutPass::~DataLayoutPass() {}
817
Rafael Espindolac435adc2014-09-10 21:27:43 +0000818bool DataLayoutPass::doInitialization(Module &M) {
819 DL.init(&M);
820 return false;
Rafael Espindola93512512014-02-25 17:30:31 +0000821}
822
Rafael Espindolac435adc2014-09-10 21:27:43 +0000823bool DataLayoutPass::doFinalization(Module &M) {
824 DL.reset("");
825 return false;
Rafael Espindola93512512014-02-25 17:30:31 +0000826}