blob: d1506b20cff8f32d87039fc86da1d6615807cea2 [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");
David Majnemer612f3122014-12-10 02:36:41 +0000202 if (!Split.second.empty() && Split.first.empty())
203 report_fatal_error("Expected token before separator in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000204 return Split;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000205}
206
Cameron McInally8af9eac2014-01-07 19:51:38 +0000207/// Get an unsigned integer, including error checks.
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000208static unsigned getInt(StringRef R) {
Cameron McInallyf0379fa2014-01-13 22:04:55 +0000209 unsigned Result;
Patrik Hägglund504f4782012-11-28 14:32:52 +0000210 bool error = R.getAsInteger(10, Result); (void)error;
Cameron McInallyf0379fa2014-01-13 22:04:55 +0000211 if (error)
212 report_fatal_error("not a number, or does not fit in an unsigned int");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000213 return Result;
214}
215
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000216/// Convert bits into bytes. Assert if not a byte width multiple.
217static unsigned inBytes(unsigned Bits) {
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000218 if (Bits % 8)
219 report_fatal_error("number of bits must be a byte width multiple");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000220 return Bits / 8;
221}
222
223void DataLayout::parseSpecifier(StringRef Desc) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000224 while (!Desc.empty()) {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000225 // Split at '-'.
226 std::pair<StringRef, StringRef> Split = split(Desc, '-');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000227 Desc = Split.second;
228
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000229 // Split at ':'.
230 Split = split(Split.first, ':');
Micah Villmowac34b5c2012-10-04 22:08:14 +0000231
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000232 // Aliases used below.
233 StringRef &Tok = Split.first; // Current token.
234 StringRef &Rest = Split.second; // The rest of the string.
Micah Villmowac34b5c2012-10-04 22:08:14 +0000235
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000236 char Specifier = Tok.front();
237 Tok = Tok.substr(1);
238
239 switch (Specifier) {
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000240 case 's':
241 // Ignored for backward compatibility.
242 // FIXME: remove this on LLVM 4.0.
243 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000244 case 'E':
Chandler Carruthf67321c2014-10-20 10:41:29 +0000245 BigEndian = true;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000246 break;
247 case 'e':
Chandler Carruthf67321c2014-10-20 10:41:29 +0000248 BigEndian = false;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000249 break;
250 case 'p': {
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000251 // Address space.
252 unsigned AddrSpace = Tok.empty() ? 0 : getInt(Tok);
David Majnemer5330c692014-12-10 01:17:08 +0000253 if (!isUInt<24>(AddrSpace))
254 report_fatal_error("Invalid address space, must be a 24bit integer");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000255
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000256 // Size.
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000257 if (Rest.empty())
258 report_fatal_error(
259 "Missing size specification for pointer in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000260 Split = split(Rest, ':');
261 unsigned PointerMemSize = inBytes(getInt(Tok));
262
263 // ABI alignment.
David Majnemer2dc1b0f2014-12-10 01:38:28 +0000264 if (Rest.empty())
265 report_fatal_error(
266 "Missing alignment specification for pointer in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000267 Split = split(Rest, ':');
268 unsigned PointerABIAlign = inBytes(getInt(Tok));
269
270 // Preferred alignment.
271 unsigned PointerPrefAlign = PointerABIAlign;
272 if (!Rest.empty()) {
273 Split = split(Rest, ':');
274 PointerPrefAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000275 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000276
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000277 setPointerAlignment(AddrSpace, PointerABIAlign, PointerPrefAlign,
278 PointerMemSize);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000279 break;
280 }
281 case 'i':
282 case 'v':
283 case 'f':
Rafael Espindola6994fdf2014-01-01 22:29:43 +0000284 case 'a': {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000285 AlignTypeEnum AlignType;
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000286 switch (Specifier) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000287 default:
288 case 'i': AlignType = INTEGER_ALIGN; break;
289 case 'v': AlignType = VECTOR_ALIGN; break;
290 case 'f': AlignType = FLOAT_ALIGN; break;
291 case 'a': AlignType = AGGREGATE_ALIGN; break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000292 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000293
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000294 // Bit size.
295 unsigned Size = Tok.empty() ? 0 : getInt(Tok);
296
David Majnemer5330c692014-12-10 01:17:08 +0000297 if (AlignType == AGGREGATE_ALIGN && Size != 0)
298 report_fatal_error(
299 "Sized aggregate specification in datalayout string");
Rafael Espindolaabdd7262014-01-06 21:40:24 +0000300
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000301 // ABI alignment.
David Majnemer612f3122014-12-10 02:36:41 +0000302 if (Rest.empty())
303 report_fatal_error(
304 "Missing alignment specification in datalayout string");
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000305 Split = split(Rest, ':');
306 unsigned ABIAlign = inBytes(getInt(Tok));
307
308 // Preferred alignment.
309 unsigned PrefAlign = ABIAlign;
310 if (!Rest.empty()) {
311 Split = split(Rest, ':');
312 PrefAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000313 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000314
Patrik Hägglund01860a62012-11-14 09:04:56 +0000315 setAlignment(AlignType, ABIAlign, PrefAlign, Size);
Micah Villmowb4faa152012-10-04 23:01:22 +0000316
Micah Villmowac34b5c2012-10-04 22:08:14 +0000317 break;
318 }
319 case 'n': // Native integer types.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000320 for (;;) {
321 unsigned Width = getInt(Tok);
David Majnemer5330c692014-12-10 01:17:08 +0000322 if (Width == 0)
323 report_fatal_error(
324 "Zero width native integer type in datalayout string");
Patrik Hägglund3eb16c52012-11-28 12:13:12 +0000325 LegalIntWidths.push_back(Width);
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000326 if (Rest.empty())
327 break;
328 Split = split(Rest, ':');
329 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000330 break;
331 case 'S': { // Stack natural alignment.
Patrik Hagglund086ee1e2012-11-30 10:06:59 +0000332 StackNaturalAlign = inBytes(getInt(Tok));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000333 break;
334 }
Rafael Espindola58873562014-01-03 19:21:54 +0000335 case 'm':
David Majnemer612f3122014-12-10 02:36:41 +0000336 if (!Tok.empty())
337 report_fatal_error("Unexpected trailing characters after mangling specifier in datalayout string");
338 if (Rest.empty())
339 report_fatal_error("Expected mangling specifier in datalayout string");
340 if (Rest.size() > 1)
341 report_fatal_error("Unknown mangling specifier in datalayout string");
Rafael Espindola58873562014-01-03 19:21:54 +0000342 switch(Rest[0]) {
343 default:
David Majnemer5330c692014-12-10 01:17:08 +0000344 report_fatal_error("Unknown mangling in datalayout string");
Rafael Espindola58873562014-01-03 19:21:54 +0000345 case 'e':
346 ManglingMode = MM_ELF;
347 break;
348 case 'o':
349 ManglingMode = MM_MachO;
350 break;
351 case 'm':
352 ManglingMode = MM_Mips;
353 break;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000354 case 'w':
355 ManglingMode = MM_WINCOFF;
Rafael Espindola58873562014-01-03 19:21:54 +0000356 break;
357 }
358 break;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000359 default:
David Majnemer5330c692014-12-10 01:17:08 +0000360 report_fatal_error("Unknown specifier in datalayout string");
Micah Villmowac34b5c2012-10-04 22:08:14 +0000361 break;
362 }
363 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000364}
365
Craig Topperc6207612014-04-09 06:08:46 +0000366DataLayout::DataLayout(const Module *M) : LayoutMap(nullptr) {
Rafael Espindolac435adc2014-09-10 21:27:43 +0000367 init(M);
368}
369
370void DataLayout::init(const Module *M) {
Rafael Espindolaf863ee22014-02-25 20:01:08 +0000371 const DataLayout *Other = M->getDataLayout();
372 if (Other)
373 *this = *Other;
374 else
Rafael Espindola248ac132014-02-25 22:23:04 +0000375 reset("");
Rafael Espindolaf863ee22014-02-25 20:01:08 +0000376}
Micah Villmowac34b5c2012-10-04 22:08:14 +0000377
Rafael Espindolaae593f12014-02-26 17:02:08 +0000378bool DataLayout::operator==(const DataLayout &Other) const {
Chandler Carruthf67321c2014-10-20 10:41:29 +0000379 bool Ret = BigEndian == Other.BigEndian &&
Rafael Espindolaae593f12014-02-26 17:02:08 +0000380 StackNaturalAlign == Other.StackNaturalAlign &&
381 ManglingMode == Other.ManglingMode &&
382 LegalIntWidths == Other.LegalIntWidths &&
Rafael Espindola89992b02014-04-22 17:47:03 +0000383 Alignments == Other.Alignments && Pointers == Other.Pointers;
Rafael Espindolaae593f12014-02-26 17:02:08 +0000384 assert(Ret == (getStringRepresentation() == Other.getStringRepresentation()));
385 return Ret;
386}
387
Micah Villmowac34b5c2012-10-04 22:08:14 +0000388void
Micah Villmowb4faa152012-10-04 23:01:22 +0000389DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000390 unsigned pref_align, uint32_t bit_width) {
David Majnemer1b9fc3a2015-02-16 05:41:53 +0000391 if (!isUInt<24>(bit_width))
392 report_fatal_error("Invalid bit width, must be a 24bit integer");
393 if (!isUInt<16>(abi_align))
394 report_fatal_error("Invalid ABI alignment, must be a 16bit integer");
395 if (!isUInt<16>(pref_align))
396 report_fatal_error("Invalid preferred alignment, must be a 16bit integer");
397
398 if (pref_align < abi_align)
399 report_fatal_error(
400 "Preferred alignment cannot be less than the ABI alignment");
401
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000402 for (LayoutAlignElem &Elem : Alignments) {
403 if (Elem.AlignType == (unsigned)align_type &&
404 Elem.TypeBitWidth == bit_width) {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000405 // Update the abi, preferred alignments.
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000406 Elem.ABIAlign = abi_align;
407 Elem.PrefAlign = pref_align;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000408 return;
409 }
410 }
411
Micah Villmowb4faa152012-10-04 23:01:22 +0000412 Alignments.push_back(LayoutAlignElem::get(align_type, abi_align,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000413 pref_align, bit_width));
414}
415
Rafael Espindola667fcb82014-02-26 16:58:35 +0000416DataLayout::PointersTy::iterator
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000417DataLayout::findPointerLowerBound(uint32_t AddressSpace) {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000418 return std::lower_bound(Pointers.begin(), Pointers.end(), AddressSpace,
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000419 [](const PointerAlignElem &A, uint32_t AddressSpace) {
420 return A.AddressSpace < AddressSpace;
421 });
Rafael Espindola667fcb82014-02-26 16:58:35 +0000422}
423
Rafael Espindolaf39136c2013-12-13 23:15:20 +0000424void DataLayout::setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign,
425 unsigned PrefAlign,
426 uint32_t TypeByteWidth) {
427 assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000428 PointersTy::iterator I = findPointerLowerBound(AddrSpace);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000429 if (I == Pointers.end() || I->AddressSpace != AddrSpace) {
430 Pointers.insert(I, PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign,
431 TypeByteWidth));
Micah Villmow89021e42012-10-09 16:06:12 +0000432 } else {
Rafael Espindola667fcb82014-02-26 16:58:35 +0000433 I->ABIAlign = ABIAlign;
434 I->PrefAlign = PrefAlign;
435 I->TypeByteWidth = TypeByteWidth;
Micah Villmow89021e42012-10-09 16:06:12 +0000436 }
437}
438
Micah Villmowac34b5c2012-10-04 22:08:14 +0000439/// getAlignmentInfo - Return the alignment (either ABI if ABIInfo = true or
Micah Villmowb4faa152012-10-04 23:01:22 +0000440/// preferred if ABIInfo = false) the layout wants for the specified datatype.
441unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000442 uint32_t BitWidth, bool ABIInfo,
443 Type *Ty) const {
444 // Check to see if we have an exact match and remember the best match we see.
445 int BestMatchIdx = -1;
446 int LargestInt = -1;
447 for (unsigned i = 0, e = Alignments.size(); i != e; ++i) {
Micah Villmow6d05e692012-10-05 17:02:14 +0000448 if (Alignments[i].AlignType == (unsigned)AlignType &&
Micah Villmowac34b5c2012-10-04 22:08:14 +0000449 Alignments[i].TypeBitWidth == BitWidth)
450 return ABIInfo ? Alignments[i].ABIAlign : Alignments[i].PrefAlign;
451
452 // The best match so far depends on what we're looking for.
453 if (AlignType == INTEGER_ALIGN &&
454 Alignments[i].AlignType == INTEGER_ALIGN) {
455 // The "best match" for integers is the smallest size that is larger than
456 // the BitWidth requested.
457 if (Alignments[i].TypeBitWidth > BitWidth && (BestMatchIdx == -1 ||
Eli Benderskyfaf5e3e2013-01-30 19:24:23 +0000458 Alignments[i].TypeBitWidth < Alignments[BestMatchIdx].TypeBitWidth))
Micah Villmowac34b5c2012-10-04 22:08:14 +0000459 BestMatchIdx = i;
460 // However, if there isn't one that's larger, then we must use the
461 // largest one we have (see below)
462 if (LargestInt == -1 ||
463 Alignments[i].TypeBitWidth > Alignments[LargestInt].TypeBitWidth)
464 LargestInt = i;
465 }
466 }
467
468 // Okay, we didn't find an exact solution. Fall back here depending on what
469 // is being looked for.
470 if (BestMatchIdx == -1) {
471 // If we didn't find an integer alignment, fall back on most conservative.
472 if (AlignType == INTEGER_ALIGN) {
473 BestMatchIdx = LargestInt;
474 } else {
475 assert(AlignType == VECTOR_ALIGN && "Unknown alignment type!");
476
477 // By default, use natural alignment for vector types. This is consistent
478 // with what clang and llvm-gcc do.
479 unsigned Align = getTypeAllocSize(cast<VectorType>(Ty)->getElementType());
480 Align *= cast<VectorType>(Ty)->getNumElements();
481 // If the alignment is not a power of 2, round up to the next power of 2.
482 // This happens for non-power-of-2 length vectors.
483 if (Align & (Align-1))
484 Align = NextPowerOf2(Align);
485 return Align;
486 }
487 }
488
489 // Since we got a "best match" index, just return it.
490 return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
491 : Alignments[BestMatchIdx].PrefAlign;
492}
493
494namespace {
495
496class StructLayoutMap {
497 typedef DenseMap<StructType*, StructLayout*> LayoutInfoTy;
498 LayoutInfoTy LayoutInfo;
499
500public:
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000501 ~StructLayoutMap() {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000502 // Remove any layouts.
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000503 for (const auto &I : LayoutInfo) {
504 StructLayout *Value = I.second;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000505 Value->~StructLayout();
506 free(Value);
507 }
508 }
509
510 StructLayout *&operator[](StructType *STy) {
511 return LayoutInfo[STy];
512 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000513};
514
515} // end anonymous namespace
516
Rafael Espindola248ac132014-02-25 22:23:04 +0000517void DataLayout::clear() {
518 LegalIntWidths.clear();
519 Alignments.clear();
520 Pointers.clear();
521 delete static_cast<StructLayoutMap *>(LayoutMap);
Craig Topperc6207612014-04-09 06:08:46 +0000522 LayoutMap = nullptr;
Rafael Espindola248ac132014-02-25 22:23:04 +0000523}
524
Micah Villmowb4faa152012-10-04 23:01:22 +0000525DataLayout::~DataLayout() {
Rafael Espindola248ac132014-02-25 22:23:04 +0000526 clear();
Micah Villmowac34b5c2012-10-04 22:08:14 +0000527}
528
Micah Villmowb4faa152012-10-04 23:01:22 +0000529const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000530 if (!LayoutMap)
531 LayoutMap = new StructLayoutMap();
532
533 StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
534 StructLayout *&SL = (*STM)[Ty];
535 if (SL) return SL;
536
537 // Otherwise, create the struct layout. Because it is variable length, we
538 // malloc it, then use placement new.
539 int NumElts = Ty->getNumElements();
540 StructLayout *L =
541 (StructLayout *)malloc(sizeof(StructLayout)+(NumElts-1) * sizeof(uint64_t));
542
543 // Set SL before calling StructLayout's ctor. The ctor could cause other
544 // entries to be added to TheMap, invalidating our reference.
545 SL = L;
546
547 new (L) StructLayout(Ty, *this);
548
549 return L;
550}
551
Micah Villmowb4faa152012-10-04 23:01:22 +0000552std::string DataLayout::getStringRepresentation() const {
Alp Tokere69170a2014-06-26 22:52:05 +0000553 std::string Result;
554 raw_string_ostream OS(Result);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000555
Chandler Carruthf67321c2014-10-20 10:41:29 +0000556 OS << (BigEndian ? "E" : "e");
Rafael Espindola58873562014-01-03 19:21:54 +0000557
558 switch (ManglingMode) {
559 case MM_None:
560 break;
561 case MM_ELF:
562 OS << "-m:e";
563 break;
564 case MM_MachO:
565 OS << "-m:o";
566 break;
Rafael Espindolaaf77e122014-01-10 13:42:12 +0000567 case MM_WINCOFF:
568 OS << "-m:w";
Rafael Espindola58873562014-01-03 19:21:54 +0000569 break;
570 case MM_Mips:
571 OS << "-m:m";
572 break;
573 }
574
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000575 for (const PointerAlignElem &PI : Pointers) {
Rafael Espindola458a4852013-12-19 23:03:03 +0000576 // Skip default.
577 if (PI.AddressSpace == 0 && PI.ABIAlign == 8 && PI.PrefAlign == 8 &&
578 PI.TypeByteWidth == 8)
579 continue;
580
Micah Villmow89021e42012-10-09 16:06:12 +0000581 OS << "-p";
582 if (PI.AddressSpace) {
583 OS << PI.AddressSpace;
584 }
Rafael Espindola458a4852013-12-19 23:03:03 +0000585 OS << ":" << PI.TypeByteWidth*8 << ':' << PI.ABIAlign*8;
586 if (PI.PrefAlign != PI.ABIAlign)
587 OS << ':' << PI.PrefAlign*8;
Micah Villmow89021e42012-10-09 16:06:12 +0000588 }
Micah Villmowac34b5c2012-10-04 22:08:14 +0000589
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000590 for (const LayoutAlignElem &AI : Alignments) {
591 if (std::find(std::begin(DefaultAlignments), std::end(DefaultAlignments),
592 AI) != std::end(DefaultAlignments))
Rafael Espindola458a4852013-12-19 23:03:03 +0000593 continue;
594 OS << '-' << (char)AI.AlignType;
595 if (AI.TypeBitWidth)
596 OS << AI.TypeBitWidth;
597 OS << ':' << AI.ABIAlign*8;
598 if (AI.ABIAlign != AI.PrefAlign)
599 OS << ':' << AI.PrefAlign*8;
Micah Villmowac34b5c2012-10-04 22:08:14 +0000600 }
601
602 if (!LegalIntWidths.empty()) {
603 OS << "-n" << (unsigned)LegalIntWidths[0];
604
605 for (unsigned i = 1, e = LegalIntWidths.size(); i != e; ++i)
606 OS << ':' << (unsigned)LegalIntWidths[i];
607 }
Rafael Espindola458a4852013-12-19 23:03:03 +0000608
609 if (StackNaturalAlign)
610 OS << "-S" << StackNaturalAlign*8;
611
Micah Villmowac34b5c2012-10-04 22:08:14 +0000612 return OS.str();
613}
614
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000615unsigned DataLayout::getPointerABIAlignment(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000616 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000617 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000618 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000619 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000620 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000621 return I->ABIAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000622}
623
624unsigned DataLayout::getPointerPrefAlignment(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000625 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000626 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000627 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000628 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000629 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000630 return I->PrefAlign;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000631}
632
633unsigned DataLayout::getPointerSize(unsigned AS) const {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000634 PointersTy::const_iterator I = findPointerLowerBound(AS);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000635 if (I == Pointers.end() || I->AddressSpace != AS) {
Rafael Espindolae8ae0db2014-02-26 17:05:38 +0000636 I = findPointerLowerBound(0);
Rafael Espindola667fcb82014-02-26 16:58:35 +0000637 assert(I->AddressSpace == 0);
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000638 }
Rafael Espindola667fcb82014-02-26 16:58:35 +0000639 return I->TypeByteWidth;
Rafael Espindola5109fcc2014-02-26 16:49:40 +0000640}
641
Matt Arsenault6f4be902013-07-26 17:37:20 +0000642unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {
643 assert(Ty->isPtrOrPtrVectorTy() &&
644 "This should only be called with a pointer or pointer vector type");
645
646 if (Ty->isPointerTy())
647 return getTypeSizeInBits(Ty);
648
Matt Arsenault517cf482013-07-27 19:22:28 +0000649 return getTypeSizeInBits(Ty->getScalarType());
Matt Arsenault6f4be902013-07-26 17:37:20 +0000650}
Micah Villmowac34b5c2012-10-04 22:08:14 +0000651
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 */
Micah Villmowb4faa152012-10-04 23:01:22 +0000660unsigned DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000661 int AlignType = -1;
662
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
710 return getAlignmentInfo((AlignTypeEnum)AlignType, getTypeSizeInBits(Ty),
711 abi_or_pref, Ty);
712}
713
Micah Villmowb4faa152012-10-04 23:01:22 +0000714unsigned DataLayout::getABITypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000715 return getAlignment(Ty, true);
716}
717
718/// getABIIntegerTypeAlignment - Return the minimum ABI-required alignment for
719/// an integer type of the specified bitwidth.
Micah Villmowb4faa152012-10-04 23:01:22 +0000720unsigned DataLayout::getABIIntegerTypeAlignment(unsigned BitWidth) const {
Craig Topperc6207612014-04-09 06:08:46 +0000721 return getAlignmentInfo(INTEGER_ALIGN, BitWidth, true, nullptr);
Micah Villmowac34b5c2012-10-04 22:08:14 +0000722}
723
Micah Villmowb4faa152012-10-04 23:01:22 +0000724unsigned DataLayout::getPrefTypeAlignment(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000725 return getAlignment(Ty, false);
726}
727
Micah Villmowb4faa152012-10-04 23:01:22 +0000728unsigned DataLayout::getPreferredTypeAlignmentShift(Type *Ty) const {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000729 unsigned Align = getPrefTypeAlignment(Ty);
730 assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
731 return Log2_32(Align);
732}
733
Micah Villmow89021e42012-10-09 16:06:12 +0000734IntegerType *DataLayout::getIntPtrType(LLVMContext &C,
735 unsigned AddressSpace) const {
736 return IntegerType::get(C, getPointerSizeInBits(AddressSpace));
Micah Villmowac34b5c2012-10-04 22:08:14 +0000737}
738
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000739Type *DataLayout::getIntPtrType(Type *Ty) const {
Chandler Carruth7ec50852012-11-01 08:07:29 +0000740 assert(Ty->isPtrOrPtrVectorTy() &&
741 "Expected a pointer or pointer vector type.");
Matt Arsenault4dbd4892014-04-23 21:10:15 +0000742 unsigned NumBits = getPointerTypeSizeInBits(Ty);
Duncan Sands5bdd9dd2012-10-29 17:31:46 +0000743 IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
744 if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
745 return VectorType::get(IntTy, VecTy->getNumElements());
746 return IntTy;
Micah Villmow12d91272012-10-24 15:52:52 +0000747}
748
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000749Type *DataLayout::getSmallestLegalIntType(LLVMContext &C, unsigned Width) const {
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000750 for (unsigned LegalIntWidth : LegalIntWidths)
751 if (Width <= LegalIntWidth)
752 return Type::getIntNTy(C, LegalIntWidth);
Craig Topperc6207612014-04-09 06:08:46 +0000753 return nullptr;
Arnaud A. de Grandmaisonf364bc62013-03-22 08:25:01 +0000754}
755
Matt Arsenault899f7d22013-09-16 22:43:16 +0000756unsigned DataLayout::getLargestLegalIntTypeSize() const {
Benjamin Kramer3ad5c962014-03-10 15:03:06 +0000757 auto Max = std::max_element(LegalIntWidths.begin(), LegalIntWidths.end());
758 return Max != LegalIntWidths.end() ? *Max : 0;
Matt Arsenault899f7d22013-09-16 22:43:16 +0000759}
760
Micah Villmowb4faa152012-10-04 23:01:22 +0000761uint64_t DataLayout::getIndexedOffset(Type *ptrTy,
Micah Villmowac34b5c2012-10-04 22:08:14 +0000762 ArrayRef<Value *> Indices) const {
763 Type *Ty = ptrTy;
764 assert(Ty->isPointerTy() && "Illegal argument for getIndexedOffset()");
765 uint64_t Result = 0;
766
767 generic_gep_type_iterator<Value* const*>
768 TI = gep_type_begin(ptrTy, Indices);
769 for (unsigned CurIDX = 0, EndIDX = Indices.size(); CurIDX != EndIDX;
770 ++CurIDX, ++TI) {
771 if (StructType *STy = dyn_cast<StructType>(*TI)) {
772 assert(Indices[CurIDX]->getType() ==
773 Type::getInt32Ty(ptrTy->getContext()) &&
774 "Illegal struct idx");
775 unsigned FieldNo = cast<ConstantInt>(Indices[CurIDX])->getZExtValue();
776
777 // Get structure layout information...
778 const StructLayout *Layout = getStructLayout(STy);
779
780 // Add in the offset, as calculated by the structure layout info...
781 Result += Layout->getElementOffset(FieldNo);
782
783 // Update Ty to refer to current element
784 Ty = STy->getElementType(FieldNo);
785 } else {
786 // Update Ty to refer to current element
787 Ty = cast<SequentialType>(Ty)->getElementType();
788
789 // Get the array index and the size of each array element.
790 if (int64_t arrayIdx = cast<ConstantInt>(Indices[CurIDX])->getSExtValue())
791 Result += (uint64_t)arrayIdx * getTypeAllocSize(Ty);
792 }
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 {
Micah Villmowac34b5c2012-10-04 22:08:14 +0000802 Type *ElemType = GV->getType()->getElementType();
803 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}
Rafael Espindola93512512014-02-25 17:30:31 +0000828
829DataLayoutPass::DataLayoutPass() : ImmutablePass(ID), DL("") {
Rafael Espindolac435adc2014-09-10 21:27:43 +0000830 initializeDataLayoutPassPass(*PassRegistry::getPassRegistry());
Rafael Espindola93512512014-02-25 17:30:31 +0000831}
832
833DataLayoutPass::~DataLayoutPass() {}
834
Rafael Espindolac435adc2014-09-10 21:27:43 +0000835bool DataLayoutPass::doInitialization(Module &M) {
836 DL.init(&M);
837 return false;
Rafael Espindola93512512014-02-25 17:30:31 +0000838}
839
Rafael Espindolac435adc2014-09-10 21:27:43 +0000840bool DataLayoutPass::doFinalization(Module &M) {
841 DL.reset("");
842 return false;
Rafael Espindola93512512014-02-25 17:30:31 +0000843}