blob: 394986e092d70ac7a0ce0aa562cd964318714266 [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);
200 assert((!Split.second.empty() || Split.first == Str) &&
201 "a trailing separator is not allowed");
202 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) {
216 assert(Bits % 8 == 0 && "number of bits must be a byte width multiple");
217 return Bits / 8;
218}
219
220void DataLayout::parseSpecifier(StringRef Desc) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000221 while (!Desc.empty()) {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000222 // Split at '-'.
223 std::pair<StringRef, StringRef> Split = split(Desc, '-');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000224 Desc = Split.second;
225
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000226 // Split at ':'.
227 Split = split(Split.first, ':');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000228
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000229 // Aliases used below.
230 StringRef &Tok = Split.first; // Current token.
231 StringRef &Rest = Split.second; // The rest of the string.
Micah Villmowac34b5c2012-10-04 22:08:14 +0000232
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000233 char Specifier = Tok.front();
234 Tok = Tok.substr(1);
235
236 switch (Specifier) {
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000237 case 's':
238 // Ignored for backward compatibility.
239 // FIXME: remove this on LLVM 4.0.
240 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000241 case 'E':
Chandler Carruthf67321c2014-10-20 10:41:29 +0000242 BigEndian = true;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000243 break;
244 case 'e':
Chandler Carruthf67321c2014-10-20 10:41:29 +0000245 BigEndian = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000246 break;
247 case 'p': {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000248 // Address space.
249 unsigned AddrSpace = Tok.empty() ? 0 : getInt(Tok);
David Majnemer5330c692014-12-10 01:17:08 +0000250 if (!isUInt<24>(AddrSpace))
251 report_fatal_error("Invalid address space, must be a 24bit integer");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000252
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000253 // Size.
254 Split = split(Rest, ':');
255 unsigned PointerMemSize = inBytes(getInt(Tok));
256
257 // ABI alignment.
258 Split = split(Rest, ':');
259 unsigned PointerABIAlign = inBytes(getInt(Tok));
260
261 // Preferred alignment.
262 unsigned PointerPrefAlign = PointerABIAlign;
263 if (!Rest.empty()) {
264 Split = split(Rest, ':');
265 PointerPrefAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000266 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000267
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000268 setPointerAlignment(AddrSpace, PointerABIAlign, PointerPrefAlign,
269 PointerMemSize);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000270 break;
271 }
272 case 'i':
273 case 'v':
274 case 'f':
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000275 case 'a': {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000276 AlignTypeEnum AlignType;
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000277 switch (Specifier) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000278 default:
279 case 'i': AlignType = INTEGER_ALIGN; break;
280 case 'v': AlignType = VECTOR_ALIGN; break;
281 case 'f': AlignType = FLOAT_ALIGN; break;
282 case 'a': AlignType = AGGREGATE_ALIGN; break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000283 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000284
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000285 // Bit size.
286 unsigned Size = Tok.empty() ? 0 : getInt(Tok);
287
David Majnemer5330c692014-12-10 01:17:08 +0000288 if (AlignType == AGGREGATE_ALIGN && Size != 0)
289 report_fatal_error(
290 "Sized aggregate specification in datalayout string");
Rafael Espindolaabdd7262014-01-06 21:40:24 +0000291
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000292 // ABI alignment.
293 Split = split(Rest, ':');
294 unsigned ABIAlign = inBytes(getInt(Tok));
295
296 // Preferred alignment.
297 unsigned PrefAlign = ABIAlign;
298 if (!Rest.empty()) {
299 Split = split(Rest, ':');
300 PrefAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000301 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000302
Patrik Hägglund01860a62012-11-14 09:04:56 +0000303 setAlignment(AlignType, ABIAlign, PrefAlign, Size);
Micah Villmowb4faa152012-10-04 23:01:22 +0000304
Micah Villmowac34b5c2012-10-04 22:08:14 +0000305 break;
306 }
307 case 'n': // Native integer types.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000308 for (;;) {
309 unsigned Width = getInt(Tok);
David Majnemer5330c692014-12-10 01:17:08 +0000310 if (Width == 0)
311 report_fatal_error(
312 "Zero width native integer type in datalayout string");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000313 LegalIntWidths.push_back(Width);
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000314 if (Rest.empty())
315 break;
316 Split = split(Rest, ':');
317 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000318 break;
319 case 'S': { // Stack natural alignment.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000320 StackNaturalAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000321 break;
322 }
Rafael Espindola58873562014-01-03 19:21:54 +0000323 case 'm':
324 assert(Tok.empty());
325 assert(Rest.size() == 1);
326 switch(Rest[0]) {
327 default:
David Majnemer5330c692014-12-10 01:17:08 +0000328 report_fatal_error("Unknown mangling in datalayout string");
Rafael Espindola58873562014-01-03 19:21:54 +0000329 case 'e':
330 ManglingMode = MM_ELF;
331 break;
332 case 'o':
333 ManglingMode = MM_MachO;
334 break;
335 case 'm':
336 ManglingMode = MM_Mips;
337 break;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000338 case 'w':
339 ManglingMode = MM_WINCOFF;
Rafael Espindola58873562014-01-03 19:21:54 +0000340 break;
341 }
342 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000343 default:
David Majnemer5330c692014-12-10 01:17:08 +0000344 report_fatal_error("Unknown specifier in datalayout string");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000345 break;
346 }
347 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000348}
349
Craig Topperc6207612014-04-09 06:08:46 +0000350DataLayout::DataLayout(const Module *M) : LayoutMap(nullptr) {
Rafael Espindolac435adc2014-09-10 21:27:43 +0000351 init(M);
352}
353
354void DataLayout::init(const Module *M) {
Rafael Espindolaf863ee22014-02-25 20:01:08 +0000355 const DataLayout *Other = M->getDataLayout();
356 if (Other)
357 *this = *Other;
358 else
Rafael Espindola248ac132014-02-25 22:23:04 +0000359 reset("");
Rafael Espindolaf863ee22014-02-25 20:01:08 +0000360}
Micah Villmowac34b5c2012-10-04 22:08:14 +0000361
Rafael Espindolaae593f12014-02-26 17:02:08 +0000362bool DataLayout::operator==(const DataLayout &Other) const {
Chandler Carruthf67321c2014-10-20 10:41:29 +0000363 bool Ret = BigEndian == Other.BigEndian &&
Rafael Espindolaae593f12014-02-26 17:02:08 +0000364 StackNaturalAlign == Other.StackNaturalAlign &&
365 ManglingMode == Other.ManglingMode &&
366 LegalIntWidths == Other.LegalIntWidths &&
Rafael Espindola89992b02014-04-22 17:47:03 +0000367 Alignments == Other.Alignments && Pointers == Other.Pointers;
Rafael Espindolaae593f12014-02-26 17:02:08 +0000368 assert(Ret == (getStringRepresentation() == Other.getStringRepresentation()));
369 return Ret;
370}
371
Micah Villmowac34b5c2012-10-04 22:08:14 +0000372void
Micah Villmowb4faa152012-10-04 23:01:22 +0000373DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000374 unsigned pref_align, uint32_t bit_width) {
375 assert(abi_align <= pref_align && "Preferred alignment worse than ABI!");
376 assert(pref_align < (1 << 16) && "Alignment doesn't fit in bitfield");
377 assert(bit_width < (1 << 24) && "Bit width doesn't fit in bitfield");
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000378 for (LayoutAlignElem &Elem : Alignments) {
379 if (Elem.AlignType == (unsigned)align_type &&
380 Elem.TypeBitWidth == bit_width) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000381 // Update the abi, preferred alignments.
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000382 Elem.ABIAlign = abi_align;
383 Elem.PrefAlign = pref_align;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000384 return;
385 }
386 }
387
Micah Villmowb4faa152012-10-04 23:01:22 +0000388 Alignments.push_back(LayoutAlignElem::get(align_type, abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000389 pref_align, bit_width));
390}
391
Rafael Espindola667fcb82014-02-26 16:58:35 +0000392DataLayout::PointersTy::iterator
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000393DataLayout::findPointerLowerBound(uint32_t AddressSpace) {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000394 return std::lower_bound(Pointers.begin(), Pointers.end(), AddressSpace,
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000395 [](const PointerAlignElem &A, uint32_t AddressSpace) {
396 return A.AddressSpace < AddressSpace;
397 });
Rafael Espindola667fcb82014-02-26 16:58:35 +0000398}
399
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000400void DataLayout::setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign,
401 unsigned PrefAlign,
402 uint32_t TypeByteWidth) {
403 assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000404 PointersTy::iterator I = findPointerLowerBound(AddrSpace);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000405 if (I == Pointers.end() || I->AddressSpace != AddrSpace) {
406 Pointers.insert(I, PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign,
407 TypeByteWidth));
Micah Villmow89021e42012-10-09 16:06:12 +0000408 } else {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000409 I->ABIAlign = ABIAlign;
410 I->PrefAlign = PrefAlign;
411 I->TypeByteWidth = TypeByteWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000412 }
413}
414
Micah Villmowac34b5c2012-10-04 22:08:14 +0000415/// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
Micah Villmowb4faa152012-10-04 23:01:22 +0000416/// preferred if ABIInfo = false) the layout wants for the specified datatype.
417unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000418 uint32_t BitWidth, bool ABIInfo,
419 Type *Ty) const {
420 // Check to see if we have an exact match and remember the best match we see.
421 int BestMatchIdx = -1;
422 int LargestInt = -1;
423 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmow6d05e692012-10-05 17:02:14 +0000424 if (Alignments[i].AlignType == (unsigned)AlignType &&
Micah Villmowac34b5c2012-10-04 22:08:14 +0000425 Alignments[i].TypeBitWidth == BitWidth)
426 return ABIInfo ? Alignments[i].ABIAlign : Alignments[i].PrefAlign;
427
428 // The best match so far depends on what we're looking for.
429 if (AlignType == INTEGER_ALIGN &&
430 Alignments[i].AlignType == INTEGER_ALIGN) {
431 // The "best match" for integers is the smallest size that is larger than
432 // the BitWidth requested.
433 if (Alignments[i].TypeBitWidth > BitWidth && (BestMatchIdx == -1 ||
Eli Benderskyfaf5e3e2013-01-30 19:24:23 +0000434 Alignments[i].TypeBitWidth < Alignments[BestMatchIdx].TypeBitWidth))
Micah Villmowac34b5c2012-10-04 22:08:14 +0000435 BestMatchIdx = i;
436 // However, if there isn't one that's larger, then we must use the
437 // largest one we have (see below)
438 if (LargestInt == -1 ||
439 Alignments[i].TypeBitWidth > Alignments[LargestInt].TypeBitWidth)
440 LargestInt = i;
441 }
442 }
443
444 // Okay, we didn't find an exact solution. Fall back here depending on what
445 // is being looked for.
446 if (BestMatchIdx == -1) {
447 // If we didn't find an integer alignment, fall back on most conservative.
448 if (AlignType == INTEGER_ALIGN) {
449 BestMatchIdx = LargestInt;
450 } else {
451 assert(AlignType == VECTOR_ALIGN && "Unknown alignment type!");
452
453 // By default, use natural alignment for vector types. This is consistent
454 // with what clang and llvm-gcc do.
455 unsigned Align = getTypeAllocSize(cast<VectorType>(Ty)->getElementType());
456 Align *= cast<VectorType>(Ty)->getNumElements();
457 // If the alignment is not a power of 2, round up to the next power of 2.
458 // This happens for non-power-of-2 length vectors.
459 if (Align & (Align-1))
460 Align = NextPowerOf2(Align);
461 return Align;
462 }
463 }
464
465 // Since we got a "best match" index, just return it.
466 return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
467 : Alignments[BestMatchIdx].PrefAlign;
468}
469
470namespace {
471
472class StructLayoutMap {
473 typedef DenseMap<StructType*, StructLayout*> LayoutInfoTy;
474 LayoutInfoTy LayoutInfo;
475
476public:
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000477 ~StructLayoutMap() {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000478 // Remove any layouts.
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000479 for (const auto &I : LayoutInfo) {
480 StructLayout *Value = I.second;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000481 Value->~StructLayout();
482 free(Value);
483 }
484 }
485
486 StructLayout *&operator[](StructType *STy) {
487 return LayoutInfo[STy];
488 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000489};
490
491} // end anonymous namespace
492
Rafael Espindola248ac132014-02-25 22:23:04 +0000493void DataLayout::clear() {
494 LegalIntWidths.clear();
495 Alignments.clear();
496 Pointers.clear();
497 delete static_cast<StructLayoutMap *>(LayoutMap);
Craig Topperc6207612014-04-09 06:08:46 +0000498 LayoutMap = nullptr;
Rafael Espindola248ac132014-02-25 22:23:04 +0000499}
500
Micah Villmowb4faa152012-10-04 23:01:22 +0000501DataLayout::~DataLayout() {
Rafael Espindola248ac132014-02-25 22:23:04 +0000502 clear();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000503}
504
Micah Villmowb4faa152012-10-04 23:01:22 +0000505const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000506 if (!LayoutMap)
507 LayoutMap = new StructLayoutMap();
508
509 StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
510 StructLayout *&SL = (*STM)[Ty];
511 if (SL) return SL;
512
513 // Otherwise, create the struct layout. Because it is variable length, we
514 // malloc it, then use placement new.
515 int NumElts = Ty->getNumElements();
516 StructLayout *L =
517 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t));
518
519 // Set SL before calling StructLayout's ctor. The ctor could cause other
520 // entries to be added to TheMap, invalidating our reference.
521 SL = L;
522
523 new (L) StructLayout(Ty, *this);
524
525 return L;
526}
527
Micah Villmowb4faa152012-10-04 23:01:22 +0000528std::string DataLayout::getStringRepresentation() const {
Alp Tokere69170a2014-06-26 22:52:05 +0000529 std::string Result;
530 raw_string_ostream OS(Result);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000531
Chandler Carruthf67321c2014-10-20 10:41:29 +0000532 OS << (BigEndian ? "E" : "e");
Rafael Espindola58873562014-01-03 19:21:54 +0000533
534 switch (ManglingMode) {
535 case MM_None:
536 break;
537 case MM_ELF:
538 OS << "-m:e";
539 break;
540 case MM_MachO:
541 OS << "-m:o";
542 break;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000543 case MM_WINCOFF:
544 OS << "-m:w";
Rafael Espindola58873562014-01-03 19:21:54 +0000545 break;
546 case MM_Mips:
547 OS << "-m:m";
548 break;
549 }
550
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000551 for (const PointerAlignElem &PI : Pointers) {
Rafael Espindola458a4852013-12-19 23:03:03 +0000552 // Skip default.
553 if (PI.AddressSpace == 0 && PI.ABIAlign == 8 && PI.PrefAlign == 8 &&
554 PI.TypeByteWidth == 8)
555 continue;
556
Micah Villmow89021e42012-10-09 16:06:12 +0000557 OS << "-p";
558 if (PI.AddressSpace) {
559 OS << PI.AddressSpace;
560 }
Rafael Espindola458a4852013-12-19 23:03:03 +0000561 OS << ":" << PI.TypeByteWidth*8 << ':' << PI.ABIAlign*8;
562 if (PI.PrefAlign != PI.ABIAlign)
563 OS << ':' << PI.PrefAlign*8;
Micah Villmow89021e42012-10-09 16:06:12 +0000564 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000565
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000566 for (const LayoutAlignElem &AI : Alignments) {
567 if (std::find(std::begin(DefaultAlignments), std::end(DefaultAlignments),
568 AI) != std::end(DefaultAlignments))
Rafael Espindola458a4852013-12-19 23:03:03 +0000569 continue;
570 OS << '-' << (char)AI.AlignType;
571 if (AI.TypeBitWidth)
572 OS << AI.TypeBitWidth;
573 OS << ':' << AI.ABIAlign*8;
574 if (AI.ABIAlign != AI.PrefAlign)
575 OS << ':' << AI.PrefAlign*8;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000576 }
577
578 if (!LegalIntWidths.empty()) {
579 OS << "-n" << (unsigned)LegalIntWidths[0];
580
581 for (unsigned i = 1, e = LegalIntWidths.size(); i != e; ++i)
582 OS << ':' << (unsigned)LegalIntWidths[i];
583 }
Rafael Espindola458a4852013-12-19 23:03:03 +0000584
585 if (StackNaturalAlign)
586 OS << "-S" << StackNaturalAlign*8;
587
Micah Villmowac34b5c2012-10-04 22:08:14 +0000588 return OS.str();
589}
590
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000591unsigned DataLayout::getPointerABIAlignment(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000592 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000593 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000594 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000595 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000596 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000597 return I->ABIAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000598}
599
600unsigned DataLayout::getPointerPrefAlignment(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000601 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000602 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000603 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000604 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000605 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000606 return I->PrefAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000607}
608
609unsigned DataLayout::getPointerSize(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000610 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000611 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000612 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000613 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000614 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000615 return I->TypeByteWidth;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000616}
617
Matt Arsenault6f4be902013-07-26 17:37:20 +0000618unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {
619 assert(Ty->isPtrOrPtrVectorTy() &&
620 "This should only be called with a pointer or pointer vector type");
621
622 if (Ty->isPointerTy())
623 return getTypeSizeInBits(Ty);
624
Matt Arsenault517cf482013-07-27 19:22:28 +0000625 return getTypeSizeInBits(Ty->getScalarType());
Matt Arsenault6f4be902013-07-26 17:37:20 +0000626}
Micah Villmowac34b5c2012-10-04 22:08:14 +0000627
Micah Villmowac34b5c2012-10-04 22:08:14 +0000628/*!
629 \param abi_or_pref Flag that determines which alignment is returned. true
630 returns the ABI alignment, false returns the preferred alignment.
631 \param Ty The underlying type for which alignment is determined.
632
633 Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
634 == false) for the requested type \a Ty.
635 */
Micah Villmowb4faa152012-10-04 23:01:22 +0000636unsigned DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000637 int AlignType = -1;
638
639 assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
640 switch (Ty->getTypeID()) {
641 // Early escape for the non-numeric types.
642 case Type::LabelTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000643 return (abi_or_pref
Micah Villmow89021e42012-10-09 16:06:12 +0000644 ? getPointerABIAlignment(0)
645 : getPointerPrefAlignment(0));
646 case Type::PointerTyID: {
Matt Arsenaultc1728972014-09-18 22:28:56 +0000647 unsigned AS = cast<PointerType>(Ty)->getAddressSpace();
Micah Villmow89021e42012-10-09 16:06:12 +0000648 return (abi_or_pref
649 ? getPointerABIAlignment(AS)
650 : getPointerPrefAlignment(AS));
651 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000652 case Type::ArrayTyID:
653 return getAlignment(cast<ArrayType>(Ty)->getElementType(), abi_or_pref);
654
655 case Type::StructTyID: {
656 // Packed structure types always have an ABI alignment of one.
657 if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
658 return 1;
659
660 // Get the layout annotation... which is lazily created on demand.
661 const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));
662 unsigned Align = getAlignmentInfo(AGGREGATE_ALIGN, 0, abi_or_pref, Ty);
663 return std::max(Align, Layout->getAlignment());
664 }
665 case Type::IntegerTyID:
Micah Villmowac34b5c2012-10-04 22:08:14 +0000666 AlignType = INTEGER_ALIGN;
667 break;
668 case Type::HalfTyID:
669 case Type::FloatTyID:
670 case Type::DoubleTyID:
671 // PPC_FP128TyID and FP128TyID have different data contents, but the
672 // same size and alignment, so they look the same here.
673 case Type::PPC_FP128TyID:
674 case Type::FP128TyID:
675 case Type::X86_FP80TyID:
676 AlignType = FLOAT_ALIGN;
677 break;
678 case Type::X86_MMXTyID:
679 case Type::VectorTyID:
680 AlignType = VECTOR_ALIGN;
681 break;
682 default:
683 llvm_unreachable("Bad type for getAlignment!!!");
684 }
685
686 return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSizeInBits(Ty),
687 abi_or_pref, Ty);
688}
689
Micah Villmowb4faa152012-10-04 23:01:22 +0000690unsigned DataLayout::getABITypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000691 return getAlignment(Ty, true);
692}
693
694/// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
695/// an integer type of the specified bitwidth.
Micah Villmowb4faa152012-10-04 23:01:22 +0000696unsigned DataLayout::getABIIntegerTypeAlignment(unsigned BitWidth) const {
Craig Topperc6207612014-04-09 06:08:46 +0000697 return getAlignmentInfo(INTEGER_ALIGN, BitWidth, true, nullptr);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000698}
699
Micah Villmowb4faa152012-10-04 23:01:22 +0000700unsigned DataLayout::getPrefTypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000701 return getAlignment(Ty, false);
702}
703
Micah Villmowb4faa152012-10-04 23:01:22 +0000704unsigned DataLayout::getPreferredTypeAlignmentShift(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000705 unsigned Align = getPrefTypeAlignment(Ty);
706 assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
707 return Log2_32(Align);
708}
709
Micah Villmow89021e42012-10-09 16:06:12 +0000710IntegerType *DataLayout::getIntPtrType(LLVMContext &C,
711 unsigned AddressSpace) const {
712 return IntegerType::get(C, getPointerSizeInBits(AddressSpace));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000713}
714
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000715Type *DataLayout::getIntPtrType(Type *Ty) const {
Chandler Carruth7ec50852012-11-01 08:07:29 +0000716 assert(Ty->isPtrOrPtrVectorTy() &&
717 "Expected a pointer or pointer vector type.");
Matt Arsenault4dbd4892014-04-23 21:10:15 +0000718 unsigned NumBits = getPointerTypeSizeInBits(Ty);
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000719 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
720 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
721 return VectorType::get(IntTy, VecTy->getNumElements());
722 return IntTy;
Micah Villmow12d91272012-10-24 15:52:52 +0000723}
724
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000725Type *DataLayout::getSmallestLegalIntType(LLVMContext &C, unsigned Width) const {
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000726 for (unsigned LegalIntWidth : LegalIntWidths)
727 if (Width <= LegalIntWidth)
728 return Type::getIntNTy(C, LegalIntWidth);
Craig Topperc6207612014-04-09 06:08:46 +0000729 return nullptr;
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000730}
731
Matt Arsenault899f7d22013-09-16 22:43:16 +0000732unsigned DataLayout::getLargestLegalIntTypeSize() const {
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000733 auto Max = std::max_element(LegalIntWidths.begin(), LegalIntWidths.end());
734 return Max != LegalIntWidths.end() ? *Max : 0;
Matt Arsenault899f7d22013-09-16 22:43:16 +0000735}
736
Micah Villmowb4faa152012-10-04 23:01:22 +0000737uint64_t DataLayout::getIndexedOffset(Type *ptrTy,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000738 ArrayRef<Value *> Indices) const {
739 Type *Ty = ptrTy;
740 assert(Ty->isPointerTy() && "Illegal argument for getIndexedOffset()");
741 uint64_t Result = 0;
742
743 generic_gep_type_iterator<Value* const*>
744 TI = gep_type_begin(ptrTy, Indices);
745 for (unsigned CurIDX = 0, EndIDX = Indices.size(); CurIDX != EndIDX;
746 ++CurIDX, ++TI) {
747 if (StructType *STy = dyn_cast<StructType>(*TI)) {
748 assert(Indices[CurIDX]->getType() ==
749 Type::getInt32Ty(ptrTy->getContext()) &&
750 "Illegal struct idx");
751 unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
752
753 // Get structure layout information...
754 const StructLayout *Layout = getStructLayout(STy);
755
756 // Add in the offset, as calculated by the structure layout info...
757 Result += Layout->getElementOffset(FieldNo);
758
759 // Update Ty to refer to current element
760 Ty = STy->getElementType(FieldNo);
761 } else {
762 // Update Ty to refer to current element
763 Ty = cast<SequentialType>(Ty)->getElementType();
764
765 // Get the array index and the size of each array element.
766 if (int64_t arrayIdx = cast<ConstantInt>(Indices[CurIDX])->getSExtValue())
767 Result += (uint64_t)arrayIdx * getTypeAllocSize(Ty);
768 }
769 }
770
771 return Result;
772}
773
774/// getPreferredAlignment - Return the preferred alignment of the specified
775/// global. This includes an explicitly requested alignment (if the global
776/// has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000777unsigned DataLayout::getPreferredAlignment(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000778 Type *ElemType = GV->getType()->getElementType();
779 unsigned Alignment = getPrefTypeAlignment(ElemType);
780 unsigned GVAlignment = GV->getAlignment();
781 if (GVAlignment >= Alignment) {
782 Alignment = GVAlignment;
783 } else if (GVAlignment != 0) {
784 Alignment = std::max(GVAlignment, getABITypeAlignment(ElemType));
785 }
786
787 if (GV->hasInitializer() && GVAlignment == 0) {
788 if (Alignment < 16) {
789 // If the global is not external, see if it is large. If so, give it a
790 // larger alignment.
791 if (getTypeSizeInBits(ElemType) > 128)
792 Alignment = 16; // 16-byte alignment.
793 }
794 }
795 return Alignment;
796}
797
798/// getPreferredAlignmentLog - Return the preferred alignment of the
799/// specified global, returned in log form. This includes an explicitly
800/// requested alignment (if the global has one).
Micah Villmowb4faa152012-10-04 23:01:22 +0000801unsigned DataLayout::getPreferredAlignmentLog(const GlobalVariable *GV) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000802 return Log2_32(getPreferredAlignment(GV));
803}
Rafael Espindola93512512014-02-25 17:30:31 +0000804
805DataLayoutPass::DataLayoutPass() : ImmutablePass(ID), DL("") {
Rafael Espindolac435adc2014-09-10 21:27:43 +0000806 initializeDataLayoutPassPass(*PassRegistry::getPassRegistry());
Rafael Espindola93512512014-02-25 17:30:31 +0000807}
808
809DataLayoutPass::~DataLayoutPass() {}
810
Rafael Espindolac435adc2014-09-10 21:27:43 +0000811bool DataLayoutPass::doInitialization(Module &M) {
812 DL.init(&M);
813 return false;
Rafael Espindola93512512014-02-25 17:30:31 +0000814}
815
Rafael Espindolac435adc2014-09-10 21:27:43 +0000816bool DataLayoutPass::doFinalization(Module &M) {
817 DL.reset("");
818 return false;
Rafael Espindola93512512014-02-25 17:30:31 +0000819}