blob: 83d1f6d8b52b8808cef66f0e4175fad363f4590a [file] [log] [blame]
Anton Korobeynikov82d0a412010-01-10 12:58:08 +00001//===---- TargetInfo.cpp - Encapsulate target details -----------*- C++ -*-===//
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +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//
10// These classes wrap the information about a call or function
11// definition used to handle ABI compliancy.
12//
13//===----------------------------------------------------------------------===//
14
Anton Korobeynikov82d0a412010-01-10 12:58:08 +000015#include "TargetInfo.h"
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +000016#include "ABIInfo.h"
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +000017#include "CGCXXABI.h"
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +000018#include "CodeGenFunction.h"
Anders Carlsson19cc4ab2009-07-18 19:43:29 +000019#include "clang/AST/RecordLayout.h"
Sandeep Patel34c1af82011-04-05 00:23:47 +000020#include "clang/Frontend/CodeGenOptions.h"
Daniel Dunbar2c0843f2009-08-24 08:52:16 +000021#include "llvm/ADT/Triple.h"
Chandler Carruth3b844ba2013-01-02 11:45:17 +000022#include "llvm/IR/DataLayout.h"
23#include "llvm/IR/Type.h"
Daniel Dunbar28df7a52009-12-03 09:13:49 +000024#include "llvm/Support/raw_ostream.h"
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +000025using namespace clang;
26using namespace CodeGen;
27
John McCallaeeb7012010-05-27 06:19:26 +000028static void AssignToArrayRange(CodeGen::CGBuilderTy &Builder,
29 llvm::Value *Array,
30 llvm::Value *Value,
31 unsigned FirstIndex,
32 unsigned LastIndex) {
33 // Alternatively, we could emit this as a loop in the source.
34 for (unsigned I = FirstIndex; I <= LastIndex; ++I) {
35 llvm::Value *Cell = Builder.CreateConstInBoundsGEP1_32(Array, I);
36 Builder.CreateStore(Value, Cell);
37 }
38}
39
John McCalld608cdb2010-08-22 10:59:02 +000040static bool isAggregateTypeForABI(QualType T) {
John McCall9d232c82013-03-07 21:37:08 +000041 return !CodeGenFunction::hasScalarEvaluationKind(T) ||
John McCalld608cdb2010-08-22 10:59:02 +000042 T->isMemberFunctionPointerType();
43}
44
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +000045ABIInfo::~ABIInfo() {}
46
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +000047static bool isRecordReturnIndirect(const RecordType *RT, CodeGen::CodeGenTypes &CGT) {
48 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl());
49 if (!RD)
50 return false;
51 return CGT.CGM.getCXXABI().isReturnTypeIndirect(RD);
52}
53
54
55static bool isRecordReturnIndirect(QualType T, CodeGen::CodeGenTypes &CGT) {
56 const RecordType *RT = T->getAs<RecordType>();
57 if (!RT)
58 return false;
59 return isRecordReturnIndirect(RT, CGT);
60}
61
62static CGCXXABI::RecordArgABI getRecordArgABI(const RecordType *RT,
63 CodeGen::CodeGenTypes &CGT) {
64 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl());
65 if (!RD)
66 return CGCXXABI::RAA_Default;
67 return CGT.CGM.getCXXABI().getRecordArgABI(RD);
68}
69
70static CGCXXABI::RecordArgABI getRecordArgABI(QualType T,
71 CodeGen::CodeGenTypes &CGT) {
72 const RecordType *RT = T->getAs<RecordType>();
73 if (!RT)
74 return CGCXXABI::RAA_Default;
75 return getRecordArgABI(RT, CGT);
76}
77
Chris Lattnerea044322010-07-29 02:01:43 +000078ASTContext &ABIInfo::getContext() const {
79 return CGT.getContext();
80}
81
82llvm::LLVMContext &ABIInfo::getVMContext() const {
83 return CGT.getLLVMContext();
84}
85
Micah Villmow25a6a842012-10-08 16:25:52 +000086const llvm::DataLayout &ABIInfo::getDataLayout() const {
87 return CGT.getDataLayout();
Chris Lattnerea044322010-07-29 02:01:43 +000088}
89
John McCall64aa4b32013-04-16 22:48:15 +000090const TargetInfo &ABIInfo::getTarget() const {
91 return CGT.getTarget();
92}
Chris Lattnerea044322010-07-29 02:01:43 +000093
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +000094void ABIArgInfo::dump() const {
Chris Lattner5f9e2722011-07-23 10:55:15 +000095 raw_ostream &OS = llvm::errs();
Daniel Dunbar28df7a52009-12-03 09:13:49 +000096 OS << "(ABIArgInfo Kind=";
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +000097 switch (TheKind) {
98 case Direct:
Chris Lattner800588f2010-07-29 06:26:06 +000099 OS << "Direct Type=";
Chris Lattner2acc6e32011-07-18 04:24:23 +0000100 if (llvm::Type *Ty = getCoerceToType())
Chris Lattner800588f2010-07-29 06:26:06 +0000101 Ty->print(OS);
102 else
103 OS << "null";
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000104 break;
Anton Korobeynikovcc6fa882009-06-06 09:36:29 +0000105 case Extend:
Daniel Dunbar28df7a52009-12-03 09:13:49 +0000106 OS << "Extend";
Anton Korobeynikovcc6fa882009-06-06 09:36:29 +0000107 break;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000108 case Ignore:
Daniel Dunbar28df7a52009-12-03 09:13:49 +0000109 OS << "Ignore";
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000110 break;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000111 case Indirect:
Daniel Dunbardc6d5742010-04-21 19:10:51 +0000112 OS << "Indirect Align=" << getIndirectAlign()
Joerg Sonnenbergere9b5d772011-07-15 18:23:44 +0000113 << " ByVal=" << getIndirectByVal()
Daniel Dunbarcf3b6f22010-09-16 20:42:02 +0000114 << " Realign=" << getIndirectRealign();
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000115 break;
116 case Expand:
Daniel Dunbar28df7a52009-12-03 09:13:49 +0000117 OS << "Expand";
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000118 break;
119 }
Daniel Dunbar28df7a52009-12-03 09:13:49 +0000120 OS << ")\n";
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000121}
122
Anton Korobeynikov82d0a412010-01-10 12:58:08 +0000123TargetCodeGenInfo::~TargetCodeGenInfo() { delete Info; }
124
John McCall49e34be2011-08-30 01:42:09 +0000125// If someone can figure out a general rule for this, that would be great.
126// It's probably just doomed to be platform-dependent, though.
127unsigned TargetCodeGenInfo::getSizeOfUnwindException() const {
128 // Verified for:
129 // x86-64 FreeBSD, Linux, Darwin
130 // x86-32 FreeBSD, Linux, Darwin
131 // PowerPC Linux, Darwin
132 // ARM Darwin (*not* EABI)
Tim Northoverc264e162013-01-31 12:13:10 +0000133 // AArch64 Linux
John McCall49e34be2011-08-30 01:42:09 +0000134 return 32;
135}
136
John McCallde5d3c72012-02-17 03:33:10 +0000137bool TargetCodeGenInfo::isNoProtoCallVariadic(const CallArgList &args,
138 const FunctionNoProtoType *fnType) const {
John McCall01f151e2011-09-21 08:08:30 +0000139 // The following conventions are known to require this to be false:
140 // x86_stdcall
141 // MIPS
142 // For everything else, we just prefer false unless we opt out.
143 return false;
144}
145
Daniel Dunbar98303b92009-09-13 08:03:58 +0000146static bool isEmptyRecord(ASTContext &Context, QualType T, bool AllowArrays);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000147
Sylvestre Ledruf3477c12012-09-27 10:16:10 +0000148/// isEmptyField - Return true iff a the field is "empty", that is it
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000149/// is an unnamed bit-field or an (array of) empty record(s).
Daniel Dunbar98303b92009-09-13 08:03:58 +0000150static bool isEmptyField(ASTContext &Context, const FieldDecl *FD,
151 bool AllowArrays) {
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000152 if (FD->isUnnamedBitfield())
153 return true;
154
155 QualType FT = FD->getType();
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000156
Eli Friedman7e7ad3f2011-11-18 03:47:20 +0000157 // Constant arrays of empty records count as empty, strip them off.
158 // Constant arrays of zero length always count as empty.
Daniel Dunbar98303b92009-09-13 08:03:58 +0000159 if (AllowArrays)
Eli Friedman7e7ad3f2011-11-18 03:47:20 +0000160 while (const ConstantArrayType *AT = Context.getAsConstantArrayType(FT)) {
161 if (AT->getSize() == 0)
162 return true;
Daniel Dunbar98303b92009-09-13 08:03:58 +0000163 FT = AT->getElementType();
Eli Friedman7e7ad3f2011-11-18 03:47:20 +0000164 }
Daniel Dunbar98303b92009-09-13 08:03:58 +0000165
Daniel Dunbar5ea68612010-05-17 16:46:00 +0000166 const RecordType *RT = FT->getAs<RecordType>();
167 if (!RT)
168 return false;
169
170 // C++ record fields are never empty, at least in the Itanium ABI.
171 //
172 // FIXME: We should use a predicate for whether this behavior is true in the
173 // current ABI.
174 if (isa<CXXRecordDecl>(RT->getDecl()))
175 return false;
176
Daniel Dunbar98303b92009-09-13 08:03:58 +0000177 return isEmptyRecord(Context, FT, AllowArrays);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000178}
179
Sylvestre Ledruf3477c12012-09-27 10:16:10 +0000180/// isEmptyRecord - Return true iff a structure contains only empty
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000181/// fields. Note that a structure with a flexible array member is not
182/// considered empty.
Daniel Dunbar98303b92009-09-13 08:03:58 +0000183static bool isEmptyRecord(ASTContext &Context, QualType T, bool AllowArrays) {
Ted Kremenek6217b802009-07-29 21:53:49 +0000184 const RecordType *RT = T->getAs<RecordType>();
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000185 if (!RT)
186 return 0;
187 const RecordDecl *RD = RT->getDecl();
188 if (RD->hasFlexibleArrayMember())
189 return false;
Daniel Dunbar5ea68612010-05-17 16:46:00 +0000190
Argyrios Kyrtzidisc5f18f32011-05-17 02:17:52 +0000191 // If this is a C++ record, check the bases first.
Daniel Dunbar5ea68612010-05-17 16:46:00 +0000192 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
Argyrios Kyrtzidisc5f18f32011-05-17 02:17:52 +0000193 for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(),
194 e = CXXRD->bases_end(); i != e; ++i)
195 if (!isEmptyRecord(Context, i->getType(), true))
196 return false;
Daniel Dunbar5ea68612010-05-17 16:46:00 +0000197
Argyrios Kyrtzidis17945a02009-06-30 02:36:12 +0000198 for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
199 i != e; ++i)
David Blaikie581deb32012-06-06 20:45:41 +0000200 if (!isEmptyField(Context, *i, AllowArrays))
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000201 return false;
202 return true;
203}
204
205/// isSingleElementStruct - Determine if a structure is a "single
206/// element struct", i.e. it has exactly one non-empty field or
207/// exactly one field which is itself a single element
208/// struct. Structures with flexible array members are never
209/// considered single element structs.
210///
211/// \return The field declaration for the single non-empty field, if
212/// it exists.
213static const Type *isSingleElementStruct(QualType T, ASTContext &Context) {
214 const RecordType *RT = T->getAsStructureType();
215 if (!RT)
216 return 0;
217
218 const RecordDecl *RD = RT->getDecl();
219 if (RD->hasFlexibleArrayMember())
220 return 0;
221
222 const Type *Found = 0;
Michael J. Spencer8bea82f2010-08-25 18:17:27 +0000223
Daniel Dunbar9430d5a2010-05-11 21:15:36 +0000224 // If this is a C++ record, check the bases first.
225 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
226 for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(),
227 e = CXXRD->bases_end(); i != e; ++i) {
Daniel Dunbar9430d5a2010-05-11 21:15:36 +0000228 // Ignore empty records.
Daniel Dunbar5ea68612010-05-17 16:46:00 +0000229 if (isEmptyRecord(Context, i->getType(), true))
Daniel Dunbar9430d5a2010-05-11 21:15:36 +0000230 continue;
231
232 // If we already found an element then this isn't a single-element struct.
233 if (Found)
234 return 0;
235
236 // If this is non-empty and not a single element struct, the composite
237 // cannot be a single element struct.
238 Found = isSingleElementStruct(i->getType(), Context);
239 if (!Found)
240 return 0;
241 }
242 }
243
244 // Check for single element.
Argyrios Kyrtzidis17945a02009-06-30 02:36:12 +0000245 for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
246 i != e; ++i) {
David Blaikie581deb32012-06-06 20:45:41 +0000247 const FieldDecl *FD = *i;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000248 QualType FT = FD->getType();
249
250 // Ignore empty fields.
Daniel Dunbar98303b92009-09-13 08:03:58 +0000251 if (isEmptyField(Context, FD, true))
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000252 continue;
253
254 // If we already found an element then this isn't a single-element
255 // struct.
256 if (Found)
257 return 0;
258
259 // Treat single element arrays as the element.
260 while (const ConstantArrayType *AT = Context.getAsConstantArrayType(FT)) {
261 if (AT->getSize().getZExtValue() != 1)
262 break;
263 FT = AT->getElementType();
264 }
265
John McCalld608cdb2010-08-22 10:59:02 +0000266 if (!isAggregateTypeForABI(FT)) {
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000267 Found = FT.getTypePtr();
268 } else {
269 Found = isSingleElementStruct(FT, Context);
270 if (!Found)
271 return 0;
272 }
273 }
274
Eli Friedmanbd4d3bc2011-11-18 01:25:50 +0000275 // We don't consider a struct a single-element struct if it has
276 // padding beyond the element type.
277 if (Found && Context.getTypeSize(Found) != Context.getTypeSize(T))
278 return 0;
279
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000280 return Found;
281}
282
283static bool is32Or64BitBasicType(QualType Ty, ASTContext &Context) {
Eli Friedmandb748a32012-11-29 23:21:04 +0000284 // Treat complex types as the element type.
285 if (const ComplexType *CTy = Ty->getAs<ComplexType>())
286 Ty = CTy->getElementType();
287
288 // Check for a type which we know has a simple scalar argument-passing
289 // convention without any padding. (We're specifically looking for 32
290 // and 64-bit integer and integer-equivalents, float, and double.)
Daniel Dunbara1842d32010-05-14 03:40:53 +0000291 if (!Ty->getAs<BuiltinType>() && !Ty->hasPointerRepresentation() &&
Eli Friedmandb748a32012-11-29 23:21:04 +0000292 !Ty->isEnumeralType() && !Ty->isBlockPointerType())
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000293 return false;
294
295 uint64_t Size = Context.getTypeSize(Ty);
296 return Size == 32 || Size == 64;
297}
298
Daniel Dunbar53012f42009-11-09 01:33:53 +0000299/// canExpandIndirectArgument - Test whether an argument type which is to be
300/// passed indirectly (on the stack) would have the equivalent layout if it was
301/// expanded into separate arguments. If so, we prefer to do the latter to avoid
302/// inhibiting optimizations.
303///
304// FIXME: This predicate is missing many cases, currently it just follows
305// llvm-gcc (checks that all fields are 32-bit or 64-bit primitive types). We
306// should probably make this smarter, or better yet make the LLVM backend
307// capable of handling it.
308static bool canExpandIndirectArgument(QualType Ty, ASTContext &Context) {
309 // We can only expand structure types.
310 const RecordType *RT = Ty->getAs<RecordType>();
311 if (!RT)
312 return false;
313
314 // We can only expand (C) structures.
315 //
316 // FIXME: This needs to be generalized to handle classes as well.
317 const RecordDecl *RD = RT->getDecl();
318 if (!RD->isStruct() || isa<CXXRecordDecl>(RD))
319 return false;
320
Eli Friedman506d4e32011-11-18 01:32:26 +0000321 uint64_t Size = 0;
322
Argyrios Kyrtzidis17945a02009-06-30 02:36:12 +0000323 for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
324 i != e; ++i) {
David Blaikie581deb32012-06-06 20:45:41 +0000325 const FieldDecl *FD = *i;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000326
327 if (!is32Or64BitBasicType(FD->getType(), Context))
328 return false;
329
330 // FIXME: Reject bit-fields wholesale; there are two problems, we don't know
331 // how to expand them yet, and the predicate for telling if a bitfield still
332 // counts as "basic" is more complicated than what we were doing previously.
333 if (FD->isBitField())
334 return false;
Eli Friedman506d4e32011-11-18 01:32:26 +0000335
336 Size += Context.getTypeSize(FD->getType());
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000337 }
338
Eli Friedman506d4e32011-11-18 01:32:26 +0000339 // Make sure there are not any holes in the struct.
340 if (Size != Context.getTypeSize(Ty))
341 return false;
342
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000343 return true;
344}
345
346namespace {
347/// DefaultABIInfo - The default implementation for ABI specific
348/// details. This implementation provides information which results in
349/// self-consistent and sensible LLVM IR generation, but does not
350/// conform to any particular ABI.
351class DefaultABIInfo : public ABIInfo {
Chris Lattnerea044322010-07-29 02:01:43 +0000352public:
353 DefaultABIInfo(CodeGen::CodeGenTypes &CGT) : ABIInfo(CGT) {}
Michael J. Spencer8bea82f2010-08-25 18:17:27 +0000354
Chris Lattnera3c109b2010-07-29 02:16:43 +0000355 ABIArgInfo classifyReturnType(QualType RetTy) const;
356 ABIArgInfo classifyArgumentType(QualType RetTy) const;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000357
Chris Lattneree5dcd02010-07-29 02:31:05 +0000358 virtual void computeInfo(CGFunctionInfo &FI) const {
Chris Lattnera3c109b2010-07-29 02:16:43 +0000359 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000360 for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
361 it != ie; ++it)
Chris Lattnera3c109b2010-07-29 02:16:43 +0000362 it->info = classifyArgumentType(it->type);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000363 }
364
365 virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
366 CodeGenFunction &CGF) const;
367};
368
Anton Korobeynikov82d0a412010-01-10 12:58:08 +0000369class DefaultTargetCodeGenInfo : public TargetCodeGenInfo {
370public:
Chris Lattnerea044322010-07-29 02:01:43 +0000371 DefaultTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT)
372 : TargetCodeGenInfo(new DefaultABIInfo(CGT)) {}
Anton Korobeynikov82d0a412010-01-10 12:58:08 +0000373};
374
375llvm::Value *DefaultABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
376 CodeGenFunction &CGF) const {
377 return 0;
378}
379
Chris Lattnera3c109b2010-07-29 02:16:43 +0000380ABIArgInfo DefaultABIInfo::classifyArgumentType(QualType Ty) const {
Jan Wen Voung90306932011-11-03 00:59:44 +0000381 if (isAggregateTypeForABI(Ty)) {
382 // Records with non trivial destructors/constructors should not be passed
383 // by value.
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +0000384 if (isRecordReturnIndirect(Ty, CGT))
Jan Wen Voung90306932011-11-03 00:59:44 +0000385 return ABIArgInfo::getIndirect(0, /*ByVal=*/false);
386
Anton Korobeynikov82d0a412010-01-10 12:58:08 +0000387 return ABIArgInfo::getIndirect(0);
Jan Wen Voung90306932011-11-03 00:59:44 +0000388 }
Daniel Dunbardc6d5742010-04-21 19:10:51 +0000389
Chris Lattnera14db752010-03-11 18:19:55 +0000390 // Treat an enum type as its underlying type.
391 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
392 Ty = EnumTy->getDecl()->getIntegerType();
Douglas Gregoraa74a1e2010-02-02 20:10:50 +0000393
Chris Lattnera14db752010-03-11 18:19:55 +0000394 return (Ty->isPromotableIntegerType() ?
395 ABIArgInfo::getExtend() : ABIArgInfo::getDirect());
Anton Korobeynikov82d0a412010-01-10 12:58:08 +0000396}
397
Bob Wilson0024f942011-01-10 23:54:17 +0000398ABIArgInfo DefaultABIInfo::classifyReturnType(QualType RetTy) const {
399 if (RetTy->isVoidType())
400 return ABIArgInfo::getIgnore();
401
402 if (isAggregateTypeForABI(RetTy))
403 return ABIArgInfo::getIndirect(0);
404
405 // Treat an enum type as its underlying type.
406 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
407 RetTy = EnumTy->getDecl()->getIntegerType();
408
409 return (RetTy->isPromotableIntegerType() ?
410 ABIArgInfo::getExtend() : ABIArgInfo::getDirect());
411}
412
Derek Schuff9ed63f82012-09-06 17:37:28 +0000413//===----------------------------------------------------------------------===//
414// le32/PNaCl bitcode ABI Implementation
Eli Benderskyc0783dc2013-04-08 21:31:01 +0000415//
416// This is a simplified version of the x86_32 ABI. Arguments and return values
417// are always passed on the stack.
Derek Schuff9ed63f82012-09-06 17:37:28 +0000418//===----------------------------------------------------------------------===//
419
420class PNaClABIInfo : public ABIInfo {
421 public:
422 PNaClABIInfo(CodeGen::CodeGenTypes &CGT) : ABIInfo(CGT) {}
423
424 ABIArgInfo classifyReturnType(QualType RetTy) const;
Eli Benderskyc0783dc2013-04-08 21:31:01 +0000425 ABIArgInfo classifyArgumentType(QualType RetTy) const;
Derek Schuff9ed63f82012-09-06 17:37:28 +0000426
427 virtual void computeInfo(CGFunctionInfo &FI) const;
428 virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
429 CodeGenFunction &CGF) const;
430};
431
432class PNaClTargetCodeGenInfo : public TargetCodeGenInfo {
433 public:
434 PNaClTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT)
435 : TargetCodeGenInfo(new PNaClABIInfo(CGT)) {}
436};
437
438void PNaClABIInfo::computeInfo(CGFunctionInfo &FI) const {
439 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
440
Derek Schuff9ed63f82012-09-06 17:37:28 +0000441 for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
442 it != ie; ++it)
Eli Benderskyc0783dc2013-04-08 21:31:01 +0000443 it->info = classifyArgumentType(it->type);
Derek Schuff9ed63f82012-09-06 17:37:28 +0000444 }
445
446llvm::Value *PNaClABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
447 CodeGenFunction &CGF) const {
448 return 0;
449}
450
Eli Benderskyc0783dc2013-04-08 21:31:01 +0000451/// \brief Classify argument of given type \p Ty.
452ABIArgInfo PNaClABIInfo::classifyArgumentType(QualType Ty) const {
Derek Schuff9ed63f82012-09-06 17:37:28 +0000453 if (isAggregateTypeForABI(Ty)) {
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +0000454 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, CGT))
455 return ABIArgInfo::getIndirect(0, RAA == CGCXXABI::RAA_DirectInMemory);
Derek Schuff9ed63f82012-09-06 17:37:28 +0000456 return ABIArgInfo::getIndirect(0);
Eli Benderskyc0783dc2013-04-08 21:31:01 +0000457 } else if (const EnumType *EnumTy = Ty->getAs<EnumType>()) {
458 // Treat an enum type as its underlying type.
Derek Schuff9ed63f82012-09-06 17:37:28 +0000459 Ty = EnumTy->getDecl()->getIntegerType();
Eli Benderskyc0783dc2013-04-08 21:31:01 +0000460 } else if (Ty->isFloatingType()) {
461 // Floating-point types don't go inreg.
462 return ABIArgInfo::getDirect();
Derek Schuff9ed63f82012-09-06 17:37:28 +0000463 }
Eli Benderskyc0783dc2013-04-08 21:31:01 +0000464
465 return (Ty->isPromotableIntegerType() ?
466 ABIArgInfo::getExtend() : ABIArgInfo::getDirect());
Derek Schuff9ed63f82012-09-06 17:37:28 +0000467}
468
469ABIArgInfo PNaClABIInfo::classifyReturnType(QualType RetTy) const {
470 if (RetTy->isVoidType())
471 return ABIArgInfo::getIgnore();
472
Eli Benderskye45dfd12013-04-04 22:49:35 +0000473 // In the PNaCl ABI we always return records/structures on the stack.
Derek Schuff9ed63f82012-09-06 17:37:28 +0000474 if (isAggregateTypeForABI(RetTy))
475 return ABIArgInfo::getIndirect(0);
476
477 // Treat an enum type as its underlying type.
478 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
479 RetTy = EnumTy->getDecl()->getIntegerType();
480
481 return (RetTy->isPromotableIntegerType() ?
482 ABIArgInfo::getExtend() : ABIArgInfo::getDirect());
483}
484
Chad Rosier1f1df1f2013-03-25 21:00:27 +0000485/// IsX86_MMXType - Return true if this is an MMX type.
486bool IsX86_MMXType(llvm::Type *IRType) {
487 // Return true if the type is an MMX type <2 x i32>, <4 x i16>, or <8 x i8>.
Bill Wendlingbb465d72010-10-18 03:41:31 +0000488 return IRType->isVectorTy() && IRType->getPrimitiveSizeInBits() == 64 &&
489 cast<llvm::VectorType>(IRType)->getElementType()->isIntegerTy() &&
490 IRType->getScalarSizeInBits() != 64;
491}
492
Jay Foadef6de3d2011-07-11 09:56:20 +0000493static llvm::Type* X86AdjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
Chris Lattner5f9e2722011-07-23 10:55:15 +0000494 StringRef Constraint,
Jay Foadef6de3d2011-07-11 09:56:20 +0000495 llvm::Type* Ty) {
Bill Wendling0507be62011-03-07 22:47:14 +0000496 if ((Constraint == "y" || Constraint == "&y") && Ty->isVectorTy())
Peter Collingbourne4b93d662011-02-19 23:03:58 +0000497 return llvm::Type::getX86_MMXTy(CGF.getLLVMContext());
498 return Ty;
499}
500
Chris Lattnerdce5ad02010-06-28 20:05:43 +0000501//===----------------------------------------------------------------------===//
502// X86-32 ABI Implementation
503//===----------------------------------------------------------------------===//
Michael J. Spencer8bea82f2010-08-25 18:17:27 +0000504
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000505/// X86_32ABIInfo - The X86-32 ABI information.
506class X86_32ABIInfo : public ABIInfo {
Rafael Espindolab48280b2012-07-31 02:44:24 +0000507 enum Class {
508 Integer,
509 Float
510 };
511
Daniel Dunbarfb67d6c2010-09-16 20:41:56 +0000512 static const unsigned MinABIStackAlignInBytes = 4;
513
David Chisnall1e4249c2009-08-17 23:08:21 +0000514 bool IsDarwinVectorABI;
515 bool IsSmallStructInRegABI;
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +0000516 bool IsWin32StructABI;
Rafael Espindolab48280b2012-07-31 02:44:24 +0000517 unsigned DefaultNumRegisterParameters;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000518
519 static bool isRegisterSize(unsigned Size) {
520 return (Size == 8 || Size == 16 || Size == 32 || Size == 64);
521 }
522
Aaron Ballman6c60c8d2012-02-22 03:04:13 +0000523 static bool shouldReturnTypeInRegister(QualType Ty, ASTContext &Context,
524 unsigned callingConvention);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000525
Daniel Dunbardc6d5742010-04-21 19:10:51 +0000526 /// getIndirectResult - Give a source type \arg Ty, return a suitable result
527 /// such that the argument will be passed in memory.
Rafael Espindola0b4cc952012-10-19 05:04:37 +0000528 ABIArgInfo getIndirectResult(QualType Ty, bool ByVal,
529 unsigned &FreeRegs) const;
Daniel Dunbardc6d5742010-04-21 19:10:51 +0000530
Daniel Dunbarfb67d6c2010-09-16 20:41:56 +0000531 /// \brief Return the alignment to use for the given type on the stack.
Daniel Dunbare59d8582010-09-16 20:42:06 +0000532 unsigned getTypeStackAlignInBytes(QualType Ty, unsigned Align) const;
Daniel Dunbarfb67d6c2010-09-16 20:41:56 +0000533
Rafael Espindolab48280b2012-07-31 02:44:24 +0000534 Class classify(QualType Ty) const;
Rafael Espindolab33a3c42012-07-23 23:30:29 +0000535 ABIArgInfo classifyReturnType(QualType RetTy,
Aaron Ballman6c60c8d2012-02-22 03:04:13 +0000536 unsigned callingConvention) const;
Rafael Espindolab6932692012-10-24 01:58:58 +0000537 ABIArgInfo classifyArgumentType(QualType RetTy, unsigned &FreeRegs,
538 bool IsFastCall) const;
539 bool shouldUseInReg(QualType Ty, unsigned &FreeRegs,
Rafael Espindolae4aeeaa2012-10-24 01:59:00 +0000540 bool IsFastCall, bool &NeedsPadding) const;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000541
Rafael Espindolab33a3c42012-07-23 23:30:29 +0000542public:
543
Rafael Espindolaaa9cf8d2012-07-24 00:01:07 +0000544 virtual void computeInfo(CGFunctionInfo &FI) const;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000545 virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
546 CodeGenFunction &CGF) const;
547
Chad Rosier1f1df1f2013-03-25 21:00:27 +0000548 X86_32ABIInfo(CodeGen::CodeGenTypes &CGT, bool d, bool p, bool w,
Rafael Espindolab48280b2012-07-31 02:44:24 +0000549 unsigned r)
Eli Friedmanc3e0fb42011-07-08 23:31:17 +0000550 : ABIInfo(CGT), IsDarwinVectorABI(d), IsSmallStructInRegABI(p),
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +0000551 IsWin32StructABI(w), DefaultNumRegisterParameters(r) {}
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000552};
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000553
Anton Korobeynikov82d0a412010-01-10 12:58:08 +0000554class X86_32TargetCodeGenInfo : public TargetCodeGenInfo {
555public:
Eli Friedman55fc7e22012-01-25 22:46:34 +0000556 X86_32TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT,
Chad Rosier1f1df1f2013-03-25 21:00:27 +0000557 bool d, bool p, bool w, unsigned r)
558 :TargetCodeGenInfo(new X86_32ABIInfo(CGT, d, p, w, r)) {}
Charles Davis74f72932010-02-13 15:54:06 +0000559
560 void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
561 CodeGen::CodeGenModule &CGM) const;
John McCall6374c332010-03-06 00:35:14 +0000562
563 int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const {
564 // Darwin uses different dwarf register numbers for EH.
John McCall64aa4b32013-04-16 22:48:15 +0000565 if (CGM.getTarget().getTriple().isOSDarwin()) return 5;
John McCall6374c332010-03-06 00:35:14 +0000566 return 4;
567 }
568
569 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
570 llvm::Value *Address) const;
Peter Collingbourne4b93d662011-02-19 23:03:58 +0000571
Jay Foadef6de3d2011-07-11 09:56:20 +0000572 llvm::Type* adjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
Chris Lattner5f9e2722011-07-23 10:55:15 +0000573 StringRef Constraint,
Jay Foadef6de3d2011-07-11 09:56:20 +0000574 llvm::Type* Ty) const {
Peter Collingbourne4b93d662011-02-19 23:03:58 +0000575 return X86AdjustInlineAsmType(CGF, Constraint, Ty);
576 }
577
Anton Korobeynikov82d0a412010-01-10 12:58:08 +0000578};
579
580}
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000581
582/// shouldReturnTypeInRegister - Determine if the given type should be
583/// passed in a register (for the Darwin ABI).
584bool X86_32ABIInfo::shouldReturnTypeInRegister(QualType Ty,
Aaron Ballman6c60c8d2012-02-22 03:04:13 +0000585 ASTContext &Context,
586 unsigned callingConvention) {
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000587 uint64_t Size = Context.getTypeSize(Ty);
588
589 // Type must be register sized.
590 if (!isRegisterSize(Size))
591 return false;
592
593 if (Ty->isVectorType()) {
594 // 64- and 128- bit vectors inside structures are not returned in
595 // registers.
596 if (Size == 64 || Size == 128)
597 return false;
598
599 return true;
600 }
601
Daniel Dunbar77115232010-05-15 00:00:30 +0000602 // If this is a builtin, pointer, enum, complex type, member pointer, or
603 // member function pointer it is ok.
Daniel Dunbara1842d32010-05-14 03:40:53 +0000604 if (Ty->getAs<BuiltinType>() || Ty->hasPointerRepresentation() ||
Daniel Dunbar55e59e12009-09-24 05:12:36 +0000605 Ty->isAnyComplexType() || Ty->isEnumeralType() ||
Daniel Dunbar77115232010-05-15 00:00:30 +0000606 Ty->isBlockPointerType() || Ty->isMemberPointerType())
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000607 return true;
608
609 // Arrays are treated like records.
610 if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty))
Aaron Ballman6c60c8d2012-02-22 03:04:13 +0000611 return shouldReturnTypeInRegister(AT->getElementType(), Context,
612 callingConvention);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000613
614 // Otherwise, it must be a record type.
Ted Kremenek6217b802009-07-29 21:53:49 +0000615 const RecordType *RT = Ty->getAs<RecordType>();
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000616 if (!RT) return false;
617
Anders Carlssona8874232010-01-27 03:25:19 +0000618 // FIXME: Traverse bases here too.
619
Aaron Ballman6c60c8d2012-02-22 03:04:13 +0000620 // For thiscall conventions, structures will never be returned in
621 // a register. This is for compatibility with the MSVC ABI
622 if (callingConvention == llvm::CallingConv::X86_ThisCall &&
623 RT->isStructureType()) {
624 return false;
625 }
626
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000627 // Structure types are passed in register if all fields would be
628 // passed in a register.
Argyrios Kyrtzidis17945a02009-06-30 02:36:12 +0000629 for (RecordDecl::field_iterator i = RT->getDecl()->field_begin(),
630 e = RT->getDecl()->field_end(); i != e; ++i) {
David Blaikie581deb32012-06-06 20:45:41 +0000631 const FieldDecl *FD = *i;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000632
633 // Empty fields are ignored.
Daniel Dunbar98303b92009-09-13 08:03:58 +0000634 if (isEmptyField(Context, FD, true))
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000635 continue;
636
637 // Check fields recursively.
Aaron Ballman6c60c8d2012-02-22 03:04:13 +0000638 if (!shouldReturnTypeInRegister(FD->getType(), Context,
639 callingConvention))
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000640 return false;
641 }
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000642 return true;
643}
644
Aaron Ballman6c60c8d2012-02-22 03:04:13 +0000645ABIArgInfo X86_32ABIInfo::classifyReturnType(QualType RetTy,
646 unsigned callingConvention) const {
Chris Lattnera3c109b2010-07-29 02:16:43 +0000647 if (RetTy->isVoidType())
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000648 return ABIArgInfo::getIgnore();
Michael J. Spencer8bea82f2010-08-25 18:17:27 +0000649
Chris Lattnera3c109b2010-07-29 02:16:43 +0000650 if (const VectorType *VT = RetTy->getAs<VectorType>()) {
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000651 // On Darwin, some vectors are returned in registers.
David Chisnall1e4249c2009-08-17 23:08:21 +0000652 if (IsDarwinVectorABI) {
Chris Lattnera3c109b2010-07-29 02:16:43 +0000653 uint64_t Size = getContext().getTypeSize(RetTy);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000654
655 // 128-bit vectors are a special case; they are returned in
656 // registers and we need to make sure to pick a type the LLVM
657 // backend will like.
658 if (Size == 128)
Chris Lattner800588f2010-07-29 06:26:06 +0000659 return ABIArgInfo::getDirect(llvm::VectorType::get(
Chris Lattnera3c109b2010-07-29 02:16:43 +0000660 llvm::Type::getInt64Ty(getVMContext()), 2));
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000661
662 // Always return in register if it fits in a general purpose
663 // register, or if it is 64 bits and has a single element.
664 if ((Size == 8 || Size == 16 || Size == 32) ||
665 (Size == 64 && VT->getNumElements() == 1))
Chris Lattner800588f2010-07-29 06:26:06 +0000666 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),
Chris Lattnera3c109b2010-07-29 02:16:43 +0000667 Size));
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000668
669 return ABIArgInfo::getIndirect(0);
670 }
671
672 return ABIArgInfo::getDirect();
Chris Lattnera3c109b2010-07-29 02:16:43 +0000673 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +0000674
John McCalld608cdb2010-08-22 10:59:02 +0000675 if (isAggregateTypeForABI(RetTy)) {
Anders Carlssona8874232010-01-27 03:25:19 +0000676 if (const RecordType *RT = RetTy->getAs<RecordType>()) {
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +0000677 if (isRecordReturnIndirect(RT, CGT))
Anders Carlsson40092972009-10-20 22:07:59 +0000678 return ABIArgInfo::getIndirect(0, /*ByVal=*/false);
Michael J. Spencer8bea82f2010-08-25 18:17:27 +0000679
Anders Carlsson40092972009-10-20 22:07:59 +0000680 // Structures with flexible arrays are always indirect.
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000681 if (RT->getDecl()->hasFlexibleArrayMember())
682 return ABIArgInfo::getIndirect(0);
Anders Carlsson40092972009-10-20 22:07:59 +0000683 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +0000684
David Chisnall1e4249c2009-08-17 23:08:21 +0000685 // If specified, structs and unions are always indirect.
686 if (!IsSmallStructInRegABI && !RetTy->isAnyComplexType())
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000687 return ABIArgInfo::getIndirect(0);
688
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000689 // Small structures which are register sized are generally returned
690 // in a register.
Aaron Ballman6c60c8d2012-02-22 03:04:13 +0000691 if (X86_32ABIInfo::shouldReturnTypeInRegister(RetTy, getContext(),
692 callingConvention)) {
Chris Lattnera3c109b2010-07-29 02:16:43 +0000693 uint64_t Size = getContext().getTypeSize(RetTy);
Eli Friedmanbd4d3bc2011-11-18 01:25:50 +0000694
695 // As a special-case, if the struct is a "single-element" struct, and
696 // the field is of type "float" or "double", return it in a
Eli Friedman55fc7e22012-01-25 22:46:34 +0000697 // floating-point register. (MSVC does not apply this special case.)
698 // We apply a similar transformation for pointer types to improve the
699 // quality of the generated IR.
Eli Friedmanbd4d3bc2011-11-18 01:25:50 +0000700 if (const Type *SeltTy = isSingleElementStruct(RetTy, getContext()))
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +0000701 if ((!IsWin32StructABI && SeltTy->isRealFloatingType())
Eli Friedman55fc7e22012-01-25 22:46:34 +0000702 || SeltTy->hasPointerRepresentation())
Eli Friedmanbd4d3bc2011-11-18 01:25:50 +0000703 return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0)));
704
705 // FIXME: We should be able to narrow this integer in cases with dead
706 // padding.
Chris Lattner800588f2010-07-29 06:26:06 +0000707 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),Size));
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000708 }
709
710 return ABIArgInfo::getIndirect(0);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000711 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +0000712
Chris Lattnera3c109b2010-07-29 02:16:43 +0000713 // Treat an enum type as its underlying type.
714 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
715 RetTy = EnumTy->getDecl()->getIntegerType();
716
717 return (RetTy->isPromotableIntegerType() ?
718 ABIArgInfo::getExtend() : ABIArgInfo::getDirect());
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000719}
720
Eli Friedmanf4bd4d82012-06-05 19:40:46 +0000721static bool isSSEVectorType(ASTContext &Context, QualType Ty) {
722 return Ty->getAs<VectorType>() && Context.getTypeSize(Ty) == 128;
723}
724
Daniel Dunbar93ae9472010-09-16 20:42:00 +0000725static bool isRecordWithSSEVectorType(ASTContext &Context, QualType Ty) {
726 const RecordType *RT = Ty->getAs<RecordType>();
727 if (!RT)
728 return 0;
729 const RecordDecl *RD = RT->getDecl();
730
731 // If this is a C++ record, check the bases first.
732 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
733 for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(),
734 e = CXXRD->bases_end(); i != e; ++i)
735 if (!isRecordWithSSEVectorType(Context, i->getType()))
736 return false;
737
738 for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
739 i != e; ++i) {
740 QualType FT = i->getType();
741
Eli Friedmanf4bd4d82012-06-05 19:40:46 +0000742 if (isSSEVectorType(Context, FT))
Daniel Dunbar93ae9472010-09-16 20:42:00 +0000743 return true;
744
745 if (isRecordWithSSEVectorType(Context, FT))
746 return true;
747 }
748
749 return false;
750}
751
Daniel Dunbare59d8582010-09-16 20:42:06 +0000752unsigned X86_32ABIInfo::getTypeStackAlignInBytes(QualType Ty,
753 unsigned Align) const {
754 // Otherwise, if the alignment is less than or equal to the minimum ABI
755 // alignment, just use the default; the backend will handle this.
Daniel Dunbarfb67d6c2010-09-16 20:41:56 +0000756 if (Align <= MinABIStackAlignInBytes)
Daniel Dunbare59d8582010-09-16 20:42:06 +0000757 return 0; // Use default alignment.
758
759 // On non-Darwin, the stack type alignment is always 4.
760 if (!IsDarwinVectorABI) {
761 // Set explicit alignment, since we may need to realign the top.
Daniel Dunbarfb67d6c2010-09-16 20:41:56 +0000762 return MinABIStackAlignInBytes;
Daniel Dunbare59d8582010-09-16 20:42:06 +0000763 }
Daniel Dunbarfb67d6c2010-09-16 20:41:56 +0000764
Daniel Dunbar93ae9472010-09-16 20:42:00 +0000765 // Otherwise, if the type contains an SSE vector type, the alignment is 16.
Eli Friedmanf4bd4d82012-06-05 19:40:46 +0000766 if (Align >= 16 && (isSSEVectorType(getContext(), Ty) ||
767 isRecordWithSSEVectorType(getContext(), Ty)))
Daniel Dunbar93ae9472010-09-16 20:42:00 +0000768 return 16;
769
770 return MinABIStackAlignInBytes;
Daniel Dunbarfb67d6c2010-09-16 20:41:56 +0000771}
772
Rafael Espindola0b4cc952012-10-19 05:04:37 +0000773ABIArgInfo X86_32ABIInfo::getIndirectResult(QualType Ty, bool ByVal,
774 unsigned &FreeRegs) const {
775 if (!ByVal) {
776 if (FreeRegs) {
777 --FreeRegs; // Non byval indirects just use one pointer.
778 return ABIArgInfo::getIndirectInReg(0, false);
779 }
Daniel Dunbar46c54fb2010-04-21 19:49:55 +0000780 return ABIArgInfo::getIndirect(0, false);
Rafael Espindola0b4cc952012-10-19 05:04:37 +0000781 }
Daniel Dunbar46c54fb2010-04-21 19:49:55 +0000782
Daniel Dunbare59d8582010-09-16 20:42:06 +0000783 // Compute the byval alignment.
784 unsigned TypeAlign = getContext().getTypeAlign(Ty) / 8;
785 unsigned StackAlign = getTypeStackAlignInBytes(Ty, TypeAlign);
786 if (StackAlign == 0)
Chris Lattnerde92d732011-05-22 23:35:00 +0000787 return ABIArgInfo::getIndirect(4);
Daniel Dunbare59d8582010-09-16 20:42:06 +0000788
789 // If the stack alignment is less than the type alignment, realign the
790 // argument.
791 if (StackAlign < TypeAlign)
792 return ABIArgInfo::getIndirect(StackAlign, /*ByVal=*/true,
793 /*Realign=*/true);
794
795 return ABIArgInfo::getIndirect(StackAlign);
Daniel Dunbardc6d5742010-04-21 19:10:51 +0000796}
797
Rafael Espindolab48280b2012-07-31 02:44:24 +0000798X86_32ABIInfo::Class X86_32ABIInfo::classify(QualType Ty) const {
799 const Type *T = isSingleElementStruct(Ty, getContext());
800 if (!T)
801 T = Ty.getTypePtr();
802
803 if (const BuiltinType *BT = T->getAs<BuiltinType>()) {
804 BuiltinType::Kind K = BT->getKind();
805 if (K == BuiltinType::Float || K == BuiltinType::Double)
806 return Float;
807 }
808 return Integer;
809}
810
Rafael Espindolab6932692012-10-24 01:58:58 +0000811bool X86_32ABIInfo::shouldUseInReg(QualType Ty, unsigned &FreeRegs,
Rafael Espindolae4aeeaa2012-10-24 01:59:00 +0000812 bool IsFastCall, bool &NeedsPadding) const {
813 NeedsPadding = false;
Rafael Espindolab48280b2012-07-31 02:44:24 +0000814 Class C = classify(Ty);
815 if (C == Float)
Rafael Espindola0b4cc952012-10-19 05:04:37 +0000816 return false;
Rafael Espindolab48280b2012-07-31 02:44:24 +0000817
Rafael Espindolab6932692012-10-24 01:58:58 +0000818 unsigned Size = getContext().getTypeSize(Ty);
819 unsigned SizeInRegs = (Size + 31) / 32;
Rafael Espindola5f14fcb2012-10-23 02:04:01 +0000820
821 if (SizeInRegs == 0)
822 return false;
823
Rafael Espindolab48280b2012-07-31 02:44:24 +0000824 if (SizeInRegs > FreeRegs) {
825 FreeRegs = 0;
Rafael Espindola0b4cc952012-10-19 05:04:37 +0000826 return false;
Rafael Espindolab48280b2012-07-31 02:44:24 +0000827 }
Rafael Espindola0b4cc952012-10-19 05:04:37 +0000828
Rafael Espindolab48280b2012-07-31 02:44:24 +0000829 FreeRegs -= SizeInRegs;
Rafael Espindolab6932692012-10-24 01:58:58 +0000830
831 if (IsFastCall) {
832 if (Size > 32)
833 return false;
834
835 if (Ty->isIntegralOrEnumerationType())
836 return true;
837
838 if (Ty->isPointerType())
839 return true;
840
841 if (Ty->isReferenceType())
842 return true;
843
Rafael Espindolae4aeeaa2012-10-24 01:59:00 +0000844 if (FreeRegs)
845 NeedsPadding = true;
846
Rafael Espindolab6932692012-10-24 01:58:58 +0000847 return false;
848 }
849
Rafael Espindola0b4cc952012-10-19 05:04:37 +0000850 return true;
Rafael Espindolab48280b2012-07-31 02:44:24 +0000851}
852
Rafael Espindola0b4cc952012-10-19 05:04:37 +0000853ABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty,
Rafael Espindolab6932692012-10-24 01:58:58 +0000854 unsigned &FreeRegs,
855 bool IsFastCall) const {
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000856 // FIXME: Set alignment on indirect arguments.
John McCalld608cdb2010-08-22 10:59:02 +0000857 if (isAggregateTypeForABI(Ty)) {
Anders Carlssona8874232010-01-27 03:25:19 +0000858 if (const RecordType *RT = Ty->getAs<RecordType>()) {
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +0000859 if (IsWin32StructABI)
860 return getIndirectResult(Ty, true, FreeRegs);
Daniel Dunbardc6d5742010-04-21 19:10:51 +0000861
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +0000862 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(RT, CGT))
863 return getIndirectResult(Ty, RAA == CGCXXABI::RAA_DirectInMemory, FreeRegs);
864
865 // Structures with flexible arrays are always indirect.
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000866 if (RT->getDecl()->hasFlexibleArrayMember())
Rafael Espindola0b4cc952012-10-19 05:04:37 +0000867 return getIndirectResult(Ty, true, FreeRegs);
Anders Carlssona8874232010-01-27 03:25:19 +0000868 }
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000869
Eli Friedman5a4d3522011-11-18 00:28:11 +0000870 // Ignore empty structs/unions.
Eli Friedman5a1ac892011-11-18 04:01:36 +0000871 if (isEmptyRecord(getContext(), Ty, true))
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000872 return ABIArgInfo::getIgnore();
873
Rafael Espindolae4aeeaa2012-10-24 01:59:00 +0000874 llvm::LLVMContext &LLVMContext = getVMContext();
875 llvm::IntegerType *Int32 = llvm::Type::getInt32Ty(LLVMContext);
876 bool NeedsPadding;
877 if (shouldUseInReg(Ty, FreeRegs, IsFastCall, NeedsPadding)) {
Rafael Espindola0b4cc952012-10-19 05:04:37 +0000878 unsigned SizeInRegs = (getContext().getTypeSize(Ty) + 31) / 32;
Rafael Espindola0b4cc952012-10-19 05:04:37 +0000879 SmallVector<llvm::Type*, 3> Elements;
880 for (unsigned I = 0; I < SizeInRegs; ++I)
881 Elements.push_back(Int32);
882 llvm::Type *Result = llvm::StructType::get(LLVMContext, Elements);
883 return ABIArgInfo::getDirectInReg(Result);
884 }
Rafael Espindolae4aeeaa2012-10-24 01:59:00 +0000885 llvm::IntegerType *PaddingType = NeedsPadding ? Int32 : 0;
Rafael Espindola0b4cc952012-10-19 05:04:37 +0000886
Daniel Dunbar53012f42009-11-09 01:33:53 +0000887 // Expand small (<= 128-bit) record types when we know that the stack layout
888 // of those arguments will match the struct. This is important because the
889 // LLVM backend isn't smart enough to remove byval, which inhibits many
890 // optimizations.
Chris Lattnera3c109b2010-07-29 02:16:43 +0000891 if (getContext().getTypeSize(Ty) <= 4*32 &&
892 canExpandIndirectArgument(Ty, getContext()))
Rafael Espindolae4aeeaa2012-10-24 01:59:00 +0000893 return ABIArgInfo::getExpandWithPadding(IsFastCall, PaddingType);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000894
Rafael Espindola0b4cc952012-10-19 05:04:37 +0000895 return getIndirectResult(Ty, true, FreeRegs);
Michael J. Spencer8bea82f2010-08-25 18:17:27 +0000896 }
897
Chris Lattnerbbae8b42010-08-26 20:05:13 +0000898 if (const VectorType *VT = Ty->getAs<VectorType>()) {
Chris Lattner7b733502010-08-26 20:08:43 +0000899 // On Darwin, some vectors are passed in memory, we handle this by passing
900 // it as an i8/i16/i32/i64.
Chris Lattnerbbae8b42010-08-26 20:05:13 +0000901 if (IsDarwinVectorABI) {
902 uint64_t Size = getContext().getTypeSize(Ty);
Chris Lattnerbbae8b42010-08-26 20:05:13 +0000903 if ((Size == 8 || Size == 16 || Size == 32) ||
904 (Size == 64 && VT->getNumElements() == 1))
905 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),
906 Size));
Chris Lattnerbbae8b42010-08-26 20:05:13 +0000907 }
Bill Wendlingbb465d72010-10-18 03:41:31 +0000908
Chad Rosier1f1df1f2013-03-25 21:00:27 +0000909 if (IsX86_MMXType(CGT.ConvertType(Ty)))
910 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(), 64));
Michael J. Spencer9cac4942010-10-19 06:39:39 +0000911
Chris Lattnerbbae8b42010-08-26 20:05:13 +0000912 return ABIArgInfo::getDirect();
913 }
Michael J. Spencer9cac4942010-10-19 06:39:39 +0000914
915
Chris Lattnera3c109b2010-07-29 02:16:43 +0000916 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
917 Ty = EnumTy->getDecl()->getIntegerType();
Douglas Gregoraa74a1e2010-02-02 20:10:50 +0000918
Rafael Espindolae4aeeaa2012-10-24 01:59:00 +0000919 bool NeedsPadding;
920 bool InReg = shouldUseInReg(Ty, FreeRegs, IsFastCall, NeedsPadding);
Rafael Espindola0b4cc952012-10-19 05:04:37 +0000921
922 if (Ty->isPromotableIntegerType()) {
923 if (InReg)
924 return ABIArgInfo::getExtendInReg();
925 return ABIArgInfo::getExtend();
926 }
927 if (InReg)
928 return ABIArgInfo::getDirectInReg();
929 return ABIArgInfo::getDirect();
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000930}
931
Rafael Espindolaaa9cf8d2012-07-24 00:01:07 +0000932void X86_32ABIInfo::computeInfo(CGFunctionInfo &FI) const {
933 FI.getReturnInfo() = classifyReturnType(FI.getReturnType(),
934 FI.getCallingConvention());
Rafael Espindolab48280b2012-07-31 02:44:24 +0000935
Rafael Espindolab6932692012-10-24 01:58:58 +0000936 unsigned CC = FI.getCallingConvention();
937 bool IsFastCall = CC == llvm::CallingConv::X86_FastCall;
938 unsigned FreeRegs;
939 if (IsFastCall)
940 FreeRegs = 2;
941 else if (FI.getHasRegParm())
942 FreeRegs = FI.getRegParm();
943 else
944 FreeRegs = DefaultNumRegisterParameters;
Rafael Espindolab48280b2012-07-31 02:44:24 +0000945
946 // If the return value is indirect, then the hidden argument is consuming one
947 // integer register.
948 if (FI.getReturnInfo().isIndirect() && FreeRegs) {
949 --FreeRegs;
950 ABIArgInfo &Old = FI.getReturnInfo();
951 Old = ABIArgInfo::getIndirectInReg(Old.getIndirectAlign(),
952 Old.getIndirectByVal(),
953 Old.getIndirectRealign());
954 }
955
Rafael Espindolaaa9cf8d2012-07-24 00:01:07 +0000956 for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
957 it != ie; ++it)
Rafael Espindolab6932692012-10-24 01:58:58 +0000958 it->info = classifyArgumentType(it->type, FreeRegs, IsFastCall);
Rafael Espindolaaa9cf8d2012-07-24 00:01:07 +0000959}
960
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000961llvm::Value *X86_32ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
962 CodeGenFunction &CGF) const {
Chris Lattner8b418682012-02-07 00:39:47 +0000963 llvm::Type *BPP = CGF.Int8PtrPtrTy;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000964
965 CGBuilderTy &Builder = CGF.Builder;
966 llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP,
967 "ap");
968 llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur");
Eli Friedman7b1fb812011-11-18 02:12:09 +0000969
970 // Compute if the address needs to be aligned
971 unsigned Align = CGF.getContext().getTypeAlignInChars(Ty).getQuantity();
972 Align = getTypeStackAlignInBytes(Ty, Align);
973 Align = std::max(Align, 4U);
974 if (Align > 4) {
975 // addr = (addr + align - 1) & -align;
976 llvm::Value *Offset =
977 llvm::ConstantInt::get(CGF.Int32Ty, Align - 1);
978 Addr = CGF.Builder.CreateGEP(Addr, Offset);
979 llvm::Value *AsInt = CGF.Builder.CreatePtrToInt(Addr,
980 CGF.Int32Ty);
981 llvm::Value *Mask = llvm::ConstantInt::get(CGF.Int32Ty, -Align);
982 Addr = CGF.Builder.CreateIntToPtr(CGF.Builder.CreateAnd(AsInt, Mask),
983 Addr->getType(),
984 "ap.cur.aligned");
985 }
986
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000987 llvm::Type *PTy =
Owen Anderson96e0fc72009-07-29 22:16:19 +0000988 llvm::PointerType::getUnqual(CGF.ConvertType(Ty));
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000989 llvm::Value *AddrTyped = Builder.CreateBitCast(Addr, PTy);
990
991 uint64_t Offset =
Eli Friedman7b1fb812011-11-18 02:12:09 +0000992 llvm::RoundUpToAlignment(CGF.getContext().getTypeSize(Ty) / 8, Align);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000993 llvm::Value *NextAddr =
Chris Lattner77b89b82010-06-27 07:15:29 +0000994 Builder.CreateGEP(Addr, llvm::ConstantInt::get(CGF.Int32Ty, Offset),
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +0000995 "ap.next");
996 Builder.CreateStore(NextAddr, VAListAddrAsBPP);
997
998 return AddrTyped;
999}
1000
Charles Davis74f72932010-02-13 15:54:06 +00001001void X86_32TargetCodeGenInfo::SetTargetAttributes(const Decl *D,
1002 llvm::GlobalValue *GV,
1003 CodeGen::CodeGenModule &CGM) const {
1004 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1005 if (FD->hasAttr<X86ForceAlignArgPointerAttr>()) {
1006 // Get the LLVM function.
1007 llvm::Function *Fn = cast<llvm::Function>(GV);
1008
1009 // Now add the 'alignstack' attribute with a value of 16.
Bill Wendling0d583392012-10-15 20:36:26 +00001010 llvm::AttrBuilder B;
Bill Wendlinge91e9ec2012-10-14 03:28:14 +00001011 B.addStackAlignmentAttr(16);
Bill Wendling909b6de2013-01-23 00:21:06 +00001012 Fn->addAttributes(llvm::AttributeSet::FunctionIndex,
1013 llvm::AttributeSet::get(CGM.getLLVMContext(),
1014 llvm::AttributeSet::FunctionIndex,
1015 B));
Charles Davis74f72932010-02-13 15:54:06 +00001016 }
1017 }
1018}
1019
John McCall6374c332010-03-06 00:35:14 +00001020bool X86_32TargetCodeGenInfo::initDwarfEHRegSizeTable(
1021 CodeGen::CodeGenFunction &CGF,
1022 llvm::Value *Address) const {
1023 CodeGen::CGBuilderTy &Builder = CGF.Builder;
John McCall6374c332010-03-06 00:35:14 +00001024
Chris Lattner8b418682012-02-07 00:39:47 +00001025 llvm::Value *Four8 = llvm::ConstantInt::get(CGF.Int8Ty, 4);
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001026
John McCall6374c332010-03-06 00:35:14 +00001027 // 0-7 are the eight integer registers; the order is different
1028 // on Darwin (for EH), but the range is the same.
1029 // 8 is %eip.
John McCallaeeb7012010-05-27 06:19:26 +00001030 AssignToArrayRange(Builder, Address, Four8, 0, 8);
John McCall6374c332010-03-06 00:35:14 +00001031
John McCall64aa4b32013-04-16 22:48:15 +00001032 if (CGF.CGM.getTarget().getTriple().isOSDarwin()) {
John McCall6374c332010-03-06 00:35:14 +00001033 // 12-16 are st(0..4). Not sure why we stop at 4.
1034 // These have size 16, which is sizeof(long double) on
1035 // platforms with 8-byte alignment for that type.
Chris Lattner8b418682012-02-07 00:39:47 +00001036 llvm::Value *Sixteen8 = llvm::ConstantInt::get(CGF.Int8Ty, 16);
John McCallaeeb7012010-05-27 06:19:26 +00001037 AssignToArrayRange(Builder, Address, Sixteen8, 12, 16);
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001038
John McCall6374c332010-03-06 00:35:14 +00001039 } else {
1040 // 9 is %eflags, which doesn't get a size on Darwin for some
1041 // reason.
1042 Builder.CreateStore(Four8, Builder.CreateConstInBoundsGEP1_32(Address, 9));
1043
1044 // 11-16 are st(0..5). Not sure why we stop at 5.
1045 // These have size 12, which is sizeof(long double) on
1046 // platforms with 4-byte alignment for that type.
Chris Lattner8b418682012-02-07 00:39:47 +00001047 llvm::Value *Twelve8 = llvm::ConstantInt::get(CGF.Int8Ty, 12);
John McCallaeeb7012010-05-27 06:19:26 +00001048 AssignToArrayRange(Builder, Address, Twelve8, 11, 16);
1049 }
John McCall6374c332010-03-06 00:35:14 +00001050
1051 return false;
1052}
1053
Chris Lattnerdce5ad02010-06-28 20:05:43 +00001054//===----------------------------------------------------------------------===//
1055// X86-64 ABI Implementation
1056//===----------------------------------------------------------------------===//
1057
1058
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001059namespace {
1060/// X86_64ABIInfo - The X86_64 ABI information.
1061class X86_64ABIInfo : public ABIInfo {
1062 enum Class {
1063 Integer = 0,
1064 SSE,
1065 SSEUp,
1066 X87,
1067 X87Up,
1068 ComplexX87,
1069 NoClass,
1070 Memory
1071 };
1072
1073 /// merge - Implement the X86_64 ABI merging algorithm.
1074 ///
1075 /// Merge an accumulating classification \arg Accum with a field
1076 /// classification \arg Field.
1077 ///
1078 /// \param Accum - The accumulating classification. This should
1079 /// always be either NoClass or the result of a previous merge
1080 /// call. In addition, this should never be Memory (the caller
1081 /// should just return Memory for the aggregate).
Chris Lattner1090a9b2010-06-28 21:43:59 +00001082 static Class merge(Class Accum, Class Field);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001083
Bruno Cardoso Lopes4943c152011-07-11 22:41:29 +00001084 /// postMerge - Implement the X86_64 ABI post merging algorithm.
1085 ///
1086 /// Post merger cleanup, reduces a malformed Hi and Lo pair to
1087 /// final MEMORY or SSE classes when necessary.
1088 ///
1089 /// \param AggregateSize - The size of the current aggregate in
1090 /// the classification process.
1091 ///
1092 /// \param Lo - The classification for the parts of the type
1093 /// residing in the low word of the containing object.
1094 ///
1095 /// \param Hi - The classification for the parts of the type
1096 /// residing in the higher words of the containing object.
1097 ///
1098 void postMerge(unsigned AggregateSize, Class &Lo, Class &Hi) const;
1099
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001100 /// classify - Determine the x86_64 register classes in which the
1101 /// given type T should be passed.
1102 ///
1103 /// \param Lo - The classification for the parts of the type
1104 /// residing in the low word of the containing object.
1105 ///
1106 /// \param Hi - The classification for the parts of the type
1107 /// residing in the high word of the containing object.
1108 ///
1109 /// \param OffsetBase - The bit offset of this type in the
1110 /// containing object. Some parameters are classified different
1111 /// depending on whether they straddle an eightbyte boundary.
1112 ///
1113 /// If a word is unused its result will be NoClass; if a type should
1114 /// be passed in Memory then at least the classification of \arg Lo
1115 /// will be Memory.
1116 ///
Sylvestre Ledruf3477c12012-09-27 10:16:10 +00001117 /// The \arg Lo class will be NoClass iff the argument is ignored.
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001118 ///
1119 /// If the \arg Lo class is ComplexX87, then the \arg Hi class will
1120 /// also be ComplexX87.
Chris Lattner9c254f02010-06-29 06:01:59 +00001121 void classify(QualType T, uint64_t OffsetBase, Class &Lo, Class &Hi) const;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001122
Bruno Cardoso Lopes4943c152011-07-11 22:41:29 +00001123 llvm::Type *GetByteVectorType(QualType Ty) const;
Chris Lattner9cbe4f02011-07-09 17:41:47 +00001124 llvm::Type *GetSSETypeAtOffset(llvm::Type *IRType,
1125 unsigned IROffset, QualType SourceTy,
1126 unsigned SourceOffset) const;
1127 llvm::Type *GetINTEGERTypeAtOffset(llvm::Type *IRType,
1128 unsigned IROffset, QualType SourceTy,
1129 unsigned SourceOffset) const;
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001130
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001131 /// getIndirectResult - Give a source type \arg Ty, return a suitable result
Daniel Dunbar46c54fb2010-04-21 19:49:55 +00001132 /// such that the argument will be returned in memory.
Chris Lattner9c254f02010-06-29 06:01:59 +00001133 ABIArgInfo getIndirectReturnResult(QualType Ty) const;
Daniel Dunbar46c54fb2010-04-21 19:49:55 +00001134
1135 /// getIndirectResult - Give a source type \arg Ty, return a suitable result
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001136 /// such that the argument will be passed in memory.
Daniel Dunbaredfac032012-03-10 01:03:58 +00001137 ///
1138 /// \param freeIntRegs - The number of free integer registers remaining
1139 /// available.
1140 ABIArgInfo getIndirectResult(QualType Ty, unsigned freeIntRegs) const;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001141
Chris Lattnera3c109b2010-07-29 02:16:43 +00001142 ABIArgInfo classifyReturnType(QualType RetTy) const;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001143
Bill Wendlingbb465d72010-10-18 03:41:31 +00001144 ABIArgInfo classifyArgumentType(QualType Ty,
Daniel Dunbaredfac032012-03-10 01:03:58 +00001145 unsigned freeIntRegs,
Bill Wendlingbb465d72010-10-18 03:41:31 +00001146 unsigned &neededInt,
Bill Wendling99aaae82010-10-18 23:51:38 +00001147 unsigned &neededSSE) const;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001148
Eli Friedmanee1ad992011-12-02 00:11:43 +00001149 bool IsIllegalVectorType(QualType Ty) const;
1150
John McCall67a57732011-04-21 01:20:55 +00001151 /// The 0.98 ABI revision clarified a lot of ambiguities,
1152 /// unfortunately in ways that were not always consistent with
1153 /// certain previous compilers. In particular, platforms which
1154 /// required strict binary compatibility with older versions of GCC
1155 /// may need to exempt themselves.
1156 bool honorsRevision0_98() const {
John McCall64aa4b32013-04-16 22:48:15 +00001157 return !getTarget().getTriple().isOSDarwin();
John McCall67a57732011-04-21 01:20:55 +00001158 }
1159
Eli Friedmanee1ad992011-12-02 00:11:43 +00001160 bool HasAVX;
Derek Schuffbabaf312012-10-11 15:52:22 +00001161 // Some ABIs (e.g. X32 ABI and Native Client OS) use 32 bit pointers on
1162 // 64-bit hardware.
1163 bool Has64BitPointers;
Eli Friedmanee1ad992011-12-02 00:11:43 +00001164
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001165public:
Eli Friedmanee1ad992011-12-02 00:11:43 +00001166 X86_64ABIInfo(CodeGen::CodeGenTypes &CGT, bool hasavx) :
Derek Schuffbabaf312012-10-11 15:52:22 +00001167 ABIInfo(CGT), HasAVX(hasavx),
Derek Schuff90da80c2012-10-11 18:21:13 +00001168 Has64BitPointers(CGT.getDataLayout().getPointerSize(0) == 8) {
Derek Schuffbabaf312012-10-11 15:52:22 +00001169 }
Chris Lattner9c254f02010-06-29 06:01:59 +00001170
John McCallde5d3c72012-02-17 03:33:10 +00001171 bool isPassedUsingAVXType(QualType type) const {
1172 unsigned neededInt, neededSSE;
Daniel Dunbaredfac032012-03-10 01:03:58 +00001173 // The freeIntRegs argument doesn't matter here.
1174 ABIArgInfo info = classifyArgumentType(type, 0, neededInt, neededSSE);
John McCallde5d3c72012-02-17 03:33:10 +00001175 if (info.isDirect()) {
1176 llvm::Type *ty = info.getCoerceToType();
1177 if (llvm::VectorType *vectorTy = dyn_cast_or_null<llvm::VectorType>(ty))
1178 return (vectorTy->getBitWidth() > 128);
1179 }
1180 return false;
1181 }
1182
Chris Lattneree5dcd02010-07-29 02:31:05 +00001183 virtual void computeInfo(CGFunctionInfo &FI) const;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001184
1185 virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
1186 CodeGenFunction &CGF) const;
1187};
Anton Korobeynikov82d0a412010-01-10 12:58:08 +00001188
Chris Lattnerf13721d2010-08-31 16:44:54 +00001189/// WinX86_64ABIInfo - The Windows X86_64 ABI information.
NAKAMURA Takumia7573222011-01-17 22:56:31 +00001190class WinX86_64ABIInfo : public ABIInfo {
1191
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +00001192 ABIArgInfo classify(QualType Ty, bool IsReturnType) const;
NAKAMURA Takumia7573222011-01-17 22:56:31 +00001193
Chris Lattnerf13721d2010-08-31 16:44:54 +00001194public:
NAKAMURA Takumia7573222011-01-17 22:56:31 +00001195 WinX86_64ABIInfo(CodeGen::CodeGenTypes &CGT) : ABIInfo(CGT) {}
1196
1197 virtual void computeInfo(CGFunctionInfo &FI) const;
Chris Lattnerf13721d2010-08-31 16:44:54 +00001198
1199 virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
1200 CodeGenFunction &CGF) const;
1201};
1202
Anton Korobeynikov82d0a412010-01-10 12:58:08 +00001203class X86_64TargetCodeGenInfo : public TargetCodeGenInfo {
1204public:
Eli Friedmanee1ad992011-12-02 00:11:43 +00001205 X86_64TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, bool HasAVX)
Derek Schuffbabaf312012-10-11 15:52:22 +00001206 : TargetCodeGenInfo(new X86_64ABIInfo(CGT, HasAVX)) {}
John McCall6374c332010-03-06 00:35:14 +00001207
John McCallde5d3c72012-02-17 03:33:10 +00001208 const X86_64ABIInfo &getABIInfo() const {
1209 return static_cast<const X86_64ABIInfo&>(TargetCodeGenInfo::getABIInfo());
1210 }
1211
John McCall6374c332010-03-06 00:35:14 +00001212 int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const {
1213 return 7;
1214 }
1215
1216 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
1217 llvm::Value *Address) const {
Chris Lattner8b418682012-02-07 00:39:47 +00001218 llvm::Value *Eight8 = llvm::ConstantInt::get(CGF.Int8Ty, 8);
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001219
John McCallaeeb7012010-05-27 06:19:26 +00001220 // 0-15 are the 16 integer registers.
1221 // 16 is %rip.
Chris Lattner8b418682012-02-07 00:39:47 +00001222 AssignToArrayRange(CGF.Builder, Address, Eight8, 0, 16);
John McCall6374c332010-03-06 00:35:14 +00001223 return false;
1224 }
Peter Collingbourne4b93d662011-02-19 23:03:58 +00001225
Jay Foadef6de3d2011-07-11 09:56:20 +00001226 llvm::Type* adjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
Chris Lattner5f9e2722011-07-23 10:55:15 +00001227 StringRef Constraint,
Jay Foadef6de3d2011-07-11 09:56:20 +00001228 llvm::Type* Ty) const {
Peter Collingbourne4b93d662011-02-19 23:03:58 +00001229 return X86AdjustInlineAsmType(CGF, Constraint, Ty);
1230 }
1231
John McCallde5d3c72012-02-17 03:33:10 +00001232 bool isNoProtoCallVariadic(const CallArgList &args,
1233 const FunctionNoProtoType *fnType) const {
John McCall01f151e2011-09-21 08:08:30 +00001234 // The default CC on x86-64 sets %al to the number of SSA
1235 // registers used, and GCC sets this when calling an unprototyped
Eli Friedman3ed79032011-12-01 04:53:19 +00001236 // function, so we override the default behavior. However, don't do
Eli Friedman68805fe2011-12-06 03:08:26 +00001237 // that when AVX types are involved: the ABI explicitly states it is
1238 // undefined, and it doesn't work in practice because of how the ABI
1239 // defines varargs anyway.
John McCallde5d3c72012-02-17 03:33:10 +00001240 if (fnType->getCallConv() == CC_Default || fnType->getCallConv() == CC_C) {
Eli Friedman3ed79032011-12-01 04:53:19 +00001241 bool HasAVXType = false;
John McCallde5d3c72012-02-17 03:33:10 +00001242 for (CallArgList::const_iterator
1243 it = args.begin(), ie = args.end(); it != ie; ++it) {
1244 if (getABIInfo().isPassedUsingAVXType(it->Ty)) {
1245 HasAVXType = true;
1246 break;
Eli Friedman3ed79032011-12-01 04:53:19 +00001247 }
1248 }
John McCallde5d3c72012-02-17 03:33:10 +00001249
Eli Friedman3ed79032011-12-01 04:53:19 +00001250 if (!HasAVXType)
1251 return true;
1252 }
John McCall01f151e2011-09-21 08:08:30 +00001253
John McCallde5d3c72012-02-17 03:33:10 +00001254 return TargetCodeGenInfo::isNoProtoCallVariadic(args, fnType);
John McCall01f151e2011-09-21 08:08:30 +00001255 }
1256
Anton Korobeynikov82d0a412010-01-10 12:58:08 +00001257};
1258
Chris Lattnerf13721d2010-08-31 16:44:54 +00001259class WinX86_64TargetCodeGenInfo : public TargetCodeGenInfo {
1260public:
1261 WinX86_64TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT)
1262 : TargetCodeGenInfo(new WinX86_64ABIInfo(CGT)) {}
1263
1264 int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const {
1265 return 7;
1266 }
1267
1268 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
1269 llvm::Value *Address) const {
Chris Lattner8b418682012-02-07 00:39:47 +00001270 llvm::Value *Eight8 = llvm::ConstantInt::get(CGF.Int8Ty, 8);
Michael J. Spencer9cac4942010-10-19 06:39:39 +00001271
Chris Lattnerf13721d2010-08-31 16:44:54 +00001272 // 0-15 are the 16 integer registers.
1273 // 16 is %rip.
Chris Lattner8b418682012-02-07 00:39:47 +00001274 AssignToArrayRange(CGF.Builder, Address, Eight8, 0, 16);
Chris Lattnerf13721d2010-08-31 16:44:54 +00001275 return false;
1276 }
1277};
1278
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001279}
1280
Bruno Cardoso Lopes4943c152011-07-11 22:41:29 +00001281void X86_64ABIInfo::postMerge(unsigned AggregateSize, Class &Lo,
1282 Class &Hi) const {
1283 // AMD64-ABI 3.2.3p2: Rule 5. Then a post merger cleanup is done:
1284 //
1285 // (a) If one of the classes is Memory, the whole argument is passed in
1286 // memory.
1287 //
1288 // (b) If X87UP is not preceded by X87, the whole argument is passed in
1289 // memory.
1290 //
1291 // (c) If the size of the aggregate exceeds two eightbytes and the first
1292 // eightbyte isn't SSE or any other eightbyte isn't SSEUP, the whole
1293 // argument is passed in memory. NOTE: This is necessary to keep the
1294 // ABI working for processors that don't support the __m256 type.
1295 //
1296 // (d) If SSEUP is not preceded by SSE or SSEUP, it is converted to SSE.
1297 //
1298 // Some of these are enforced by the merging logic. Others can arise
1299 // only with unions; for example:
1300 // union { _Complex double; unsigned; }
1301 //
1302 // Note that clauses (b) and (c) were added in 0.98.
1303 //
1304 if (Hi == Memory)
1305 Lo = Memory;
1306 if (Hi == X87Up && Lo != X87 && honorsRevision0_98())
1307 Lo = Memory;
1308 if (AggregateSize > 128 && (Lo != SSE || Hi != SSEUp))
1309 Lo = Memory;
1310 if (Hi == SSEUp && Lo != SSE)
1311 Hi = SSE;
1312}
1313
Chris Lattner1090a9b2010-06-28 21:43:59 +00001314X86_64ABIInfo::Class X86_64ABIInfo::merge(Class Accum, Class Field) {
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001315 // AMD64-ABI 3.2.3p2: Rule 4. Each field of an object is
1316 // classified recursively so that always two fields are
1317 // considered. The resulting class is calculated according to
1318 // the classes of the fields in the eightbyte:
1319 //
1320 // (a) If both classes are equal, this is the resulting class.
1321 //
1322 // (b) If one of the classes is NO_CLASS, the resulting class is
1323 // the other class.
1324 //
1325 // (c) If one of the classes is MEMORY, the result is the MEMORY
1326 // class.
1327 //
1328 // (d) If one of the classes is INTEGER, the result is the
1329 // INTEGER.
1330 //
1331 // (e) If one of the classes is X87, X87UP, COMPLEX_X87 class,
1332 // MEMORY is used as class.
1333 //
1334 // (f) Otherwise class SSE is used.
1335
1336 // Accum should never be memory (we should have returned) or
1337 // ComplexX87 (because this cannot be passed in a structure).
1338 assert((Accum != Memory && Accum != ComplexX87) &&
1339 "Invalid accumulated classification during merge.");
1340 if (Accum == Field || Field == NoClass)
1341 return Accum;
Chris Lattner1090a9b2010-06-28 21:43:59 +00001342 if (Field == Memory)
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001343 return Memory;
Chris Lattner1090a9b2010-06-28 21:43:59 +00001344 if (Accum == NoClass)
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001345 return Field;
Chris Lattner1090a9b2010-06-28 21:43:59 +00001346 if (Accum == Integer || Field == Integer)
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001347 return Integer;
Chris Lattner1090a9b2010-06-28 21:43:59 +00001348 if (Field == X87 || Field == X87Up || Field == ComplexX87 ||
1349 Accum == X87 || Accum == X87Up)
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001350 return Memory;
Chris Lattner1090a9b2010-06-28 21:43:59 +00001351 return SSE;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001352}
1353
Chris Lattnerbcaedae2010-06-30 19:14:05 +00001354void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase,
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001355 Class &Lo, Class &Hi) const {
1356 // FIXME: This code can be simplified by introducing a simple value class for
1357 // Class pairs with appropriate constructor methods for the various
1358 // situations.
1359
1360 // FIXME: Some of the split computations are wrong; unaligned vectors
1361 // shouldn't be passed in registers for example, so there is no chance they
1362 // can straddle an eightbyte. Verify & simplify.
1363
1364 Lo = Hi = NoClass;
1365
1366 Class &Current = OffsetBase < 64 ? Lo : Hi;
1367 Current = Memory;
1368
John McCall183700f2009-09-21 23:43:11 +00001369 if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001370 BuiltinType::Kind k = BT->getKind();
1371
1372 if (k == BuiltinType::Void) {
1373 Current = NoClass;
1374 } else if (k == BuiltinType::Int128 || k == BuiltinType::UInt128) {
1375 Lo = Integer;
1376 Hi = Integer;
1377 } else if (k >= BuiltinType::Bool && k <= BuiltinType::LongLong) {
1378 Current = Integer;
Derek Schuff7da46f92012-10-11 16:55:58 +00001379 } else if ((k == BuiltinType::Float || k == BuiltinType::Double) ||
1380 (k == BuiltinType::LongDouble &&
John McCall64aa4b32013-04-16 22:48:15 +00001381 getTarget().getTriple().getOS() == llvm::Triple::NaCl)) {
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001382 Current = SSE;
1383 } else if (k == BuiltinType::LongDouble) {
1384 Lo = X87;
1385 Hi = X87Up;
1386 }
1387 // FIXME: _Decimal32 and _Decimal64 are SSE.
1388 // FIXME: _float128 and _Decimal128 are (SSE, SSEUp).
Chris Lattner1090a9b2010-06-28 21:43:59 +00001389 return;
1390 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001391
Chris Lattner1090a9b2010-06-28 21:43:59 +00001392 if (const EnumType *ET = Ty->getAs<EnumType>()) {
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001393 // Classify the underlying integer type.
Chris Lattner9c254f02010-06-29 06:01:59 +00001394 classify(ET->getDecl()->getIntegerType(), OffsetBase, Lo, Hi);
Chris Lattner1090a9b2010-06-28 21:43:59 +00001395 return;
1396 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001397
Chris Lattner1090a9b2010-06-28 21:43:59 +00001398 if (Ty->hasPointerRepresentation()) {
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001399 Current = Integer;
Chris Lattner1090a9b2010-06-28 21:43:59 +00001400 return;
1401 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001402
Chris Lattner1090a9b2010-06-28 21:43:59 +00001403 if (Ty->isMemberPointerType()) {
Derek Schuffbabaf312012-10-11 15:52:22 +00001404 if (Ty->isMemberFunctionPointerType() && Has64BitPointers)
Daniel Dunbar67d438d2010-05-15 00:00:37 +00001405 Lo = Hi = Integer;
1406 else
1407 Current = Integer;
Chris Lattner1090a9b2010-06-28 21:43:59 +00001408 return;
1409 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001410
Chris Lattner1090a9b2010-06-28 21:43:59 +00001411 if (const VectorType *VT = Ty->getAs<VectorType>()) {
Chris Lattnerea044322010-07-29 02:01:43 +00001412 uint64_t Size = getContext().getTypeSize(VT);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001413 if (Size == 32) {
1414 // gcc passes all <4 x char>, <2 x short>, <1 x int>, <1 x
1415 // float> as integer.
1416 Current = Integer;
1417
1418 // If this type crosses an eightbyte boundary, it should be
1419 // split.
1420 uint64_t EB_Real = (OffsetBase) / 64;
1421 uint64_t EB_Imag = (OffsetBase + Size - 1) / 64;
1422 if (EB_Real != EB_Imag)
1423 Hi = Lo;
1424 } else if (Size == 64) {
1425 // gcc passes <1 x double> in memory. :(
1426 if (VT->getElementType()->isSpecificBuiltinType(BuiltinType::Double))
1427 return;
1428
1429 // gcc passes <1 x long long> as INTEGER.
Chris Lattner473f8e72010-08-26 18:03:20 +00001430 if (VT->getElementType()->isSpecificBuiltinType(BuiltinType::LongLong) ||
Chris Lattner0fefa412010-08-26 18:13:50 +00001431 VT->getElementType()->isSpecificBuiltinType(BuiltinType::ULongLong) ||
1432 VT->getElementType()->isSpecificBuiltinType(BuiltinType::Long) ||
1433 VT->getElementType()->isSpecificBuiltinType(BuiltinType::ULong))
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001434 Current = Integer;
1435 else
1436 Current = SSE;
1437
1438 // If this type crosses an eightbyte boundary, it should be
1439 // split.
1440 if (OffsetBase && OffsetBase != 64)
1441 Hi = Lo;
Eli Friedmanee1ad992011-12-02 00:11:43 +00001442 } else if (Size == 128 || (HasAVX && Size == 256)) {
Bruno Cardoso Lopes4943c152011-07-11 22:41:29 +00001443 // Arguments of 256-bits are split into four eightbyte chunks. The
1444 // least significant one belongs to class SSE and all the others to class
1445 // SSEUP. The original Lo and Hi design considers that types can't be
1446 // greater than 128-bits, so a 64-bit split in Hi and Lo makes sense.
1447 // This design isn't correct for 256-bits, but since there're no cases
1448 // where the upper parts would need to be inspected, avoid adding
1449 // complexity and just consider Hi to match the 64-256 part.
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001450 Lo = SSE;
1451 Hi = SSEUp;
1452 }
Chris Lattner1090a9b2010-06-28 21:43:59 +00001453 return;
1454 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001455
Chris Lattner1090a9b2010-06-28 21:43:59 +00001456 if (const ComplexType *CT = Ty->getAs<ComplexType>()) {
Chris Lattnerea044322010-07-29 02:01:43 +00001457 QualType ET = getContext().getCanonicalType(CT->getElementType());
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001458
Chris Lattnerea044322010-07-29 02:01:43 +00001459 uint64_t Size = getContext().getTypeSize(Ty);
Douglas Gregor2ade35e2010-06-16 00:17:44 +00001460 if (ET->isIntegralOrEnumerationType()) {
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001461 if (Size <= 64)
1462 Current = Integer;
1463 else if (Size <= 128)
1464 Lo = Hi = Integer;
Chris Lattnerea044322010-07-29 02:01:43 +00001465 } else if (ET == getContext().FloatTy)
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001466 Current = SSE;
Derek Schuff7da46f92012-10-11 16:55:58 +00001467 else if (ET == getContext().DoubleTy ||
1468 (ET == getContext().LongDoubleTy &&
John McCall64aa4b32013-04-16 22:48:15 +00001469 getTarget().getTriple().getOS() == llvm::Triple::NaCl))
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001470 Lo = Hi = SSE;
Chris Lattnerea044322010-07-29 02:01:43 +00001471 else if (ET == getContext().LongDoubleTy)
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001472 Current = ComplexX87;
1473
1474 // If this complex type crosses an eightbyte boundary then it
1475 // should be split.
1476 uint64_t EB_Real = (OffsetBase) / 64;
Chris Lattnerea044322010-07-29 02:01:43 +00001477 uint64_t EB_Imag = (OffsetBase + getContext().getTypeSize(ET)) / 64;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001478 if (Hi == NoClass && EB_Real != EB_Imag)
1479 Hi = Lo;
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001480
Chris Lattner1090a9b2010-06-28 21:43:59 +00001481 return;
1482 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001483
Chris Lattnerea044322010-07-29 02:01:43 +00001484 if (const ConstantArrayType *AT = getContext().getAsConstantArrayType(Ty)) {
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001485 // Arrays are treated like structures.
1486
Chris Lattnerea044322010-07-29 02:01:43 +00001487 uint64_t Size = getContext().getTypeSize(Ty);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001488
1489 // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger
Bruno Cardoso Lopes4943c152011-07-11 22:41:29 +00001490 // than four eightbytes, ..., it has class MEMORY.
1491 if (Size > 256)
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001492 return;
1493
1494 // AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned
1495 // fields, it has class MEMORY.
1496 //
1497 // Only need to check alignment of array base.
Chris Lattnerea044322010-07-29 02:01:43 +00001498 if (OffsetBase % getContext().getTypeAlign(AT->getElementType()))
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001499 return;
1500
1501 // Otherwise implement simplified merge. We could be smarter about
1502 // this, but it isn't worth it and would be harder to verify.
1503 Current = NoClass;
Chris Lattnerea044322010-07-29 02:01:43 +00001504 uint64_t EltSize = getContext().getTypeSize(AT->getElementType());
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001505 uint64_t ArraySize = AT->getSize().getZExtValue();
Bruno Cardoso Lopes089d8922011-07-12 01:27:38 +00001506
1507 // The only case a 256-bit wide vector could be used is when the array
1508 // contains a single 256-bit element. Since Lo and Hi logic isn't extended
1509 // to work for sizes wider than 128, early check and fallback to memory.
1510 if (Size > 128 && EltSize != 256)
1511 return;
1512
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001513 for (uint64_t i=0, Offset=OffsetBase; i<ArraySize; ++i, Offset += EltSize) {
1514 Class FieldLo, FieldHi;
Chris Lattner9c254f02010-06-29 06:01:59 +00001515 classify(AT->getElementType(), Offset, FieldLo, FieldHi);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001516 Lo = merge(Lo, FieldLo);
1517 Hi = merge(Hi, FieldHi);
1518 if (Lo == Memory || Hi == Memory)
1519 break;
1520 }
1521
Bruno Cardoso Lopes4943c152011-07-11 22:41:29 +00001522 postMerge(Size, Lo, Hi);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001523 assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp array classification.");
Chris Lattner1090a9b2010-06-28 21:43:59 +00001524 return;
1525 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001526
Chris Lattner1090a9b2010-06-28 21:43:59 +00001527 if (const RecordType *RT = Ty->getAs<RecordType>()) {
Chris Lattnerea044322010-07-29 02:01:43 +00001528 uint64_t Size = getContext().getTypeSize(Ty);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001529
1530 // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger
Bruno Cardoso Lopes4943c152011-07-11 22:41:29 +00001531 // than four eightbytes, ..., it has class MEMORY.
1532 if (Size > 256)
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001533 return;
1534
Anders Carlsson0a8f8472009-09-16 15:53:40 +00001535 // AMD64-ABI 3.2.3p2: Rule 2. If a C++ object has either a non-trivial
1536 // copy constructor or a non-trivial destructor, it is passed by invisible
1537 // reference.
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +00001538 if (getRecordArgABI(RT, CGT))
Anders Carlsson0a8f8472009-09-16 15:53:40 +00001539 return;
Daniel Dunbarce9f4232009-11-22 23:01:23 +00001540
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001541 const RecordDecl *RD = RT->getDecl();
1542
1543 // Assume variable sized types are passed in memory.
1544 if (RD->hasFlexibleArrayMember())
1545 return;
1546
Chris Lattnerea044322010-07-29 02:01:43 +00001547 const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001548
1549 // Reset Lo class, this will be recomputed.
1550 Current = NoClass;
Daniel Dunbarce9f4232009-11-22 23:01:23 +00001551
1552 // If this is a C++ record, classify the bases first.
1553 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1554 for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(),
1555 e = CXXRD->bases_end(); i != e; ++i) {
1556 assert(!i->isVirtual() && !i->getType()->isDependentType() &&
1557 "Unexpected base class!");
1558 const CXXRecordDecl *Base =
1559 cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
1560
1561 // Classify this field.
1562 //
1563 // AMD64-ABI 3.2.3p2: Rule 3. If the size of the aggregate exceeds a
1564 // single eightbyte, each is classified separately. Each eightbyte gets
1565 // initialized to class NO_CLASS.
1566 Class FieldLo, FieldHi;
Benjamin Kramerd4f51982012-07-04 18:45:14 +00001567 uint64_t Offset =
1568 OffsetBase + getContext().toBits(Layout.getBaseClassOffset(Base));
Chris Lattner9c254f02010-06-29 06:01:59 +00001569 classify(i->getType(), Offset, FieldLo, FieldHi);
Daniel Dunbarce9f4232009-11-22 23:01:23 +00001570 Lo = merge(Lo, FieldLo);
1571 Hi = merge(Hi, FieldHi);
1572 if (Lo == Memory || Hi == Memory)
1573 break;
1574 }
1575 }
1576
1577 // Classify the fields one at a time, merging the results.
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001578 unsigned idx = 0;
Bruno Cardoso Lopes548e4782011-07-12 22:30:58 +00001579 for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
Argyrios Kyrtzidis17945a02009-06-30 02:36:12 +00001580 i != e; ++i, ++idx) {
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001581 uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx);
1582 bool BitField = i->isBitField();
1583
Bruno Cardoso Lopesb8981df2011-07-13 21:58:55 +00001584 // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger than
1585 // four eightbytes, or it contains unaligned fields, it has class MEMORY.
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001586 //
Bruno Cardoso Lopesb8981df2011-07-13 21:58:55 +00001587 // The only case a 256-bit wide vector could be used is when the struct
1588 // contains a single 256-bit element. Since Lo and Hi logic isn't extended
1589 // to work for sizes wider than 128, early check and fallback to memory.
1590 //
1591 if (Size > 128 && getContext().getTypeSize(i->getType()) != 256) {
1592 Lo = Memory;
1593 return;
1594 }
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001595 // Note, skip this test for bit-fields, see below.
Chris Lattnerea044322010-07-29 02:01:43 +00001596 if (!BitField && Offset % getContext().getTypeAlign(i->getType())) {
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001597 Lo = Memory;
1598 return;
1599 }
1600
1601 // Classify this field.
1602 //
1603 // AMD64-ABI 3.2.3p2: Rule 3. If the size of the aggregate
1604 // exceeds a single eightbyte, each is classified
1605 // separately. Each eightbyte gets initialized to class
1606 // NO_CLASS.
1607 Class FieldLo, FieldHi;
1608
1609 // Bit-fields require special handling, they do not force the
1610 // structure to be passed in memory even if unaligned, and
1611 // therefore they can straddle an eightbyte.
1612 if (BitField) {
1613 // Ignore padding bit-fields.
1614 if (i->isUnnamedBitfield())
1615 continue;
1616
1617 uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx);
Richard Smitha6b8b2c2011-10-10 18:28:20 +00001618 uint64_t Size = i->getBitWidthValue(getContext());
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001619
1620 uint64_t EB_Lo = Offset / 64;
1621 uint64_t EB_Hi = (Offset + Size - 1) / 64;
1622 FieldLo = FieldHi = NoClass;
1623 if (EB_Lo) {
1624 assert(EB_Hi == EB_Lo && "Invalid classification, type > 16 bytes.");
1625 FieldLo = NoClass;
1626 FieldHi = Integer;
1627 } else {
1628 FieldLo = Integer;
1629 FieldHi = EB_Hi ? Integer : NoClass;
1630 }
1631 } else
Chris Lattner9c254f02010-06-29 06:01:59 +00001632 classify(i->getType(), Offset, FieldLo, FieldHi);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001633 Lo = merge(Lo, FieldLo);
1634 Hi = merge(Hi, FieldHi);
1635 if (Lo == Memory || Hi == Memory)
1636 break;
1637 }
1638
Bruno Cardoso Lopes4943c152011-07-11 22:41:29 +00001639 postMerge(Size, Lo, Hi);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001640 }
1641}
1642
Chris Lattner9c254f02010-06-29 06:01:59 +00001643ABIArgInfo X86_64ABIInfo::getIndirectReturnResult(QualType Ty) const {
Daniel Dunbar46c54fb2010-04-21 19:49:55 +00001644 // If this is a scalar LLVM value then assume LLVM will pass it in the right
1645 // place naturally.
John McCalld608cdb2010-08-22 10:59:02 +00001646 if (!isAggregateTypeForABI(Ty)) {
Daniel Dunbar46c54fb2010-04-21 19:49:55 +00001647 // Treat an enum type as its underlying type.
1648 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
1649 Ty = EnumTy->getDecl()->getIntegerType();
1650
1651 return (Ty->isPromotableIntegerType() ?
1652 ABIArgInfo::getExtend() : ABIArgInfo::getDirect());
1653 }
1654
1655 return ABIArgInfo::getIndirect(0);
1656}
1657
Eli Friedmanee1ad992011-12-02 00:11:43 +00001658bool X86_64ABIInfo::IsIllegalVectorType(QualType Ty) const {
1659 if (const VectorType *VecTy = Ty->getAs<VectorType>()) {
1660 uint64_t Size = getContext().getTypeSize(VecTy);
1661 unsigned LargestVector = HasAVX ? 256 : 128;
1662 if (Size <= 64 || Size > LargestVector)
1663 return true;
1664 }
1665
1666 return false;
1667}
1668
Daniel Dunbaredfac032012-03-10 01:03:58 +00001669ABIArgInfo X86_64ABIInfo::getIndirectResult(QualType Ty,
1670 unsigned freeIntRegs) const {
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001671 // If this is a scalar LLVM value then assume LLVM will pass it in the right
1672 // place naturally.
Daniel Dunbaredfac032012-03-10 01:03:58 +00001673 //
1674 // This assumption is optimistic, as there could be free registers available
1675 // when we need to pass this argument in memory, and LLVM could try to pass
1676 // the argument in the free register. This does not seem to happen currently,
1677 // but this code would be much safer if we could mark the argument with
1678 // 'onstack'. See PR12193.
Eli Friedmanee1ad992011-12-02 00:11:43 +00001679 if (!isAggregateTypeForABI(Ty) && !IsIllegalVectorType(Ty)) {
Douglas Gregoraa74a1e2010-02-02 20:10:50 +00001680 // Treat an enum type as its underlying type.
1681 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
1682 Ty = EnumTy->getDecl()->getIntegerType();
1683
Anton Korobeynikovcc6fa882009-06-06 09:36:29 +00001684 return (Ty->isPromotableIntegerType() ?
1685 ABIArgInfo::getExtend() : ABIArgInfo::getDirect());
Douglas Gregoraa74a1e2010-02-02 20:10:50 +00001686 }
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001687
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +00001688 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, CGT))
1689 return ABIArgInfo::getIndirect(0, RAA == CGCXXABI::RAA_DirectInMemory);
Anders Carlsson0a8f8472009-09-16 15:53:40 +00001690
Chris Lattner855d2272011-05-22 23:21:23 +00001691 // Compute the byval alignment. We specify the alignment of the byval in all
1692 // cases so that the mid-level optimizer knows the alignment of the byval.
1693 unsigned Align = std::max(getContext().getTypeAlign(Ty) / 8, 8U);
Daniel Dunbaredfac032012-03-10 01:03:58 +00001694
1695 // Attempt to avoid passing indirect results using byval when possible. This
1696 // is important for good codegen.
1697 //
1698 // We do this by coercing the value into a scalar type which the backend can
1699 // handle naturally (i.e., without using byval).
1700 //
1701 // For simplicity, we currently only do this when we have exhausted all of the
1702 // free integer registers. Doing this when there are free integer registers
1703 // would require more care, as we would have to ensure that the coerced value
1704 // did not claim the unused register. That would require either reording the
1705 // arguments to the function (so that any subsequent inreg values came first),
1706 // or only doing this optimization when there were no following arguments that
1707 // might be inreg.
1708 //
1709 // We currently expect it to be rare (particularly in well written code) for
1710 // arguments to be passed on the stack when there are still free integer
1711 // registers available (this would typically imply large structs being passed
1712 // by value), so this seems like a fair tradeoff for now.
1713 //
1714 // We can revisit this if the backend grows support for 'onstack' parameter
1715 // attributes. See PR12193.
1716 if (freeIntRegs == 0) {
1717 uint64_t Size = getContext().getTypeSize(Ty);
1718
1719 // If this type fits in an eightbyte, coerce it into the matching integral
1720 // type, which will end up on the stack (with alignment 8).
1721 if (Align == 8 && Size <= 64)
1722 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),
1723 Size));
1724 }
1725
Chris Lattner855d2272011-05-22 23:21:23 +00001726 return ABIArgInfo::getIndirect(Align);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00001727}
1728
Bruno Cardoso Lopes4943c152011-07-11 22:41:29 +00001729/// GetByteVectorType - The ABI specifies that a value should be passed in an
1730/// full vector XMM/YMM register. Pick an LLVM IR type that will be passed as a
Chris Lattner0f408f52010-07-29 04:56:46 +00001731/// vector register.
Bruno Cardoso Lopes4943c152011-07-11 22:41:29 +00001732llvm::Type *X86_64ABIInfo::GetByteVectorType(QualType Ty) const {
Chris Lattner9cbe4f02011-07-09 17:41:47 +00001733 llvm::Type *IRType = CGT.ConvertType(Ty);
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001734
Chris Lattner15842bd2010-07-29 05:02:29 +00001735 // Wrapper structs that just contain vectors are passed just like vectors,
1736 // strip them off if present.
Chris Lattner9cbe4f02011-07-09 17:41:47 +00001737 llvm::StructType *STy = dyn_cast<llvm::StructType>(IRType);
Chris Lattner15842bd2010-07-29 05:02:29 +00001738 while (STy && STy->getNumElements() == 1) {
1739 IRType = STy->getElementType(0);
1740 STy = dyn_cast<llvm::StructType>(IRType);
1741 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001742
Bruno Cardoso Lopes528a8c72011-07-08 22:57:35 +00001743 // If the preferred type is a 16-byte vector, prefer to pass it.
Chris Lattner9cbe4f02011-07-09 17:41:47 +00001744 if (llvm::VectorType *VT = dyn_cast<llvm::VectorType>(IRType)){
1745 llvm::Type *EltTy = VT->getElementType();
Bruno Cardoso Lopes4943c152011-07-11 22:41:29 +00001746 unsigned BitWidth = VT->getBitWidth();
Tanya Lattnerce275672011-11-28 23:18:11 +00001747 if ((BitWidth >= 128 && BitWidth <= 256) &&
Chris Lattner0f408f52010-07-29 04:56:46 +00001748 (EltTy->isFloatTy() || EltTy->isDoubleTy() ||
1749 EltTy->isIntegerTy(8) || EltTy->isIntegerTy(16) ||
1750 EltTy->isIntegerTy(32) || EltTy->isIntegerTy(64) ||
1751 EltTy->isIntegerTy(128)))
1752 return VT;
1753 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001754
Chris Lattner0f408f52010-07-29 04:56:46 +00001755 return llvm::VectorType::get(llvm::Type::getDoubleTy(getVMContext()), 2);
1756}
1757
Chris Lattnere2962be2010-07-29 07:30:00 +00001758/// BitsContainNoUserData - Return true if the specified [start,end) bit range
1759/// is known to either be off the end of the specified type or being in
1760/// alignment padding. The user type specified is known to be at most 128 bits
1761/// in size, and have passed through X86_64ABIInfo::classify with a successful
1762/// classification that put one of the two halves in the INTEGER class.
1763///
1764/// It is conservatively correct to return false.
1765static bool BitsContainNoUserData(QualType Ty, unsigned StartBit,
1766 unsigned EndBit, ASTContext &Context) {
1767 // If the bytes being queried are off the end of the type, there is no user
1768 // data hiding here. This handles analysis of builtins, vectors and other
1769 // types that don't contain interesting padding.
1770 unsigned TySize = (unsigned)Context.getTypeSize(Ty);
1771 if (TySize <= StartBit)
1772 return true;
1773
Chris Lattner021c3a32010-07-29 07:43:55 +00001774 if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty)) {
1775 unsigned EltSize = (unsigned)Context.getTypeSize(AT->getElementType());
1776 unsigned NumElts = (unsigned)AT->getSize().getZExtValue();
1777
1778 // Check each element to see if the element overlaps with the queried range.
1779 for (unsigned i = 0; i != NumElts; ++i) {
1780 // If the element is after the span we care about, then we're done..
1781 unsigned EltOffset = i*EltSize;
1782 if (EltOffset >= EndBit) break;
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001783
Chris Lattner021c3a32010-07-29 07:43:55 +00001784 unsigned EltStart = EltOffset < StartBit ? StartBit-EltOffset :0;
1785 if (!BitsContainNoUserData(AT->getElementType(), EltStart,
1786 EndBit-EltOffset, Context))
1787 return false;
1788 }
1789 // If it overlaps no elements, then it is safe to process as padding.
1790 return true;
1791 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001792
Chris Lattnere2962be2010-07-29 07:30:00 +00001793 if (const RecordType *RT = Ty->getAs<RecordType>()) {
1794 const RecordDecl *RD = RT->getDecl();
1795 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001796
Chris Lattnere2962be2010-07-29 07:30:00 +00001797 // If this is a C++ record, check the bases first.
1798 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1799 for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(),
1800 e = CXXRD->bases_end(); i != e; ++i) {
1801 assert(!i->isVirtual() && !i->getType()->isDependentType() &&
1802 "Unexpected base class!");
1803 const CXXRecordDecl *Base =
1804 cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001805
Chris Lattnere2962be2010-07-29 07:30:00 +00001806 // If the base is after the span we care about, ignore it.
Benjamin Kramerd4f51982012-07-04 18:45:14 +00001807 unsigned BaseOffset = Context.toBits(Layout.getBaseClassOffset(Base));
Chris Lattnere2962be2010-07-29 07:30:00 +00001808 if (BaseOffset >= EndBit) continue;
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001809
Chris Lattnere2962be2010-07-29 07:30:00 +00001810 unsigned BaseStart = BaseOffset < StartBit ? StartBit-BaseOffset :0;
1811 if (!BitsContainNoUserData(i->getType(), BaseStart,
1812 EndBit-BaseOffset, Context))
1813 return false;
1814 }
1815 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001816
Chris Lattnere2962be2010-07-29 07:30:00 +00001817 // Verify that no field has data that overlaps the region of interest. Yes
1818 // this could be sped up a lot by being smarter about queried fields,
1819 // however we're only looking at structs up to 16 bytes, so we don't care
1820 // much.
1821 unsigned idx = 0;
1822 for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
1823 i != e; ++i, ++idx) {
1824 unsigned FieldOffset = (unsigned)Layout.getFieldOffset(idx);
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001825
Chris Lattnere2962be2010-07-29 07:30:00 +00001826 // If we found a field after the region we care about, then we're done.
1827 if (FieldOffset >= EndBit) break;
1828
1829 unsigned FieldStart = FieldOffset < StartBit ? StartBit-FieldOffset :0;
1830 if (!BitsContainNoUserData(i->getType(), FieldStart, EndBit-FieldOffset,
1831 Context))
1832 return false;
1833 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001834
Chris Lattnere2962be2010-07-29 07:30:00 +00001835 // If nothing in this record overlapped the area of interest, then we're
1836 // clean.
1837 return true;
1838 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001839
Chris Lattnere2962be2010-07-29 07:30:00 +00001840 return false;
1841}
1842
Chris Lattner0b362002010-07-29 18:39:32 +00001843/// ContainsFloatAtOffset - Return true if the specified LLVM IR type has a
1844/// float member at the specified offset. For example, {int,{float}} has a
1845/// float at offset 4. It is conservatively correct for this routine to return
1846/// false.
Chris Lattner2acc6e32011-07-18 04:24:23 +00001847static bool ContainsFloatAtOffset(llvm::Type *IRType, unsigned IROffset,
Micah Villmow25a6a842012-10-08 16:25:52 +00001848 const llvm::DataLayout &TD) {
Chris Lattner0b362002010-07-29 18:39:32 +00001849 // Base case if we find a float.
1850 if (IROffset == 0 && IRType->isFloatTy())
1851 return true;
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001852
Chris Lattner0b362002010-07-29 18:39:32 +00001853 // If this is a struct, recurse into the field at the specified offset.
Chris Lattner2acc6e32011-07-18 04:24:23 +00001854 if (llvm::StructType *STy = dyn_cast<llvm::StructType>(IRType)) {
Chris Lattner0b362002010-07-29 18:39:32 +00001855 const llvm::StructLayout *SL = TD.getStructLayout(STy);
1856 unsigned Elt = SL->getElementContainingOffset(IROffset);
1857 IROffset -= SL->getElementOffset(Elt);
1858 return ContainsFloatAtOffset(STy->getElementType(Elt), IROffset, TD);
1859 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001860
Chris Lattner0b362002010-07-29 18:39:32 +00001861 // If this is an array, recurse into the field at the specified offset.
Chris Lattner2acc6e32011-07-18 04:24:23 +00001862 if (llvm::ArrayType *ATy = dyn_cast<llvm::ArrayType>(IRType)) {
1863 llvm::Type *EltTy = ATy->getElementType();
Chris Lattner0b362002010-07-29 18:39:32 +00001864 unsigned EltSize = TD.getTypeAllocSize(EltTy);
1865 IROffset -= IROffset/EltSize*EltSize;
1866 return ContainsFloatAtOffset(EltTy, IROffset, TD);
1867 }
1868
1869 return false;
1870}
1871
Chris Lattnerf47c9442010-07-29 18:13:09 +00001872
1873/// GetSSETypeAtOffset - Return a type that will be passed by the backend in the
1874/// low 8 bytes of an XMM register, corresponding to the SSE class.
Chris Lattner9cbe4f02011-07-09 17:41:47 +00001875llvm::Type *X86_64ABIInfo::
1876GetSSETypeAtOffset(llvm::Type *IRType, unsigned IROffset,
Chris Lattnerf47c9442010-07-29 18:13:09 +00001877 QualType SourceTy, unsigned SourceOffset) const {
Chris Lattnercba8d312010-07-29 18:19:50 +00001878 // The only three choices we have are either double, <2 x float>, or float. We
Chris Lattnerf47c9442010-07-29 18:13:09 +00001879 // pass as float if the last 4 bytes is just padding. This happens for
1880 // structs that contain 3 floats.
1881 if (BitsContainNoUserData(SourceTy, SourceOffset*8+32,
1882 SourceOffset*8+64, getContext()))
1883 return llvm::Type::getFloatTy(getVMContext());
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001884
Chris Lattner0b362002010-07-29 18:39:32 +00001885 // We want to pass as <2 x float> if the LLVM IR type contains a float at
1886 // offset+0 and offset+4. Walk the LLVM IR type to find out if this is the
1887 // case.
Micah Villmow25a6a842012-10-08 16:25:52 +00001888 if (ContainsFloatAtOffset(IRType, IROffset, getDataLayout()) &&
1889 ContainsFloatAtOffset(IRType, IROffset+4, getDataLayout()))
Chris Lattner22fd4ba2010-08-25 23:39:14 +00001890 return llvm::VectorType::get(llvm::Type::getFloatTy(getVMContext()), 2);
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001891
Chris Lattnerf47c9442010-07-29 18:13:09 +00001892 return llvm::Type::getDoubleTy(getVMContext());
1893}
1894
1895
Chris Lattner0d2656d2010-07-29 17:40:35 +00001896/// GetINTEGERTypeAtOffset - The ABI specifies that a value should be passed in
1897/// an 8-byte GPR. This means that we either have a scalar or we are talking
1898/// about the high or low part of an up-to-16-byte struct. This routine picks
1899/// the best LLVM IR type to represent this, which may be i64 or may be anything
Chris Lattner49382de2010-07-28 22:44:07 +00001900/// else that the backend will pass in a GPR that works better (e.g. i8, %foo*,
1901/// etc).
1902///
1903/// PrefType is an LLVM IR type that corresponds to (part of) the IR type for
1904/// the source type. IROffset is an offset in bytes into the LLVM IR type that
1905/// the 8-byte value references. PrefType may be null.
1906///
1907/// SourceTy is the source level type for the entire argument. SourceOffset is
1908/// an offset into this that we're processing (which is always either 0 or 8).
1909///
Chris Lattner9cbe4f02011-07-09 17:41:47 +00001910llvm::Type *X86_64ABIInfo::
1911GetINTEGERTypeAtOffset(llvm::Type *IRType, unsigned IROffset,
Chris Lattner0d2656d2010-07-29 17:40:35 +00001912 QualType SourceTy, unsigned SourceOffset) const {
Chris Lattnere2962be2010-07-29 07:30:00 +00001913 // If we're dealing with an un-offset LLVM IR type, then it means that we're
1914 // returning an 8-byte unit starting with it. See if we can safely use it.
1915 if (IROffset == 0) {
1916 // Pointers and int64's always fill the 8-byte unit.
Derek Schuffbabaf312012-10-11 15:52:22 +00001917 if ((isa<llvm::PointerType>(IRType) && Has64BitPointers) ||
1918 IRType->isIntegerTy(64))
Chris Lattnere2962be2010-07-29 07:30:00 +00001919 return IRType;
Chris Lattner49382de2010-07-28 22:44:07 +00001920
Chris Lattnere2962be2010-07-29 07:30:00 +00001921 // If we have a 1/2/4-byte integer, we can use it only if the rest of the
1922 // goodness in the source type is just tail padding. This is allowed to
1923 // kick in for struct {double,int} on the int, but not on
1924 // struct{double,int,int} because we wouldn't return the second int. We
1925 // have to do this analysis on the source type because we can't depend on
1926 // unions being lowered a specific way etc.
1927 if (IRType->isIntegerTy(8) || IRType->isIntegerTy(16) ||
Derek Schuffbabaf312012-10-11 15:52:22 +00001928 IRType->isIntegerTy(32) ||
1929 (isa<llvm::PointerType>(IRType) && !Has64BitPointers)) {
1930 unsigned BitWidth = isa<llvm::PointerType>(IRType) ? 32 :
1931 cast<llvm::IntegerType>(IRType)->getBitWidth();
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001932
Chris Lattnere2962be2010-07-29 07:30:00 +00001933 if (BitsContainNoUserData(SourceTy, SourceOffset*8+BitWidth,
1934 SourceOffset*8+64, getContext()))
1935 return IRType;
1936 }
1937 }
Chris Lattner49382de2010-07-28 22:44:07 +00001938
Chris Lattner2acc6e32011-07-18 04:24:23 +00001939 if (llvm::StructType *STy = dyn_cast<llvm::StructType>(IRType)) {
Chris Lattner49382de2010-07-28 22:44:07 +00001940 // If this is a struct, recurse into the field at the specified offset.
Micah Villmow25a6a842012-10-08 16:25:52 +00001941 const llvm::StructLayout *SL = getDataLayout().getStructLayout(STy);
Chris Lattner49382de2010-07-28 22:44:07 +00001942 if (IROffset < SL->getSizeInBytes()) {
1943 unsigned FieldIdx = SL->getElementContainingOffset(IROffset);
1944 IROffset -= SL->getElementOffset(FieldIdx);
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001945
Chris Lattner0d2656d2010-07-29 17:40:35 +00001946 return GetINTEGERTypeAtOffset(STy->getElementType(FieldIdx), IROffset,
1947 SourceTy, SourceOffset);
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001948 }
Chris Lattner49382de2010-07-28 22:44:07 +00001949 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001950
Chris Lattner2acc6e32011-07-18 04:24:23 +00001951 if (llvm::ArrayType *ATy = dyn_cast<llvm::ArrayType>(IRType)) {
Chris Lattner9cbe4f02011-07-09 17:41:47 +00001952 llvm::Type *EltTy = ATy->getElementType();
Micah Villmow25a6a842012-10-08 16:25:52 +00001953 unsigned EltSize = getDataLayout().getTypeAllocSize(EltTy);
Chris Lattner021c3a32010-07-29 07:43:55 +00001954 unsigned EltOffset = IROffset/EltSize*EltSize;
Chris Lattner0d2656d2010-07-29 17:40:35 +00001955 return GetINTEGERTypeAtOffset(EltTy, IROffset-EltOffset, SourceTy,
1956 SourceOffset);
Chris Lattner021c3a32010-07-29 07:43:55 +00001957 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001958
Chris Lattner49382de2010-07-28 22:44:07 +00001959 // Okay, we don't have any better idea of what to pass, so we pass this in an
1960 // integer register that isn't too big to fit the rest of the struct.
Chris Lattner9e45a3d2010-07-29 17:34:39 +00001961 unsigned TySizeInBytes =
1962 (unsigned)getContext().getTypeSizeInChars(SourceTy).getQuantity();
Chris Lattner49382de2010-07-28 22:44:07 +00001963
Chris Lattner9e45a3d2010-07-29 17:34:39 +00001964 assert(TySizeInBytes != SourceOffset && "Empty field?");
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00001965
Chris Lattner49382de2010-07-28 22:44:07 +00001966 // It is always safe to classify this as an integer type up to i64 that
1967 // isn't larger than the structure.
Chris Lattner9e45a3d2010-07-29 17:34:39 +00001968 return llvm::IntegerType::get(getVMContext(),
1969 std::min(TySizeInBytes-SourceOffset, 8U)*8);
Chris Lattner9c254f02010-06-29 06:01:59 +00001970}
1971
Chris Lattner66e7b682010-09-01 00:50:20 +00001972
1973/// GetX86_64ByValArgumentPair - Given a high and low type that can ideally
1974/// be used as elements of a two register pair to pass or return, return a
1975/// first class aggregate to represent them. For example, if the low part of
1976/// a by-value argument should be passed as i32* and the high part as float,
1977/// return {i32*, float}.
Chris Lattner9cbe4f02011-07-09 17:41:47 +00001978static llvm::Type *
Jay Foadef6de3d2011-07-11 09:56:20 +00001979GetX86_64ByValArgumentPair(llvm::Type *Lo, llvm::Type *Hi,
Micah Villmow25a6a842012-10-08 16:25:52 +00001980 const llvm::DataLayout &TD) {
Chris Lattner66e7b682010-09-01 00:50:20 +00001981 // In order to correctly satisfy the ABI, we need to the high part to start
1982 // at offset 8. If the high and low parts we inferred are both 4-byte types
1983 // (e.g. i32 and i32) then the resultant struct type ({i32,i32}) won't have
1984 // the second element at offset 8. Check for this:
1985 unsigned LoSize = (unsigned)TD.getTypeAllocSize(Lo);
1986 unsigned HiAlign = TD.getABITypeAlignment(Hi);
Micah Villmow25a6a842012-10-08 16:25:52 +00001987 unsigned HiStart = llvm::DataLayout::RoundUpAlignment(LoSize, HiAlign);
Chris Lattner66e7b682010-09-01 00:50:20 +00001988 assert(HiStart != 0 && HiStart <= 8 && "Invalid x86-64 argument pair!");
Michael J. Spencer9cac4942010-10-19 06:39:39 +00001989
Chris Lattner66e7b682010-09-01 00:50:20 +00001990 // To handle this, we have to increase the size of the low part so that the
1991 // second element will start at an 8 byte offset. We can't increase the size
1992 // of the second element because it might make us access off the end of the
1993 // struct.
1994 if (HiStart != 8) {
1995 // There are only two sorts of types the ABI generation code can produce for
1996 // the low part of a pair that aren't 8 bytes in size: float or i8/i16/i32.
1997 // Promote these to a larger type.
1998 if (Lo->isFloatTy())
1999 Lo = llvm::Type::getDoubleTy(Lo->getContext());
2000 else {
2001 assert(Lo->isIntegerTy() && "Invalid/unknown lo type");
2002 Lo = llvm::Type::getInt64Ty(Lo->getContext());
2003 }
2004 }
Michael J. Spencer9cac4942010-10-19 06:39:39 +00002005
Chris Lattner9cbe4f02011-07-09 17:41:47 +00002006 llvm::StructType *Result = llvm::StructType::get(Lo, Hi, NULL);
Michael J. Spencer9cac4942010-10-19 06:39:39 +00002007
2008
Chris Lattner66e7b682010-09-01 00:50:20 +00002009 // Verify that the second element is at an 8-byte offset.
2010 assert(TD.getStructLayout(Result)->getElementOffset(1) == 8 &&
2011 "Invalid x86-64 argument pair!");
2012 return Result;
2013}
2014
Chris Lattner519f68c2010-07-28 23:06:14 +00002015ABIArgInfo X86_64ABIInfo::
Chris Lattnera3c109b2010-07-29 02:16:43 +00002016classifyReturnType(QualType RetTy) const {
Chris Lattner519f68c2010-07-28 23:06:14 +00002017 // AMD64-ABI 3.2.3p4: Rule 1. Classify the return type with the
2018 // classification algorithm.
2019 X86_64ABIInfo::Class Lo, Hi;
2020 classify(RetTy, 0, Lo, Hi);
2021
2022 // Check some invariants.
2023 assert((Hi != Memory || Lo == Memory) && "Invalid memory classification.");
Chris Lattner519f68c2010-07-28 23:06:14 +00002024 assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification.");
2025
Chris Lattner9cbe4f02011-07-09 17:41:47 +00002026 llvm::Type *ResType = 0;
Chris Lattner519f68c2010-07-28 23:06:14 +00002027 switch (Lo) {
2028 case NoClass:
Chris Lattner117e3f42010-07-30 04:02:24 +00002029 if (Hi == NoClass)
2030 return ABIArgInfo::getIgnore();
2031 // If the low part is just padding, it takes no register, leave ResType
2032 // null.
2033 assert((Hi == SSE || Hi == Integer || Hi == X87Up) &&
2034 "Unknown missing lo part");
2035 break;
Chris Lattner519f68c2010-07-28 23:06:14 +00002036
2037 case SSEUp:
2038 case X87Up:
David Blaikieb219cfc2011-09-23 05:06:16 +00002039 llvm_unreachable("Invalid classification for lo word.");
Chris Lattner519f68c2010-07-28 23:06:14 +00002040
2041 // AMD64-ABI 3.2.3p4: Rule 2. Types of class memory are returned via
2042 // hidden argument.
2043 case Memory:
2044 return getIndirectReturnResult(RetTy);
2045
2046 // AMD64-ABI 3.2.3p4: Rule 3. If the class is INTEGER, the next
2047 // available register of the sequence %rax, %rdx is used.
2048 case Integer:
Chris Lattner9cbe4f02011-07-09 17:41:47 +00002049 ResType = GetINTEGERTypeAtOffset(CGT.ConvertType(RetTy), 0, RetTy, 0);
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00002050
Chris Lattnereb518b42010-07-29 21:42:50 +00002051 // If we have a sign or zero extended integer, make sure to return Extend
2052 // so that the parameter gets the right LLVM IR attributes.
2053 if (Hi == NoClass && isa<llvm::IntegerType>(ResType)) {
2054 // Treat an enum type as its underlying type.
2055 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
2056 RetTy = EnumTy->getDecl()->getIntegerType();
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00002057
Chris Lattnereb518b42010-07-29 21:42:50 +00002058 if (RetTy->isIntegralOrEnumerationType() &&
2059 RetTy->isPromotableIntegerType())
2060 return ABIArgInfo::getExtend();
2061 }
Chris Lattner519f68c2010-07-28 23:06:14 +00002062 break;
2063
2064 // AMD64-ABI 3.2.3p4: Rule 4. If the class is SSE, the next
2065 // available SSE register of the sequence %xmm0, %xmm1 is used.
2066 case SSE:
Chris Lattner9cbe4f02011-07-09 17:41:47 +00002067 ResType = GetSSETypeAtOffset(CGT.ConvertType(RetTy), 0, RetTy, 0);
Chris Lattner0b30c672010-07-28 23:12:33 +00002068 break;
Chris Lattner519f68c2010-07-28 23:06:14 +00002069
2070 // AMD64-ABI 3.2.3p4: Rule 6. If the class is X87, the value is
2071 // returned on the X87 stack in %st0 as 80-bit x87 number.
2072 case X87:
Chris Lattnerea044322010-07-29 02:01:43 +00002073 ResType = llvm::Type::getX86_FP80Ty(getVMContext());
Chris Lattner0b30c672010-07-28 23:12:33 +00002074 break;
Chris Lattner519f68c2010-07-28 23:06:14 +00002075
2076 // AMD64-ABI 3.2.3p4: Rule 8. If the class is COMPLEX_X87, the real
2077 // part of the value is returned in %st0 and the imaginary part in
2078 // %st1.
2079 case ComplexX87:
2080 assert(Hi == ComplexX87 && "Unexpected ComplexX87 classification.");
Chris Lattner7650d952011-06-18 22:49:11 +00002081 ResType = llvm::StructType::get(llvm::Type::getX86_FP80Ty(getVMContext()),
Chris Lattnerea044322010-07-29 02:01:43 +00002082 llvm::Type::getX86_FP80Ty(getVMContext()),
Chris Lattner519f68c2010-07-28 23:06:14 +00002083 NULL);
2084 break;
2085 }
2086
Chris Lattner9cbe4f02011-07-09 17:41:47 +00002087 llvm::Type *HighPart = 0;
Chris Lattner519f68c2010-07-28 23:06:14 +00002088 switch (Hi) {
2089 // Memory was handled previously and X87 should
2090 // never occur as a hi class.
2091 case Memory:
2092 case X87:
David Blaikieb219cfc2011-09-23 05:06:16 +00002093 llvm_unreachable("Invalid classification for hi word.");
Chris Lattner519f68c2010-07-28 23:06:14 +00002094
2095 case ComplexX87: // Previously handled.
Chris Lattner0b30c672010-07-28 23:12:33 +00002096 case NoClass:
2097 break;
Chris Lattner519f68c2010-07-28 23:06:14 +00002098
Chris Lattner3db4dde2010-09-01 00:20:33 +00002099 case Integer:
Chris Lattner9cbe4f02011-07-09 17:41:47 +00002100 HighPart = GetINTEGERTypeAtOffset(CGT.ConvertType(RetTy), 8, RetTy, 8);
Chris Lattner3db4dde2010-09-01 00:20:33 +00002101 if (Lo == NoClass) // Return HighPart at offset 8 in memory.
2102 return ABIArgInfo::getDirect(HighPart, 8);
Chris Lattner519f68c2010-07-28 23:06:14 +00002103 break;
Chris Lattner3db4dde2010-09-01 00:20:33 +00002104 case SSE:
Chris Lattner9cbe4f02011-07-09 17:41:47 +00002105 HighPart = GetSSETypeAtOffset(CGT.ConvertType(RetTy), 8, RetTy, 8);
Chris Lattner3db4dde2010-09-01 00:20:33 +00002106 if (Lo == NoClass) // Return HighPart at offset 8 in memory.
2107 return ABIArgInfo::getDirect(HighPart, 8);
Chris Lattner519f68c2010-07-28 23:06:14 +00002108 break;
2109
2110 // AMD64-ABI 3.2.3p4: Rule 5. If the class is SSEUP, the eightbyte
Bruno Cardoso Lopes4943c152011-07-11 22:41:29 +00002111 // is passed in the next available eightbyte chunk if the last used
2112 // vector register.
Chris Lattner519f68c2010-07-28 23:06:14 +00002113 //
Chris Lattnerfc8f0e12011-04-15 05:22:18 +00002114 // SSEUP should always be preceded by SSE, just widen.
Chris Lattner519f68c2010-07-28 23:06:14 +00002115 case SSEUp:
2116 assert(Lo == SSE && "Unexpected SSEUp classification.");
Bruno Cardoso Lopes4943c152011-07-11 22:41:29 +00002117 ResType = GetByteVectorType(RetTy);
Chris Lattner519f68c2010-07-28 23:06:14 +00002118 break;
2119
2120 // AMD64-ABI 3.2.3p4: Rule 7. If the class is X87UP, the value is
2121 // returned together with the previous X87 value in %st0.
2122 case X87Up:
Chris Lattnerfc8f0e12011-04-15 05:22:18 +00002123 // If X87Up is preceded by X87, we don't need to do
Chris Lattner519f68c2010-07-28 23:06:14 +00002124 // anything. However, in some cases with unions it may not be
Chris Lattnerfc8f0e12011-04-15 05:22:18 +00002125 // preceded by X87. In such situations we follow gcc and pass the
Chris Lattner519f68c2010-07-28 23:06:14 +00002126 // extra bits in an SSE reg.
Chris Lattner603519d2010-07-29 17:49:08 +00002127 if (Lo != X87) {
Chris Lattner9cbe4f02011-07-09 17:41:47 +00002128 HighPart = GetSSETypeAtOffset(CGT.ConvertType(RetTy), 8, RetTy, 8);
Chris Lattner3db4dde2010-09-01 00:20:33 +00002129 if (Lo == NoClass) // Return HighPart at offset 8 in memory.
2130 return ABIArgInfo::getDirect(HighPart, 8);
Chris Lattner603519d2010-07-29 17:49:08 +00002131 }
Chris Lattner519f68c2010-07-28 23:06:14 +00002132 break;
2133 }
Michael J. Spencer9cac4942010-10-19 06:39:39 +00002134
Chris Lattner3db4dde2010-09-01 00:20:33 +00002135 // If a high part was specified, merge it together with the low part. It is
Chris Lattner645406a2010-09-01 00:24:35 +00002136 // known to pass in the high eightbyte of the result. We do this by forming a
2137 // first class struct aggregate with the high and low part: {low, high}
Chris Lattner66e7b682010-09-01 00:50:20 +00002138 if (HighPart)
Micah Villmow25a6a842012-10-08 16:25:52 +00002139 ResType = GetX86_64ByValArgumentPair(ResType, HighPart, getDataLayout());
Chris Lattner519f68c2010-07-28 23:06:14 +00002140
Chris Lattnereb518b42010-07-29 21:42:50 +00002141 return ABIArgInfo::getDirect(ResType);
Chris Lattner519f68c2010-07-28 23:06:14 +00002142}
2143
Daniel Dunbaredfac032012-03-10 01:03:58 +00002144ABIArgInfo X86_64ABIInfo::classifyArgumentType(
2145 QualType Ty, unsigned freeIntRegs, unsigned &neededInt, unsigned &neededSSE)
2146 const
2147{
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002148 X86_64ABIInfo::Class Lo, Hi;
Chris Lattner9c254f02010-06-29 06:01:59 +00002149 classify(Ty, 0, Lo, Hi);
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00002150
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002151 // Check some invariants.
2152 // FIXME: Enforce these by construction.
2153 assert((Hi != Memory || Lo == Memory) && "Invalid memory classification.");
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002154 assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification.");
2155
2156 neededInt = 0;
2157 neededSSE = 0;
Chris Lattner9cbe4f02011-07-09 17:41:47 +00002158 llvm::Type *ResType = 0;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002159 switch (Lo) {
2160 case NoClass:
Chris Lattner117e3f42010-07-30 04:02:24 +00002161 if (Hi == NoClass)
2162 return ABIArgInfo::getIgnore();
2163 // If the low part is just padding, it takes no register, leave ResType
2164 // null.
2165 assert((Hi == SSE || Hi == Integer || Hi == X87Up) &&
2166 "Unknown missing lo part");
2167 break;
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00002168
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002169 // AMD64-ABI 3.2.3p3: Rule 1. If the class is MEMORY, pass the argument
2170 // on the stack.
2171 case Memory:
2172
2173 // AMD64-ABI 3.2.3p3: Rule 5. If the class is X87, X87UP or
2174 // COMPLEX_X87, it is passed in memory.
2175 case X87:
2176 case ComplexX87:
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +00002177 if (getRecordArgABI(Ty, CGT) == CGCXXABI::RAA_Indirect)
Eli Friedmanded137f2011-06-29 07:04:55 +00002178 ++neededInt;
Daniel Dunbaredfac032012-03-10 01:03:58 +00002179 return getIndirectResult(Ty, freeIntRegs);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002180
2181 case SSEUp:
2182 case X87Up:
David Blaikieb219cfc2011-09-23 05:06:16 +00002183 llvm_unreachable("Invalid classification for lo word.");
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002184
2185 // AMD64-ABI 3.2.3p3: Rule 2. If the class is INTEGER, the next
2186 // available register of the sequence %rdi, %rsi, %rdx, %rcx, %r8
2187 // and %r9 is used.
2188 case Integer:
Chris Lattner9c254f02010-06-29 06:01:59 +00002189 ++neededInt;
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00002190
Chris Lattner49382de2010-07-28 22:44:07 +00002191 // Pick an 8-byte type based on the preferred type.
Chris Lattner9cbe4f02011-07-09 17:41:47 +00002192 ResType = GetINTEGERTypeAtOffset(CGT.ConvertType(Ty), 0, Ty, 0);
Chris Lattnereb518b42010-07-29 21:42:50 +00002193
2194 // If we have a sign or zero extended integer, make sure to return Extend
2195 // so that the parameter gets the right LLVM IR attributes.
2196 if (Hi == NoClass && isa<llvm::IntegerType>(ResType)) {
2197 // Treat an enum type as its underlying type.
2198 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
2199 Ty = EnumTy->getDecl()->getIntegerType();
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00002200
Chris Lattnereb518b42010-07-29 21:42:50 +00002201 if (Ty->isIntegralOrEnumerationType() &&
2202 Ty->isPromotableIntegerType())
2203 return ABIArgInfo::getExtend();
2204 }
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00002205
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002206 break;
2207
2208 // AMD64-ABI 3.2.3p3: Rule 3. If the class is SSE, the next
2209 // available SSE register is used, the registers are taken in the
2210 // order from %xmm0 to %xmm7.
Bill Wendlingbb465d72010-10-18 03:41:31 +00002211 case SSE: {
Chris Lattner9cbe4f02011-07-09 17:41:47 +00002212 llvm::Type *IRType = CGT.ConvertType(Ty);
Eli Friedman14508ff2011-07-02 00:57:27 +00002213 ResType = GetSSETypeAtOffset(IRType, 0, Ty, 0);
Bill Wendling99aaae82010-10-18 23:51:38 +00002214 ++neededSSE;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002215 break;
2216 }
Bill Wendlingbb465d72010-10-18 03:41:31 +00002217 }
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002218
Chris Lattner9cbe4f02011-07-09 17:41:47 +00002219 llvm::Type *HighPart = 0;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002220 switch (Hi) {
2221 // Memory was handled previously, ComplexX87 and X87 should
Chris Lattnerfc8f0e12011-04-15 05:22:18 +00002222 // never occur as hi classes, and X87Up must be preceded by X87,
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002223 // which is passed in memory.
2224 case Memory:
2225 case X87:
2226 case ComplexX87:
David Blaikieb219cfc2011-09-23 05:06:16 +00002227 llvm_unreachable("Invalid classification for hi word.");
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002228
2229 case NoClass: break;
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00002230
Chris Lattner645406a2010-09-01 00:24:35 +00002231 case Integer:
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002232 ++neededInt;
Chris Lattner49382de2010-07-28 22:44:07 +00002233 // Pick an 8-byte type based on the preferred type.
Chris Lattner9cbe4f02011-07-09 17:41:47 +00002234 HighPart = GetINTEGERTypeAtOffset(CGT.ConvertType(Ty), 8, Ty, 8);
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00002235
Chris Lattner645406a2010-09-01 00:24:35 +00002236 if (Lo == NoClass) // Pass HighPart at offset 8 in memory.
2237 return ABIArgInfo::getDirect(HighPart, 8);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002238 break;
2239
2240 // X87Up generally doesn't occur here (long double is passed in
2241 // memory), except in situations involving unions.
2242 case X87Up:
Chris Lattner645406a2010-09-01 00:24:35 +00002243 case SSE:
Chris Lattner9cbe4f02011-07-09 17:41:47 +00002244 HighPart = GetSSETypeAtOffset(CGT.ConvertType(Ty), 8, Ty, 8);
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00002245
Chris Lattner645406a2010-09-01 00:24:35 +00002246 if (Lo == NoClass) // Pass HighPart at offset 8 in memory.
2247 return ABIArgInfo::getDirect(HighPart, 8);
Chris Lattner117e3f42010-07-30 04:02:24 +00002248
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002249 ++neededSSE;
2250 break;
2251
2252 // AMD64-ABI 3.2.3p3: Rule 4. If the class is SSEUP, the
2253 // eightbyte is passed in the upper half of the last used SSE
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00002254 // register. This only happens when 128-bit vectors are passed.
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002255 case SSEUp:
Chris Lattnerab5722e2010-07-28 23:47:21 +00002256 assert(Lo == SSE && "Unexpected SSEUp classification");
Bruno Cardoso Lopes4943c152011-07-11 22:41:29 +00002257 ResType = GetByteVectorType(Ty);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002258 break;
2259 }
2260
Chris Lattner645406a2010-09-01 00:24:35 +00002261 // If a high part was specified, merge it together with the low part. It is
2262 // known to pass in the high eightbyte of the result. We do this by forming a
2263 // first class struct aggregate with the high and low part: {low, high}
2264 if (HighPart)
Micah Villmow25a6a842012-10-08 16:25:52 +00002265 ResType = GetX86_64ByValArgumentPair(ResType, HighPart, getDataLayout());
Michael J. Spencer9cac4942010-10-19 06:39:39 +00002266
Chris Lattnereb518b42010-07-29 21:42:50 +00002267 return ABIArgInfo::getDirect(ResType);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002268}
2269
Chris Lattneree5dcd02010-07-29 02:31:05 +00002270void X86_64ABIInfo::computeInfo(CGFunctionInfo &FI) const {
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00002271
Chris Lattnera3c109b2010-07-29 02:16:43 +00002272 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002273
2274 // Keep track of the number of assigned registers.
Bill Wendling99aaae82010-10-18 23:51:38 +00002275 unsigned freeIntRegs = 6, freeSSERegs = 8;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002276
2277 // If the return value is indirect, then the hidden argument is consuming one
2278 // integer register.
2279 if (FI.getReturnInfo().isIndirect())
2280 --freeIntRegs;
2281
2282 // AMD64-ABI 3.2.3p3: Once arguments are classified, the registers
2283 // get assigned (in left-to-right order) for passing as follows...
2284 for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
2285 it != ie; ++it) {
Bill Wendling99aaae82010-10-18 23:51:38 +00002286 unsigned neededInt, neededSSE;
Daniel Dunbaredfac032012-03-10 01:03:58 +00002287 it->info = classifyArgumentType(it->type, freeIntRegs, neededInt,
2288 neededSSE);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002289
2290 // AMD64-ABI 3.2.3p3: If there are no registers available for any
2291 // eightbyte of an argument, the whole argument is passed on the
2292 // stack. If registers have already been assigned for some
2293 // eightbytes of such an argument, the assignments get reverted.
Bill Wendling99aaae82010-10-18 23:51:38 +00002294 if (freeIntRegs >= neededInt && freeSSERegs >= neededSSE) {
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002295 freeIntRegs -= neededInt;
2296 freeSSERegs -= neededSSE;
2297 } else {
Daniel Dunbaredfac032012-03-10 01:03:58 +00002298 it->info = getIndirectResult(it->type, freeIntRegs);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002299 }
2300 }
2301}
2302
2303static llvm::Value *EmitVAArgFromMemory(llvm::Value *VAListAddr,
2304 QualType Ty,
2305 CodeGenFunction &CGF) {
2306 llvm::Value *overflow_arg_area_p =
2307 CGF.Builder.CreateStructGEP(VAListAddr, 2, "overflow_arg_area_p");
2308 llvm::Value *overflow_arg_area =
2309 CGF.Builder.CreateLoad(overflow_arg_area_p, "overflow_arg_area");
2310
2311 // AMD64-ABI 3.5.7p5: Step 7. Align l->overflow_arg_area upwards to a 16
2312 // byte boundary if alignment needed by type exceeds 8 byte boundary.
Eli Friedman8d2fe422011-11-18 02:44:19 +00002313 // It isn't stated explicitly in the standard, but in practice we use
2314 // alignment greater than 16 where necessary.
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002315 uint64_t Align = CGF.getContext().getTypeAlign(Ty) / 8;
2316 if (Align > 8) {
Eli Friedman8d2fe422011-11-18 02:44:19 +00002317 // overflow_arg_area = (overflow_arg_area + align - 1) & -align;
Owen Anderson0032b272009-08-13 21:57:51 +00002318 llvm::Value *Offset =
Eli Friedman8d2fe422011-11-18 02:44:19 +00002319 llvm::ConstantInt::get(CGF.Int64Ty, Align - 1);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002320 overflow_arg_area = CGF.Builder.CreateGEP(overflow_arg_area, Offset);
2321 llvm::Value *AsInt = CGF.Builder.CreatePtrToInt(overflow_arg_area,
Chris Lattner77b89b82010-06-27 07:15:29 +00002322 CGF.Int64Ty);
Eli Friedman8d2fe422011-11-18 02:44:19 +00002323 llvm::Value *Mask = llvm::ConstantInt::get(CGF.Int64Ty, -(uint64_t)Align);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002324 overflow_arg_area =
2325 CGF.Builder.CreateIntToPtr(CGF.Builder.CreateAnd(AsInt, Mask),
2326 overflow_arg_area->getType(),
2327 "overflow_arg_area.align");
2328 }
2329
2330 // AMD64-ABI 3.5.7p5: Step 8. Fetch type from l->overflow_arg_area.
Chris Lattner2acc6e32011-07-18 04:24:23 +00002331 llvm::Type *LTy = CGF.ConvertTypeForMem(Ty);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002332 llvm::Value *Res =
2333 CGF.Builder.CreateBitCast(overflow_arg_area,
Owen Anderson96e0fc72009-07-29 22:16:19 +00002334 llvm::PointerType::getUnqual(LTy));
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002335
2336 // AMD64-ABI 3.5.7p5: Step 9. Set l->overflow_arg_area to:
2337 // l->overflow_arg_area + sizeof(type).
2338 // AMD64-ABI 3.5.7p5: Step 10. Align l->overflow_arg_area upwards to
2339 // an 8 byte boundary.
2340
2341 uint64_t SizeInBytes = (CGF.getContext().getTypeSize(Ty) + 7) / 8;
Owen Anderson0032b272009-08-13 21:57:51 +00002342 llvm::Value *Offset =
Chris Lattner77b89b82010-06-27 07:15:29 +00002343 llvm::ConstantInt::get(CGF.Int32Ty, (SizeInBytes + 7) & ~7);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002344 overflow_arg_area = CGF.Builder.CreateGEP(overflow_arg_area, Offset,
2345 "overflow_arg_area.next");
2346 CGF.Builder.CreateStore(overflow_arg_area, overflow_arg_area_p);
2347
2348 // AMD64-ABI 3.5.7p5: Step 11. Return the fetched type.
2349 return Res;
2350}
2351
2352llvm::Value *X86_64ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
2353 CodeGenFunction &CGF) const {
2354 // Assume that va_list type is correct; should be pointer to LLVM type:
2355 // struct {
2356 // i32 gp_offset;
2357 // i32 fp_offset;
2358 // i8* overflow_arg_area;
2359 // i8* reg_save_area;
2360 // };
Bill Wendling99aaae82010-10-18 23:51:38 +00002361 unsigned neededInt, neededSSE;
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00002362
Chris Lattnera14db752010-03-11 18:19:55 +00002363 Ty = CGF.getContext().getCanonicalType(Ty);
Daniel Dunbaredfac032012-03-10 01:03:58 +00002364 ABIArgInfo AI = classifyArgumentType(Ty, 0, neededInt, neededSSE);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002365
2366 // AMD64-ABI 3.5.7p5: Step 1. Determine whether type may be passed
2367 // in the registers. If not go to step 7.
2368 if (!neededInt && !neededSSE)
2369 return EmitVAArgFromMemory(VAListAddr, Ty, CGF);
2370
2371 // AMD64-ABI 3.5.7p5: Step 2. Compute num_gp to hold the number of
2372 // general purpose registers needed to pass type and num_fp to hold
2373 // the number of floating point registers needed.
2374
2375 // AMD64-ABI 3.5.7p5: Step 3. Verify whether arguments fit into
2376 // registers. In the case: l->gp_offset > 48 - num_gp * 8 or
2377 // l->fp_offset > 304 - num_fp * 16 go to step 7.
2378 //
2379 // NOTE: 304 is a typo, there are (6 * 8 + 8 * 16) = 176 bytes of
2380 // register save space).
2381
2382 llvm::Value *InRegs = 0;
2383 llvm::Value *gp_offset_p = 0, *gp_offset = 0;
2384 llvm::Value *fp_offset_p = 0, *fp_offset = 0;
2385 if (neededInt) {
2386 gp_offset_p = CGF.Builder.CreateStructGEP(VAListAddr, 0, "gp_offset_p");
2387 gp_offset = CGF.Builder.CreateLoad(gp_offset_p, "gp_offset");
Chris Lattner1090a9b2010-06-28 21:43:59 +00002388 InRegs = llvm::ConstantInt::get(CGF.Int32Ty, 48 - neededInt * 8);
2389 InRegs = CGF.Builder.CreateICmpULE(gp_offset, InRegs, "fits_in_gp");
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002390 }
2391
2392 if (neededSSE) {
2393 fp_offset_p = CGF.Builder.CreateStructGEP(VAListAddr, 1, "fp_offset_p");
2394 fp_offset = CGF.Builder.CreateLoad(fp_offset_p, "fp_offset");
2395 llvm::Value *FitsInFP =
Chris Lattner1090a9b2010-06-28 21:43:59 +00002396 llvm::ConstantInt::get(CGF.Int32Ty, 176 - neededSSE * 16);
2397 FitsInFP = CGF.Builder.CreateICmpULE(fp_offset, FitsInFP, "fits_in_fp");
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002398 InRegs = InRegs ? CGF.Builder.CreateAnd(InRegs, FitsInFP) : FitsInFP;
2399 }
2400
2401 llvm::BasicBlock *InRegBlock = CGF.createBasicBlock("vaarg.in_reg");
2402 llvm::BasicBlock *InMemBlock = CGF.createBasicBlock("vaarg.in_mem");
2403 llvm::BasicBlock *ContBlock = CGF.createBasicBlock("vaarg.end");
2404 CGF.Builder.CreateCondBr(InRegs, InRegBlock, InMemBlock);
2405
2406 // Emit code to load the value if it was passed in registers.
2407
2408 CGF.EmitBlock(InRegBlock);
2409
2410 // AMD64-ABI 3.5.7p5: Step 4. Fetch type from l->reg_save_area with
2411 // an offset of l->gp_offset and/or l->fp_offset. This may require
2412 // copying to a temporary location in case the parameter is passed
2413 // in different register classes or requires an alignment greater
2414 // than 8 for general purpose registers and 16 for XMM registers.
2415 //
2416 // FIXME: This really results in shameful code when we end up needing to
2417 // collect arguments from different places; often what should result in a
2418 // simple assembling of a structure from scattered addresses has many more
2419 // loads than necessary. Can we clean this up?
Chris Lattner2acc6e32011-07-18 04:24:23 +00002420 llvm::Type *LTy = CGF.ConvertTypeForMem(Ty);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002421 llvm::Value *RegAddr =
2422 CGF.Builder.CreateLoad(CGF.Builder.CreateStructGEP(VAListAddr, 3),
2423 "reg_save_area");
2424 if (neededInt && neededSSE) {
2425 // FIXME: Cleanup.
Chris Lattner800588f2010-07-29 06:26:06 +00002426 assert(AI.isDirect() && "Unexpected ABI info for mixed regs");
Chris Lattner2acc6e32011-07-18 04:24:23 +00002427 llvm::StructType *ST = cast<llvm::StructType>(AI.getCoerceToType());
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002428 llvm::Value *Tmp = CGF.CreateTempAlloca(ST);
2429 assert(ST->getNumElements() == 2 && "Unexpected ABI info for mixed regs");
Chris Lattner2acc6e32011-07-18 04:24:23 +00002430 llvm::Type *TyLo = ST->getElementType(0);
2431 llvm::Type *TyHi = ST->getElementType(1);
Chris Lattnera8b7a7d2010-08-26 06:28:35 +00002432 assert((TyLo->isFPOrFPVectorTy() ^ TyHi->isFPOrFPVectorTy()) &&
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002433 "Unexpected ABI info for mixed regs");
Chris Lattner2acc6e32011-07-18 04:24:23 +00002434 llvm::Type *PTyLo = llvm::PointerType::getUnqual(TyLo);
2435 llvm::Type *PTyHi = llvm::PointerType::getUnqual(TyHi);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002436 llvm::Value *GPAddr = CGF.Builder.CreateGEP(RegAddr, gp_offset);
2437 llvm::Value *FPAddr = CGF.Builder.CreateGEP(RegAddr, fp_offset);
Duncan Sandsf177d9d2010-02-15 16:14:01 +00002438 llvm::Value *RegLoAddr = TyLo->isFloatingPointTy() ? FPAddr : GPAddr;
2439 llvm::Value *RegHiAddr = TyLo->isFloatingPointTy() ? GPAddr : FPAddr;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002440 llvm::Value *V =
2441 CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegLoAddr, PTyLo));
2442 CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 0));
2443 V = CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegHiAddr, PTyHi));
2444 CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 1));
2445
Owen Andersona1cf15f2009-07-14 23:10:40 +00002446 RegAddr = CGF.Builder.CreateBitCast(Tmp,
Owen Anderson96e0fc72009-07-29 22:16:19 +00002447 llvm::PointerType::getUnqual(LTy));
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002448 } else if (neededInt) {
2449 RegAddr = CGF.Builder.CreateGEP(RegAddr, gp_offset);
2450 RegAddr = CGF.Builder.CreateBitCast(RegAddr,
Owen Anderson96e0fc72009-07-29 22:16:19 +00002451 llvm::PointerType::getUnqual(LTy));
Chris Lattnerdce5ad02010-06-28 20:05:43 +00002452 } else if (neededSSE == 1) {
2453 RegAddr = CGF.Builder.CreateGEP(RegAddr, fp_offset);
2454 RegAddr = CGF.Builder.CreateBitCast(RegAddr,
2455 llvm::PointerType::getUnqual(LTy));
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002456 } else {
Chris Lattnerdce5ad02010-06-28 20:05:43 +00002457 assert(neededSSE == 2 && "Invalid number of needed registers!");
2458 // SSE registers are spaced 16 bytes apart in the register save
2459 // area, we need to collect the two eightbytes together.
2460 llvm::Value *RegAddrLo = CGF.Builder.CreateGEP(RegAddr, fp_offset);
Chris Lattner1090a9b2010-06-28 21:43:59 +00002461 llvm::Value *RegAddrHi = CGF.Builder.CreateConstGEP1_32(RegAddrLo, 16);
Chris Lattner8b418682012-02-07 00:39:47 +00002462 llvm::Type *DoubleTy = CGF.DoubleTy;
Chris Lattner2acc6e32011-07-18 04:24:23 +00002463 llvm::Type *DblPtrTy =
Chris Lattnerdce5ad02010-06-28 20:05:43 +00002464 llvm::PointerType::getUnqual(DoubleTy);
Chris Lattner2acc6e32011-07-18 04:24:23 +00002465 llvm::StructType *ST = llvm::StructType::get(DoubleTy,
Chris Lattnerdce5ad02010-06-28 20:05:43 +00002466 DoubleTy, NULL);
2467 llvm::Value *V, *Tmp = CGF.CreateTempAlloca(ST);
2468 V = CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegAddrLo,
2469 DblPtrTy));
2470 CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 0));
2471 V = CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegAddrHi,
2472 DblPtrTy));
2473 CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 1));
2474 RegAddr = CGF.Builder.CreateBitCast(Tmp,
2475 llvm::PointerType::getUnqual(LTy));
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002476 }
2477
2478 // AMD64-ABI 3.5.7p5: Step 5. Set:
2479 // l->gp_offset = l->gp_offset + num_gp * 8
2480 // l->fp_offset = l->fp_offset + num_fp * 16.
2481 if (neededInt) {
Chris Lattner77b89b82010-06-27 07:15:29 +00002482 llvm::Value *Offset = llvm::ConstantInt::get(CGF.Int32Ty, neededInt * 8);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002483 CGF.Builder.CreateStore(CGF.Builder.CreateAdd(gp_offset, Offset),
2484 gp_offset_p);
2485 }
2486 if (neededSSE) {
Chris Lattner77b89b82010-06-27 07:15:29 +00002487 llvm::Value *Offset = llvm::ConstantInt::get(CGF.Int32Ty, neededSSE * 16);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002488 CGF.Builder.CreateStore(CGF.Builder.CreateAdd(fp_offset, Offset),
2489 fp_offset_p);
2490 }
2491 CGF.EmitBranch(ContBlock);
2492
2493 // Emit code to load the value if it was passed in memory.
2494
2495 CGF.EmitBlock(InMemBlock);
2496 llvm::Value *MemAddr = EmitVAArgFromMemory(VAListAddr, Ty, CGF);
2497
2498 // Return the appropriate result.
2499
2500 CGF.EmitBlock(ContBlock);
Jay Foadbbf3bac2011-03-30 11:28:58 +00002501 llvm::PHINode *ResAddr = CGF.Builder.CreatePHI(RegAddr->getType(), 2,
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002502 "vaarg.addr");
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002503 ResAddr->addIncoming(RegAddr, InRegBlock);
2504 ResAddr->addIncoming(MemAddr, InMemBlock);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002505 return ResAddr;
2506}
2507
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +00002508ABIArgInfo WinX86_64ABIInfo::classify(QualType Ty, bool IsReturnType) const {
NAKAMURA Takumia7573222011-01-17 22:56:31 +00002509
2510 if (Ty->isVoidType())
2511 return ABIArgInfo::getIgnore();
2512
2513 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
2514 Ty = EnumTy->getDecl()->getIntegerType();
2515
2516 uint64_t Size = getContext().getTypeSize(Ty);
2517
2518 if (const RecordType *RT = Ty->getAs<RecordType>()) {
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +00002519 if (IsReturnType) {
2520 if (isRecordReturnIndirect(RT, CGT))
2521 return ABIArgInfo::getIndirect(0, false);
2522 } else {
2523 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(RT, CGT))
2524 return ABIArgInfo::getIndirect(0, RAA == CGCXXABI::RAA_DirectInMemory);
2525 }
2526
2527 if (RT->getDecl()->hasFlexibleArrayMember())
NAKAMURA Takumia7573222011-01-17 22:56:31 +00002528 return ABIArgInfo::getIndirect(0, /*ByVal=*/false);
2529
NAKAMURA Takumi6f174332011-02-22 03:56:57 +00002530 // FIXME: mingw-w64-gcc emits 128-bit struct as i128
John McCall64aa4b32013-04-16 22:48:15 +00002531 if (Size == 128 && getTarget().getTriple().getOS() == llvm::Triple::MinGW32)
NAKAMURA Takumi6f174332011-02-22 03:56:57 +00002532 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),
2533 Size));
2534
2535 // MS x64 ABI requirement: "Any argument that doesn't fit in 8 bytes, or is
2536 // not 1, 2, 4, or 8 bytes, must be passed by reference."
2537 if (Size <= 64 &&
NAKAMURA Takumiff8be0e2011-01-19 00:11:33 +00002538 (Size & (Size - 1)) == 0)
NAKAMURA Takumia7573222011-01-17 22:56:31 +00002539 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),
2540 Size));
2541
2542 return ABIArgInfo::getIndirect(0, /*ByVal=*/false);
2543 }
2544
2545 if (Ty->isPromotableIntegerType())
2546 return ABIArgInfo::getExtend();
2547
2548 return ABIArgInfo::getDirect();
2549}
2550
2551void WinX86_64ABIInfo::computeInfo(CGFunctionInfo &FI) const {
2552
2553 QualType RetTy = FI.getReturnType();
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +00002554 FI.getReturnInfo() = classify(RetTy, true);
NAKAMURA Takumia7573222011-01-17 22:56:31 +00002555
NAKAMURA Takumia7573222011-01-17 22:56:31 +00002556 for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
2557 it != ie; ++it)
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +00002558 it->info = classify(it->type, false);
NAKAMURA Takumia7573222011-01-17 22:56:31 +00002559}
2560
Chris Lattnerf13721d2010-08-31 16:44:54 +00002561llvm::Value *WinX86_64ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
2562 CodeGenFunction &CGF) const {
Chris Lattner8b418682012-02-07 00:39:47 +00002563 llvm::Type *BPP = CGF.Int8PtrPtrTy;
Chris Lattnerdce5ad02010-06-28 20:05:43 +00002564
Chris Lattnerf13721d2010-08-31 16:44:54 +00002565 CGBuilderTy &Builder = CGF.Builder;
2566 llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP,
2567 "ap");
2568 llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur");
2569 llvm::Type *PTy =
2570 llvm::PointerType::getUnqual(CGF.ConvertType(Ty));
2571 llvm::Value *AddrTyped = Builder.CreateBitCast(Addr, PTy);
2572
2573 uint64_t Offset =
2574 llvm::RoundUpToAlignment(CGF.getContext().getTypeSize(Ty) / 8, 8);
2575 llvm::Value *NextAddr =
2576 Builder.CreateGEP(Addr, llvm::ConstantInt::get(CGF.Int32Ty, Offset),
2577 "ap.next");
2578 Builder.CreateStore(NextAddr, VAListAddrAsBPP);
2579
2580 return AddrTyped;
2581}
Chris Lattnerdce5ad02010-06-28 20:05:43 +00002582
Benjamin Kramerc6f84cf2012-10-20 13:02:06 +00002583namespace {
2584
Derek Schuff263366f2012-10-16 22:30:41 +00002585class NaClX86_64ABIInfo : public ABIInfo {
2586 public:
2587 NaClX86_64ABIInfo(CodeGen::CodeGenTypes &CGT, bool HasAVX)
2588 : ABIInfo(CGT), PInfo(CGT), NInfo(CGT, HasAVX) {}
2589 virtual void computeInfo(CGFunctionInfo &FI) const;
2590 virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
2591 CodeGenFunction &CGF) const;
2592 private:
2593 PNaClABIInfo PInfo; // Used for generating calls with pnaclcall callingconv.
2594 X86_64ABIInfo NInfo; // Used for everything else.
2595};
2596
2597class NaClX86_64TargetCodeGenInfo : public TargetCodeGenInfo {
2598 public:
2599 NaClX86_64TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, bool HasAVX)
2600 : TargetCodeGenInfo(new NaClX86_64ABIInfo(CGT, HasAVX)) {}
2601};
2602
Benjamin Kramerc6f84cf2012-10-20 13:02:06 +00002603}
2604
Derek Schuff263366f2012-10-16 22:30:41 +00002605void NaClX86_64ABIInfo::computeInfo(CGFunctionInfo &FI) const {
2606 if (FI.getASTCallingConvention() == CC_PnaclCall)
2607 PInfo.computeInfo(FI);
2608 else
2609 NInfo.computeInfo(FI);
2610}
2611
2612llvm::Value *NaClX86_64ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
2613 CodeGenFunction &CGF) const {
2614 // Always use the native convention; calling pnacl-style varargs functions
2615 // is unuspported.
2616 return NInfo.EmitVAArg(VAListAddr, Ty, CGF);
2617}
2618
2619
John McCallec853ba2010-03-11 00:10:12 +00002620// PowerPC-32
2621
2622namespace {
2623class PPC32TargetCodeGenInfo : public DefaultTargetCodeGenInfo {
2624public:
Chris Lattnerea044322010-07-29 02:01:43 +00002625 PPC32TargetCodeGenInfo(CodeGenTypes &CGT) : DefaultTargetCodeGenInfo(CGT) {}
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00002626
John McCallec853ba2010-03-11 00:10:12 +00002627 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const {
2628 // This is recovered from gcc output.
2629 return 1; // r1 is the dedicated stack pointer
2630 }
2631
2632 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00002633 llvm::Value *Address) const;
John McCallec853ba2010-03-11 00:10:12 +00002634};
2635
2636}
2637
2638bool
2639PPC32TargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
2640 llvm::Value *Address) const {
2641 // This is calculated from the LLVM and GCC tables and verified
2642 // against gcc output. AFAIK all ABIs use the same encoding.
2643
2644 CodeGen::CGBuilderTy &Builder = CGF.Builder;
John McCallec853ba2010-03-11 00:10:12 +00002645
Chris Lattner8b418682012-02-07 00:39:47 +00002646 llvm::IntegerType *i8 = CGF.Int8Ty;
John McCallec853ba2010-03-11 00:10:12 +00002647 llvm::Value *Four8 = llvm::ConstantInt::get(i8, 4);
2648 llvm::Value *Eight8 = llvm::ConstantInt::get(i8, 8);
2649 llvm::Value *Sixteen8 = llvm::ConstantInt::get(i8, 16);
2650
2651 // 0-31: r0-31, the 4-byte general-purpose registers
John McCallaeeb7012010-05-27 06:19:26 +00002652 AssignToArrayRange(Builder, Address, Four8, 0, 31);
John McCallec853ba2010-03-11 00:10:12 +00002653
2654 // 32-63: fp0-31, the 8-byte floating-point registers
John McCallaeeb7012010-05-27 06:19:26 +00002655 AssignToArrayRange(Builder, Address, Eight8, 32, 63);
John McCallec853ba2010-03-11 00:10:12 +00002656
2657 // 64-76 are various 4-byte special-purpose registers:
2658 // 64: mq
2659 // 65: lr
2660 // 66: ctr
2661 // 67: ap
2662 // 68-75 cr0-7
2663 // 76: xer
John McCallaeeb7012010-05-27 06:19:26 +00002664 AssignToArrayRange(Builder, Address, Four8, 64, 76);
John McCallec853ba2010-03-11 00:10:12 +00002665
2666 // 77-108: v0-31, the 16-byte vector registers
John McCallaeeb7012010-05-27 06:19:26 +00002667 AssignToArrayRange(Builder, Address, Sixteen8, 77, 108);
John McCallec853ba2010-03-11 00:10:12 +00002668
2669 // 109: vrsave
2670 // 110: vscr
2671 // 111: spe_acc
2672 // 112: spefscr
2673 // 113: sfp
John McCallaeeb7012010-05-27 06:19:26 +00002674 AssignToArrayRange(Builder, Address, Four8, 109, 113);
John McCallec853ba2010-03-11 00:10:12 +00002675
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00002676 return false;
John McCallec853ba2010-03-11 00:10:12 +00002677}
2678
Roman Divacky0fbc4b92012-05-09 18:22:46 +00002679// PowerPC-64
2680
2681namespace {
Bill Schmidt2fc107f2012-10-03 19:18:57 +00002682/// PPC64_SVR4_ABIInfo - The 64-bit PowerPC ELF (SVR4) ABI information.
2683class PPC64_SVR4_ABIInfo : public DefaultABIInfo {
2684
2685public:
2686 PPC64_SVR4_ABIInfo(CodeGen::CodeGenTypes &CGT) : DefaultABIInfo(CGT) {}
2687
Ulrich Weigand71c0dcc2012-11-05 19:13:42 +00002688 bool isPromotableTypeForABI(QualType Ty) const;
2689
2690 ABIArgInfo classifyReturnType(QualType RetTy) const;
2691 ABIArgInfo classifyArgumentType(QualType Ty) const;
2692
Bill Schmidtb1f5fe02012-10-12 19:26:17 +00002693 // TODO: We can add more logic to computeInfo to improve performance.
2694 // Example: For aggregate arguments that fit in a register, we could
2695 // use getDirectInReg (as is done below for structs containing a single
2696 // floating-point value) to avoid pushing them to memory on function
2697 // entry. This would require changing the logic in PPCISelLowering
2698 // when lowering the parameters in the caller and args in the callee.
2699 virtual void computeInfo(CGFunctionInfo &FI) const {
2700 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
2701 for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
2702 it != ie; ++it) {
2703 // We rely on the default argument classification for the most part.
2704 // One exception: An aggregate containing a single floating-point
2705 // item must be passed in a register if one is available.
2706 const Type *T = isSingleElementStruct(it->type, getContext());
2707 if (T) {
2708 const BuiltinType *BT = T->getAs<BuiltinType>();
2709 if (BT && BT->isFloatingPoint()) {
2710 QualType QT(T, 0);
2711 it->info = ABIArgInfo::getDirectInReg(CGT.ConvertType(QT));
2712 continue;
2713 }
2714 }
2715 it->info = classifyArgumentType(it->type);
2716 }
2717 }
Bill Schmidt2fc107f2012-10-03 19:18:57 +00002718
2719 virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr,
2720 QualType Ty,
2721 CodeGenFunction &CGF) const;
2722};
2723
2724class PPC64_SVR4_TargetCodeGenInfo : public TargetCodeGenInfo {
2725public:
2726 PPC64_SVR4_TargetCodeGenInfo(CodeGenTypes &CGT)
2727 : TargetCodeGenInfo(new PPC64_SVR4_ABIInfo(CGT)) {}
2728
2729 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const {
2730 // This is recovered from gcc output.
2731 return 1; // r1 is the dedicated stack pointer
2732 }
2733
2734 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
2735 llvm::Value *Address) const;
2736};
2737
Roman Divacky0fbc4b92012-05-09 18:22:46 +00002738class PPC64TargetCodeGenInfo : public DefaultTargetCodeGenInfo {
2739public:
2740 PPC64TargetCodeGenInfo(CodeGenTypes &CGT) : DefaultTargetCodeGenInfo(CGT) {}
2741
2742 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const {
2743 // This is recovered from gcc output.
2744 return 1; // r1 is the dedicated stack pointer
2745 }
2746
2747 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
2748 llvm::Value *Address) const;
2749};
2750
2751}
2752
Ulrich Weigand71c0dcc2012-11-05 19:13:42 +00002753// Return true if the ABI requires Ty to be passed sign- or zero-
2754// extended to 64 bits.
2755bool
2756PPC64_SVR4_ABIInfo::isPromotableTypeForABI(QualType Ty) const {
2757 // Treat an enum type as its underlying type.
2758 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
2759 Ty = EnumTy->getDecl()->getIntegerType();
2760
2761 // Promotable integer types are required to be promoted by the ABI.
2762 if (Ty->isPromotableIntegerType())
2763 return true;
2764
2765 // In addition to the usual promotable integer types, we also need to
2766 // extend all 32-bit types, since the ABI requires promotion to 64 bits.
2767 if (const BuiltinType *BT = Ty->getAs<BuiltinType>())
2768 switch (BT->getKind()) {
2769 case BuiltinType::Int:
2770 case BuiltinType::UInt:
2771 return true;
2772 default:
2773 break;
2774 }
2775
2776 return false;
2777}
2778
2779ABIArgInfo
2780PPC64_SVR4_ABIInfo::classifyArgumentType(QualType Ty) const {
Bill Schmidtc9715fc2012-11-27 02:46:43 +00002781 if (Ty->isAnyComplexType())
2782 return ABIArgInfo::getDirect();
2783
Ulrich Weigand71c0dcc2012-11-05 19:13:42 +00002784 if (isAggregateTypeForABI(Ty)) {
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +00002785 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, CGT))
2786 return ABIArgInfo::getIndirect(0, RAA == CGCXXABI::RAA_DirectInMemory);
Ulrich Weigand71c0dcc2012-11-05 19:13:42 +00002787
2788 return ABIArgInfo::getIndirect(0);
2789 }
2790
2791 return (isPromotableTypeForABI(Ty) ?
2792 ABIArgInfo::getExtend() : ABIArgInfo::getDirect());
2793}
2794
2795ABIArgInfo
2796PPC64_SVR4_ABIInfo::classifyReturnType(QualType RetTy) const {
2797 if (RetTy->isVoidType())
2798 return ABIArgInfo::getIgnore();
2799
Bill Schmidt9e6111a2012-12-17 04:20:17 +00002800 if (RetTy->isAnyComplexType())
2801 return ABIArgInfo::getDirect();
2802
Ulrich Weigand71c0dcc2012-11-05 19:13:42 +00002803 if (isAggregateTypeForABI(RetTy))
2804 return ABIArgInfo::getIndirect(0);
2805
2806 return (isPromotableTypeForABI(RetTy) ?
2807 ABIArgInfo::getExtend() : ABIArgInfo::getDirect());
2808}
2809
Bill Schmidt2fc107f2012-10-03 19:18:57 +00002810// Based on ARMABIInfo::EmitVAArg, adjusted for 64-bit machine.
2811llvm::Value *PPC64_SVR4_ABIInfo::EmitVAArg(llvm::Value *VAListAddr,
2812 QualType Ty,
2813 CodeGenFunction &CGF) const {
2814 llvm::Type *BP = CGF.Int8PtrTy;
2815 llvm::Type *BPP = CGF.Int8PtrPtrTy;
2816
2817 CGBuilderTy &Builder = CGF.Builder;
2818 llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP, "ap");
2819 llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur");
2820
Bill Schmidt19f8e852013-01-14 17:45:36 +00002821 // Update the va_list pointer. The pointer should be bumped by the
2822 // size of the object. We can trust getTypeSize() except for a complex
2823 // type whose base type is smaller than a doubleword. For these, the
2824 // size of the object is 16 bytes; see below for further explanation.
Bill Schmidt2fc107f2012-10-03 19:18:57 +00002825 unsigned SizeInBytes = CGF.getContext().getTypeSize(Ty) / 8;
Bill Schmidt19f8e852013-01-14 17:45:36 +00002826 QualType BaseTy;
2827 unsigned CplxBaseSize = 0;
2828
2829 if (const ComplexType *CTy = Ty->getAs<ComplexType>()) {
2830 BaseTy = CTy->getElementType();
2831 CplxBaseSize = CGF.getContext().getTypeSize(BaseTy) / 8;
2832 if (CplxBaseSize < 8)
2833 SizeInBytes = 16;
2834 }
2835
Bill Schmidt2fc107f2012-10-03 19:18:57 +00002836 unsigned Offset = llvm::RoundUpToAlignment(SizeInBytes, 8);
2837 llvm::Value *NextAddr =
2838 Builder.CreateGEP(Addr, llvm::ConstantInt::get(CGF.Int64Ty, Offset),
2839 "ap.next");
2840 Builder.CreateStore(NextAddr, VAListAddrAsBPP);
2841
Bill Schmidt19f8e852013-01-14 17:45:36 +00002842 // If we have a complex type and the base type is smaller than 8 bytes,
2843 // the ABI calls for the real and imaginary parts to be right-adjusted
2844 // in separate doublewords. However, Clang expects us to produce a
2845 // pointer to a structure with the two parts packed tightly. So generate
2846 // loads of the real and imaginary parts relative to the va_list pointer,
2847 // and store them to a temporary structure.
2848 if (CplxBaseSize && CplxBaseSize < 8) {
2849 llvm::Value *RealAddr = Builder.CreatePtrToInt(Addr, CGF.Int64Ty);
2850 llvm::Value *ImagAddr = RealAddr;
2851 RealAddr = Builder.CreateAdd(RealAddr, Builder.getInt64(8 - CplxBaseSize));
2852 ImagAddr = Builder.CreateAdd(ImagAddr, Builder.getInt64(16 - CplxBaseSize));
2853 llvm::Type *PBaseTy = llvm::PointerType::getUnqual(CGF.ConvertType(BaseTy));
2854 RealAddr = Builder.CreateIntToPtr(RealAddr, PBaseTy);
2855 ImagAddr = Builder.CreateIntToPtr(ImagAddr, PBaseTy);
2856 llvm::Value *Real = Builder.CreateLoad(RealAddr, false, ".vareal");
2857 llvm::Value *Imag = Builder.CreateLoad(ImagAddr, false, ".vaimag");
2858 llvm::Value *Ptr = CGF.CreateTempAlloca(CGT.ConvertTypeForMem(Ty),
2859 "vacplx");
2860 llvm::Value *RealPtr = Builder.CreateStructGEP(Ptr, 0, ".real");
2861 llvm::Value *ImagPtr = Builder.CreateStructGEP(Ptr, 1, ".imag");
2862 Builder.CreateStore(Real, RealPtr, false);
2863 Builder.CreateStore(Imag, ImagPtr, false);
2864 return Ptr;
2865 }
2866
Bill Schmidt2fc107f2012-10-03 19:18:57 +00002867 // If the argument is smaller than 8 bytes, it is right-adjusted in
2868 // its doubleword slot. Adjust the pointer to pick it up from the
2869 // correct offset.
2870 if (SizeInBytes < 8) {
2871 llvm::Value *AddrAsInt = Builder.CreatePtrToInt(Addr, CGF.Int64Ty);
2872 AddrAsInt = Builder.CreateAdd(AddrAsInt, Builder.getInt64(8 - SizeInBytes));
2873 Addr = Builder.CreateIntToPtr(AddrAsInt, BP);
2874 }
2875
2876 llvm::Type *PTy = llvm::PointerType::getUnqual(CGF.ConvertType(Ty));
2877 return Builder.CreateBitCast(Addr, PTy);
2878}
2879
2880static bool
2881PPC64_initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
2882 llvm::Value *Address) {
Roman Divacky0fbc4b92012-05-09 18:22:46 +00002883 // This is calculated from the LLVM and GCC tables and verified
2884 // against gcc output. AFAIK all ABIs use the same encoding.
2885
2886 CodeGen::CGBuilderTy &Builder = CGF.Builder;
2887
2888 llvm::IntegerType *i8 = CGF.Int8Ty;
2889 llvm::Value *Four8 = llvm::ConstantInt::get(i8, 4);
2890 llvm::Value *Eight8 = llvm::ConstantInt::get(i8, 8);
2891 llvm::Value *Sixteen8 = llvm::ConstantInt::get(i8, 16);
2892
2893 // 0-31: r0-31, the 8-byte general-purpose registers
2894 AssignToArrayRange(Builder, Address, Eight8, 0, 31);
2895
2896 // 32-63: fp0-31, the 8-byte floating-point registers
2897 AssignToArrayRange(Builder, Address, Eight8, 32, 63);
2898
2899 // 64-76 are various 4-byte special-purpose registers:
2900 // 64: mq
2901 // 65: lr
2902 // 66: ctr
2903 // 67: ap
2904 // 68-75 cr0-7
2905 // 76: xer
2906 AssignToArrayRange(Builder, Address, Four8, 64, 76);
2907
2908 // 77-108: v0-31, the 16-byte vector registers
2909 AssignToArrayRange(Builder, Address, Sixteen8, 77, 108);
2910
2911 // 109: vrsave
2912 // 110: vscr
2913 // 111: spe_acc
2914 // 112: spefscr
2915 // 113: sfp
2916 AssignToArrayRange(Builder, Address, Four8, 109, 113);
2917
2918 return false;
2919}
John McCallec853ba2010-03-11 00:10:12 +00002920
Bill Schmidt2fc107f2012-10-03 19:18:57 +00002921bool
2922PPC64_SVR4_TargetCodeGenInfo::initDwarfEHRegSizeTable(
2923 CodeGen::CodeGenFunction &CGF,
2924 llvm::Value *Address) const {
2925
2926 return PPC64_initDwarfEHRegSizeTable(CGF, Address);
2927}
2928
2929bool
2930PPC64TargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
2931 llvm::Value *Address) const {
2932
2933 return PPC64_initDwarfEHRegSizeTable(CGF, Address);
2934}
2935
Chris Lattnerdce5ad02010-06-28 20:05:43 +00002936//===----------------------------------------------------------------------===//
Daniel Dunbar34d91fd2009-09-12 00:59:49 +00002937// ARM ABI Implementation
Chris Lattnerdce5ad02010-06-28 20:05:43 +00002938//===----------------------------------------------------------------------===//
Daniel Dunbar34d91fd2009-09-12 00:59:49 +00002939
2940namespace {
2941
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002942class ARMABIInfo : public ABIInfo {
Daniel Dunbar5e7bace2009-09-12 01:00:39 +00002943public:
2944 enum ABIKind {
2945 APCS = 0,
2946 AAPCS = 1,
2947 AAPCS_VFP
2948 };
2949
2950private:
2951 ABIKind Kind;
2952
2953public:
John McCallbd7370a2013-02-28 19:01:20 +00002954 ARMABIInfo(CodeGenTypes &CGT, ABIKind _Kind) : ABIInfo(CGT), Kind(_Kind) {
2955 setRuntimeCC();
2956 }
Daniel Dunbar5e7bace2009-09-12 01:00:39 +00002957
John McCall49e34be2011-08-30 01:42:09 +00002958 bool isEABI() const {
John McCall64aa4b32013-04-16 22:48:15 +00002959 StringRef Env = getTarget().getTriple().getEnvironmentName();
Logan Chien94a71422012-09-02 09:30:11 +00002960 return (Env == "gnueabi" || Env == "eabi" ||
2961 Env == "android" || Env == "androideabi");
John McCall49e34be2011-08-30 01:42:09 +00002962 }
2963
Daniel Dunbar5e7bace2009-09-12 01:00:39 +00002964private:
2965 ABIKind getABIKind() const { return Kind; }
2966
Chris Lattnera3c109b2010-07-29 02:16:43 +00002967 ABIArgInfo classifyReturnType(QualType RetTy) const;
Manman Ren710c5172012-10-31 19:02:26 +00002968 ABIArgInfo classifyArgumentType(QualType RetTy, int *VFPRegs,
2969 unsigned &AllocatedVFP,
Manman Renb3fa55f2012-10-30 23:21:41 +00002970 bool &IsHA) const;
Manman Ren97f81572012-10-16 19:18:39 +00002971 bool isIllegalVectorType(QualType Ty) const;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002972
Chris Lattneree5dcd02010-07-29 02:31:05 +00002973 virtual void computeInfo(CGFunctionInfo &FI) const;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002974
2975 virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
2976 CodeGenFunction &CGF) const;
John McCallbd7370a2013-02-28 19:01:20 +00002977
2978 llvm::CallingConv::ID getLLVMDefaultCC() const;
2979 llvm::CallingConv::ID getABIDefaultCC() const;
2980 void setRuntimeCC();
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00002981};
2982
Anton Korobeynikov82d0a412010-01-10 12:58:08 +00002983class ARMTargetCodeGenInfo : public TargetCodeGenInfo {
2984public:
Chris Lattnerea044322010-07-29 02:01:43 +00002985 ARMTargetCodeGenInfo(CodeGenTypes &CGT, ARMABIInfo::ABIKind K)
2986 :TargetCodeGenInfo(new ARMABIInfo(CGT, K)) {}
John McCall6374c332010-03-06 00:35:14 +00002987
John McCall49e34be2011-08-30 01:42:09 +00002988 const ARMABIInfo &getABIInfo() const {
2989 return static_cast<const ARMABIInfo&>(TargetCodeGenInfo::getABIInfo());
2990 }
2991
John McCall6374c332010-03-06 00:35:14 +00002992 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const {
2993 return 13;
2994 }
Roman Divacky09345d12011-05-18 19:36:54 +00002995
Chris Lattner5f9e2722011-07-23 10:55:15 +00002996 StringRef getARCRetainAutoreleasedReturnValueMarker() const {
John McCallf85e1932011-06-15 23:02:42 +00002997 return "mov\tr7, r7\t\t@ marker for objc_retainAutoreleaseReturnValue";
2998 }
2999
Roman Divacky09345d12011-05-18 19:36:54 +00003000 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
3001 llvm::Value *Address) const {
Chris Lattner8b418682012-02-07 00:39:47 +00003002 llvm::Value *Four8 = llvm::ConstantInt::get(CGF.Int8Ty, 4);
Roman Divacky09345d12011-05-18 19:36:54 +00003003
3004 // 0-15 are the 16 integer registers.
Chris Lattner8b418682012-02-07 00:39:47 +00003005 AssignToArrayRange(CGF.Builder, Address, Four8, 0, 15);
Roman Divacky09345d12011-05-18 19:36:54 +00003006 return false;
3007 }
John McCall49e34be2011-08-30 01:42:09 +00003008
3009 unsigned getSizeOfUnwindException() const {
3010 if (getABIInfo().isEABI()) return 88;
3011 return TargetCodeGenInfo::getSizeOfUnwindException();
3012 }
Anton Korobeynikov82d0a412010-01-10 12:58:08 +00003013};
3014
Daniel Dunbar34d91fd2009-09-12 00:59:49 +00003015}
3016
Chris Lattneree5dcd02010-07-29 02:31:05 +00003017void ARMABIInfo::computeInfo(CGFunctionInfo &FI) const {
Manman Renb3fa55f2012-10-30 23:21:41 +00003018 // To correctly handle Homogeneous Aggregate, we need to keep track of the
Manman Ren710c5172012-10-31 19:02:26 +00003019 // VFP registers allocated so far.
Manman Renb3fa55f2012-10-30 23:21:41 +00003020 // C.1.vfp If the argument is a VFP CPRC and there are sufficient consecutive
3021 // VFP registers of the appropriate type unallocated then the argument is
3022 // allocated to the lowest-numbered sequence of such registers.
3023 // C.2.vfp If the argument is a VFP CPRC then any VFP registers that are
3024 // unallocated are marked as unavailable.
3025 unsigned AllocatedVFP = 0;
Manman Ren710c5172012-10-31 19:02:26 +00003026 int VFPRegs[16] = { 0 };
Chris Lattnera3c109b2010-07-29 02:16:43 +00003027 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00003028 for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
Manman Renb3fa55f2012-10-30 23:21:41 +00003029 it != ie; ++it) {
3030 unsigned PreAllocation = AllocatedVFP;
3031 bool IsHA = false;
3032 // 6.1.2.3 There is one VFP co-processor register class using registers
3033 // s0-s15 (d0-d7) for passing arguments.
3034 const unsigned NumVFPs = 16;
Manman Ren710c5172012-10-31 19:02:26 +00003035 it->info = classifyArgumentType(it->type, VFPRegs, AllocatedVFP, IsHA);
Manman Renb3fa55f2012-10-30 23:21:41 +00003036 // If we do not have enough VFP registers for the HA, any VFP registers
3037 // that are unallocated are marked as unavailable. To achieve this, we add
3038 // padding of (NumVFPs - PreAllocation) floats.
3039 if (IsHA && AllocatedVFP > NumVFPs && PreAllocation < NumVFPs) {
3040 llvm::Type *PaddingTy = llvm::ArrayType::get(
3041 llvm::Type::getFloatTy(getVMContext()), NumVFPs - PreAllocation);
3042 it->info = ABIArgInfo::getExpandWithPadding(false, PaddingTy);
3043 }
3044 }
Daniel Dunbar5e7bace2009-09-12 01:00:39 +00003045
Anton Korobeynikov414d8962011-04-14 20:06:49 +00003046 // Always honor user-specified calling convention.
3047 if (FI.getCallingConvention() != llvm::CallingConv::C)
3048 return;
3049
John McCallbd7370a2013-02-28 19:01:20 +00003050 llvm::CallingConv::ID cc = getRuntimeCC();
3051 if (cc != llvm::CallingConv::C)
3052 FI.setEffectiveCallingConvention(cc);
3053}
Rafael Espindola25117ab2010-06-16 16:13:39 +00003054
John McCallbd7370a2013-02-28 19:01:20 +00003055/// Return the default calling convention that LLVM will use.
3056llvm::CallingConv::ID ARMABIInfo::getLLVMDefaultCC() const {
3057 // The default calling convention that LLVM will infer.
John McCall64aa4b32013-04-16 22:48:15 +00003058 if (getTarget().getTriple().getEnvironmentName()=="gnueabihf")
John McCallbd7370a2013-02-28 19:01:20 +00003059 return llvm::CallingConv::ARM_AAPCS_VFP;
3060 else if (isEABI())
3061 return llvm::CallingConv::ARM_AAPCS;
3062 else
3063 return llvm::CallingConv::ARM_APCS;
3064}
3065
3066/// Return the calling convention that our ABI would like us to use
3067/// as the C calling convention.
3068llvm::CallingConv::ID ARMABIInfo::getABIDefaultCC() const {
Daniel Dunbar5e7bace2009-09-12 01:00:39 +00003069 switch (getABIKind()) {
John McCallbd7370a2013-02-28 19:01:20 +00003070 case APCS: return llvm::CallingConv::ARM_APCS;
3071 case AAPCS: return llvm::CallingConv::ARM_AAPCS;
3072 case AAPCS_VFP: return llvm::CallingConv::ARM_AAPCS_VFP;
Daniel Dunbar5e7bace2009-09-12 01:00:39 +00003073 }
John McCallbd7370a2013-02-28 19:01:20 +00003074 llvm_unreachable("bad ABI kind");
3075}
3076
3077void ARMABIInfo::setRuntimeCC() {
3078 assert(getRuntimeCC() == llvm::CallingConv::C);
3079
3080 // Don't muddy up the IR with a ton of explicit annotations if
3081 // they'd just match what LLVM will infer from the triple.
3082 llvm::CallingConv::ID abiCC = getABIDefaultCC();
3083 if (abiCC != getLLVMDefaultCC())
3084 RuntimeCC = abiCC;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00003085}
3086
Bob Wilson194f06a2011-08-03 05:58:22 +00003087/// isHomogeneousAggregate - Return true if a type is an AAPCS-VFP homogeneous
3088/// aggregate. If HAMembers is non-null, the number of base elements
3089/// contained in the type is returned through it; this is used for the
3090/// recursive calls that check aggregate component types.
3091static bool isHomogeneousAggregate(QualType Ty, const Type *&Base,
3092 ASTContext &Context,
3093 uint64_t *HAMembers = 0) {
Anton Korobeynikoveaf856d2012-04-13 11:22:00 +00003094 uint64_t Members = 0;
Bob Wilson194f06a2011-08-03 05:58:22 +00003095 if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty)) {
3096 if (!isHomogeneousAggregate(AT->getElementType(), Base, Context, &Members))
3097 return false;
3098 Members *= AT->getSize().getZExtValue();
3099 } else if (const RecordType *RT = Ty->getAs<RecordType>()) {
3100 const RecordDecl *RD = RT->getDecl();
Anton Korobeynikoveaf856d2012-04-13 11:22:00 +00003101 if (RD->hasFlexibleArrayMember())
Bob Wilson194f06a2011-08-03 05:58:22 +00003102 return false;
Anton Korobeynikoveaf856d2012-04-13 11:22:00 +00003103
Bob Wilson194f06a2011-08-03 05:58:22 +00003104 Members = 0;
3105 for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
3106 i != e; ++i) {
David Blaikie581deb32012-06-06 20:45:41 +00003107 const FieldDecl *FD = *i;
Bob Wilson194f06a2011-08-03 05:58:22 +00003108 uint64_t FldMembers;
3109 if (!isHomogeneousAggregate(FD->getType(), Base, Context, &FldMembers))
3110 return false;
Anton Korobeynikoveaf856d2012-04-13 11:22:00 +00003111
3112 Members = (RD->isUnion() ?
3113 std::max(Members, FldMembers) : Members + FldMembers);
Bob Wilson194f06a2011-08-03 05:58:22 +00003114 }
3115 } else {
3116 Members = 1;
3117 if (const ComplexType *CT = Ty->getAs<ComplexType>()) {
3118 Members = 2;
3119 Ty = CT->getElementType();
3120 }
3121
3122 // Homogeneous aggregates for AAPCS-VFP must have base types of float,
3123 // double, or 64-bit or 128-bit vectors.
3124 if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
3125 if (BT->getKind() != BuiltinType::Float &&
Tim Northoveradfa45f2012-07-20 22:29:29 +00003126 BT->getKind() != BuiltinType::Double &&
3127 BT->getKind() != BuiltinType::LongDouble)
Bob Wilson194f06a2011-08-03 05:58:22 +00003128 return false;
3129 } else if (const VectorType *VT = Ty->getAs<VectorType>()) {
3130 unsigned VecSize = Context.getTypeSize(VT);
3131 if (VecSize != 64 && VecSize != 128)
3132 return false;
3133 } else {
3134 return false;
3135 }
3136
3137 // The base type must be the same for all members. Vector types of the
3138 // same total size are treated as being equivalent here.
3139 const Type *TyPtr = Ty.getTypePtr();
3140 if (!Base)
3141 Base = TyPtr;
3142 if (Base != TyPtr &&
3143 (!Base->isVectorType() || !TyPtr->isVectorType() ||
3144 Context.getTypeSize(Base) != Context.getTypeSize(TyPtr)))
3145 return false;
3146 }
3147
3148 // Homogeneous Aggregates can have at most 4 members of the base type.
3149 if (HAMembers)
3150 *HAMembers = Members;
Anton Korobeynikoveaf856d2012-04-13 11:22:00 +00003151
3152 return (Members > 0 && Members <= 4);
Bob Wilson194f06a2011-08-03 05:58:22 +00003153}
3154
Manman Ren710c5172012-10-31 19:02:26 +00003155/// markAllocatedVFPs - update VFPRegs according to the alignment and
3156/// number of VFP registers (unit is S register) requested.
3157static void markAllocatedVFPs(int *VFPRegs, unsigned &AllocatedVFP,
3158 unsigned Alignment,
3159 unsigned NumRequired) {
3160 // Early Exit.
3161 if (AllocatedVFP >= 16)
3162 return;
3163 // C.1.vfp If the argument is a VFP CPRC and there are sufficient consecutive
3164 // VFP registers of the appropriate type unallocated then the argument is
3165 // allocated to the lowest-numbered sequence of such registers.
3166 for (unsigned I = 0; I < 16; I += Alignment) {
3167 bool FoundSlot = true;
3168 for (unsigned J = I, JEnd = I + NumRequired; J < JEnd; J++)
3169 if (J >= 16 || VFPRegs[J]) {
3170 FoundSlot = false;
3171 break;
3172 }
3173 if (FoundSlot) {
3174 for (unsigned J = I, JEnd = I + NumRequired; J < JEnd; J++)
3175 VFPRegs[J] = 1;
3176 AllocatedVFP += NumRequired;
3177 return;
3178 }
3179 }
3180 // C.2.vfp If the argument is a VFP CPRC then any VFP registers that are
3181 // unallocated are marked as unavailable.
3182 for (unsigned I = 0; I < 16; I++)
3183 VFPRegs[I] = 1;
3184 AllocatedVFP = 17; // We do not have enough VFP registers.
3185}
3186
3187ABIArgInfo ARMABIInfo::classifyArgumentType(QualType Ty, int *VFPRegs,
3188 unsigned &AllocatedVFP,
Manman Renb3fa55f2012-10-30 23:21:41 +00003189 bool &IsHA) const {
3190 // We update number of allocated VFPs according to
3191 // 6.1.2.1 The following argument types are VFP CPRCs:
3192 // A single-precision floating-point type (including promoted
3193 // half-precision types); A double-precision floating-point type;
3194 // A 64-bit or 128-bit containerized vector type; Homogeneous Aggregate
3195 // with a Base Type of a single- or double-precision floating-point type,
3196 // 64-bit containerized vectors or 128-bit containerized vectors with one
3197 // to four Elements.
3198
Manman Ren97f81572012-10-16 19:18:39 +00003199 // Handle illegal vector types here.
3200 if (isIllegalVectorType(Ty)) {
3201 uint64_t Size = getContext().getTypeSize(Ty);
3202 if (Size <= 32) {
3203 llvm::Type *ResType =
3204 llvm::Type::getInt32Ty(getVMContext());
3205 return ABIArgInfo::getDirect(ResType);
3206 }
3207 if (Size == 64) {
3208 llvm::Type *ResType = llvm::VectorType::get(
3209 llvm::Type::getInt32Ty(getVMContext()), 2);
Manman Ren710c5172012-10-31 19:02:26 +00003210 markAllocatedVFPs(VFPRegs, AllocatedVFP, 2, 2);
Manman Ren97f81572012-10-16 19:18:39 +00003211 return ABIArgInfo::getDirect(ResType);
3212 }
3213 if (Size == 128) {
3214 llvm::Type *ResType = llvm::VectorType::get(
3215 llvm::Type::getInt32Ty(getVMContext()), 4);
Manman Ren710c5172012-10-31 19:02:26 +00003216 markAllocatedVFPs(VFPRegs, AllocatedVFP, 4, 4);
Manman Ren97f81572012-10-16 19:18:39 +00003217 return ABIArgInfo::getDirect(ResType);
3218 }
3219 return ABIArgInfo::getIndirect(0, /*ByVal=*/false);
3220 }
Manman Ren710c5172012-10-31 19:02:26 +00003221 // Update VFPRegs for legal vector types.
Manman Renb3fa55f2012-10-30 23:21:41 +00003222 if (const VectorType *VT = Ty->getAs<VectorType>()) {
3223 uint64_t Size = getContext().getTypeSize(VT);
3224 // Size of a legal vector should be power of 2 and above 64.
Manman Ren710c5172012-10-31 19:02:26 +00003225 markAllocatedVFPs(VFPRegs, AllocatedVFP, Size >= 128 ? 4 : 2, Size / 32);
Manman Renb3fa55f2012-10-30 23:21:41 +00003226 }
Manman Ren710c5172012-10-31 19:02:26 +00003227 // Update VFPRegs for floating point types.
Manman Renb3fa55f2012-10-30 23:21:41 +00003228 if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
3229 if (BT->getKind() == BuiltinType::Half ||
3230 BT->getKind() == BuiltinType::Float)
Manman Ren710c5172012-10-31 19:02:26 +00003231 markAllocatedVFPs(VFPRegs, AllocatedVFP, 1, 1);
Manman Renb3fa55f2012-10-30 23:21:41 +00003232 if (BT->getKind() == BuiltinType::Double ||
Manman Ren710c5172012-10-31 19:02:26 +00003233 BT->getKind() == BuiltinType::LongDouble)
3234 markAllocatedVFPs(VFPRegs, AllocatedVFP, 2, 2);
Manman Renb3fa55f2012-10-30 23:21:41 +00003235 }
Manman Ren97f81572012-10-16 19:18:39 +00003236
John McCalld608cdb2010-08-22 10:59:02 +00003237 if (!isAggregateTypeForABI(Ty)) {
Douglas Gregoraa74a1e2010-02-02 20:10:50 +00003238 // Treat an enum type as its underlying type.
3239 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
3240 Ty = EnumTy->getDecl()->getIntegerType();
3241
Anton Korobeynikovcc6fa882009-06-06 09:36:29 +00003242 return (Ty->isPromotableIntegerType() ?
3243 ABIArgInfo::getExtend() : ABIArgInfo::getDirect());
Douglas Gregoraa74a1e2010-02-02 20:10:50 +00003244 }
Daniel Dunbar98303b92009-09-13 08:03:58 +00003245
Daniel Dunbar42025572009-09-14 21:54:03 +00003246 // Ignore empty records.
Chris Lattnera3c109b2010-07-29 02:16:43 +00003247 if (isEmptyRecord(getContext(), Ty, true))
Daniel Dunbar42025572009-09-14 21:54:03 +00003248 return ABIArgInfo::getIgnore();
3249
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +00003250 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, CGT))
3251 return ABIArgInfo::getIndirect(0, RAA == CGCXXABI::RAA_DirectInMemory);
Rafael Espindola0eb1d972010-06-08 02:42:08 +00003252
Bob Wilson194f06a2011-08-03 05:58:22 +00003253 if (getABIKind() == ARMABIInfo::AAPCS_VFP) {
Manman Renb3fa55f2012-10-30 23:21:41 +00003254 // Homogeneous Aggregates need to be expanded when we can fit the aggregate
3255 // into VFP registers.
Bob Wilson194f06a2011-08-03 05:58:22 +00003256 const Type *Base = 0;
Manman Renb3fa55f2012-10-30 23:21:41 +00003257 uint64_t Members = 0;
3258 if (isHomogeneousAggregate(Ty, Base, getContext(), &Members)) {
Anton Korobeynikoveaf856d2012-04-13 11:22:00 +00003259 assert(Base && "Base class should be set for homogeneous aggregate");
Manman Renb3fa55f2012-10-30 23:21:41 +00003260 // Base can be a floating-point or a vector.
3261 if (Base->isVectorType()) {
3262 // ElementSize is in number of floats.
3263 unsigned ElementSize = getContext().getTypeSize(Base) == 64 ? 2 : 4;
Manman Rencb489dd2012-11-06 19:05:29 +00003264 markAllocatedVFPs(VFPRegs, AllocatedVFP, ElementSize,
3265 Members * ElementSize);
Manman Renb3fa55f2012-10-30 23:21:41 +00003266 } else if (Base->isSpecificBuiltinType(BuiltinType::Float))
Manman Ren710c5172012-10-31 19:02:26 +00003267 markAllocatedVFPs(VFPRegs, AllocatedVFP, 1, Members);
Manman Renb3fa55f2012-10-30 23:21:41 +00003268 else {
3269 assert(Base->isSpecificBuiltinType(BuiltinType::Double) ||
3270 Base->isSpecificBuiltinType(BuiltinType::LongDouble));
Manman Ren710c5172012-10-31 19:02:26 +00003271 markAllocatedVFPs(VFPRegs, AllocatedVFP, 2, Members * 2);
Manman Renb3fa55f2012-10-30 23:21:41 +00003272 }
3273 IsHA = true;
Bob Wilson194f06a2011-08-03 05:58:22 +00003274 return ABIArgInfo::getExpand();
Anton Korobeynikoveaf856d2012-04-13 11:22:00 +00003275 }
Bob Wilson194f06a2011-08-03 05:58:22 +00003276 }
3277
Manman Ren634b3d22012-08-13 21:23:55 +00003278 // Support byval for ARM.
Manman Rencb489dd2012-11-06 19:05:29 +00003279 // The ABI alignment for APCS is 4-byte and for AAPCS at least 4-byte and at
3280 // most 8-byte. We realign the indirect argument if type alignment is bigger
3281 // than ABI alignment.
Manman Renfd1ba912012-11-05 22:42:46 +00003282 uint64_t ABIAlign = 4;
3283 uint64_t TyAlign = getContext().getTypeAlign(Ty) / 8;
3284 if (getABIKind() == ARMABIInfo::AAPCS_VFP ||
3285 getABIKind() == ARMABIInfo::AAPCS)
3286 ABIAlign = std::min(std::max(TyAlign, (uint64_t)4), (uint64_t)8);
Manman Ren885ad692012-11-06 04:58:01 +00003287 if (getContext().getTypeSizeInChars(Ty) > CharUnits::fromQuantity(64)) {
3288 return ABIArgInfo::getIndirect(0, /*ByVal=*/true,
Manman Rencb489dd2012-11-06 19:05:29 +00003289 /*Realign=*/TyAlign > ABIAlign);
Eli Friedman79f30982012-08-09 00:31:40 +00003290 }
3291
Daniel Dunbar8aa87c72010-09-23 01:54:28 +00003292 // Otherwise, pass by coercing to a structure of the appropriate size.
Chris Lattner2acc6e32011-07-18 04:24:23 +00003293 llvm::Type* ElemTy;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00003294 unsigned SizeRegs;
Eli Friedman79f30982012-08-09 00:31:40 +00003295 // FIXME: Try to match the types of the arguments more accurately where
3296 // we can.
3297 if (getContext().getTypeAlign(Ty) <= 32) {
Bob Wilson53fc1a62011-08-01 23:39:04 +00003298 ElemTy = llvm::Type::getInt32Ty(getVMContext());
3299 SizeRegs = (getContext().getTypeSize(Ty) + 31) / 32;
Manman Ren78eb76e2012-06-25 22:04:00 +00003300 } else {
Manman Ren78eb76e2012-06-25 22:04:00 +00003301 ElemTy = llvm::Type::getInt64Ty(getVMContext());
3302 SizeRegs = (getContext().getTypeSize(Ty) + 63) / 64;
Stuart Hastings67d097e2011-04-27 17:24:02 +00003303 }
Stuart Hastingsb7f62d02011-04-28 18:16:06 +00003304
Chris Lattner9cbe4f02011-07-09 17:41:47 +00003305 llvm::Type *STy =
Chris Lattner7650d952011-06-18 22:49:11 +00003306 llvm::StructType::get(llvm::ArrayType::get(ElemTy, SizeRegs), NULL);
Stuart Hastingsb7f62d02011-04-28 18:16:06 +00003307 return ABIArgInfo::getDirect(STy);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00003308}
3309
Chris Lattnera3c109b2010-07-29 02:16:43 +00003310static bool isIntegerLikeType(QualType Ty, ASTContext &Context,
Daniel Dunbar98303b92009-09-13 08:03:58 +00003311 llvm::LLVMContext &VMContext) {
3312 // APCS, C Language Calling Conventions, Non-Simple Return Values: A structure
3313 // is called integer-like if its size is less than or equal to one word, and
3314 // the offset of each of its addressable sub-fields is zero.
3315
3316 uint64_t Size = Context.getTypeSize(Ty);
3317
3318 // Check that the type fits in a word.
3319 if (Size > 32)
3320 return false;
3321
3322 // FIXME: Handle vector types!
3323 if (Ty->isVectorType())
3324 return false;
3325
Daniel Dunbarb0d58192009-09-14 02:20:34 +00003326 // Float types are never treated as "integer like".
3327 if (Ty->isRealFloatingType())
3328 return false;
3329
Daniel Dunbar98303b92009-09-13 08:03:58 +00003330 // If this is a builtin or pointer type then it is ok.
John McCall183700f2009-09-21 23:43:11 +00003331 if (Ty->getAs<BuiltinType>() || Ty->isPointerType())
Daniel Dunbar98303b92009-09-13 08:03:58 +00003332 return true;
3333
Daniel Dunbar45815812010-02-01 23:31:26 +00003334 // Small complex integer types are "integer like".
3335 if (const ComplexType *CT = Ty->getAs<ComplexType>())
3336 return isIntegerLikeType(CT->getElementType(), Context, VMContext);
Daniel Dunbar98303b92009-09-13 08:03:58 +00003337
3338 // Single element and zero sized arrays should be allowed, by the definition
3339 // above, but they are not.
3340
3341 // Otherwise, it must be a record type.
3342 const RecordType *RT = Ty->getAs<RecordType>();
3343 if (!RT) return false;
3344
3345 // Ignore records with flexible arrays.
3346 const RecordDecl *RD = RT->getDecl();
3347 if (RD->hasFlexibleArrayMember())
3348 return false;
3349
3350 // Check that all sub-fields are at offset 0, and are themselves "integer
3351 // like".
3352 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
3353
3354 bool HadField = false;
3355 unsigned idx = 0;
3356 for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
3357 i != e; ++i, ++idx) {
David Blaikie581deb32012-06-06 20:45:41 +00003358 const FieldDecl *FD = *i;
Daniel Dunbar98303b92009-09-13 08:03:58 +00003359
Daniel Dunbar679855a2010-01-29 03:22:29 +00003360 // Bit-fields are not addressable, we only need to verify they are "integer
3361 // like". We still have to disallow a subsequent non-bitfield, for example:
3362 // struct { int : 0; int x }
3363 // is non-integer like according to gcc.
3364 if (FD->isBitField()) {
3365 if (!RD->isUnion())
3366 HadField = true;
Daniel Dunbar98303b92009-09-13 08:03:58 +00003367
Daniel Dunbar679855a2010-01-29 03:22:29 +00003368 if (!isIntegerLikeType(FD->getType(), Context, VMContext))
3369 return false;
Daniel Dunbar98303b92009-09-13 08:03:58 +00003370
Daniel Dunbar679855a2010-01-29 03:22:29 +00003371 continue;
Daniel Dunbar98303b92009-09-13 08:03:58 +00003372 }
3373
Daniel Dunbar679855a2010-01-29 03:22:29 +00003374 // Check if this field is at offset 0.
3375 if (Layout.getFieldOffset(idx) != 0)
3376 return false;
3377
Daniel Dunbar98303b92009-09-13 08:03:58 +00003378 if (!isIntegerLikeType(FD->getType(), Context, VMContext))
3379 return false;
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00003380
Daniel Dunbar679855a2010-01-29 03:22:29 +00003381 // Only allow at most one field in a structure. This doesn't match the
3382 // wording above, but follows gcc in situations with a field following an
3383 // empty structure.
Daniel Dunbar98303b92009-09-13 08:03:58 +00003384 if (!RD->isUnion()) {
3385 if (HadField)
3386 return false;
3387
3388 HadField = true;
3389 }
3390 }
3391
3392 return true;
3393}
3394
Chris Lattnera3c109b2010-07-29 02:16:43 +00003395ABIArgInfo ARMABIInfo::classifyReturnType(QualType RetTy) const {
Daniel Dunbar98303b92009-09-13 08:03:58 +00003396 if (RetTy->isVoidType())
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00003397 return ABIArgInfo::getIgnore();
Daniel Dunbar98303b92009-09-13 08:03:58 +00003398
Daniel Dunbarf554b1c2010-09-23 01:54:32 +00003399 // Large vector types should be returned via memory.
3400 if (RetTy->isVectorType() && getContext().getTypeSize(RetTy) > 128)
3401 return ABIArgInfo::getIndirect(0);
3402
John McCalld608cdb2010-08-22 10:59:02 +00003403 if (!isAggregateTypeForABI(RetTy)) {
Douglas Gregoraa74a1e2010-02-02 20:10:50 +00003404 // Treat an enum type as its underlying type.
3405 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
3406 RetTy = EnumTy->getDecl()->getIntegerType();
3407
Anton Korobeynikovcc6fa882009-06-06 09:36:29 +00003408 return (RetTy->isPromotableIntegerType() ?
3409 ABIArgInfo::getExtend() : ABIArgInfo::getDirect());
Douglas Gregoraa74a1e2010-02-02 20:10:50 +00003410 }
Daniel Dunbar98303b92009-09-13 08:03:58 +00003411
Rafael Espindola0eb1d972010-06-08 02:42:08 +00003412 // Structures with either a non-trivial destructor or a non-trivial
3413 // copy constructor are always indirect.
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +00003414 if (isRecordReturnIndirect(RetTy, CGT))
Rafael Espindola0eb1d972010-06-08 02:42:08 +00003415 return ABIArgInfo::getIndirect(0, /*ByVal=*/false);
3416
Daniel Dunbar98303b92009-09-13 08:03:58 +00003417 // Are we following APCS?
3418 if (getABIKind() == APCS) {
Chris Lattnera3c109b2010-07-29 02:16:43 +00003419 if (isEmptyRecord(getContext(), RetTy, false))
Daniel Dunbar98303b92009-09-13 08:03:58 +00003420 return ABIArgInfo::getIgnore();
3421
Daniel Dunbar4cc753f2010-02-01 23:31:19 +00003422 // Complex types are all returned as packed integers.
3423 //
3424 // FIXME: Consider using 2 x vector types if the back end handles them
3425 // correctly.
3426 if (RetTy->isAnyComplexType())
Chris Lattner800588f2010-07-29 06:26:06 +00003427 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),
Chris Lattnera3c109b2010-07-29 02:16:43 +00003428 getContext().getTypeSize(RetTy)));
Daniel Dunbar4cc753f2010-02-01 23:31:19 +00003429
Daniel Dunbar98303b92009-09-13 08:03:58 +00003430 // Integer like structures are returned in r0.
Chris Lattnera3c109b2010-07-29 02:16:43 +00003431 if (isIntegerLikeType(RetTy, getContext(), getVMContext())) {
Daniel Dunbar98303b92009-09-13 08:03:58 +00003432 // Return in the smallest viable integer type.
Chris Lattnera3c109b2010-07-29 02:16:43 +00003433 uint64_t Size = getContext().getTypeSize(RetTy);
Daniel Dunbar98303b92009-09-13 08:03:58 +00003434 if (Size <= 8)
Chris Lattner800588f2010-07-29 06:26:06 +00003435 return ABIArgInfo::getDirect(llvm::Type::getInt8Ty(getVMContext()));
Daniel Dunbar98303b92009-09-13 08:03:58 +00003436 if (Size <= 16)
Chris Lattner800588f2010-07-29 06:26:06 +00003437 return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext()));
3438 return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
Daniel Dunbar98303b92009-09-13 08:03:58 +00003439 }
3440
3441 // Otherwise return in memory.
3442 return ABIArgInfo::getIndirect(0);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00003443 }
Daniel Dunbar98303b92009-09-13 08:03:58 +00003444
3445 // Otherwise this is an AAPCS variant.
3446
Chris Lattnera3c109b2010-07-29 02:16:43 +00003447 if (isEmptyRecord(getContext(), RetTy, true))
Daniel Dunbar16a08082009-09-14 00:56:55 +00003448 return ABIArgInfo::getIgnore();
3449
Bob Wilson3b694fa2011-11-02 04:51:36 +00003450 // Check for homogeneous aggregates with AAPCS-VFP.
3451 if (getABIKind() == AAPCS_VFP) {
3452 const Type *Base = 0;
Anton Korobeynikoveaf856d2012-04-13 11:22:00 +00003453 if (isHomogeneousAggregate(RetTy, Base, getContext())) {
3454 assert(Base && "Base class should be set for homogeneous aggregate");
Bob Wilson3b694fa2011-11-02 04:51:36 +00003455 // Homogeneous Aggregates are returned directly.
3456 return ABIArgInfo::getDirect();
Anton Korobeynikoveaf856d2012-04-13 11:22:00 +00003457 }
Bob Wilson3b694fa2011-11-02 04:51:36 +00003458 }
3459
Daniel Dunbar98303b92009-09-13 08:03:58 +00003460 // Aggregates <= 4 bytes are returned in r0; other aggregates
3461 // are returned indirectly.
Chris Lattnera3c109b2010-07-29 02:16:43 +00003462 uint64_t Size = getContext().getTypeSize(RetTy);
Daniel Dunbar16a08082009-09-14 00:56:55 +00003463 if (Size <= 32) {
3464 // Return in the smallest viable integer type.
3465 if (Size <= 8)
Chris Lattner800588f2010-07-29 06:26:06 +00003466 return ABIArgInfo::getDirect(llvm::Type::getInt8Ty(getVMContext()));
Daniel Dunbar16a08082009-09-14 00:56:55 +00003467 if (Size <= 16)
Chris Lattner800588f2010-07-29 06:26:06 +00003468 return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext()));
3469 return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
Daniel Dunbar16a08082009-09-14 00:56:55 +00003470 }
3471
Daniel Dunbar98303b92009-09-13 08:03:58 +00003472 return ABIArgInfo::getIndirect(0);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00003473}
3474
Manman Ren97f81572012-10-16 19:18:39 +00003475/// isIllegalVector - check whether Ty is an illegal vector type.
3476bool ARMABIInfo::isIllegalVectorType(QualType Ty) const {
3477 if (const VectorType *VT = Ty->getAs<VectorType>()) {
3478 // Check whether VT is legal.
3479 unsigned NumElements = VT->getNumElements();
3480 uint64_t Size = getContext().getTypeSize(VT);
3481 // NumElements should be power of 2.
3482 if ((NumElements & (NumElements - 1)) != 0)
3483 return true;
3484 // Size should be greater than 32 bits.
3485 return Size <= 32;
3486 }
3487 return false;
3488}
3489
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00003490llvm::Value *ARMABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
Chris Lattner77b89b82010-06-27 07:15:29 +00003491 CodeGenFunction &CGF) const {
Chris Lattner8b418682012-02-07 00:39:47 +00003492 llvm::Type *BP = CGF.Int8PtrTy;
3493 llvm::Type *BPP = CGF.Int8PtrPtrTy;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00003494
3495 CGBuilderTy &Builder = CGF.Builder;
Chris Lattner8b418682012-02-07 00:39:47 +00003496 llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP, "ap");
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00003497 llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur");
Manman Rend105e732012-10-16 19:01:37 +00003498
3499 uint64_t Size = CGF.getContext().getTypeSize(Ty) / 8;
Rafael Espindolae164c182011-08-02 22:33:37 +00003500 uint64_t TyAlign = CGF.getContext().getTypeAlign(Ty) / 8;
Manman Ren97f81572012-10-16 19:18:39 +00003501 bool IsIndirect = false;
Manman Rend105e732012-10-16 19:01:37 +00003502
3503 // The ABI alignment for 64-bit or 128-bit vectors is 8 for AAPCS and 4 for
3504 // APCS. For AAPCS, the ABI alignment is at least 4-byte and at most 8-byte.
Manman Ren93371022012-10-16 19:51:48 +00003505 if (getABIKind() == ARMABIInfo::AAPCS_VFP ||
3506 getABIKind() == ARMABIInfo::AAPCS)
3507 TyAlign = std::min(std::max(TyAlign, (uint64_t)4), (uint64_t)8);
3508 else
3509 TyAlign = 4;
Manman Ren97f81572012-10-16 19:18:39 +00003510 // Use indirect if size of the illegal vector is bigger than 16 bytes.
3511 if (isIllegalVectorType(Ty) && Size > 16) {
3512 IsIndirect = true;
3513 Size = 4;
3514 TyAlign = 4;
3515 }
Manman Rend105e732012-10-16 19:01:37 +00003516
3517 // Handle address alignment for ABI alignment > 4 bytes.
Rafael Espindolae164c182011-08-02 22:33:37 +00003518 if (TyAlign > 4) {
3519 assert((TyAlign & (TyAlign - 1)) == 0 &&
3520 "Alignment is not power of 2!");
3521 llvm::Value *AddrAsInt = Builder.CreatePtrToInt(Addr, CGF.Int32Ty);
3522 AddrAsInt = Builder.CreateAdd(AddrAsInt, Builder.getInt32(TyAlign - 1));
3523 AddrAsInt = Builder.CreateAnd(AddrAsInt, Builder.getInt32(~(TyAlign - 1)));
Manman Rend105e732012-10-16 19:01:37 +00003524 Addr = Builder.CreateIntToPtr(AddrAsInt, BP, "ap.align");
Rafael Espindolae164c182011-08-02 22:33:37 +00003525 }
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00003526
3527 uint64_t Offset =
Manman Rend105e732012-10-16 19:01:37 +00003528 llvm::RoundUpToAlignment(Size, 4);
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00003529 llvm::Value *NextAddr =
Chris Lattner77b89b82010-06-27 07:15:29 +00003530 Builder.CreateGEP(Addr, llvm::ConstantInt::get(CGF.Int32Ty, Offset),
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00003531 "ap.next");
3532 Builder.CreateStore(NextAddr, VAListAddrAsBPP);
3533
Manman Ren97f81572012-10-16 19:18:39 +00003534 if (IsIndirect)
3535 Addr = Builder.CreateLoad(Builder.CreateBitCast(Addr, BPP));
Manman Ren93371022012-10-16 19:51:48 +00003536 else if (TyAlign < CGF.getContext().getTypeAlign(Ty) / 8) {
Manman Rend105e732012-10-16 19:01:37 +00003537 // We can't directly cast ap.cur to pointer to a vector type, since ap.cur
3538 // may not be correctly aligned for the vector type. We create an aligned
3539 // temporary space and copy the content over from ap.cur to the temporary
3540 // space. This is necessary if the natural alignment of the type is greater
3541 // than the ABI alignment.
3542 llvm::Type *I8PtrTy = Builder.getInt8PtrTy();
3543 CharUnits CharSize = getContext().getTypeSizeInChars(Ty);
3544 llvm::Value *AlignedTemp = CGF.CreateTempAlloca(CGF.ConvertType(Ty),
3545 "var.align");
3546 llvm::Value *Dst = Builder.CreateBitCast(AlignedTemp, I8PtrTy);
3547 llvm::Value *Src = Builder.CreateBitCast(Addr, I8PtrTy);
3548 Builder.CreateMemCpy(Dst, Src,
3549 llvm::ConstantInt::get(CGF.IntPtrTy, CharSize.getQuantity()),
3550 TyAlign, false);
3551 Addr = AlignedTemp; //The content is in aligned location.
3552 }
3553 llvm::Type *PTy =
3554 llvm::PointerType::getUnqual(CGF.ConvertType(Ty));
3555 llvm::Value *AddrTyped = Builder.CreateBitCast(Addr, PTy);
3556
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00003557 return AddrTyped;
3558}
3559
Benjamin Kramerc6f84cf2012-10-20 13:02:06 +00003560namespace {
3561
Derek Schuff263366f2012-10-16 22:30:41 +00003562class NaClARMABIInfo : public ABIInfo {
3563 public:
3564 NaClARMABIInfo(CodeGen::CodeGenTypes &CGT, ARMABIInfo::ABIKind Kind)
3565 : ABIInfo(CGT), PInfo(CGT), NInfo(CGT, Kind) {}
3566 virtual void computeInfo(CGFunctionInfo &FI) const;
3567 virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
3568 CodeGenFunction &CGF) const;
3569 private:
3570 PNaClABIInfo PInfo; // Used for generating calls with pnaclcall callingconv.
3571 ARMABIInfo NInfo; // Used for everything else.
3572};
3573
3574class NaClARMTargetCodeGenInfo : public TargetCodeGenInfo {
3575 public:
3576 NaClARMTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, ARMABIInfo::ABIKind Kind)
3577 : TargetCodeGenInfo(new NaClARMABIInfo(CGT, Kind)) {}
3578};
3579
Benjamin Kramerc6f84cf2012-10-20 13:02:06 +00003580}
3581
Derek Schuff263366f2012-10-16 22:30:41 +00003582void NaClARMABIInfo::computeInfo(CGFunctionInfo &FI) const {
3583 if (FI.getASTCallingConvention() == CC_PnaclCall)
3584 PInfo.computeInfo(FI);
3585 else
3586 static_cast<const ABIInfo&>(NInfo).computeInfo(FI);
3587}
3588
3589llvm::Value *NaClARMABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
3590 CodeGenFunction &CGF) const {
3591 // Always use the native convention; calling pnacl-style varargs functions
3592 // is unsupported.
3593 return static_cast<const ABIInfo&>(NInfo).EmitVAArg(VAListAddr, Ty, CGF);
3594}
3595
Chris Lattnerdce5ad02010-06-28 20:05:43 +00003596//===----------------------------------------------------------------------===//
Tim Northoverc264e162013-01-31 12:13:10 +00003597// AArch64 ABI Implementation
3598//===----------------------------------------------------------------------===//
3599
3600namespace {
3601
3602class AArch64ABIInfo : public ABIInfo {
3603public:
3604 AArch64ABIInfo(CodeGenTypes &CGT) : ABIInfo(CGT) {}
3605
3606private:
3607 // The AArch64 PCS is explicit about return types and argument types being
3608 // handled identically, so we don't need to draw a distinction between
3609 // Argument and Return classification.
3610 ABIArgInfo classifyGenericType(QualType Ty, int &FreeIntRegs,
3611 int &FreeVFPRegs) const;
3612
3613 ABIArgInfo tryUseRegs(QualType Ty, int &FreeRegs, int RegsNeeded, bool IsInt,
3614 llvm::Type *DirectTy = 0) const;
3615
3616 virtual void computeInfo(CGFunctionInfo &FI) const;
3617
3618 virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
3619 CodeGenFunction &CGF) const;
3620};
3621
3622class AArch64TargetCodeGenInfo : public TargetCodeGenInfo {
3623public:
3624 AArch64TargetCodeGenInfo(CodeGenTypes &CGT)
3625 :TargetCodeGenInfo(new AArch64ABIInfo(CGT)) {}
3626
3627 const AArch64ABIInfo &getABIInfo() const {
3628 return static_cast<const AArch64ABIInfo&>(TargetCodeGenInfo::getABIInfo());
3629 }
3630
3631 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const {
3632 return 31;
3633 }
3634
3635 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
3636 llvm::Value *Address) const {
3637 // 0-31 are x0-x30 and sp: 8 bytes each
3638 llvm::Value *Eight8 = llvm::ConstantInt::get(CGF.Int8Ty, 8);
3639 AssignToArrayRange(CGF.Builder, Address, Eight8, 0, 31);
3640
3641 // 64-95 are v0-v31: 16 bytes each
3642 llvm::Value *Sixteen8 = llvm::ConstantInt::get(CGF.Int8Ty, 16);
3643 AssignToArrayRange(CGF.Builder, Address, Sixteen8, 64, 95);
3644
3645 return false;
3646 }
3647
3648};
3649
3650}
3651
3652void AArch64ABIInfo::computeInfo(CGFunctionInfo &FI) const {
3653 int FreeIntRegs = 8, FreeVFPRegs = 8;
3654
3655 FI.getReturnInfo() = classifyGenericType(FI.getReturnType(),
3656 FreeIntRegs, FreeVFPRegs);
3657
3658 FreeIntRegs = FreeVFPRegs = 8;
3659 for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
3660 it != ie; ++it) {
3661 it->info = classifyGenericType(it->type, FreeIntRegs, FreeVFPRegs);
3662
3663 }
3664}
3665
3666ABIArgInfo
3667AArch64ABIInfo::tryUseRegs(QualType Ty, int &FreeRegs, int RegsNeeded,
3668 bool IsInt, llvm::Type *DirectTy) const {
3669 if (FreeRegs >= RegsNeeded) {
3670 FreeRegs -= RegsNeeded;
3671 return ABIArgInfo::getDirect(DirectTy);
3672 }
3673
3674 llvm::Type *Padding = 0;
3675
3676 // We need padding so that later arguments don't get filled in anyway. That
3677 // wouldn't happen if only ByVal arguments followed in the same category, but
3678 // a large structure will simply seem to be a pointer as far as LLVM is
3679 // concerned.
3680 if (FreeRegs > 0) {
3681 if (IsInt)
3682 Padding = llvm::Type::getInt64Ty(getVMContext());
3683 else
3684 Padding = llvm::Type::getFloatTy(getVMContext());
3685
3686 // Either [N x i64] or [N x float].
3687 Padding = llvm::ArrayType::get(Padding, FreeRegs);
3688 FreeRegs = 0;
3689 }
3690
3691 return ABIArgInfo::getIndirect(getContext().getTypeAlign(Ty) / 8,
3692 /*IsByVal=*/ true, /*Realign=*/ false,
3693 Padding);
3694}
3695
3696
3697ABIArgInfo AArch64ABIInfo::classifyGenericType(QualType Ty,
3698 int &FreeIntRegs,
3699 int &FreeVFPRegs) const {
3700 // Can only occurs for return, but harmless otherwise.
3701 if (Ty->isVoidType())
3702 return ABIArgInfo::getIgnore();
3703
3704 // Large vector types should be returned via memory. There's no such concept
3705 // in the ABI, but they'd be over 16 bytes anyway so no matter how they're
3706 // classified they'd go into memory (see B.3).
3707 if (Ty->isVectorType() && getContext().getTypeSize(Ty) > 128) {
3708 if (FreeIntRegs > 0)
3709 --FreeIntRegs;
3710 return ABIArgInfo::getIndirect(0, /*ByVal=*/false);
3711 }
3712
3713 // All non-aggregate LLVM types have a concrete ABI representation so they can
3714 // be passed directly. After this block we're guaranteed to be in a
3715 // complicated case.
3716 if (!isAggregateTypeForABI(Ty)) {
3717 // Treat an enum type as its underlying type.
3718 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
3719 Ty = EnumTy->getDecl()->getIntegerType();
3720
3721 if (Ty->isFloatingType() || Ty->isVectorType())
3722 return tryUseRegs(Ty, FreeVFPRegs, /*RegsNeeded=*/ 1, /*IsInt=*/ false);
3723
3724 assert(getContext().getTypeSize(Ty) <= 128 &&
3725 "unexpectedly large scalar type");
3726
3727 int RegsNeeded = getContext().getTypeSize(Ty) > 64 ? 2 : 1;
3728
3729 // If the type may need padding registers to ensure "alignment", we must be
3730 // careful when this is accounted for. Increasing the effective size covers
3731 // all cases.
3732 if (getContext().getTypeAlign(Ty) == 128)
3733 RegsNeeded += FreeIntRegs % 2 != 0;
3734
3735 return tryUseRegs(Ty, FreeIntRegs, RegsNeeded, /*IsInt=*/ true);
3736 }
3737
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +00003738 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, CGT)) {
3739 if (FreeIntRegs > 0 && RAA == CGCXXABI::RAA_Indirect)
Tim Northoverc264e162013-01-31 12:13:10 +00003740 --FreeIntRegs;
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +00003741 return ABIArgInfo::getIndirect(0, RAA == CGCXXABI::RAA_DirectInMemory);
Tim Northoverc264e162013-01-31 12:13:10 +00003742 }
3743
3744 if (isEmptyRecord(getContext(), Ty, true)) {
3745 if (!getContext().getLangOpts().CPlusPlus) {
3746 // Empty structs outside C++ mode are a GNU extension, so no ABI can
3747 // possibly tell us what to do. It turns out (I believe) that GCC ignores
3748 // the object for parameter-passsing purposes.
3749 return ABIArgInfo::getIgnore();
3750 }
3751
3752 // The combination of C++98 9p5 (sizeof(struct) != 0) and the pseudocode
3753 // description of va_arg in the PCS require that an empty struct does
3754 // actually occupy space for parameter-passing. I'm hoping for a
3755 // clarification giving an explicit paragraph to point to in future.
3756 return tryUseRegs(Ty, FreeIntRegs, /*RegsNeeded=*/ 1, /*IsInt=*/ true,
3757 llvm::Type::getInt8Ty(getVMContext()));
3758 }
3759
3760 // Homogeneous vector aggregates get passed in registers or on the stack.
3761 const Type *Base = 0;
3762 uint64_t NumMembers = 0;
3763 if (isHomogeneousAggregate(Ty, Base, getContext(), &NumMembers)) {
3764 assert(Base && "Base class should be set for homogeneous aggregate");
3765 // Homogeneous aggregates are passed and returned directly.
3766 return tryUseRegs(Ty, FreeVFPRegs, /*RegsNeeded=*/ NumMembers,
3767 /*IsInt=*/ false);
3768 }
3769
3770 uint64_t Size = getContext().getTypeSize(Ty);
3771 if (Size <= 128) {
3772 // Small structs can use the same direct type whether they're in registers
3773 // or on the stack.
3774 llvm::Type *BaseTy;
3775 unsigned NumBases;
3776 int SizeInRegs = (Size + 63) / 64;
3777
3778 if (getContext().getTypeAlign(Ty) == 128) {
3779 BaseTy = llvm::Type::getIntNTy(getVMContext(), 128);
3780 NumBases = 1;
3781
3782 // If the type may need padding registers to ensure "alignment", we must
3783 // be careful when this is accounted for. Increasing the effective size
3784 // covers all cases.
3785 SizeInRegs += FreeIntRegs % 2 != 0;
3786 } else {
3787 BaseTy = llvm::Type::getInt64Ty(getVMContext());
3788 NumBases = SizeInRegs;
3789 }
3790 llvm::Type *DirectTy = llvm::ArrayType::get(BaseTy, NumBases);
3791
3792 return tryUseRegs(Ty, FreeIntRegs, /*RegsNeeded=*/ SizeInRegs,
3793 /*IsInt=*/ true, DirectTy);
3794 }
3795
3796 // If the aggregate is > 16 bytes, it's passed and returned indirectly. In
3797 // LLVM terms the return uses an "sret" pointer, but that's handled elsewhere.
3798 --FreeIntRegs;
3799 return ABIArgInfo::getIndirect(0, /* byVal = */ false);
3800}
3801
3802llvm::Value *AArch64ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
3803 CodeGenFunction &CGF) const {
3804 // The AArch64 va_list type and handling is specified in the Procedure Call
3805 // Standard, section B.4:
3806 //
3807 // struct {
3808 // void *__stack;
3809 // void *__gr_top;
3810 // void *__vr_top;
3811 // int __gr_offs;
3812 // int __vr_offs;
3813 // };
3814
3815 assert(!CGF.CGM.getDataLayout().isBigEndian()
3816 && "va_arg not implemented for big-endian AArch64");
3817
3818 int FreeIntRegs = 8, FreeVFPRegs = 8;
3819 Ty = CGF.getContext().getCanonicalType(Ty);
3820 ABIArgInfo AI = classifyGenericType(Ty, FreeIntRegs, FreeVFPRegs);
3821
3822 llvm::BasicBlock *MaybeRegBlock = CGF.createBasicBlock("vaarg.maybe_reg");
3823 llvm::BasicBlock *InRegBlock = CGF.createBasicBlock("vaarg.in_reg");
3824 llvm::BasicBlock *OnStackBlock = CGF.createBasicBlock("vaarg.on_stack");
3825 llvm::BasicBlock *ContBlock = CGF.createBasicBlock("vaarg.end");
3826
3827 llvm::Value *reg_offs_p = 0, *reg_offs = 0;
3828 int reg_top_index;
3829 int RegSize;
3830 if (FreeIntRegs < 8) {
3831 assert(FreeVFPRegs == 8 && "Arguments never split between int & VFP regs");
3832 // 3 is the field number of __gr_offs
3833 reg_offs_p = CGF.Builder.CreateStructGEP(VAListAddr, 3, "gr_offs_p");
3834 reg_offs = CGF.Builder.CreateLoad(reg_offs_p, "gr_offs");
3835 reg_top_index = 1; // field number for __gr_top
3836 RegSize = 8 * (8 - FreeIntRegs);
3837 } else {
3838 assert(FreeVFPRegs < 8 && "Argument must go in VFP or int regs");
3839 // 4 is the field number of __vr_offs.
3840 reg_offs_p = CGF.Builder.CreateStructGEP(VAListAddr, 4, "vr_offs_p");
3841 reg_offs = CGF.Builder.CreateLoad(reg_offs_p, "vr_offs");
3842 reg_top_index = 2; // field number for __vr_top
3843 RegSize = 16 * (8 - FreeVFPRegs);
3844 }
3845
3846 //=======================================
3847 // Find out where argument was passed
3848 //=======================================
3849
3850 // If reg_offs >= 0 we're already using the stack for this type of
3851 // argument. We don't want to keep updating reg_offs (in case it overflows,
3852 // though anyone passing 2GB of arguments, each at most 16 bytes, deserves
3853 // whatever they get).
3854 llvm::Value *UsingStack = 0;
3855 UsingStack = CGF.Builder.CreateICmpSGE(reg_offs,
3856 llvm::ConstantInt::get(CGF.Int32Ty, 0));
3857
3858 CGF.Builder.CreateCondBr(UsingStack, OnStackBlock, MaybeRegBlock);
3859
3860 // Otherwise, at least some kind of argument could go in these registers, the
3861 // quesiton is whether this particular type is too big.
3862 CGF.EmitBlock(MaybeRegBlock);
3863
3864 // Integer arguments may need to correct register alignment (for example a
3865 // "struct { __int128 a; };" gets passed in x_2N, x_{2N+1}). In this case we
3866 // align __gr_offs to calculate the potential address.
3867 if (FreeIntRegs < 8 && AI.isDirect() && getContext().getTypeAlign(Ty) > 64) {
3868 int Align = getContext().getTypeAlign(Ty) / 8;
3869
3870 reg_offs = CGF.Builder.CreateAdd(reg_offs,
3871 llvm::ConstantInt::get(CGF.Int32Ty, Align - 1),
3872 "align_regoffs");
3873 reg_offs = CGF.Builder.CreateAnd(reg_offs,
3874 llvm::ConstantInt::get(CGF.Int32Ty, -Align),
3875 "aligned_regoffs");
3876 }
3877
3878 // Update the gr_offs/vr_offs pointer for next call to va_arg on this va_list.
3879 llvm::Value *NewOffset = 0;
3880 NewOffset = CGF.Builder.CreateAdd(reg_offs,
3881 llvm::ConstantInt::get(CGF.Int32Ty, RegSize),
3882 "new_reg_offs");
3883 CGF.Builder.CreateStore(NewOffset, reg_offs_p);
3884
3885 // Now we're in a position to decide whether this argument really was in
3886 // registers or not.
3887 llvm::Value *InRegs = 0;
3888 InRegs = CGF.Builder.CreateICmpSLE(NewOffset,
3889 llvm::ConstantInt::get(CGF.Int32Ty, 0),
3890 "inreg");
3891
3892 CGF.Builder.CreateCondBr(InRegs, InRegBlock, OnStackBlock);
3893
3894 //=======================================
3895 // Argument was in registers
3896 //=======================================
3897
3898 // Now we emit the code for if the argument was originally passed in
3899 // registers. First start the appropriate block:
3900 CGF.EmitBlock(InRegBlock);
3901
3902 llvm::Value *reg_top_p = 0, *reg_top = 0;
3903 reg_top_p = CGF.Builder.CreateStructGEP(VAListAddr, reg_top_index, "reg_top_p");
3904 reg_top = CGF.Builder.CreateLoad(reg_top_p, "reg_top");
3905 llvm::Value *BaseAddr = CGF.Builder.CreateGEP(reg_top, reg_offs);
3906 llvm::Value *RegAddr = 0;
3907 llvm::Type *MemTy = llvm::PointerType::getUnqual(CGF.ConvertTypeForMem(Ty));
3908
3909 if (!AI.isDirect()) {
3910 // If it's been passed indirectly (actually a struct), whatever we find from
3911 // stored registers or on the stack will actually be a struct **.
3912 MemTy = llvm::PointerType::getUnqual(MemTy);
3913 }
3914
3915 const Type *Base = 0;
3916 uint64_t NumMembers;
3917 if (isHomogeneousAggregate(Ty, Base, getContext(), &NumMembers)
3918 && NumMembers > 1) {
3919 // Homogeneous aggregates passed in registers will have their elements split
3920 // and stored 16-bytes apart regardless of size (they're notionally in qN,
3921 // qN+1, ...). We reload and store into a temporary local variable
3922 // contiguously.
3923 assert(AI.isDirect() && "Homogeneous aggregates should be passed directly");
3924 llvm::Type *BaseTy = CGF.ConvertType(QualType(Base, 0));
3925 llvm::Type *HFATy = llvm::ArrayType::get(BaseTy, NumMembers);
3926 llvm::Value *Tmp = CGF.CreateTempAlloca(HFATy);
3927
3928 for (unsigned i = 0; i < NumMembers; ++i) {
3929 llvm::Value *BaseOffset = llvm::ConstantInt::get(CGF.Int32Ty, 16 * i);
3930 llvm::Value *LoadAddr = CGF.Builder.CreateGEP(BaseAddr, BaseOffset);
3931 LoadAddr = CGF.Builder.CreateBitCast(LoadAddr,
3932 llvm::PointerType::getUnqual(BaseTy));
3933 llvm::Value *StoreAddr = CGF.Builder.CreateStructGEP(Tmp, i);
3934
3935 llvm::Value *Elem = CGF.Builder.CreateLoad(LoadAddr);
3936 CGF.Builder.CreateStore(Elem, StoreAddr);
3937 }
3938
3939 RegAddr = CGF.Builder.CreateBitCast(Tmp, MemTy);
3940 } else {
3941 // Otherwise the object is contiguous in memory
3942 RegAddr = CGF.Builder.CreateBitCast(BaseAddr, MemTy);
3943 }
3944
3945 CGF.EmitBranch(ContBlock);
3946
3947 //=======================================
3948 // Argument was on the stack
3949 //=======================================
3950 CGF.EmitBlock(OnStackBlock);
3951
3952 llvm::Value *stack_p = 0, *OnStackAddr = 0;
3953 stack_p = CGF.Builder.CreateStructGEP(VAListAddr, 0, "stack_p");
3954 OnStackAddr = CGF.Builder.CreateLoad(stack_p, "stack");
3955
3956 // Again, stack arguments may need realigmnent. In this case both integer and
3957 // floating-point ones might be affected.
3958 if (AI.isDirect() && getContext().getTypeAlign(Ty) > 64) {
3959 int Align = getContext().getTypeAlign(Ty) / 8;
3960
3961 OnStackAddr = CGF.Builder.CreatePtrToInt(OnStackAddr, CGF.Int64Ty);
3962
3963 OnStackAddr = CGF.Builder.CreateAdd(OnStackAddr,
3964 llvm::ConstantInt::get(CGF.Int64Ty, Align - 1),
3965 "align_stack");
3966 OnStackAddr = CGF.Builder.CreateAnd(OnStackAddr,
3967 llvm::ConstantInt::get(CGF.Int64Ty, -Align),
3968 "align_stack");
3969
3970 OnStackAddr = CGF.Builder.CreateIntToPtr(OnStackAddr, CGF.Int8PtrTy);
3971 }
3972
3973 uint64_t StackSize;
3974 if (AI.isDirect())
3975 StackSize = getContext().getTypeSize(Ty) / 8;
3976 else
3977 StackSize = 8;
3978
3979 // All stack slots are 8 bytes
3980 StackSize = llvm::RoundUpToAlignment(StackSize, 8);
3981
3982 llvm::Value *StackSizeC = llvm::ConstantInt::get(CGF.Int32Ty, StackSize);
3983 llvm::Value *NewStack = CGF.Builder.CreateGEP(OnStackAddr, StackSizeC,
3984 "new_stack");
3985
3986 // Write the new value of __stack for the next call to va_arg
3987 CGF.Builder.CreateStore(NewStack, stack_p);
3988
3989 OnStackAddr = CGF.Builder.CreateBitCast(OnStackAddr, MemTy);
3990
3991 CGF.EmitBranch(ContBlock);
3992
3993 //=======================================
3994 // Tidy up
3995 //=======================================
3996 CGF.EmitBlock(ContBlock);
3997
3998 llvm::PHINode *ResAddr = CGF.Builder.CreatePHI(MemTy, 2, "vaarg.addr");
3999 ResAddr->addIncoming(RegAddr, InRegBlock);
4000 ResAddr->addIncoming(OnStackAddr, OnStackBlock);
4001
4002 if (AI.isDirect())
4003 return ResAddr;
4004
4005 return CGF.Builder.CreateLoad(ResAddr, "vaarg.addr");
4006}
4007
4008//===----------------------------------------------------------------------===//
Justin Holewinski2c585b92012-05-24 17:43:12 +00004009// NVPTX ABI Implementation
Justin Holewinski0259c3a2011-04-22 11:10:38 +00004010//===----------------------------------------------------------------------===//
4011
4012namespace {
4013
Justin Holewinski2c585b92012-05-24 17:43:12 +00004014class NVPTXABIInfo : public ABIInfo {
Justin Holewinski0259c3a2011-04-22 11:10:38 +00004015public:
Justin Holewinskidca8f332013-03-30 14:38:24 +00004016 NVPTXABIInfo(CodeGenTypes &CGT) : ABIInfo(CGT) {}
Justin Holewinski0259c3a2011-04-22 11:10:38 +00004017
4018 ABIArgInfo classifyReturnType(QualType RetTy) const;
4019 ABIArgInfo classifyArgumentType(QualType Ty) const;
4020
4021 virtual void computeInfo(CGFunctionInfo &FI) const;
4022 virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
4023 CodeGenFunction &CFG) const;
4024};
4025
Justin Holewinski2c585b92012-05-24 17:43:12 +00004026class NVPTXTargetCodeGenInfo : public TargetCodeGenInfo {
Justin Holewinski0259c3a2011-04-22 11:10:38 +00004027public:
Justin Holewinski2c585b92012-05-24 17:43:12 +00004028 NVPTXTargetCodeGenInfo(CodeGenTypes &CGT)
4029 : TargetCodeGenInfo(new NVPTXABIInfo(CGT)) {}
Justin Holewinski818eafb2011-10-05 17:58:44 +00004030
Peter Collingbourne2f7aa992011-10-13 16:24:41 +00004031 virtual void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
4032 CodeGen::CodeGenModule &M) const;
Justin Holewinskidca8f332013-03-30 14:38:24 +00004033private:
4034 static void addKernelMetadata(llvm::Function *F);
Justin Holewinski0259c3a2011-04-22 11:10:38 +00004035};
4036
Justin Holewinski2c585b92012-05-24 17:43:12 +00004037ABIArgInfo NVPTXABIInfo::classifyReturnType(QualType RetTy) const {
Justin Holewinski0259c3a2011-04-22 11:10:38 +00004038 if (RetTy->isVoidType())
4039 return ABIArgInfo::getIgnore();
4040 if (isAggregateTypeForABI(RetTy))
4041 return ABIArgInfo::getIndirect(0);
4042 return ABIArgInfo::getDirect();
4043}
4044
Justin Holewinski2c585b92012-05-24 17:43:12 +00004045ABIArgInfo NVPTXABIInfo::classifyArgumentType(QualType Ty) const {
Justin Holewinski0259c3a2011-04-22 11:10:38 +00004046 if (isAggregateTypeForABI(Ty))
4047 return ABIArgInfo::getIndirect(0);
4048
4049 return ABIArgInfo::getDirect();
4050}
4051
Justin Holewinski2c585b92012-05-24 17:43:12 +00004052void NVPTXABIInfo::computeInfo(CGFunctionInfo &FI) const {
Justin Holewinski0259c3a2011-04-22 11:10:38 +00004053 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
4054 for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
4055 it != ie; ++it)
4056 it->info = classifyArgumentType(it->type);
4057
4058 // Always honor user-specified calling convention.
4059 if (FI.getCallingConvention() != llvm::CallingConv::C)
4060 return;
4061
John McCallbd7370a2013-02-28 19:01:20 +00004062 FI.setEffectiveCallingConvention(getRuntimeCC());
4063}
4064
Justin Holewinski2c585b92012-05-24 17:43:12 +00004065llvm::Value *NVPTXABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
4066 CodeGenFunction &CFG) const {
4067 llvm_unreachable("NVPTX does not support varargs");
Justin Holewinski0259c3a2011-04-22 11:10:38 +00004068}
4069
Justin Holewinski2c585b92012-05-24 17:43:12 +00004070void NVPTXTargetCodeGenInfo::
4071SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
4072 CodeGen::CodeGenModule &M) const{
Justin Holewinski818eafb2011-10-05 17:58:44 +00004073 const FunctionDecl *FD = dyn_cast<FunctionDecl>(D);
4074 if (!FD) return;
4075
4076 llvm::Function *F = cast<llvm::Function>(GV);
4077
4078 // Perform special handling in OpenCL mode
David Blaikie4e4d0842012-03-11 07:00:24 +00004079 if (M.getLangOpts().OpenCL) {
Justin Holewinskidca8f332013-03-30 14:38:24 +00004080 // Use OpenCL function attributes to check for kernel functions
Justin Holewinski818eafb2011-10-05 17:58:44 +00004081 // By default, all functions are device functions
Justin Holewinski818eafb2011-10-05 17:58:44 +00004082 if (FD->hasAttr<OpenCLKernelAttr>()) {
Justin Holewinskidca8f332013-03-30 14:38:24 +00004083 // OpenCL __kernel functions get kernel metadata
4084 addKernelMetadata(F);
Justin Holewinski818eafb2011-10-05 17:58:44 +00004085 // And kernel functions are not subject to inlining
Bill Wendling72390b32012-12-20 19:27:06 +00004086 F->addFnAttr(llvm::Attribute::NoInline);
Justin Holewinski818eafb2011-10-05 17:58:44 +00004087 }
Peter Collingbourne744d90b2011-10-06 16:49:54 +00004088 }
Justin Holewinski818eafb2011-10-05 17:58:44 +00004089
Peter Collingbourne744d90b2011-10-06 16:49:54 +00004090 // Perform special handling in CUDA mode.
David Blaikie4e4d0842012-03-11 07:00:24 +00004091 if (M.getLangOpts().CUDA) {
Justin Holewinskidca8f332013-03-30 14:38:24 +00004092 // CUDA __global__ functions get a kernel metadata entry. Since
Peter Collingbourne744d90b2011-10-06 16:49:54 +00004093 // __global__ functions cannot be called from the device, we do not
4094 // need to set the noinline attribute.
4095 if (FD->getAttr<CUDAGlobalAttr>())
Justin Holewinskidca8f332013-03-30 14:38:24 +00004096 addKernelMetadata(F);
Justin Holewinski818eafb2011-10-05 17:58:44 +00004097 }
4098}
4099
Justin Holewinskidca8f332013-03-30 14:38:24 +00004100void NVPTXTargetCodeGenInfo::addKernelMetadata(llvm::Function *F) {
4101 llvm::Module *M = F->getParent();
4102 llvm::LLVMContext &Ctx = M->getContext();
4103
4104 // Get "nvvm.annotations" metadata node
4105 llvm::NamedMDNode *MD = M->getOrInsertNamedMetadata("nvvm.annotations");
4106
4107 // Create !{<func-ref>, metadata !"kernel", i32 1} node
4108 llvm::SmallVector<llvm::Value *, 3> MDVals;
4109 MDVals.push_back(F);
4110 MDVals.push_back(llvm::MDString::get(Ctx, "kernel"));
4111 MDVals.push_back(llvm::ConstantInt::get(llvm::Type::getInt32Ty(Ctx), 1));
4112
4113 // Append metadata to nvvm.annotations
4114 MD->addOperand(llvm::MDNode::get(Ctx, MDVals));
4115}
4116
Justin Holewinski0259c3a2011-04-22 11:10:38 +00004117}
4118
4119//===----------------------------------------------------------------------===//
Wesley Peck276fdf42010-12-19 19:57:51 +00004120// MBlaze ABI Implementation
4121//===----------------------------------------------------------------------===//
4122
4123namespace {
4124
4125class MBlazeABIInfo : public ABIInfo {
4126public:
4127 MBlazeABIInfo(CodeGenTypes &CGT) : ABIInfo(CGT) {}
4128
4129 bool isPromotableIntegerType(QualType Ty) const;
4130
4131 ABIArgInfo classifyReturnType(QualType RetTy) const;
4132 ABIArgInfo classifyArgumentType(QualType RetTy) const;
4133
4134 virtual void computeInfo(CGFunctionInfo &FI) const {
4135 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
4136 for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
4137 it != ie; ++it)
4138 it->info = classifyArgumentType(it->type);
4139 }
4140
4141 virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
4142 CodeGenFunction &CGF) const;
4143};
4144
4145class MBlazeTargetCodeGenInfo : public TargetCodeGenInfo {
4146public:
4147 MBlazeTargetCodeGenInfo(CodeGenTypes &CGT)
4148 : TargetCodeGenInfo(new MBlazeABIInfo(CGT)) {}
4149 void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
4150 CodeGen::CodeGenModule &M) const;
4151};
4152
4153}
4154
4155bool MBlazeABIInfo::isPromotableIntegerType(QualType Ty) const {
4156 // MBlaze ABI requires all 8 and 16 bit quantities to be extended.
4157 if (const BuiltinType *BT = Ty->getAs<BuiltinType>())
4158 switch (BT->getKind()) {
4159 case BuiltinType::Bool:
4160 case BuiltinType::Char_S:
4161 case BuiltinType::Char_U:
4162 case BuiltinType::SChar:
4163 case BuiltinType::UChar:
4164 case BuiltinType::Short:
4165 case BuiltinType::UShort:
4166 return true;
4167 default:
4168 return false;
4169 }
4170 return false;
4171}
4172
4173llvm::Value *MBlazeABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
4174 CodeGenFunction &CGF) const {
4175 // FIXME: Implement
4176 return 0;
4177}
4178
4179
4180ABIArgInfo MBlazeABIInfo::classifyReturnType(QualType RetTy) const {
4181 if (RetTy->isVoidType())
4182 return ABIArgInfo::getIgnore();
4183 if (isAggregateTypeForABI(RetTy))
4184 return ABIArgInfo::getIndirect(0);
4185
4186 return (isPromotableIntegerType(RetTy) ?
4187 ABIArgInfo::getExtend() : ABIArgInfo::getDirect());
4188}
4189
4190ABIArgInfo MBlazeABIInfo::classifyArgumentType(QualType Ty) const {
4191 if (isAggregateTypeForABI(Ty))
4192 return ABIArgInfo::getIndirect(0);
4193
4194 return (isPromotableIntegerType(Ty) ?
4195 ABIArgInfo::getExtend() : ABIArgInfo::getDirect());
4196}
4197
4198void MBlazeTargetCodeGenInfo::SetTargetAttributes(const Decl *D,
4199 llvm::GlobalValue *GV,
4200 CodeGen::CodeGenModule &M)
4201 const {
4202 const FunctionDecl *FD = dyn_cast<FunctionDecl>(D);
4203 if (!FD) return;
NAKAMURA Takumi125b4cb2011-02-17 08:50:50 +00004204
Wesley Peck276fdf42010-12-19 19:57:51 +00004205 llvm::CallingConv::ID CC = llvm::CallingConv::C;
4206 if (FD->hasAttr<MBlazeInterruptHandlerAttr>())
4207 CC = llvm::CallingConv::MBLAZE_INTR;
4208 else if (FD->hasAttr<MBlazeSaveVolatilesAttr>())
4209 CC = llvm::CallingConv::MBLAZE_SVOL;
4210
4211 if (CC != llvm::CallingConv::C) {
4212 // Handle 'interrupt_handler' attribute:
4213 llvm::Function *F = cast<llvm::Function>(GV);
4214
4215 // Step 1: Set ISR calling convention.
4216 F->setCallingConv(CC);
4217
4218 // Step 2: Add attributes goodness.
Bill Wendling72390b32012-12-20 19:27:06 +00004219 F->addFnAttr(llvm::Attribute::NoInline);
Wesley Peck276fdf42010-12-19 19:57:51 +00004220 }
4221
4222 // Step 3: Emit _interrupt_handler alias.
4223 if (CC == llvm::CallingConv::MBLAZE_INTR)
4224 new llvm::GlobalAlias(GV->getType(), llvm::Function::ExternalLinkage,
4225 "_interrupt_handler", GV, &M.getModule());
4226}
4227
4228
4229//===----------------------------------------------------------------------===//
Anton Korobeynikov82d0a412010-01-10 12:58:08 +00004230// MSP430 ABI Implementation
Chris Lattnerdce5ad02010-06-28 20:05:43 +00004231//===----------------------------------------------------------------------===//
Anton Korobeynikov82d0a412010-01-10 12:58:08 +00004232
4233namespace {
4234
4235class MSP430TargetCodeGenInfo : public TargetCodeGenInfo {
4236public:
Chris Lattnerea044322010-07-29 02:01:43 +00004237 MSP430TargetCodeGenInfo(CodeGenTypes &CGT)
4238 : TargetCodeGenInfo(new DefaultABIInfo(CGT)) {}
Anton Korobeynikov82d0a412010-01-10 12:58:08 +00004239 void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
4240 CodeGen::CodeGenModule &M) const;
4241};
4242
4243}
4244
4245void MSP430TargetCodeGenInfo::SetTargetAttributes(const Decl *D,
4246 llvm::GlobalValue *GV,
4247 CodeGen::CodeGenModule &M) const {
4248 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
4249 if (const MSP430InterruptAttr *attr = FD->getAttr<MSP430InterruptAttr>()) {
4250 // Handle 'interrupt' attribute:
4251 llvm::Function *F = cast<llvm::Function>(GV);
4252
4253 // Step 1: Set ISR calling convention.
4254 F->setCallingConv(llvm::CallingConv::MSP430_INTR);
4255
4256 // Step 2: Add attributes goodness.
Bill Wendling72390b32012-12-20 19:27:06 +00004257 F->addFnAttr(llvm::Attribute::NoInline);
Anton Korobeynikov82d0a412010-01-10 12:58:08 +00004258
4259 // Step 3: Emit ISR vector alias.
Anton Korobeynikovf419a852012-11-26 18:59:10 +00004260 unsigned Num = attr->getNumber() / 2;
Anton Korobeynikov82d0a412010-01-10 12:58:08 +00004261 new llvm::GlobalAlias(GV->getType(), llvm::Function::ExternalLinkage,
Anton Korobeynikovf419a852012-11-26 18:59:10 +00004262 "__isr_" + Twine(Num),
Anton Korobeynikov82d0a412010-01-10 12:58:08 +00004263 GV, &M.getModule());
4264 }
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00004265 }
4266}
4267
Chris Lattnerdce5ad02010-06-28 20:05:43 +00004268//===----------------------------------------------------------------------===//
John McCallaeeb7012010-05-27 06:19:26 +00004269// MIPS ABI Implementation. This works for both little-endian and
4270// big-endian variants.
Chris Lattnerdce5ad02010-06-28 20:05:43 +00004271//===----------------------------------------------------------------------===//
4272
John McCallaeeb7012010-05-27 06:19:26 +00004273namespace {
Akira Hatanaka619e8872011-06-02 00:09:17 +00004274class MipsABIInfo : public ABIInfo {
Akira Hatanakac0e3b662011-11-02 23:14:57 +00004275 bool IsO32;
Akira Hatanakac359f202012-07-03 19:24:06 +00004276 unsigned MinABIStackAlignInBytes, StackAlignInBytes;
4277 void CoerceToIntArgs(uint64_t TySize,
4278 SmallVector<llvm::Type*, 8> &ArgList) const;
Akira Hatanaka91338cf2012-05-11 21:56:58 +00004279 llvm::Type* HandleAggregates(QualType Ty, uint64_t TySize) const;
Akira Hatanakac7ecc2e2012-01-04 03:34:42 +00004280 llvm::Type* returnAggregateInRegs(QualType RetTy, uint64_t Size) const;
Akira Hatanakaa33fd392012-01-09 19:31:25 +00004281 llvm::Type* getPaddingType(uint64_t Align, uint64_t Offset) const;
Akira Hatanaka619e8872011-06-02 00:09:17 +00004282public:
Akira Hatanakab551dd32011-11-03 00:05:50 +00004283 MipsABIInfo(CodeGenTypes &CGT, bool _IsO32) :
Akira Hatanakac359f202012-07-03 19:24:06 +00004284 ABIInfo(CGT), IsO32(_IsO32), MinABIStackAlignInBytes(IsO32 ? 4 : 8),
4285 StackAlignInBytes(IsO32 ? 8 : 16) {}
Akira Hatanaka619e8872011-06-02 00:09:17 +00004286
4287 ABIArgInfo classifyReturnType(QualType RetTy) const;
Akira Hatanakaf0cc2082012-01-07 00:25:33 +00004288 ABIArgInfo classifyArgumentType(QualType RetTy, uint64_t &Offset) const;
Akira Hatanaka619e8872011-06-02 00:09:17 +00004289 virtual void computeInfo(CGFunctionInfo &FI) const;
4290 virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
4291 CodeGenFunction &CGF) const;
4292};
4293
John McCallaeeb7012010-05-27 06:19:26 +00004294class MIPSTargetCodeGenInfo : public TargetCodeGenInfo {
Akira Hatanakae624fa02011-09-20 18:23:28 +00004295 unsigned SizeOfUnwindException;
John McCallaeeb7012010-05-27 06:19:26 +00004296public:
Akira Hatanakac0e3b662011-11-02 23:14:57 +00004297 MIPSTargetCodeGenInfo(CodeGenTypes &CGT, bool IsO32)
4298 : TargetCodeGenInfo(new MipsABIInfo(CGT, IsO32)),
4299 SizeOfUnwindException(IsO32 ? 24 : 32) {}
John McCallaeeb7012010-05-27 06:19:26 +00004300
4301 int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const {
4302 return 29;
4303 }
4304
Reed Kotler7dfd1822013-01-16 17:10:28 +00004305 void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
4306 CodeGen::CodeGenModule &CGM) const {
Reed Kotlerad4b8b42013-03-13 20:40:30 +00004307 const FunctionDecl *FD = dyn_cast<FunctionDecl>(D);
4308 if (!FD) return;
Rafael Espindolad8e6d6d2013-03-19 14:32:23 +00004309 llvm::Function *Fn = cast<llvm::Function>(GV);
Reed Kotlerad4b8b42013-03-13 20:40:30 +00004310 if (FD->hasAttr<Mips16Attr>()) {
4311 Fn->addFnAttr("mips16");
4312 }
4313 else if (FD->hasAttr<NoMips16Attr>()) {
4314 Fn->addFnAttr("nomips16");
4315 }
Reed Kotler7dfd1822013-01-16 17:10:28 +00004316 }
Reed Kotlerad4b8b42013-03-13 20:40:30 +00004317
John McCallaeeb7012010-05-27 06:19:26 +00004318 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
Michael J. Spencer8bea82f2010-08-25 18:17:27 +00004319 llvm::Value *Address) const;
John McCall49e34be2011-08-30 01:42:09 +00004320
4321 unsigned getSizeOfUnwindException() const {
Akira Hatanakae624fa02011-09-20 18:23:28 +00004322 return SizeOfUnwindException;
John McCall49e34be2011-08-30 01:42:09 +00004323 }
John McCallaeeb7012010-05-27 06:19:26 +00004324};
4325}
4326
Akira Hatanakac359f202012-07-03 19:24:06 +00004327void MipsABIInfo::CoerceToIntArgs(uint64_t TySize,
4328 SmallVector<llvm::Type*, 8> &ArgList) const {
4329 llvm::IntegerType *IntTy =
4330 llvm::IntegerType::get(getVMContext(), MinABIStackAlignInBytes * 8);
Akira Hatanaka91338cf2012-05-11 21:56:58 +00004331
4332 // Add (TySize / MinABIStackAlignInBytes) args of IntTy.
4333 for (unsigned N = TySize / (MinABIStackAlignInBytes * 8); N; --N)
4334 ArgList.push_back(IntTy);
4335
4336 // If necessary, add one more integer type to ArgList.
4337 unsigned R = TySize % (MinABIStackAlignInBytes * 8);
4338
4339 if (R)
4340 ArgList.push_back(llvm::IntegerType::get(getVMContext(), R));
Akira Hatanaka91338cf2012-05-11 21:56:58 +00004341}
4342
Akira Hatanakad5a257f2011-11-02 23:54:49 +00004343// In N32/64, an aligned double precision floating point field is passed in
4344// a register.
Akira Hatanaka91338cf2012-05-11 21:56:58 +00004345llvm::Type* MipsABIInfo::HandleAggregates(QualType Ty, uint64_t TySize) const {
Akira Hatanakac359f202012-07-03 19:24:06 +00004346 SmallVector<llvm::Type*, 8> ArgList, IntArgList;
4347
4348 if (IsO32) {
4349 CoerceToIntArgs(TySize, ArgList);
4350 return llvm::StructType::get(getVMContext(), ArgList);
4351 }
Akira Hatanakad5a257f2011-11-02 23:54:49 +00004352
Akira Hatanaka2afd23d2012-01-12 00:52:17 +00004353 if (Ty->isComplexType())
4354 return CGT.ConvertType(Ty);
Akira Hatanaka6d1080f2012-01-10 23:12:19 +00004355
Akira Hatanakaa34e9212012-02-09 19:54:16 +00004356 const RecordType *RT = Ty->getAs<RecordType>();
Akira Hatanakad5a257f2011-11-02 23:54:49 +00004357
Akira Hatanakac359f202012-07-03 19:24:06 +00004358 // Unions/vectors are passed in integer registers.
4359 if (!RT || !RT->isStructureOrClassType()) {
4360 CoerceToIntArgs(TySize, ArgList);
4361 return llvm::StructType::get(getVMContext(), ArgList);
4362 }
Akira Hatanakad5a257f2011-11-02 23:54:49 +00004363
4364 const RecordDecl *RD = RT->getDecl();
4365 const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
Akira Hatanaka91338cf2012-05-11 21:56:58 +00004366 assert(!(TySize % 8) && "Size of structure must be multiple of 8.");
Akira Hatanakad5a257f2011-11-02 23:54:49 +00004367
Akira Hatanakad5a257f2011-11-02 23:54:49 +00004368 uint64_t LastOffset = 0;
4369 unsigned idx = 0;
4370 llvm::IntegerType *I64 = llvm::IntegerType::get(getVMContext(), 64);
4371
Akira Hatanakaa34e9212012-02-09 19:54:16 +00004372 // Iterate over fields in the struct/class and check if there are any aligned
4373 // double fields.
Akira Hatanakad5a257f2011-11-02 23:54:49 +00004374 for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
4375 i != e; ++i, ++idx) {
David Blaikie262bc182012-04-30 02:36:29 +00004376 const QualType Ty = i->getType();
Akira Hatanakad5a257f2011-11-02 23:54:49 +00004377 const BuiltinType *BT = Ty->getAs<BuiltinType>();
4378
4379 if (!BT || BT->getKind() != BuiltinType::Double)
4380 continue;
4381
4382 uint64_t Offset = Layout.getFieldOffset(idx);
4383 if (Offset % 64) // Ignore doubles that are not aligned.
4384 continue;
4385
4386 // Add ((Offset - LastOffset) / 64) args of type i64.
4387 for (unsigned j = (Offset - LastOffset) / 64; j > 0; --j)
4388 ArgList.push_back(I64);
4389
4390 // Add double type.
4391 ArgList.push_back(llvm::Type::getDoubleTy(getVMContext()));
4392 LastOffset = Offset + 64;
4393 }
4394
Akira Hatanakac359f202012-07-03 19:24:06 +00004395 CoerceToIntArgs(TySize - LastOffset, IntArgList);
4396 ArgList.append(IntArgList.begin(), IntArgList.end());
Akira Hatanakad5a257f2011-11-02 23:54:49 +00004397
4398 return llvm::StructType::get(getVMContext(), ArgList);
4399}
4400
Akira Hatanakaa33fd392012-01-09 19:31:25 +00004401llvm::Type *MipsABIInfo::getPaddingType(uint64_t Align, uint64_t Offset) const {
Akira Hatanaka91338cf2012-05-11 21:56:58 +00004402 assert((Offset % MinABIStackAlignInBytes) == 0);
Akira Hatanakaa33fd392012-01-09 19:31:25 +00004403
Akira Hatanaka91338cf2012-05-11 21:56:58 +00004404 if ((Align - 1) & Offset)
4405 return llvm::IntegerType::get(getVMContext(), MinABIStackAlignInBytes * 8);
4406
4407 return 0;
Akira Hatanakaa33fd392012-01-09 19:31:25 +00004408}
Akira Hatanaka9659d592012-01-10 22:44:52 +00004409
Akira Hatanakaf0cc2082012-01-07 00:25:33 +00004410ABIArgInfo
4411MipsABIInfo::classifyArgumentType(QualType Ty, uint64_t &Offset) const {
Akira Hatanakaa33fd392012-01-09 19:31:25 +00004412 uint64_t OrigOffset = Offset;
Akira Hatanaka91338cf2012-05-11 21:56:58 +00004413 uint64_t TySize = getContext().getTypeSize(Ty);
Akira Hatanakaa33fd392012-01-09 19:31:25 +00004414 uint64_t Align = getContext().getTypeAlign(Ty) / 8;
Akira Hatanaka91338cf2012-05-11 21:56:58 +00004415
Akira Hatanakac359f202012-07-03 19:24:06 +00004416 Align = std::min(std::max(Align, (uint64_t)MinABIStackAlignInBytes),
4417 (uint64_t)StackAlignInBytes);
Akira Hatanaka91338cf2012-05-11 21:56:58 +00004418 Offset = llvm::RoundUpToAlignment(Offset, Align);
4419 Offset += llvm::RoundUpToAlignment(TySize, Align * 8) / 8;
Akira Hatanakaa33fd392012-01-09 19:31:25 +00004420
Akira Hatanakac359f202012-07-03 19:24:06 +00004421 if (isAggregateTypeForABI(Ty) || Ty->isVectorType()) {
Akira Hatanaka619e8872011-06-02 00:09:17 +00004422 // Ignore empty aggregates.
Akira Hatanakaf0cc2082012-01-07 00:25:33 +00004423 if (TySize == 0)
Akira Hatanaka619e8872011-06-02 00:09:17 +00004424 return ABIArgInfo::getIgnore();
4425
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +00004426 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, CGT)) {
Akira Hatanaka91338cf2012-05-11 21:56:58 +00004427 Offset = OrigOffset + MinABIStackAlignInBytes;
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +00004428 return ABIArgInfo::getIndirect(0, RAA == CGCXXABI::RAA_DirectInMemory);
Akira Hatanakaf0cc2082012-01-07 00:25:33 +00004429 }
Akira Hatanaka511949b2011-08-01 18:09:58 +00004430
Akira Hatanaka91338cf2012-05-11 21:56:58 +00004431 // If we have reached here, aggregates are passed directly by coercing to
4432 // another structure type. Padding is inserted if the offset of the
4433 // aggregate is unaligned.
4434 return ABIArgInfo::getDirect(HandleAggregates(Ty, TySize), 0,
4435 getPaddingType(Align, OrigOffset));
Akira Hatanaka619e8872011-06-02 00:09:17 +00004436 }
4437
4438 // Treat an enum type as its underlying type.
4439 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
4440 Ty = EnumTy->getDecl()->getIntegerType();
4441
Akira Hatanakaa33fd392012-01-09 19:31:25 +00004442 if (Ty->isPromotableIntegerType())
4443 return ABIArgInfo::getExtend();
4444
Akira Hatanaka4055cfc2013-01-24 21:47:33 +00004445 return ABIArgInfo::getDirect(0, 0,
4446 IsO32 ? 0 : getPaddingType(Align, OrigOffset));
Akira Hatanaka619e8872011-06-02 00:09:17 +00004447}
4448
Akira Hatanakac7ecc2e2012-01-04 03:34:42 +00004449llvm::Type*
4450MipsABIInfo::returnAggregateInRegs(QualType RetTy, uint64_t Size) const {
Akira Hatanakada54ff32012-02-09 18:49:26 +00004451 const RecordType *RT = RetTy->getAs<RecordType>();
Akira Hatanakac359f202012-07-03 19:24:06 +00004452 SmallVector<llvm::Type*, 8> RTList;
Akira Hatanakac7ecc2e2012-01-04 03:34:42 +00004453
Akira Hatanakada54ff32012-02-09 18:49:26 +00004454 if (RT && RT->isStructureOrClassType()) {
Akira Hatanakac7ecc2e2012-01-04 03:34:42 +00004455 const RecordDecl *RD = RT->getDecl();
Akira Hatanakada54ff32012-02-09 18:49:26 +00004456 const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
4457 unsigned FieldCnt = Layout.getFieldCount();
Akira Hatanakac7ecc2e2012-01-04 03:34:42 +00004458
Akira Hatanakada54ff32012-02-09 18:49:26 +00004459 // N32/64 returns struct/classes in floating point registers if the
4460 // following conditions are met:
4461 // 1. The size of the struct/class is no larger than 128-bit.
4462 // 2. The struct/class has one or two fields all of which are floating
4463 // point types.
4464 // 3. The offset of the first field is zero (this follows what gcc does).
4465 //
4466 // Any other composite results are returned in integer registers.
4467 //
4468 if (FieldCnt && (FieldCnt <= 2) && !Layout.getFieldOffset(0)) {
4469 RecordDecl::field_iterator b = RD->field_begin(), e = RD->field_end();
4470 for (; b != e; ++b) {
David Blaikie262bc182012-04-30 02:36:29 +00004471 const BuiltinType *BT = b->getType()->getAs<BuiltinType>();
Akira Hatanakac7ecc2e2012-01-04 03:34:42 +00004472
Akira Hatanakada54ff32012-02-09 18:49:26 +00004473 if (!BT || !BT->isFloatingPoint())
4474 break;
Akira Hatanakac7ecc2e2012-01-04 03:34:42 +00004475
David Blaikie262bc182012-04-30 02:36:29 +00004476 RTList.push_back(CGT.ConvertType(b->getType()));
Akira Hatanakada54ff32012-02-09 18:49:26 +00004477 }
4478
4479 if (b == e)
4480 return llvm::StructType::get(getVMContext(), RTList,
4481 RD->hasAttr<PackedAttr>());
4482
4483 RTList.clear();
Akira Hatanakac7ecc2e2012-01-04 03:34:42 +00004484 }
Akira Hatanakac7ecc2e2012-01-04 03:34:42 +00004485 }
4486
Akira Hatanakac359f202012-07-03 19:24:06 +00004487 CoerceToIntArgs(Size, RTList);
Akira Hatanakac7ecc2e2012-01-04 03:34:42 +00004488 return llvm::StructType::get(getVMContext(), RTList);
4489}
4490
Akira Hatanaka619e8872011-06-02 00:09:17 +00004491ABIArgInfo MipsABIInfo::classifyReturnType(QualType RetTy) const {
Akira Hatanakaa8536c02012-01-23 23:18:57 +00004492 uint64_t Size = getContext().getTypeSize(RetTy);
4493
4494 if (RetTy->isVoidType() || Size == 0)
Akira Hatanaka619e8872011-06-02 00:09:17 +00004495 return ABIArgInfo::getIgnore();
4496
Akira Hatanaka8aeb1472012-05-11 21:01:17 +00004497 if (isAggregateTypeForABI(RetTy) || RetTy->isVectorType()) {
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +00004498 if (isRecordReturnIndirect(RetTy, CGT))
4499 return ABIArgInfo::getIndirect(0);
4500
Akira Hatanakac7ecc2e2012-01-04 03:34:42 +00004501 if (Size <= 128) {
4502 if (RetTy->isAnyComplexType())
4503 return ABIArgInfo::getDirect();
4504
Akira Hatanakac359f202012-07-03 19:24:06 +00004505 // O32 returns integer vectors in registers.
4506 if (IsO32 && RetTy->isVectorType() && !RetTy->hasFloatingRepresentation())
4507 return ABIArgInfo::getDirect(returnAggregateInRegs(RetTy, Size));
4508
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +00004509 if (!IsO32)
Akira Hatanakac7ecc2e2012-01-04 03:34:42 +00004510 return ABIArgInfo::getDirect(returnAggregateInRegs(RetTy, Size));
4511 }
Akira Hatanaka619e8872011-06-02 00:09:17 +00004512
4513 return ABIArgInfo::getIndirect(0);
4514 }
4515
4516 // Treat an enum type as its underlying type.
4517 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
4518 RetTy = EnumTy->getDecl()->getIntegerType();
4519
4520 return (RetTy->isPromotableIntegerType() ?
4521 ABIArgInfo::getExtend() : ABIArgInfo::getDirect());
4522}
4523
4524void MipsABIInfo::computeInfo(CGFunctionInfo &FI) const {
Akira Hatanakacc662542012-01-12 01:10:09 +00004525 ABIArgInfo &RetInfo = FI.getReturnInfo();
4526 RetInfo = classifyReturnType(FI.getReturnType());
4527
4528 // Check if a pointer to an aggregate is passed as a hidden argument.
Akira Hatanaka91338cf2012-05-11 21:56:58 +00004529 uint64_t Offset = RetInfo.isIndirect() ? MinABIStackAlignInBytes : 0;
Akira Hatanakacc662542012-01-12 01:10:09 +00004530
Akira Hatanaka619e8872011-06-02 00:09:17 +00004531 for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
4532 it != ie; ++it)
Akira Hatanakaf0cc2082012-01-07 00:25:33 +00004533 it->info = classifyArgumentType(it->type, Offset);
Akira Hatanaka619e8872011-06-02 00:09:17 +00004534}
4535
4536llvm::Value* MipsABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
4537 CodeGenFunction &CGF) const {
Chris Lattner8b418682012-02-07 00:39:47 +00004538 llvm::Type *BP = CGF.Int8PtrTy;
4539 llvm::Type *BPP = CGF.Int8PtrPtrTy;
Akira Hatanakac35e69d2011-08-01 20:48:01 +00004540
4541 CGBuilderTy &Builder = CGF.Builder;
4542 llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP, "ap");
4543 llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur");
Akira Hatanaka8f675e42012-01-23 23:59:52 +00004544 int64_t TypeAlign = getContext().getTypeAlign(Ty) / 8;
Akira Hatanakac35e69d2011-08-01 20:48:01 +00004545 llvm::Type *PTy = llvm::PointerType::getUnqual(CGF.ConvertType(Ty));
4546 llvm::Value *AddrTyped;
John McCall64aa4b32013-04-16 22:48:15 +00004547 unsigned PtrWidth = getTarget().getPointerWidth(0);
Akira Hatanaka8f675e42012-01-23 23:59:52 +00004548 llvm::IntegerType *IntTy = (PtrWidth == 32) ? CGF.Int32Ty : CGF.Int64Ty;
Akira Hatanakac35e69d2011-08-01 20:48:01 +00004549
4550 if (TypeAlign > MinABIStackAlignInBytes) {
Akira Hatanaka8f675e42012-01-23 23:59:52 +00004551 llvm::Value *AddrAsInt = CGF.Builder.CreatePtrToInt(Addr, IntTy);
4552 llvm::Value *Inc = llvm::ConstantInt::get(IntTy, TypeAlign - 1);
4553 llvm::Value *Mask = llvm::ConstantInt::get(IntTy, -TypeAlign);
4554 llvm::Value *Add = CGF.Builder.CreateAdd(AddrAsInt, Inc);
Akira Hatanakac35e69d2011-08-01 20:48:01 +00004555 llvm::Value *And = CGF.Builder.CreateAnd(Add, Mask);
4556 AddrTyped = CGF.Builder.CreateIntToPtr(And, PTy);
4557 }
4558 else
4559 AddrTyped = Builder.CreateBitCast(Addr, PTy);
4560
4561 llvm::Value *AlignedAddr = Builder.CreateBitCast(AddrTyped, BP);
Akira Hatanaka8f675e42012-01-23 23:59:52 +00004562 TypeAlign = std::max((unsigned)TypeAlign, MinABIStackAlignInBytes);
Akira Hatanakac35e69d2011-08-01 20:48:01 +00004563 uint64_t Offset =
4564 llvm::RoundUpToAlignment(CGF.getContext().getTypeSize(Ty) / 8, TypeAlign);
4565 llvm::Value *NextAddr =
Akira Hatanaka8f675e42012-01-23 23:59:52 +00004566 Builder.CreateGEP(AlignedAddr, llvm::ConstantInt::get(IntTy, Offset),
Akira Hatanakac35e69d2011-08-01 20:48:01 +00004567 "ap.next");
4568 Builder.CreateStore(NextAddr, VAListAddrAsBPP);
4569
4570 return AddrTyped;
Akira Hatanaka619e8872011-06-02 00:09:17 +00004571}
4572
John McCallaeeb7012010-05-27 06:19:26 +00004573bool
4574MIPSTargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
4575 llvm::Value *Address) const {
4576 // This information comes from gcc's implementation, which seems to
4577 // as canonical as it gets.
4578
John McCallaeeb7012010-05-27 06:19:26 +00004579 // Everything on MIPS is 4 bytes. Double-precision FP registers
4580 // are aliased to pairs of single-precision FP registers.
Chris Lattner8b418682012-02-07 00:39:47 +00004581 llvm::Value *Four8 = llvm::ConstantInt::get(CGF.Int8Ty, 4);
John McCallaeeb7012010-05-27 06:19:26 +00004582
4583 // 0-31 are the general purpose registers, $0 - $31.
4584 // 32-63 are the floating-point registers, $f0 - $f31.
4585 // 64 and 65 are the multiply/divide registers, $hi and $lo.
4586 // 66 is the (notional, I think) register for signal-handler return.
Chris Lattner8b418682012-02-07 00:39:47 +00004587 AssignToArrayRange(CGF.Builder, Address, Four8, 0, 65);
John McCallaeeb7012010-05-27 06:19:26 +00004588
4589 // 67-74 are the floating-point status registers, $fcc0 - $fcc7.
4590 // They are one bit wide and ignored here.
4591
4592 // 80-111 are the coprocessor 0 registers, $c0r0 - $c0r31.
4593 // (coprocessor 1 is the FP unit)
4594 // 112-143 are the coprocessor 2 registers, $c2r0 - $c2r31.
4595 // 144-175 are the coprocessor 3 registers, $c3r0 - $c3r31.
4596 // 176-181 are the DSP accumulator registers.
Chris Lattner8b418682012-02-07 00:39:47 +00004597 AssignToArrayRange(CGF.Builder, Address, Four8, 80, 181);
John McCallaeeb7012010-05-27 06:19:26 +00004598 return false;
4599}
4600
Peter Collingbourne2f7aa992011-10-13 16:24:41 +00004601//===----------------------------------------------------------------------===//
4602// TCE ABI Implementation (see http://tce.cs.tut.fi). Uses mostly the defaults.
4603// Currently subclassed only to implement custom OpenCL C function attribute
4604// handling.
4605//===----------------------------------------------------------------------===//
4606
4607namespace {
4608
4609class TCETargetCodeGenInfo : public DefaultTargetCodeGenInfo {
4610public:
4611 TCETargetCodeGenInfo(CodeGenTypes &CGT)
4612 : DefaultTargetCodeGenInfo(CGT) {}
4613
4614 virtual void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
4615 CodeGen::CodeGenModule &M) const;
4616};
4617
4618void TCETargetCodeGenInfo::SetTargetAttributes(const Decl *D,
4619 llvm::GlobalValue *GV,
4620 CodeGen::CodeGenModule &M) const {
4621 const FunctionDecl *FD = dyn_cast<FunctionDecl>(D);
4622 if (!FD) return;
4623
4624 llvm::Function *F = cast<llvm::Function>(GV);
4625
David Blaikie4e4d0842012-03-11 07:00:24 +00004626 if (M.getLangOpts().OpenCL) {
Peter Collingbourne2f7aa992011-10-13 16:24:41 +00004627 if (FD->hasAttr<OpenCLKernelAttr>()) {
4628 // OpenCL C Kernel functions are not subject to inlining
Bill Wendling72390b32012-12-20 19:27:06 +00004629 F->addFnAttr(llvm::Attribute::NoInline);
Peter Collingbourne2f7aa992011-10-13 16:24:41 +00004630
4631 if (FD->hasAttr<ReqdWorkGroupSizeAttr>()) {
4632
4633 // Convert the reqd_work_group_size() attributes to metadata.
4634 llvm::LLVMContext &Context = F->getContext();
4635 llvm::NamedMDNode *OpenCLMetadata =
4636 M.getModule().getOrInsertNamedMetadata("opencl.kernel_wg_size_info");
4637
4638 SmallVector<llvm::Value*, 5> Operands;
4639 Operands.push_back(F);
4640
Chris Lattner8b418682012-02-07 00:39:47 +00004641 Operands.push_back(llvm::Constant::getIntegerValue(M.Int32Ty,
4642 llvm::APInt(32,
4643 FD->getAttr<ReqdWorkGroupSizeAttr>()->getXDim())));
4644 Operands.push_back(llvm::Constant::getIntegerValue(M.Int32Ty,
4645 llvm::APInt(32,
Peter Collingbourne2f7aa992011-10-13 16:24:41 +00004646 FD->getAttr<ReqdWorkGroupSizeAttr>()->getYDim())));
Chris Lattner8b418682012-02-07 00:39:47 +00004647 Operands.push_back(llvm::Constant::getIntegerValue(M.Int32Ty,
4648 llvm::APInt(32,
Peter Collingbourne2f7aa992011-10-13 16:24:41 +00004649 FD->getAttr<ReqdWorkGroupSizeAttr>()->getZDim())));
4650
4651 // Add a boolean constant operand for "required" (true) or "hint" (false)
4652 // for implementing the work_group_size_hint attr later. Currently
4653 // always true as the hint is not yet implemented.
Chris Lattner8b418682012-02-07 00:39:47 +00004654 Operands.push_back(llvm::ConstantInt::getTrue(Context));
Peter Collingbourne2f7aa992011-10-13 16:24:41 +00004655 OpenCLMetadata->addOperand(llvm::MDNode::get(Context, Operands));
4656 }
4657 }
4658 }
4659}
4660
4661}
John McCallaeeb7012010-05-27 06:19:26 +00004662
Tony Linthicum96319392011-12-12 21:14:55 +00004663//===----------------------------------------------------------------------===//
4664// Hexagon ABI Implementation
4665//===----------------------------------------------------------------------===//
4666
4667namespace {
4668
4669class HexagonABIInfo : public ABIInfo {
4670
4671
4672public:
4673 HexagonABIInfo(CodeGenTypes &CGT) : ABIInfo(CGT) {}
4674
4675private:
4676
4677 ABIArgInfo classifyReturnType(QualType RetTy) const;
4678 ABIArgInfo classifyArgumentType(QualType RetTy) const;
4679
4680 virtual void computeInfo(CGFunctionInfo &FI) const;
4681
4682 virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
4683 CodeGenFunction &CGF) const;
4684};
4685
4686class HexagonTargetCodeGenInfo : public TargetCodeGenInfo {
4687public:
4688 HexagonTargetCodeGenInfo(CodeGenTypes &CGT)
4689 :TargetCodeGenInfo(new HexagonABIInfo(CGT)) {}
4690
4691 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const {
4692 return 29;
4693 }
4694};
4695
4696}
4697
4698void HexagonABIInfo::computeInfo(CGFunctionInfo &FI) const {
4699 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
4700 for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
4701 it != ie; ++it)
4702 it->info = classifyArgumentType(it->type);
4703}
4704
4705ABIArgInfo HexagonABIInfo::classifyArgumentType(QualType Ty) const {
4706 if (!isAggregateTypeForABI(Ty)) {
4707 // Treat an enum type as its underlying type.
4708 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
4709 Ty = EnumTy->getDecl()->getIntegerType();
4710
4711 return (Ty->isPromotableIntegerType() ?
4712 ABIArgInfo::getExtend() : ABIArgInfo::getDirect());
4713 }
4714
4715 // Ignore empty records.
4716 if (isEmptyRecord(getContext(), Ty, true))
4717 return ABIArgInfo::getIgnore();
4718
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +00004719 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, CGT))
4720 return ABIArgInfo::getIndirect(0, RAA == CGCXXABI::RAA_DirectInMemory);
Tony Linthicum96319392011-12-12 21:14:55 +00004721
4722 uint64_t Size = getContext().getTypeSize(Ty);
4723 if (Size > 64)
4724 return ABIArgInfo::getIndirect(0, /*ByVal=*/true);
4725 // Pass in the smallest viable integer type.
4726 else if (Size > 32)
4727 return ABIArgInfo::getDirect(llvm::Type::getInt64Ty(getVMContext()));
4728 else if (Size > 16)
4729 return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
4730 else if (Size > 8)
4731 return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext()));
4732 else
4733 return ABIArgInfo::getDirect(llvm::Type::getInt8Ty(getVMContext()));
4734}
4735
4736ABIArgInfo HexagonABIInfo::classifyReturnType(QualType RetTy) const {
4737 if (RetTy->isVoidType())
4738 return ABIArgInfo::getIgnore();
4739
4740 // Large vector types should be returned via memory.
4741 if (RetTy->isVectorType() && getContext().getTypeSize(RetTy) > 64)
4742 return ABIArgInfo::getIndirect(0);
4743
4744 if (!isAggregateTypeForABI(RetTy)) {
4745 // Treat an enum type as its underlying type.
4746 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
4747 RetTy = EnumTy->getDecl()->getIntegerType();
4748
4749 return (RetTy->isPromotableIntegerType() ?
4750 ABIArgInfo::getExtend() : ABIArgInfo::getDirect());
4751 }
4752
4753 // Structures with either a non-trivial destructor or a non-trivial
4754 // copy constructor are always indirect.
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +00004755 if (isRecordReturnIndirect(RetTy, CGT))
Tony Linthicum96319392011-12-12 21:14:55 +00004756 return ABIArgInfo::getIndirect(0, /*ByVal=*/false);
4757
4758 if (isEmptyRecord(getContext(), RetTy, true))
4759 return ABIArgInfo::getIgnore();
4760
4761 // Aggregates <= 8 bytes are returned in r0; other aggregates
4762 // are returned indirectly.
4763 uint64_t Size = getContext().getTypeSize(RetTy);
4764 if (Size <= 64) {
4765 // Return in the smallest viable integer type.
4766 if (Size <= 8)
4767 return ABIArgInfo::getDirect(llvm::Type::getInt8Ty(getVMContext()));
4768 if (Size <= 16)
4769 return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext()));
4770 if (Size <= 32)
4771 return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
4772 return ABIArgInfo::getDirect(llvm::Type::getInt64Ty(getVMContext()));
4773 }
4774
4775 return ABIArgInfo::getIndirect(0, /*ByVal=*/true);
4776}
4777
4778llvm::Value *HexagonABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
Chris Lattner8b418682012-02-07 00:39:47 +00004779 CodeGenFunction &CGF) const {
Tony Linthicum96319392011-12-12 21:14:55 +00004780 // FIXME: Need to handle alignment
Chris Lattner8b418682012-02-07 00:39:47 +00004781 llvm::Type *BPP = CGF.Int8PtrPtrTy;
Tony Linthicum96319392011-12-12 21:14:55 +00004782
4783 CGBuilderTy &Builder = CGF.Builder;
4784 llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP,
4785 "ap");
4786 llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur");
4787 llvm::Type *PTy =
4788 llvm::PointerType::getUnqual(CGF.ConvertType(Ty));
4789 llvm::Value *AddrTyped = Builder.CreateBitCast(Addr, PTy);
4790
4791 uint64_t Offset =
4792 llvm::RoundUpToAlignment(CGF.getContext().getTypeSize(Ty) / 8, 4);
4793 llvm::Value *NextAddr =
4794 Builder.CreateGEP(Addr, llvm::ConstantInt::get(CGF.Int32Ty, Offset),
4795 "ap.next");
4796 Builder.CreateStore(NextAddr, VAListAddrAsBPP);
4797
4798 return AddrTyped;
4799}
4800
4801
Chris Lattnerea044322010-07-29 02:01:43 +00004802const TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() {
Anton Korobeynikov82d0a412010-01-10 12:58:08 +00004803 if (TheTargetCodeGenInfo)
4804 return *TheTargetCodeGenInfo;
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00004805
John McCall64aa4b32013-04-16 22:48:15 +00004806 const llvm::Triple &Triple = getTarget().getTriple();
Daniel Dunbar1752ee42009-08-24 09:10:05 +00004807 switch (Triple.getArch()) {
Daniel Dunbar2c0843f2009-08-24 08:52:16 +00004808 default:
Chris Lattnerea044322010-07-29 02:01:43 +00004809 return *(TheTargetCodeGenInfo = new DefaultTargetCodeGenInfo(Types));
Daniel Dunbar2c0843f2009-08-24 08:52:16 +00004810
Derek Schuff9ed63f82012-09-06 17:37:28 +00004811 case llvm::Triple::le32:
4812 return *(TheTargetCodeGenInfo = new PNaClTargetCodeGenInfo(Types));
John McCallaeeb7012010-05-27 06:19:26 +00004813 case llvm::Triple::mips:
4814 case llvm::Triple::mipsel:
Akira Hatanakac0e3b662011-11-02 23:14:57 +00004815 return *(TheTargetCodeGenInfo = new MIPSTargetCodeGenInfo(Types, true));
John McCallaeeb7012010-05-27 06:19:26 +00004816
Akira Hatanaka8c6dfbe2011-09-20 18:30:57 +00004817 case llvm::Triple::mips64:
4818 case llvm::Triple::mips64el:
Akira Hatanakac0e3b662011-11-02 23:14:57 +00004819 return *(TheTargetCodeGenInfo = new MIPSTargetCodeGenInfo(Types, false));
Akira Hatanaka8c6dfbe2011-09-20 18:30:57 +00004820
Tim Northoverc264e162013-01-31 12:13:10 +00004821 case llvm::Triple::aarch64:
4822 return *(TheTargetCodeGenInfo = new AArch64TargetCodeGenInfo(Types));
4823
Daniel Dunbar34d91fd2009-09-12 00:59:49 +00004824 case llvm::Triple::arm:
4825 case llvm::Triple::thumb:
Sandeep Patel34c1af82011-04-05 00:23:47 +00004826 {
4827 ARMABIInfo::ABIKind Kind = ARMABIInfo::AAPCS;
John McCall64aa4b32013-04-16 22:48:15 +00004828 if (strcmp(getTarget().getABI(), "apcs-gnu") == 0)
Sandeep Patel34c1af82011-04-05 00:23:47 +00004829 Kind = ARMABIInfo::APCS;
David Tweedb16abb12012-10-25 13:33:01 +00004830 else if (CodeGenOpts.FloatABI == "hard" ||
John McCall64aa4b32013-04-16 22:48:15 +00004831 (CodeGenOpts.FloatABI != "soft" &&
4832 Triple.getEnvironment() == llvm::Triple::GNUEABIHF))
Sandeep Patel34c1af82011-04-05 00:23:47 +00004833 Kind = ARMABIInfo::AAPCS_VFP;
4834
Derek Schuff263366f2012-10-16 22:30:41 +00004835 switch (Triple.getOS()) {
Eli Bendersky441d9f72012-12-04 18:38:10 +00004836 case llvm::Triple::NaCl:
Derek Schuff263366f2012-10-16 22:30:41 +00004837 return *(TheTargetCodeGenInfo =
4838 new NaClARMTargetCodeGenInfo(Types, Kind));
4839 default:
4840 return *(TheTargetCodeGenInfo =
4841 new ARMTargetCodeGenInfo(Types, Kind));
4842 }
Sandeep Patel34c1af82011-04-05 00:23:47 +00004843 }
Daniel Dunbar34d91fd2009-09-12 00:59:49 +00004844
John McCallec853ba2010-03-11 00:10:12 +00004845 case llvm::Triple::ppc:
Chris Lattnerea044322010-07-29 02:01:43 +00004846 return *(TheTargetCodeGenInfo = new PPC32TargetCodeGenInfo(Types));
Roman Divacky0fbc4b92012-05-09 18:22:46 +00004847 case llvm::Triple::ppc64:
Bill Schmidt2fc107f2012-10-03 19:18:57 +00004848 if (Triple.isOSBinFormatELF())
4849 return *(TheTargetCodeGenInfo = new PPC64_SVR4_TargetCodeGenInfo(Types));
4850 else
4851 return *(TheTargetCodeGenInfo = new PPC64TargetCodeGenInfo(Types));
John McCallec853ba2010-03-11 00:10:12 +00004852
Peter Collingbourneedb66f32012-05-20 23:28:41 +00004853 case llvm::Triple::nvptx:
4854 case llvm::Triple::nvptx64:
Justin Holewinski2c585b92012-05-24 17:43:12 +00004855 return *(TheTargetCodeGenInfo = new NVPTXTargetCodeGenInfo(Types));
Justin Holewinski0259c3a2011-04-22 11:10:38 +00004856
Wesley Peck276fdf42010-12-19 19:57:51 +00004857 case llvm::Triple::mblaze:
4858 return *(TheTargetCodeGenInfo = new MBlazeTargetCodeGenInfo(Types));
4859
Anton Korobeynikov82d0a412010-01-10 12:58:08 +00004860 case llvm::Triple::msp430:
Chris Lattnerea044322010-07-29 02:01:43 +00004861 return *(TheTargetCodeGenInfo = new MSP430TargetCodeGenInfo(Types));
Daniel Dunbar34d91fd2009-09-12 00:59:49 +00004862
Peter Collingbourne2f7aa992011-10-13 16:24:41 +00004863 case llvm::Triple::tce:
4864 return *(TheTargetCodeGenInfo = new TCETargetCodeGenInfo(Types));
4865
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00004866 case llvm::Triple::x86: {
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00004867 if (Triple.isOSDarwin())
Anton Korobeynikov82d0a412010-01-10 12:58:08 +00004868 return *(TheTargetCodeGenInfo =
Chad Rosier1f1df1f2013-03-25 21:00:27 +00004869 new X86_32TargetCodeGenInfo(Types, true, true, false,
Rafael Espindolab48280b2012-07-31 02:44:24 +00004870 CodeGenOpts.NumRegisterParameters));
Daniel Dunbardb57a4c2011-04-19 21:43:27 +00004871
4872 switch (Triple.getOS()) {
Daniel Dunbar2c0843f2009-08-24 08:52:16 +00004873 case llvm::Triple::Cygwin:
Daniel Dunbar2c0843f2009-08-24 08:52:16 +00004874 case llvm::Triple::MinGW32:
Edward O'Callaghan727e2682009-10-21 11:58:24 +00004875 case llvm::Triple::AuroraUX:
4876 case llvm::Triple::DragonFly:
David Chisnall75c135a2009-09-03 01:48:05 +00004877 case llvm::Triple::FreeBSD:
Daniel Dunbar2c0843f2009-08-24 08:52:16 +00004878 case llvm::Triple::OpenBSD:
Eli Friedman42f74f22012-08-08 23:57:20 +00004879 case llvm::Triple::Bitrig:
Anton Korobeynikov82d0a412010-01-10 12:58:08 +00004880 return *(TheTargetCodeGenInfo =
Chad Rosier1f1df1f2013-03-25 21:00:27 +00004881 new X86_32TargetCodeGenInfo(Types, false, true, false,
Rafael Espindolab48280b2012-07-31 02:44:24 +00004882 CodeGenOpts.NumRegisterParameters));
Eli Friedman55fc7e22012-01-25 22:46:34 +00004883
4884 case llvm::Triple::Win32:
4885 return *(TheTargetCodeGenInfo =
Chad Rosier1f1df1f2013-03-25 21:00:27 +00004886 new X86_32TargetCodeGenInfo(Types, false, true, true,
Rafael Espindolab48280b2012-07-31 02:44:24 +00004887 CodeGenOpts.NumRegisterParameters));
Daniel Dunbar2c0843f2009-08-24 08:52:16 +00004888
4889 default:
Anton Korobeynikov82d0a412010-01-10 12:58:08 +00004890 return *(TheTargetCodeGenInfo =
Chad Rosier1f1df1f2013-03-25 21:00:27 +00004891 new X86_32TargetCodeGenInfo(Types, false, false, false,
Rafael Espindolab48280b2012-07-31 02:44:24 +00004892 CodeGenOpts.NumRegisterParameters));
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00004893 }
Eli Friedmanc3e0fb42011-07-08 23:31:17 +00004894 }
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00004895
Eli Friedmanee1ad992011-12-02 00:11:43 +00004896 case llvm::Triple::x86_64: {
John McCall64aa4b32013-04-16 22:48:15 +00004897 bool HasAVX = strcmp(getTarget().getABI(), "avx") == 0;
Eli Friedmanee1ad992011-12-02 00:11:43 +00004898
Chris Lattnerf13721d2010-08-31 16:44:54 +00004899 switch (Triple.getOS()) {
4900 case llvm::Triple::Win32:
NAKAMURA Takumi0aa20572011-02-17 08:51:38 +00004901 case llvm::Triple::MinGW32:
Chris Lattnerf13721d2010-08-31 16:44:54 +00004902 case llvm::Triple::Cygwin:
4903 return *(TheTargetCodeGenInfo = new WinX86_64TargetCodeGenInfo(Types));
Eli Bendersky441d9f72012-12-04 18:38:10 +00004904 case llvm::Triple::NaCl:
John McCall64aa4b32013-04-16 22:48:15 +00004905 return *(TheTargetCodeGenInfo = new NaClX86_64TargetCodeGenInfo(Types,
4906 HasAVX));
Chris Lattnerf13721d2010-08-31 16:44:54 +00004907 default:
Eli Friedmanee1ad992011-12-02 00:11:43 +00004908 return *(TheTargetCodeGenInfo = new X86_64TargetCodeGenInfo(Types,
4909 HasAVX));
Chris Lattnerf13721d2010-08-31 16:44:54 +00004910 }
Daniel Dunbar2c0843f2009-08-24 08:52:16 +00004911 }
Tony Linthicum96319392011-12-12 21:14:55 +00004912 case llvm::Triple::hexagon:
4913 return *(TheTargetCodeGenInfo = new HexagonTargetCodeGenInfo(Types));
Eli Friedmanee1ad992011-12-02 00:11:43 +00004914 }
Anton Korobeynikovc4a59eb2009-06-05 22:08:42 +00004915}