blob: c08b93bd84aa1f20682c7394933c88fedeb05325 [file] [log] [blame]
Daniel Dunbara8f02052008-09-08 21:33:45 +00001//===----- CGCall.h - Encapsulate calling convention details ----*- C++ -*-===//
2//
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
15#include "CGCall.h"
16#include "CodeGenFunction.h"
Daniel Dunbar3ef2e852008-09-10 00:41:16 +000017#include "CodeGenModule.h"
Daniel Dunbarf98eeff2008-10-13 17:02:26 +000018#include "clang/Basic/TargetInfo.h"
Daniel Dunbara8f02052008-09-08 21:33:45 +000019#include "clang/AST/ASTContext.h"
20#include "clang/AST/Decl.h"
21#include "clang/AST/DeclObjC.h"
Daniel Dunbar51a2d192009-01-29 08:13:58 +000022#include "clang/AST/RecordLayout.h"
Daniel Dunbar04d35782008-09-17 00:51:38 +000023#include "llvm/ADT/StringExtras.h"
Devang Patel98bfe502008-09-24 01:01:36 +000024#include "llvm/Attributes.h"
Daniel Dunbare09a9692009-01-24 08:32:22 +000025#include "llvm/Support/CommandLine.h"
Daniel Dunbar708d8a82009-01-27 01:36:03 +000026#include "llvm/Target/TargetData.h"
Daniel Dunbara8f02052008-09-08 21:33:45 +000027using namespace clang;
28using namespace CodeGen;
29
30/***/
31
Daniel Dunbara8f02052008-09-08 21:33:45 +000032// FIXME: Use iterator and sidestep silly type array creation.
33
Daniel Dunbar3ad1f072008-09-10 04:01:49 +000034CGFunctionInfo::CGFunctionInfo(const FunctionTypeNoProto *FTNP)
35 : IsVariadic(true)
36{
37 ArgTypes.push_back(FTNP->getResultType());
38}
39
40CGFunctionInfo::CGFunctionInfo(const FunctionTypeProto *FTP)
41 : IsVariadic(FTP->isVariadic())
42{
43 ArgTypes.push_back(FTP->getResultType());
44 for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
45 ArgTypes.push_back(FTP->getArgType(i));
46}
47
48// FIXME: Is there really any reason to have this still?
Daniel Dunbara8f02052008-09-08 21:33:45 +000049CGFunctionInfo::CGFunctionInfo(const FunctionDecl *FD)
Daniel Dunbara8f02052008-09-08 21:33:45 +000050{
51 const FunctionType *FTy = FD->getType()->getAsFunctionType();
52 const FunctionTypeProto *FTP = dyn_cast<FunctionTypeProto>(FTy);
Daniel Dunbar3ad1f072008-09-10 04:01:49 +000053
Daniel Dunbara8f02052008-09-08 21:33:45 +000054 ArgTypes.push_back(FTy->getResultType());
Daniel Dunbar3ad1f072008-09-10 04:01:49 +000055 if (FTP) {
56 IsVariadic = FTP->isVariadic();
Daniel Dunbara8f02052008-09-08 21:33:45 +000057 for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i)
58 ArgTypes.push_back(FTP->getArgType(i));
Daniel Dunbar3ad1f072008-09-10 04:01:49 +000059 } else {
60 IsVariadic = true;
61 }
Daniel Dunbara8f02052008-09-08 21:33:45 +000062}
63
64CGFunctionInfo::CGFunctionInfo(const ObjCMethodDecl *MD,
65 const ASTContext &Context)
Daniel Dunbar3ad1f072008-09-10 04:01:49 +000066 : IsVariadic(MD->isVariadic())
Daniel Dunbara8f02052008-09-08 21:33:45 +000067{
68 ArgTypes.push_back(MD->getResultType());
69 ArgTypes.push_back(MD->getSelfDecl()->getType());
70 ArgTypes.push_back(Context.getObjCSelType());
71 for (ObjCMethodDecl::param_const_iterator i = MD->param_begin(),
72 e = MD->param_end(); i != e; ++i)
73 ArgTypes.push_back((*i)->getType());
74}
75
Daniel Dunbarebbb8f32009-01-31 02:19:00 +000076CGFunctionInfo::CGFunctionInfo(QualType ResTy, const CallArgList &Args,
77 bool _IsVariadic)
78 : IsVariadic(_IsVariadic)
79{
80 ArgTypes.push_back(ResTy);
81 for (CallArgList::const_iterator i = Args.begin(), e = Args.end();
82 i != e; ++i)
83 ArgTypes.push_back(i->second);
84}
85
Daniel Dunbarbccb0682008-09-10 00:32:18 +000086ArgTypeIterator CGFunctionInfo::argtypes_begin() const {
87 return ArgTypes.begin();
88}
89
90ArgTypeIterator CGFunctionInfo::argtypes_end() const {
91 return ArgTypes.end();
Daniel Dunbara8f02052008-09-08 21:33:45 +000092}
93
94/***/
95
Daniel Dunbar22e30052008-09-11 01:48:57 +000096/// ABIArgInfo - Helper class to encapsulate information about how a
97/// specific C type should be passed to or returned from a function.
Daniel Dunbare126ab12008-09-10 02:41:04 +000098class ABIArgInfo {
99public:
100 enum Kind {
101 Default,
Daniel Dunbar17d35372008-12-18 04:52:14 +0000102 StructRet, /// Only valid for return values. The return value
103 /// should be passed through a pointer to a caller
104 /// allocated location passed as an implicit first
105 /// argument to the function.
Daniel Dunbar22e30052008-09-11 01:48:57 +0000106
Daniel Dunbar1358b202009-01-26 21:26:08 +0000107 Ignore, /// Ignore the argument (treat as void). Useful for
108 /// void and empty structs.
109
Daniel Dunbar04d35782008-09-17 00:51:38 +0000110 Coerce, /// Only valid for aggregate return types, the argument
111 /// should be accessed by coercion to a provided type.
Daniel Dunbar22e30052008-09-11 01:48:57 +0000112
113 ByVal, /// Only valid for aggregate argument types. The
114 /// structure should be passed "byval" with the
115 /// specified alignment (0 indicates default
116 /// alignment).
117
118 Expand, /// Only valid for aggregate argument types. The
119 /// structure should be expanded into consecutive
Daniel Dunbar04d35782008-09-17 00:51:38 +0000120 /// arguments for its constituent fields. Currently
121 /// expand is only allowed on structures whose fields
122 /// are all scalar types or are themselves expandable
123 /// types.
Daniel Dunbar22e30052008-09-11 01:48:57 +0000124
125 KindFirst=Default, KindLast=Expand
Daniel Dunbare126ab12008-09-10 02:41:04 +0000126 };
127
128private:
129 Kind TheKind;
Daniel Dunbar73d66602008-09-10 07:04:09 +0000130 const llvm::Type *TypeData;
Daniel Dunbar22e30052008-09-11 01:48:57 +0000131 unsigned UIntData;
Daniel Dunbare126ab12008-09-10 02:41:04 +0000132
Daniel Dunbar22e30052008-09-11 01:48:57 +0000133 ABIArgInfo(Kind K, const llvm::Type *TD=0,
134 unsigned UI=0) : TheKind(K),
135 TypeData(TD),
136 UIntData(0) {}
Daniel Dunbare126ab12008-09-10 02:41:04 +0000137public:
138 static ABIArgInfo getDefault() {
Daniel Dunbar22e30052008-09-11 01:48:57 +0000139 return ABIArgInfo(Default);
Daniel Dunbare126ab12008-09-10 02:41:04 +0000140 }
141 static ABIArgInfo getStructRet() {
Daniel Dunbar22e30052008-09-11 01:48:57 +0000142 return ABIArgInfo(StructRet);
Daniel Dunbare126ab12008-09-10 02:41:04 +0000143 }
Daniel Dunbar1358b202009-01-26 21:26:08 +0000144 static ABIArgInfo getIgnore() {
145 return ABIArgInfo(Ignore);
146 }
Daniel Dunbar73d66602008-09-10 07:04:09 +0000147 static ABIArgInfo getCoerce(const llvm::Type *T) {
Daniel Dunbare126ab12008-09-10 02:41:04 +0000148 return ABIArgInfo(Coerce, T);
149 }
Daniel Dunbar22e30052008-09-11 01:48:57 +0000150 static ABIArgInfo getByVal(unsigned Alignment) {
151 return ABIArgInfo(ByVal, 0, Alignment);
152 }
Daniel Dunbar04d35782008-09-17 00:51:38 +0000153 static ABIArgInfo getExpand() {
154 return ABIArgInfo(Expand);
155 }
Daniel Dunbare126ab12008-09-10 02:41:04 +0000156
157 Kind getKind() const { return TheKind; }
158 bool isDefault() const { return TheKind == Default; }
159 bool isStructRet() const { return TheKind == StructRet; }
Daniel Dunbar1358b202009-01-26 21:26:08 +0000160 bool isIgnore() const { return TheKind == Ignore; }
Daniel Dunbare126ab12008-09-10 02:41:04 +0000161 bool isCoerce() const { return TheKind == Coerce; }
Daniel Dunbar22e30052008-09-11 01:48:57 +0000162 bool isByVal() const { return TheKind == ByVal; }
Daniel Dunbar04d35782008-09-17 00:51:38 +0000163 bool isExpand() const { return TheKind == Expand; }
Daniel Dunbar3ad1f072008-09-10 04:01:49 +0000164
165 // Coerce accessors
Daniel Dunbar73d66602008-09-10 07:04:09 +0000166 const llvm::Type *getCoerceToType() const {
Daniel Dunbar3ad1f072008-09-10 04:01:49 +0000167 assert(TheKind == Coerce && "Invalid kind!");
168 return TypeData;
169 }
Daniel Dunbar22e30052008-09-11 01:48:57 +0000170
171 // ByVal accessors
172 unsigned getByValAlignment() const {
173 assert(TheKind == ByVal && "Invalid kind!");
174 return UIntData;
175 }
Daniel Dunbare126ab12008-09-10 02:41:04 +0000176};
177
178/***/
179
Daniel Dunbarf98eeff2008-10-13 17:02:26 +0000180/* FIXME: All of this stuff should be part of the target interface
181 somehow. It is currently here because it is not clear how to factor
182 the targets to support this, since the Targets currently live in a
183 layer below types n'stuff.
184 */
185
186/// ABIInfo - Target specific hooks for defining how a type should be
187/// passed or returned from functions.
188class clang::ABIInfo {
189public:
190 virtual ~ABIInfo();
191
192 virtual ABIArgInfo classifyReturnType(QualType RetTy,
193 ASTContext &Context) const = 0;
194
195 virtual ABIArgInfo classifyArgumentType(QualType Ty,
196 ASTContext &Context) const = 0;
197};
198
199ABIInfo::~ABIInfo() {}
200
Daniel Dunbar99eebc62008-09-17 21:22:33 +0000201/// isEmptyStruct - Return true iff a structure has no non-empty
202/// members. Note that a structure with a flexible array member is not
203/// considered empty.
204static bool isEmptyStruct(QualType T) {
205 const RecordType *RT = T->getAsStructureType();
206 if (!RT)
207 return 0;
208 const RecordDecl *RD = RT->getDecl();
209 if (RD->hasFlexibleArrayMember())
210 return false;
Douglas Gregor5d764842009-01-09 17:18:27 +0000211 for (RecordDecl::field_iterator i = RD->field_begin(),
Daniel Dunbar99eebc62008-09-17 21:22:33 +0000212 e = RD->field_end(); i != e; ++i) {
213 const FieldDecl *FD = *i;
214 if (!isEmptyStruct(FD->getType()))
215 return false;
216 }
217 return true;
218}
219
220/// isSingleElementStruct - Determine if a structure is a "single
221/// element struct", i.e. it has exactly one non-empty field or
222/// exactly one field which is itself a single element
223/// struct. Structures with flexible array members are never
224/// considered single element structs.
225///
226/// \return The field declaration for the single non-empty field, if
227/// it exists.
228static const FieldDecl *isSingleElementStruct(QualType T) {
229 const RecordType *RT = T->getAsStructureType();
230 if (!RT)
231 return 0;
232
233 const RecordDecl *RD = RT->getDecl();
234 if (RD->hasFlexibleArrayMember())
235 return 0;
236
237 const FieldDecl *Found = 0;
Douglas Gregor5d764842009-01-09 17:18:27 +0000238 for (RecordDecl::field_iterator i = RD->field_begin(),
Daniel Dunbar99eebc62008-09-17 21:22:33 +0000239 e = RD->field_end(); i != e; ++i) {
240 const FieldDecl *FD = *i;
241 QualType FT = FD->getType();
242
243 if (isEmptyStruct(FT)) {
244 // Ignore
245 } else if (Found) {
246 return 0;
247 } else if (!CodeGenFunction::hasAggregateLLVMType(FT)) {
248 Found = FD;
249 } else {
250 Found = isSingleElementStruct(FT);
251 if (!Found)
252 return 0;
253 }
254 }
255
256 return Found;
257}
258
259static bool is32Or64BitBasicType(QualType Ty, ASTContext &Context) {
260 if (!Ty->getAsBuiltinType() && !Ty->isPointerType())
261 return false;
262
263 uint64_t Size = Context.getTypeSize(Ty);
264 return Size == 32 || Size == 64;
265}
266
267static bool areAllFields32Or64BitBasicType(const RecordDecl *RD,
268 ASTContext &Context) {
Douglas Gregor5d764842009-01-09 17:18:27 +0000269 for (RecordDecl::field_iterator i = RD->field_begin(),
Daniel Dunbar99eebc62008-09-17 21:22:33 +0000270 e = RD->field_end(); i != e; ++i) {
271 const FieldDecl *FD = *i;
272
273 if (!is32Or64BitBasicType(FD->getType(), Context))
274 return false;
275
276 // If this is a bit-field we need to make sure it is still a
277 // 32-bit or 64-bit type.
278 if (Expr *BW = FD->getBitWidth()) {
279 unsigned Width = BW->getIntegerConstantExprValue(Context).getZExtValue();
280 if (Width <= 16)
281 return false;
282 }
283 }
284 return true;
285}
286
Daniel Dunbarf98eeff2008-10-13 17:02:26 +0000287namespace {
288/// DefaultABIInfo - The default implementation for ABI specific
289/// details. This implementation provides information which results in
290/// sensible LLVM IR generation, but does not conform to any
291/// particular ABI.
292class DefaultABIInfo : public ABIInfo {
293 virtual ABIArgInfo classifyReturnType(QualType RetTy,
294 ASTContext &Context) const;
295
296 virtual ABIArgInfo classifyArgumentType(QualType RetTy,
297 ASTContext &Context) const;
298};
299
300/// X86_32ABIInfo - The X86-32 ABI information.
301class X86_32ABIInfo : public ABIInfo {
302public:
303 virtual ABIArgInfo classifyReturnType(QualType RetTy,
304 ASTContext &Context) const;
305
306 virtual ABIArgInfo classifyArgumentType(QualType RetTy,
307 ASTContext &Context) const;
308};
309}
310
311ABIArgInfo X86_32ABIInfo::classifyReturnType(QualType RetTy,
312 ASTContext &Context) const {
Daniel Dunbare126ab12008-09-10 02:41:04 +0000313 if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
Daniel Dunbar99eebc62008-09-17 21:22:33 +0000314 // Classify "single element" structs as their element type.
315 const FieldDecl *SeltFD = isSingleElementStruct(RetTy);
316 if (SeltFD) {
317 QualType SeltTy = SeltFD->getType()->getDesugaredType();
318 if (const BuiltinType *BT = SeltTy->getAsBuiltinType()) {
319 // FIXME: This is gross, it would be nice if we could just
320 // pass back SeltTy and have clients deal with it. Is it worth
321 // supporting coerce to both LLVM and clang Types?
322 if (BT->isIntegerType()) {
323 uint64_t Size = Context.getTypeSize(SeltTy);
324 return ABIArgInfo::getCoerce(llvm::IntegerType::get((unsigned) Size));
325 } else if (BT->getKind() == BuiltinType::Float) {
326 return ABIArgInfo::getCoerce(llvm::Type::FloatTy);
327 } else if (BT->getKind() == BuiltinType::Double) {
328 return ABIArgInfo::getCoerce(llvm::Type::DoubleTy);
329 }
330 } else if (SeltTy->isPointerType()) {
331 // FIXME: It would be really nice if this could come out as
332 // the proper pointer type.
333 llvm::Type *PtrTy =
334 llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
335 return ABIArgInfo::getCoerce(PtrTy);
336 }
337 }
338
Daniel Dunbar73d66602008-09-10 07:04:09 +0000339 uint64_t Size = Context.getTypeSize(RetTy);
340 if (Size == 8) {
341 return ABIArgInfo::getCoerce(llvm::Type::Int8Ty);
342 } else if (Size == 16) {
343 return ABIArgInfo::getCoerce(llvm::Type::Int16Ty);
344 } else if (Size == 32) {
345 return ABIArgInfo::getCoerce(llvm::Type::Int32Ty);
346 } else if (Size == 64) {
347 return ABIArgInfo::getCoerce(llvm::Type::Int64Ty);
348 } else {
349 return ABIArgInfo::getStructRet();
350 }
Daniel Dunbare126ab12008-09-10 02:41:04 +0000351 } else {
352 return ABIArgInfo::getDefault();
353 }
354}
355
Daniel Dunbarf98eeff2008-10-13 17:02:26 +0000356ABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty,
357 ASTContext &Context) const {
Daniel Dunbar3158c592008-09-17 20:11:04 +0000358 if (CodeGenFunction::hasAggregateLLVMType(Ty)) {
Daniel Dunbar99eebc62008-09-17 21:22:33 +0000359 // Structures with flexible arrays are always byval.
360 if (const RecordType *RT = Ty->getAsStructureType())
361 if (RT->getDecl()->hasFlexibleArrayMember())
362 return ABIArgInfo::getByVal(0);
363
364 // Expand empty structs (i.e. ignore)
365 uint64_t Size = Context.getTypeSize(Ty);
366 if (Ty->isStructureType() && Size == 0)
367 return ABIArgInfo::getExpand();
368
369 // Expand structs with size <= 128-bits which consist only of
370 // basic types (int, long long, float, double, xxx*). This is
371 // non-recursive and does not ignore empty fields.
372 if (const RecordType *RT = Ty->getAsStructureType()) {
373 if (Context.getTypeSize(Ty) <= 4*32 &&
374 areAllFields32Or64BitBasicType(RT->getDecl(), Context))
375 return ABIArgInfo::getExpand();
376 }
377
Daniel Dunbar22e30052008-09-11 01:48:57 +0000378 return ABIArgInfo::getByVal(0);
379 } else {
380 return ABIArgInfo::getDefault();
381 }
382}
383
Daniel Dunbare09a9692009-01-24 08:32:22 +0000384namespace {
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000385/// X86_64ABIInfo - The X86_64 ABI information.
Daniel Dunbare09a9692009-01-24 08:32:22 +0000386class X86_64ABIInfo : public ABIInfo {
387 enum Class {
388 Integer = 0,
389 SSE,
390 SSEUp,
391 X87,
392 X87Up,
393 ComplexX87,
394 NoClass,
395 Memory
396 };
397
Daniel Dunbar11dc6772009-01-30 08:09:32 +0000398 /// merge - Implement the X86_64 ABI merging algorithm.
399 ///
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000400 /// Merge an accumulating classification \arg Accum with a field
401 /// classification \arg Field.
402 ///
403 /// \param Accum - The accumulating classification. This should
404 /// always be either NoClass or the result of a previous merge
405 /// call. In addition, this should never be Memory (the caller
406 /// should just return Memory for the aggregate).
407 Class merge(Class Accum, Class Field) const;
Daniel Dunbar11dc6772009-01-30 08:09:32 +0000408
Daniel Dunbare09a9692009-01-24 08:32:22 +0000409 /// classify - Determine the x86_64 register classes in which the
410 /// given type T should be passed.
411 ///
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000412 /// \param Lo - The classification for the parts of the type
413 /// residing in the low word of the containing object.
414 ///
415 /// \param Hi - The classification for the parts of the type
416 /// residing in the high word of the containing object.
417 ///
418 /// \param OffsetBase - The bit offset of this type in the
Daniel Dunbar2a2dce32009-01-30 22:40:15 +0000419 /// containing object. Some parameters are classified different
420 /// depending on whether they straddle an eightbyte boundary.
Daniel Dunbare09a9692009-01-24 08:32:22 +0000421 ///
422 /// If a word is unused its result will be NoClass; if a type should
423 /// be passed in Memory then at least the classification of \arg Lo
424 /// will be Memory.
425 ///
426 /// The \arg Lo class will be NoClass iff the argument is ignored.
427 ///
428 /// If the \arg Lo class is ComplexX87, then the \arg Hi class will
429 /// be NoClass.
Daniel Dunbar1aa2be92009-01-30 00:47:38 +0000430 void classify(QualType T, ASTContext &Context, uint64_t OffsetBase,
Daniel Dunbare09a9692009-01-24 08:32:22 +0000431 Class &Lo, Class &Hi) const;
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000432
Daniel Dunbare09a9692009-01-24 08:32:22 +0000433public:
434 virtual ABIArgInfo classifyReturnType(QualType RetTy,
435 ASTContext &Context) const;
436
437 virtual ABIArgInfo classifyArgumentType(QualType RetTy,
438 ASTContext &Context) const;
439};
440}
441
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000442X86_64ABIInfo::Class X86_64ABIInfo::merge(Class Accum,
443 Class Field) const {
Daniel Dunbar11dc6772009-01-30 08:09:32 +0000444 // AMD64-ABI 3.2.3p2: Rule 4. Each field of an object is
445 // classified recursively so that always two fields are
446 // considered. The resulting class is calculated according to
447 // the classes of the fields in the eightbyte:
448 //
449 // (a) If both classes are equal, this is the resulting class.
450 //
451 // (b) If one of the classes is NO_CLASS, the resulting class is
452 // the other class.
453 //
454 // (c) If one of the classes is MEMORY, the result is the MEMORY
455 // class.
456 //
457 // (d) If one of the classes is INTEGER, the result is the
458 // INTEGER.
459 //
460 // (e) If one of the classes is X87, X87UP, COMPLEX_X87 class,
461 // MEMORY is used as class.
462 //
463 // (f) Otherwise class SSE is used.
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000464 assert((Accum == NoClass || Accum == Integer ||
465 Accum == SSE || Accum == SSEUp) &&
466 "Invalid accumulated classification during merge.");
467 if (Accum == Field || Field == NoClass)
468 return Accum;
469 else if (Field == Memory)
470 return Memory;
471 else if (Accum == NoClass)
472 return Field;
473 else if (Accum == Integer || Field == Integer)
474 return Integer;
475 else if (Field == X87 || Field == X87Up || Field == ComplexX87)
476 return Memory;
Daniel Dunbar11dc6772009-01-30 08:09:32 +0000477 else
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000478 return SSE;
Daniel Dunbar11dc6772009-01-30 08:09:32 +0000479}
480
Daniel Dunbare09a9692009-01-24 08:32:22 +0000481void X86_64ABIInfo::classify(QualType Ty,
482 ASTContext &Context,
Daniel Dunbar1aa2be92009-01-30 00:47:38 +0000483 uint64_t OffsetBase,
Daniel Dunbare09a9692009-01-24 08:32:22 +0000484 Class &Lo, Class &Hi) const {
Daniel Dunbar36b378e2009-02-02 18:06:39 +0000485 // FIXME: This code can be simplified by introducing a simple value
486 // class for Class pairs with appropriate constructor methods for
487 // the various situations.
488
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000489 Lo = Hi = NoClass;
490
491 Class &Current = OffsetBase < 64 ? Lo : Hi;
492 Current = Memory;
493
Daniel Dunbare09a9692009-01-24 08:32:22 +0000494 if (const BuiltinType *BT = Ty->getAsBuiltinType()) {
495 BuiltinType::Kind k = BT->getKind();
496
Daniel Dunbar1358b202009-01-26 21:26:08 +0000497 if (k == BuiltinType::Void) {
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000498 Current = NoClass;
Daniel Dunbar1358b202009-01-26 21:26:08 +0000499 } else if (k >= BuiltinType::Bool && k <= BuiltinType::LongLong) {
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000500 Current = Integer;
Daniel Dunbare09a9692009-01-24 08:32:22 +0000501 } else if (k == BuiltinType::Float || k == BuiltinType::Double) {
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000502 Current = SSE;
Daniel Dunbare09a9692009-01-24 08:32:22 +0000503 } else if (k == BuiltinType::LongDouble) {
504 Lo = X87;
505 Hi = X87Up;
506 }
Daniel Dunbarcf1f3be2009-01-27 02:01:34 +0000507 // FIXME: _Decimal32 and _Decimal64 are SSE.
508 // FIXME: _float128 and _Decimal128 are (SSE, SSEUp).
Daniel Dunbare09a9692009-01-24 08:32:22 +0000509 // FIXME: __int128 is (Integer, Integer).
510 } else if (Ty->isPointerLikeType() || Ty->isBlockPointerType() ||
511 Ty->isObjCQualifiedInterfaceType()) {
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000512 Current = Integer;
Daniel Dunbarcf1f3be2009-01-27 02:01:34 +0000513 } else if (const VectorType *VT = Ty->getAsVectorType()) {
Daniel Dunbar1aa2be92009-01-30 00:47:38 +0000514 uint64_t Size = Context.getTypeSize(VT);
Daniel Dunbarcf1f3be2009-01-27 02:01:34 +0000515 if (Size == 64) {
Daniel Dunbarcdf91e82009-01-30 19:38:39 +0000516 // gcc passes <1 x double> in memory.
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000517 if (VT->getElementType() == Context.DoubleTy)
Daniel Dunbarcdf91e82009-01-30 19:38:39 +0000518 return;
Daniel Dunbarcdf91e82009-01-30 19:38:39 +0000519
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000520 Current = SSE;
Daniel Dunbare413f532009-01-30 18:40:10 +0000521
522 // If this type crosses an eightbyte boundary, it should be
523 // split.
Daniel Dunbar2a2dce32009-01-30 22:40:15 +0000524 if (OffsetBase && OffsetBase != 64)
Daniel Dunbare413f532009-01-30 18:40:10 +0000525 Hi = Lo;
Daniel Dunbarcf1f3be2009-01-27 02:01:34 +0000526 } else if (Size == 128) {
527 Lo = SSE;
528 Hi = SSEUp;
529 }
Daniel Dunbare09a9692009-01-24 08:32:22 +0000530 } else if (const ComplexType *CT = Ty->getAsComplexType()) {
531 QualType ET = CT->getElementType();
532
Daniel Dunbare413f532009-01-30 18:40:10 +0000533 uint64_t Size = Context.getTypeSize(Ty);
Daniel Dunbar28770fc2009-01-29 07:22:20 +0000534 if (ET->isIntegerType()) {
Daniel Dunbar28770fc2009-01-29 07:22:20 +0000535 if (Size <= 64)
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000536 Current = Integer;
Daniel Dunbar28770fc2009-01-29 07:22:20 +0000537 else if (Size <= 128)
538 Lo = Hi = Integer;
539 } else if (ET == Context.FloatTy)
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000540 Current = SSE;
Daniel Dunbare09a9692009-01-24 08:32:22 +0000541 else if (ET == Context.DoubleTy)
542 Lo = Hi = SSE;
543 else if (ET == Context.LongDoubleTy)
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000544 Current = ComplexX87;
Daniel Dunbar6a7f8b32009-01-29 09:42:07 +0000545
546 // If this complex type crosses an eightbyte boundary then it
547 // should be split.
Daniel Dunbar2a2dce32009-01-30 22:40:15 +0000548 uint64_t EB_Real = (OffsetBase) / 64;
549 uint64_t EB_Imag = (OffsetBase + Context.getTypeSize(ET)) / 64;
Daniel Dunbar6a7f8b32009-01-29 09:42:07 +0000550 if (Hi == NoClass && EB_Real != EB_Imag)
551 Hi = Lo;
Daniel Dunbar11dc6772009-01-30 08:09:32 +0000552 } else if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty)) {
553 // Arrays are treated like structures.
554
555 uint64_t Size = Context.getTypeSize(Ty);
556
557 // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger
558 // than two eightbytes, ..., it has class MEMORY.
559 if (Size > 128)
560 return;
561
562 // AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned
563 // fields, it has class MEMORY.
564 //
565 // Only need to check alignment of array base.
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000566 if (OffsetBase % Context.getTypeAlign(AT->getElementType()))
Daniel Dunbar11dc6772009-01-30 08:09:32 +0000567 return;
Daniel Dunbar11dc6772009-01-30 08:09:32 +0000568
569 // Otherwise implement simplified merge. We could be smarter about
570 // this, but it isn't worth it and would be harder to verify.
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000571 Current = NoClass;
Daniel Dunbar11dc6772009-01-30 08:09:32 +0000572 uint64_t EltSize = Context.getTypeSize(AT->getElementType());
573 uint64_t ArraySize = AT->getSize().getZExtValue();
574 for (uint64_t i=0, Offset=OffsetBase; i<ArraySize; ++i, Offset += EltSize) {
575 Class FieldLo, FieldHi;
576 classify(AT->getElementType(), Context, Offset, FieldLo, FieldHi);
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000577 Lo = merge(Lo, FieldLo);
578 Hi = merge(Hi, FieldHi);
579 if (Lo == Memory || Hi == Memory)
580 break;
Daniel Dunbar11dc6772009-01-30 08:09:32 +0000581 }
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000582
583 // Do post merger cleanup (see below). Only case we worry about is Memory.
584 if (Hi == Memory)
585 Lo = Memory;
586 assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp array classification.");
Daniel Dunbar51a2d192009-01-29 08:13:58 +0000587 } else if (const RecordType *RT = Ty->getAsRecordType()) {
Daniel Dunbar1aa2be92009-01-30 00:47:38 +0000588 uint64_t Size = Context.getTypeSize(Ty);
Daniel Dunbar51a2d192009-01-29 08:13:58 +0000589
590 // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger
591 // than two eightbytes, ..., it has class MEMORY.
592 if (Size > 128)
593 return;
594
595 const RecordDecl *RD = RT->getDecl();
596
597 // Assume variable sized types are passed in memory.
598 if (RD->hasFlexibleArrayMember())
599 return;
600
601 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
602
603 // Reset Lo class, this will be recomputed.
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000604 Current = NoClass;
Daniel Dunbar51a2d192009-01-29 08:13:58 +0000605 unsigned idx = 0;
606 for (RecordDecl::field_iterator i = RD->field_begin(),
607 e = RD->field_end(); i != e; ++i, ++idx) {
Daniel Dunbar11dc6772009-01-30 08:09:32 +0000608 uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx);
Daniel Dunbar51a2d192009-01-29 08:13:58 +0000609
Daniel Dunbar11dc6772009-01-30 08:09:32 +0000610 // AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned
611 // fields, it has class MEMORY.
Daniel Dunbar51a2d192009-01-29 08:13:58 +0000612 if (Offset % Context.getTypeAlign(i->getType())) {
613 Lo = Memory;
614 return;
615 }
616
Daniel Dunbar51a2d192009-01-29 08:13:58 +0000617 // Classify this field.
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000618 //
619 // AMD64-ABI 3.2.3p2: Rule 3. If the size of the aggregate
620 // exceeds a single eightbyte, each is classified
621 // separately. Each eightbyte gets initialized to class
622 // NO_CLASS.
Daniel Dunbar51a2d192009-01-29 08:13:58 +0000623 Class FieldLo, FieldHi;
Daniel Dunbar6a7f8b32009-01-29 09:42:07 +0000624 classify(i->getType(), Context, Offset, FieldLo, FieldHi);
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000625 Lo = merge(Lo, FieldLo);
626 Hi = merge(Hi, FieldHi);
627 if (Lo == Memory || Hi == Memory)
628 break;
Daniel Dunbar51a2d192009-01-29 08:13:58 +0000629 }
630
631 // AMD64-ABI 3.2.3p2: Rule 5. Then a post merger cleanup is done:
632 //
633 // (a) If one of the classes is MEMORY, the whole argument is
634 // passed in memory.
635 //
636 // (b) If SSEUP is not preceeded by SSE, it is converted to SSE.
637
638 // The first of these conditions is guaranteed by how we implement
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000639 // the merge (just bail).
640 //
641 // The second condition occurs in the case of unions; for example
642 // union { _Complex double; unsigned; }.
643 if (Hi == Memory)
644 Lo = Memory;
Daniel Dunbar51a2d192009-01-29 08:13:58 +0000645 if (Hi == SSEUp && Lo != SSE)
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000646 Hi = SSE;
Daniel Dunbare09a9692009-01-24 08:32:22 +0000647 }
648}
649
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000650
Daniel Dunbarb6d5c442009-01-15 18:18:40 +0000651ABIArgInfo X86_64ABIInfo::classifyReturnType(QualType RetTy,
652 ASTContext &Context) const {
Daniel Dunbare09a9692009-01-24 08:32:22 +0000653 // AMD64-ABI 3.2.3p4: Rule 1. Classify the return type with the
654 // classification algorithm.
655 X86_64ABIInfo::Class Lo, Hi;
Daniel Dunbar6a7f8b32009-01-29 09:42:07 +0000656 classify(RetTy, Context, 0, Lo, Hi);
Daniel Dunbare09a9692009-01-24 08:32:22 +0000657
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000658 // Check some invariants.
659 assert((Hi != Memory || Lo == Memory) && "Invalid memory classification.");
660 assert((Lo != NoClass || Hi == NoClass) && "Invalid null classification.");
661 assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification.");
662
Daniel Dunbare09a9692009-01-24 08:32:22 +0000663 const llvm::Type *ResType = 0;
664 switch (Lo) {
665 case NoClass:
Daniel Dunbar1358b202009-01-26 21:26:08 +0000666 return ABIArgInfo::getIgnore();
Daniel Dunbare09a9692009-01-24 08:32:22 +0000667
668 case SSEUp:
669 case X87Up:
670 assert(0 && "Invalid classification for lo word.");
671
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000672 // AMD64-ABI 3.2.3p4: Rule 2. Types of class memory are returned via
673 // hidden argument, i.e. structret.
Daniel Dunbare09a9692009-01-24 08:32:22 +0000674 case Memory:
675 return ABIArgInfo::getStructRet();
676
677 // AMD64-ABI 3.2.3p4: Rule 3. If the class is INTEGER, the next
678 // available register of the sequence %rax, %rdx is used.
679 case Integer:
680 ResType = llvm::Type::Int64Ty; break;
681
682 // AMD64-ABI 3.2.3p4: Rule 4. If the class is SSE, the next
683 // available SSE register of the sequence %xmm0, %xmm1 is used.
684 case SSE:
685 ResType = llvm::Type::DoubleTy; break;
686
687 // AMD64-ABI 3.2.3p4: Rule 6. If the class is X87, the value is
688 // returned on the X87 stack in %st0 as 80-bit x87 number.
689 case X87:
690 ResType = llvm::Type::X86_FP80Ty; break;
691
Daniel Dunbar64b132f2009-01-31 00:06:58 +0000692 // AMD64-ABI 3.2.3p4: Rule 8. If the class is COMPLEX_X87, the real
693 // part of the value is returned in %st0 and the imaginary part in
694 // %st1.
Daniel Dunbare09a9692009-01-24 08:32:22 +0000695 case ComplexX87:
696 assert(Hi == NoClass && "Unexpected ComplexX87 classification.");
697 ResType = llvm::VectorType::get(llvm::Type::X86_FP80Ty, 2);
698 break;
699 }
700
701 switch (Hi) {
702 // Memory was handled previously, and ComplexX87 and X87 should
703 // never occur as hi classes.
704 case Memory:
705 case X87:
706 case ComplexX87:
707 assert(0 && "Invalid classification for hi word.");
708
709 case NoClass: break;
710 case Integer:
Daniel Dunbar7e8a7022009-01-29 07:36:07 +0000711 ResType = llvm::StructType::get(ResType, llvm::Type::Int64Ty, NULL);
712 break;
Daniel Dunbare09a9692009-01-24 08:32:22 +0000713 case SSE:
Daniel Dunbar7e8a7022009-01-29 07:36:07 +0000714 ResType = llvm::StructType::get(ResType, llvm::Type::DoubleTy, NULL);
715 break;
Daniel Dunbare09a9692009-01-24 08:32:22 +0000716
717 // AMD64-ABI 3.2.3p4: Rule 5. If the class is SSEUP, the eightbyte
718 // is passed in the upper half of the last used SSE register.
719 //
720 // SSEUP should always be preceeded by SSE, just widen.
721 case SSEUp:
722 assert(Lo == SSE && "Unexpected SSEUp classification.");
723 ResType = llvm::VectorType::get(llvm::Type::DoubleTy, 2);
724 break;
725
726 // AMD64-ABI 3.2.3p4: Rule 7. If the class is X87UP, the value is
Daniel Dunbar7e8a7022009-01-29 07:36:07 +0000727 // returned together with the previous X87 value in %st0.
Daniel Dunbare09a9692009-01-24 08:32:22 +0000728 //
729 // X87UP should always be preceeded by X87, so we don't need to do
730 // anything here.
731 case X87Up:
732 assert(Lo == X87 && "Unexpected X87Up classification.");
733 break;
734 }
735
736 return ABIArgInfo::getCoerce(ResType);
Daniel Dunbarb6d5c442009-01-15 18:18:40 +0000737}
738
739ABIArgInfo X86_64ABIInfo::classifyArgumentType(QualType Ty,
740 ASTContext &Context) const {
741 return ABIArgInfo::getDefault();
742}
743
Daniel Dunbarf98eeff2008-10-13 17:02:26 +0000744ABIArgInfo DefaultABIInfo::classifyReturnType(QualType RetTy,
745 ASTContext &Context) const {
746 return ABIArgInfo::getDefault();
747}
748
749ABIArgInfo DefaultABIInfo::classifyArgumentType(QualType Ty,
750 ASTContext &Context) const {
Daniel Dunbarf98eeff2008-10-13 17:02:26 +0000751 return ABIArgInfo::getDefault();
752}
753
754const ABIInfo &CodeGenTypes::getABIInfo() const {
755 if (TheABIInfo)
756 return *TheABIInfo;
757
758 // For now we just cache this in the CodeGenTypes and don't bother
759 // to free it.
760 const char *TargetPrefix = getContext().Target.getTargetPrefix();
761 if (strcmp(TargetPrefix, "x86") == 0) {
Daniel Dunbarb6d5c442009-01-15 18:18:40 +0000762 switch (getContext().Target.getPointerWidth(0)) {
763 case 32:
Daniel Dunbarf98eeff2008-10-13 17:02:26 +0000764 return *(TheABIInfo = new X86_32ABIInfo());
Daniel Dunbarb6d5c442009-01-15 18:18:40 +0000765 case 64:
Daniel Dunbar56555952009-01-30 18:47:53 +0000766 return *(TheABIInfo = new X86_64ABIInfo());
Daniel Dunbarb6d5c442009-01-15 18:18:40 +0000767 }
Daniel Dunbarf98eeff2008-10-13 17:02:26 +0000768 }
769
770 return *(TheABIInfo = new DefaultABIInfo);
771}
772
773// getABIReturnInfo - Wrap the ABIInfo getABIReturnInfo, altering
774// "default" types to StructRet when appropriate for simplicity.
775static ABIArgInfo getABIReturnInfo(QualType Ty, CodeGenTypes &CGT) {
776 assert(!Ty->isArrayType() &&
777 "Array types cannot be passed directly.");
778 ABIArgInfo Info = CGT.getABIInfo().classifyReturnType(Ty, CGT.getContext());
Daniel Dunbar3158c592008-09-17 20:11:04 +0000779 // Ensure default on aggregate types is StructRet.
780 if (Info.isDefault() && CodeGenFunction::hasAggregateLLVMType(Ty))
781 return ABIArgInfo::getStructRet();
782 return Info;
783}
784
Daniel Dunbarf98eeff2008-10-13 17:02:26 +0000785// getABIArgumentInfo - Wrap the ABIInfo getABIReturnInfo, altering
786// "default" types to ByVal when appropriate for simplicity.
787static ABIArgInfo getABIArgumentInfo(QualType Ty, CodeGenTypes &CGT) {
788 assert(!Ty->isArrayType() &&
789 "Array types cannot be passed directly.");
790 ABIArgInfo Info = CGT.getABIInfo().classifyArgumentType(Ty, CGT.getContext());
Daniel Dunbar3158c592008-09-17 20:11:04 +0000791 // Ensure default on aggregate types is ByVal.
792 if (Info.isDefault() && CodeGenFunction::hasAggregateLLVMType(Ty))
793 return ABIArgInfo::getByVal(0);
794 return Info;
795}
796
Daniel Dunbare126ab12008-09-10 02:41:04 +0000797/***/
798
Daniel Dunbar04d35782008-09-17 00:51:38 +0000799void CodeGenTypes::GetExpandedTypes(QualType Ty,
800 std::vector<const llvm::Type*> &ArgTys) {
801 const RecordType *RT = Ty->getAsStructureType();
802 assert(RT && "Can only expand structure types.");
803 const RecordDecl *RD = RT->getDecl();
804 assert(!RD->hasFlexibleArrayMember() &&
805 "Cannot expand structure with flexible array.");
806
Douglas Gregor5d764842009-01-09 17:18:27 +0000807 for (RecordDecl::field_iterator i = RD->field_begin(),
Daniel Dunbar04d35782008-09-17 00:51:38 +0000808 e = RD->field_end(); i != e; ++i) {
809 const FieldDecl *FD = *i;
810 assert(!FD->isBitField() &&
811 "Cannot expand structure with bit-field members.");
812
813 QualType FT = FD->getType();
814 if (CodeGenFunction::hasAggregateLLVMType(FT)) {
815 GetExpandedTypes(FT, ArgTys);
816 } else {
817 ArgTys.push_back(ConvertType(FT));
818 }
819 }
820}
821
822llvm::Function::arg_iterator
823CodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV,
824 llvm::Function::arg_iterator AI) {
825 const RecordType *RT = Ty->getAsStructureType();
826 assert(RT && "Can only expand structure types.");
827
828 RecordDecl *RD = RT->getDecl();
829 assert(LV.isSimple() &&
830 "Unexpected non-simple lvalue during struct expansion.");
831 llvm::Value *Addr = LV.getAddress();
832 for (RecordDecl::field_iterator i = RD->field_begin(),
833 e = RD->field_end(); i != e; ++i) {
834 FieldDecl *FD = *i;
835 QualType FT = FD->getType();
836
837 // FIXME: What are the right qualifiers here?
838 LValue LV = EmitLValueForField(Addr, FD, false, 0);
839 if (CodeGenFunction::hasAggregateLLVMType(FT)) {
840 AI = ExpandTypeFromArgs(FT, LV, AI);
841 } else {
842 EmitStoreThroughLValue(RValue::get(AI), LV, FT);
843 ++AI;
844 }
845 }
846
847 return AI;
848}
849
850void
851CodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV,
852 llvm::SmallVector<llvm::Value*, 16> &Args) {
853 const RecordType *RT = Ty->getAsStructureType();
854 assert(RT && "Can only expand structure types.");
855
856 RecordDecl *RD = RT->getDecl();
857 assert(RV.isAggregate() && "Unexpected rvalue during struct expansion");
858 llvm::Value *Addr = RV.getAggregateAddr();
859 for (RecordDecl::field_iterator i = RD->field_begin(),
860 e = RD->field_end(); i != e; ++i) {
861 FieldDecl *FD = *i;
862 QualType FT = FD->getType();
863
864 // FIXME: What are the right qualifiers here?
865 LValue LV = EmitLValueForField(Addr, FD, false, 0);
866 if (CodeGenFunction::hasAggregateLLVMType(FT)) {
867 ExpandTypeToArgs(FT, RValue::getAggregate(LV.getAddress()), Args);
868 } else {
869 RValue RV = EmitLoadOfLValue(LV, FT);
870 assert(RV.isScalar() &&
871 "Unexpected non-scalar rvalue during struct expansion.");
872 Args.push_back(RV.getScalarVal());
873 }
874 }
875}
876
877/***/
878
Daniel Dunbar3ad1f072008-09-10 04:01:49 +0000879const llvm::FunctionType *
880CodeGenTypes::GetFunctionType(const CGFunctionInfo &FI) {
881 std::vector<const llvm::Type*> ArgTys;
882
883 const llvm::Type *ResultType = 0;
884
Daniel Dunbar5ec32e92009-01-31 03:05:44 +0000885 ArgTypeIterator begin = FI.argtypes_begin(), end = FI.argtypes_end();
Daniel Dunbar3ad1f072008-09-10 04:01:49 +0000886 QualType RetTy = *begin;
Daniel Dunbarf98eeff2008-10-13 17:02:26 +0000887 ABIArgInfo RetAI = getABIReturnInfo(RetTy, *this);
Daniel Dunbar22e30052008-09-11 01:48:57 +0000888 switch (RetAI.getKind()) {
889 case ABIArgInfo::ByVal:
890 case ABIArgInfo::Expand:
891 assert(0 && "Invalid ABI kind for return argument");
892
Daniel Dunbar3ad1f072008-09-10 04:01:49 +0000893 case ABIArgInfo::Default:
894 if (RetTy->isVoidType()) {
895 ResultType = llvm::Type::VoidTy;
896 } else {
Daniel Dunbara9976a22008-09-10 07:00:50 +0000897 ResultType = ConvertType(RetTy);
Daniel Dunbar3ad1f072008-09-10 04:01:49 +0000898 }
899 break;
900
901 case ABIArgInfo::StructRet: {
902 ResultType = llvm::Type::VoidTy;
Daniel Dunbara9976a22008-09-10 07:00:50 +0000903 const llvm::Type *STy = ConvertType(RetTy);
Daniel Dunbar3ad1f072008-09-10 04:01:49 +0000904 ArgTys.push_back(llvm::PointerType::get(STy, RetTy.getAddressSpace()));
905 break;
906 }
907
Daniel Dunbar1358b202009-01-26 21:26:08 +0000908 case ABIArgInfo::Ignore:
909 ResultType = llvm::Type::VoidTy;
910 break;
911
Daniel Dunbar3ad1f072008-09-10 04:01:49 +0000912 case ABIArgInfo::Coerce:
Daniel Dunbar73d66602008-09-10 07:04:09 +0000913 ResultType = RetAI.getCoerceToType();
Daniel Dunbar3ad1f072008-09-10 04:01:49 +0000914 break;
915 }
916
917 for (++begin; begin != end; ++begin) {
Daniel Dunbarf98eeff2008-10-13 17:02:26 +0000918 ABIArgInfo AI = getABIArgumentInfo(*begin, *this);
Daniel Dunbara9976a22008-09-10 07:00:50 +0000919 const llvm::Type *Ty = ConvertType(*begin);
Daniel Dunbar22e30052008-09-11 01:48:57 +0000920
921 switch (AI.getKind()) {
Daniel Dunbar1358b202009-01-26 21:26:08 +0000922 case ABIArgInfo::Ignore:
923 break;
924
Daniel Dunbar04d35782008-09-17 00:51:38 +0000925 case ABIArgInfo::Coerce:
Daniel Dunbar22e30052008-09-11 01:48:57 +0000926 case ABIArgInfo::StructRet:
927 assert(0 && "Invalid ABI kind for non-return argument");
928
929 case ABIArgInfo::ByVal:
Daniel Dunbar3ad1f072008-09-10 04:01:49 +0000930 // byval arguments are always on the stack, which is addr space #0.
931 ArgTys.push_back(llvm::PointerType::getUnqual(Ty));
Daniel Dunbar22e30052008-09-11 01:48:57 +0000932 assert(AI.getByValAlignment() == 0 && "FIXME: alignment unhandled");
933 break;
934
935 case ABIArgInfo::Default:
936 ArgTys.push_back(Ty);
937 break;
Daniel Dunbar22e30052008-09-11 01:48:57 +0000938
939 case ABIArgInfo::Expand:
Daniel Dunbar04d35782008-09-17 00:51:38 +0000940 GetExpandedTypes(*begin, ArgTys);
Daniel Dunbar22e30052008-09-11 01:48:57 +0000941 break;
942 }
Daniel Dunbar3ad1f072008-09-10 04:01:49 +0000943 }
944
Daniel Dunbar5ec32e92009-01-31 03:05:44 +0000945 return llvm::FunctionType::get(ResultType, ArgTys, FI.isVariadic());
Daniel Dunbar3ad1f072008-09-10 04:01:49 +0000946}
947
Daniel Dunbar3ef2e852008-09-10 00:41:16 +0000948bool CodeGenModule::ReturnTypeUsesSret(QualType RetTy) {
Daniel Dunbarf98eeff2008-10-13 17:02:26 +0000949 return getABIReturnInfo(RetTy, getTypes()).isStructRet();
Daniel Dunbar49f5a0d2008-09-09 23:48:28 +0000950}
951
Devang Patela85a9ef2008-09-25 21:02:23 +0000952void CodeGenModule::ConstructAttributeList(const Decl *TargetDecl,
Daniel Dunbarebbb8f32009-01-31 02:19:00 +0000953 const CGFunctionInfo &Info,
Devang Patela85a9ef2008-09-25 21:02:23 +0000954 AttributeListType &PAL) {
Daniel Dunbarbccb0682008-09-10 00:32:18 +0000955 unsigned FuncAttrs = 0;
Devang Patel2bb6eb82008-09-26 22:53:57 +0000956 unsigned RetAttrs = 0;
Daniel Dunbarbccb0682008-09-10 00:32:18 +0000957
958 if (TargetDecl) {
959 if (TargetDecl->getAttr<NoThrowAttr>())
Devang Patela85a9ef2008-09-25 21:02:23 +0000960 FuncAttrs |= llvm::Attribute::NoUnwind;
Daniel Dunbarbccb0682008-09-10 00:32:18 +0000961 if (TargetDecl->getAttr<NoReturnAttr>())
Devang Patela85a9ef2008-09-25 21:02:23 +0000962 FuncAttrs |= llvm::Attribute::NoReturn;
Anders Carlssondd6791c2008-10-05 23:32:53 +0000963 if (TargetDecl->getAttr<PureAttr>())
964 FuncAttrs |= llvm::Attribute::ReadOnly;
965 if (TargetDecl->getAttr<ConstAttr>())
966 FuncAttrs |= llvm::Attribute::ReadNone;
Daniel Dunbarbccb0682008-09-10 00:32:18 +0000967 }
968
Daniel Dunbarebbb8f32009-01-31 02:19:00 +0000969 ArgTypeIterator begin = Info.argtypes_begin(), end = Info.argtypes_end();
Daniel Dunbare126ab12008-09-10 02:41:04 +0000970 QualType RetTy = *begin;
Daniel Dunbarbccb0682008-09-10 00:32:18 +0000971 unsigned Index = 1;
Daniel Dunbarf98eeff2008-10-13 17:02:26 +0000972 ABIArgInfo RetAI = getABIReturnInfo(RetTy, getTypes());
Daniel Dunbar3ad1f072008-09-10 04:01:49 +0000973 switch (RetAI.getKind()) {
Daniel Dunbare126ab12008-09-10 02:41:04 +0000974 case ABIArgInfo::Default:
975 if (RetTy->isPromotableIntegerType()) {
976 if (RetTy->isSignedIntegerType()) {
Devang Patel2bb6eb82008-09-26 22:53:57 +0000977 RetAttrs |= llvm::Attribute::SExt;
Daniel Dunbare126ab12008-09-10 02:41:04 +0000978 } else if (RetTy->isUnsignedIntegerType()) {
Devang Patel2bb6eb82008-09-26 22:53:57 +0000979 RetAttrs |= llvm::Attribute::ZExt;
Daniel Dunbare126ab12008-09-10 02:41:04 +0000980 }
981 }
982 break;
983
984 case ABIArgInfo::StructRet:
Devang Patela85a9ef2008-09-25 21:02:23 +0000985 PAL.push_back(llvm::AttributeWithIndex::get(Index,
Daniel Dunbarebbb8f32009-01-31 02:19:00 +0000986 llvm::Attribute::StructRet |
987 llvm::Attribute::NoAlias));
Daniel Dunbarbccb0682008-09-10 00:32:18 +0000988 ++Index;
Daniel Dunbare126ab12008-09-10 02:41:04 +0000989 break;
990
Daniel Dunbar1358b202009-01-26 21:26:08 +0000991 case ABIArgInfo::Ignore:
Daniel Dunbare126ab12008-09-10 02:41:04 +0000992 case ABIArgInfo::Coerce:
Daniel Dunbare126ab12008-09-10 02:41:04 +0000993 break;
Daniel Dunbar22e30052008-09-11 01:48:57 +0000994
995 case ABIArgInfo::ByVal:
996 case ABIArgInfo::Expand:
997 assert(0 && "Invalid ABI kind for return argument");
Daniel Dunbarbccb0682008-09-10 00:32:18 +0000998 }
Daniel Dunbare126ab12008-09-10 02:41:04 +0000999
Devang Patel2bb6eb82008-09-26 22:53:57 +00001000 if (RetAttrs)
1001 PAL.push_back(llvm::AttributeWithIndex::get(0, RetAttrs));
Daniel Dunbar04d35782008-09-17 00:51:38 +00001002 for (++begin; begin != end; ++begin) {
Daniel Dunbarbccb0682008-09-10 00:32:18 +00001003 QualType ParamType = *begin;
Devang Patela85a9ef2008-09-25 21:02:23 +00001004 unsigned Attributes = 0;
Daniel Dunbarf98eeff2008-10-13 17:02:26 +00001005 ABIArgInfo AI = getABIArgumentInfo(ParamType, getTypes());
Daniel Dunbar22e30052008-09-11 01:48:57 +00001006
1007 switch (AI.getKind()) {
1008 case ABIArgInfo::StructRet:
Daniel Dunbar04d35782008-09-17 00:51:38 +00001009 case ABIArgInfo::Coerce:
Daniel Dunbar22e30052008-09-11 01:48:57 +00001010 assert(0 && "Invalid ABI kind for non-return argument");
1011
1012 case ABIArgInfo::ByVal:
Devang Patela85a9ef2008-09-25 21:02:23 +00001013 Attributes |= llvm::Attribute::ByVal;
Daniel Dunbar22e30052008-09-11 01:48:57 +00001014 assert(AI.getByValAlignment() == 0 && "FIXME: alignment unhandled");
1015 break;
1016
1017 case ABIArgInfo::Default:
1018 if (ParamType->isPromotableIntegerType()) {
1019 if (ParamType->isSignedIntegerType()) {
Devang Patela85a9ef2008-09-25 21:02:23 +00001020 Attributes |= llvm::Attribute::SExt;
Daniel Dunbar22e30052008-09-11 01:48:57 +00001021 } else if (ParamType->isUnsignedIntegerType()) {
Devang Patela85a9ef2008-09-25 21:02:23 +00001022 Attributes |= llvm::Attribute::ZExt;
Daniel Dunbar22e30052008-09-11 01:48:57 +00001023 }
Daniel Dunbarbccb0682008-09-10 00:32:18 +00001024 }
Daniel Dunbar22e30052008-09-11 01:48:57 +00001025 break;
Daniel Dunbar22e30052008-09-11 01:48:57 +00001026
Daniel Dunbar1358b202009-01-26 21:26:08 +00001027 case ABIArgInfo::Ignore:
1028 // Skip increment, no matching LLVM parameter.
1029 continue;
1030
Daniel Dunbar04d35782008-09-17 00:51:38 +00001031 case ABIArgInfo::Expand: {
1032 std::vector<const llvm::Type*> Tys;
1033 // FIXME: This is rather inefficient. Do we ever actually need
1034 // to do anything here? The result should be just reconstructed
1035 // on the other side, so extension should be a non-issue.
1036 getTypes().GetExpandedTypes(ParamType, Tys);
1037 Index += Tys.size();
1038 continue;
1039 }
Daniel Dunbarbccb0682008-09-10 00:32:18 +00001040 }
Daniel Dunbar22e30052008-09-11 01:48:57 +00001041
Devang Patela85a9ef2008-09-25 21:02:23 +00001042 if (Attributes)
1043 PAL.push_back(llvm::AttributeWithIndex::get(Index, Attributes));
Daniel Dunbar04d35782008-09-17 00:51:38 +00001044 ++Index;
Daniel Dunbarbccb0682008-09-10 00:32:18 +00001045 }
Devang Patel2bb6eb82008-09-26 22:53:57 +00001046 if (FuncAttrs)
1047 PAL.push_back(llvm::AttributeWithIndex::get(~0, FuncAttrs));
1048
Daniel Dunbarbccb0682008-09-10 00:32:18 +00001049}
1050
Daniel Dunbarfc1a9c42008-09-09 23:27:19 +00001051void CodeGenFunction::EmitFunctionProlog(llvm::Function *Fn,
1052 QualType RetTy,
1053 const FunctionArgList &Args) {
1054 // Emit allocs for param decls. Give the LLVM Argument nodes names.
1055 llvm::Function::arg_iterator AI = Fn->arg_begin();
1056
1057 // Name the struct return argument.
Daniel Dunbare126ab12008-09-10 02:41:04 +00001058 if (CGM.ReturnTypeUsesSret(RetTy)) {
Daniel Dunbarfc1a9c42008-09-09 23:27:19 +00001059 AI->setName("agg.result");
1060 ++AI;
1061 }
1062
1063 for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
Daniel Dunbar04d35782008-09-17 00:51:38 +00001064 i != e; ++i) {
Daniel Dunbarfc1a9c42008-09-09 23:27:19 +00001065 const VarDecl *Arg = i->first;
Daniel Dunbar04d35782008-09-17 00:51:38 +00001066 QualType Ty = i->second;
Daniel Dunbarf98eeff2008-10-13 17:02:26 +00001067 ABIArgInfo ArgI = getABIArgumentInfo(Ty, CGM.getTypes());
Daniel Dunbar22e30052008-09-11 01:48:57 +00001068
1069 switch (ArgI.getKind()) {
1070 case ABIArgInfo::ByVal:
1071 case ABIArgInfo::Default: {
1072 assert(AI != Fn->arg_end() && "Argument mismatch!");
1073 llvm::Value* V = AI;
Daniel Dunbar04d35782008-09-17 00:51:38 +00001074 if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
Daniel Dunbar22e30052008-09-11 01:48:57 +00001075 // This must be a promotion, for something like
1076 // "void a(x) short x; {..."
Daniel Dunbar04d35782008-09-17 00:51:38 +00001077 V = EmitScalarConversion(V, Ty, Arg->getType());
Daniel Dunbarfc1a9c42008-09-09 23:27:19 +00001078 }
Daniel Dunbar22e30052008-09-11 01:48:57 +00001079 EmitParmDecl(*Arg, V);
1080 break;
1081 }
Daniel Dunbar04d35782008-09-17 00:51:38 +00001082
1083 case ABIArgInfo::Expand: {
1084 // If this was structure was expand into multiple arguments then
1085 // we need to create a temporary and reconstruct it from the
1086 // arguments.
Chris Lattner6c5ec622008-11-24 04:00:27 +00001087 std::string Name = Arg->getNameAsString();
Daniel Dunbar04d35782008-09-17 00:51:38 +00001088 llvm::Value *Temp = CreateTempAlloca(ConvertType(Ty),
1089 (Name + ".addr").c_str());
1090 // FIXME: What are the right qualifiers here?
1091 llvm::Function::arg_iterator End =
1092 ExpandTypeFromArgs(Ty, LValue::MakeAddr(Temp,0), AI);
1093 EmitParmDecl(*Arg, Temp);
Daniel Dunbar22e30052008-09-11 01:48:57 +00001094
Daniel Dunbar04d35782008-09-17 00:51:38 +00001095 // Name the arguments used in expansion and increment AI.
1096 unsigned Index = 0;
1097 for (; AI != End; ++AI, ++Index)
1098 AI->setName(Name + "." + llvm::utostr(Index));
1099 continue;
1100 }
Daniel Dunbar1358b202009-01-26 21:26:08 +00001101
1102 case ABIArgInfo::Ignore:
1103 break;
1104
Daniel Dunbar22e30052008-09-11 01:48:57 +00001105 case ABIArgInfo::Coerce:
Daniel Dunbar22e30052008-09-11 01:48:57 +00001106 case ABIArgInfo::StructRet:
1107 assert(0 && "Invalid ABI kind for non-return argument");
1108 }
Daniel Dunbar04d35782008-09-17 00:51:38 +00001109
1110 ++AI;
Daniel Dunbarfc1a9c42008-09-09 23:27:19 +00001111 }
1112 assert(AI == Fn->arg_end() && "Argument mismatch!");
1113}
1114
Daniel Dunbar708d8a82009-01-27 01:36:03 +00001115/// CreateCoercedLoad - Create a load from \arg SrcPtr interpreted as
1116/// a pointer to an object of type \arg Ty.
1117///
1118/// This safely handles the case when the src type is smaller than the
1119/// destination type; in this situation the values of bits which not
1120/// present in the src are undefined.
1121static llvm::Value *CreateCoercedLoad(llvm::Value *SrcPtr,
1122 const llvm::Type *Ty,
1123 CodeGenFunction &CGF) {
1124 const llvm::Type *SrcTy =
1125 cast<llvm::PointerType>(SrcPtr->getType())->getElementType();
Daniel Dunbar1aa2be92009-01-30 00:47:38 +00001126 uint64_t SrcSize = CGF.CGM.getTargetData().getTypePaddedSize(SrcTy);
1127 uint64_t DstSize = CGF.CGM.getTargetData().getTypePaddedSize(Ty);
Daniel Dunbar708d8a82009-01-27 01:36:03 +00001128
1129 // If load is legal, just bitcase the src pointer.
1130 if (SrcSize == DstSize) {
1131 llvm::Value *Casted =
1132 CGF.Builder.CreateBitCast(SrcPtr, llvm::PointerType::getUnqual(Ty));
1133 return CGF.Builder.CreateLoad(Casted);
1134 } else {
1135 assert(SrcSize < DstSize && "Coercion is losing source bits!");
1136
1137 // Otherwise do coercion through memory. This is stupid, but
1138 // simple.
1139 llvm::Value *Tmp = CGF.CreateTempAlloca(Ty);
1140 llvm::Value *Casted =
1141 CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(SrcTy));
1142 CGF.Builder.CreateStore(CGF.Builder.CreateLoad(SrcPtr), Casted);
1143 return CGF.Builder.CreateLoad(Tmp);
1144 }
1145}
1146
1147/// CreateCoercedStore - Create a store to \arg DstPtr from \arg Src,
1148/// where the source and destination may have different types.
1149///
1150/// This safely handles the case when the src type is larger than the
1151/// destination type; the upper bits of the src will be lost.
1152static void CreateCoercedStore(llvm::Value *Src,
1153 llvm::Value *DstPtr,
1154 CodeGenFunction &CGF) {
1155 const llvm::Type *SrcTy = Src->getType();
1156 const llvm::Type *DstTy =
1157 cast<llvm::PointerType>(DstPtr->getType())->getElementType();
1158
Daniel Dunbar1aa2be92009-01-30 00:47:38 +00001159 uint64_t SrcSize = CGF.CGM.getTargetData().getTypePaddedSize(SrcTy);
1160 uint64_t DstSize = CGF.CGM.getTargetData().getTypePaddedSize(DstTy);
Daniel Dunbar708d8a82009-01-27 01:36:03 +00001161
1162 // If store is legal, just bitcase the src pointer.
1163 if (SrcSize == DstSize) {
1164 llvm::Value *Casted =
1165 CGF.Builder.CreateBitCast(DstPtr, llvm::PointerType::getUnqual(SrcTy));
1166 CGF.Builder.CreateStore(Src, Casted);
1167 } else {
1168 assert(SrcSize > DstSize && "Coercion is missing bits!");
1169
1170 // Otherwise do coercion through memory. This is stupid, but
1171 // simple.
1172 llvm::Value *Tmp = CGF.CreateTempAlloca(SrcTy);
1173 CGF.Builder.CreateStore(Src, Tmp);
1174 llvm::Value *Casted =
1175 CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(DstTy));
1176 CGF.Builder.CreateStore(CGF.Builder.CreateLoad(Casted), DstPtr);
1177 }
1178}
1179
Daniel Dunbarfc1a9c42008-09-09 23:27:19 +00001180void CodeGenFunction::EmitFunctionEpilog(QualType RetTy,
1181 llvm::Value *ReturnValue) {
Daniel Dunbare126ab12008-09-10 02:41:04 +00001182 llvm::Value *RV = 0;
1183
1184 // Functions with no result always return void.
1185 if (ReturnValue) {
Daniel Dunbarf98eeff2008-10-13 17:02:26 +00001186 ABIArgInfo RetAI = getABIReturnInfo(RetTy, CGM.getTypes());
Daniel Dunbare126ab12008-09-10 02:41:04 +00001187
1188 switch (RetAI.getKind()) {
1189 case ABIArgInfo::StructRet:
Daniel Dunbar17d35372008-12-18 04:52:14 +00001190 if (RetTy->isAnyComplexType()) {
1191 // FIXME: Volatile
1192 ComplexPairTy RT = LoadComplexFromAddr(ReturnValue, false);
1193 StoreComplexToAddr(RT, CurFn->arg_begin(), false);
1194 } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
1195 EmitAggregateCopy(CurFn->arg_begin(), ReturnValue, RetTy);
1196 } else {
1197 Builder.CreateStore(Builder.CreateLoad(ReturnValue),
1198 CurFn->arg_begin());
1199 }
Daniel Dunbare126ab12008-09-10 02:41:04 +00001200 break;
Daniel Dunbar22e30052008-09-11 01:48:57 +00001201
Daniel Dunbare126ab12008-09-10 02:41:04 +00001202 case ABIArgInfo::Default:
1203 RV = Builder.CreateLoad(ReturnValue);
1204 break;
1205
Daniel Dunbar1358b202009-01-26 21:26:08 +00001206 case ABIArgInfo::Ignore:
1207 break;
1208
Daniel Dunbar73d66602008-09-10 07:04:09 +00001209 case ABIArgInfo::Coerce: {
Daniel Dunbar708d8a82009-01-27 01:36:03 +00001210 RV = CreateCoercedLoad(ReturnValue, RetAI.getCoerceToType(), *this);
Daniel Dunbar22e30052008-09-11 01:48:57 +00001211 break;
Daniel Dunbar73d66602008-09-10 07:04:09 +00001212 }
Daniel Dunbar22e30052008-09-11 01:48:57 +00001213
1214 case ABIArgInfo::ByVal:
1215 case ABIArgInfo::Expand:
1216 assert(0 && "Invalid ABI kind for return argument");
Daniel Dunbarfc1a9c42008-09-09 23:27:19 +00001217 }
1218 }
Daniel Dunbare126ab12008-09-10 02:41:04 +00001219
1220 if (RV) {
1221 Builder.CreateRet(RV);
1222 } else {
1223 Builder.CreateRetVoid();
1224 }
Daniel Dunbarfc1a9c42008-09-09 23:27:19 +00001225}
1226
1227RValue CodeGenFunction::EmitCall(llvm::Value *Callee,
Daniel Dunbare126ab12008-09-10 02:41:04 +00001228 QualType RetTy,
Daniel Dunbarfc1a9c42008-09-09 23:27:19 +00001229 const CallArgList &CallArgs) {
Daniel Dunbarfc1a9c42008-09-09 23:27:19 +00001230 llvm::SmallVector<llvm::Value*, 16> Args;
Daniel Dunbarfc1a9c42008-09-09 23:27:19 +00001231
1232 // Handle struct-return functions by passing a pointer to the
1233 // location that we would like to return into.
Daniel Dunbarf98eeff2008-10-13 17:02:26 +00001234 ABIArgInfo RetAI = getABIReturnInfo(RetTy, CGM.getTypes());
Daniel Dunbare126ab12008-09-10 02:41:04 +00001235 switch (RetAI.getKind()) {
1236 case ABIArgInfo::StructRet:
Daniel Dunbarfc1a9c42008-09-09 23:27:19 +00001237 // Create a temporary alloca to hold the result of the call. :(
Daniel Dunbar04d35782008-09-17 00:51:38 +00001238 Args.push_back(CreateTempAlloca(ConvertType(RetTy)));
Daniel Dunbare126ab12008-09-10 02:41:04 +00001239 break;
1240
1241 case ABIArgInfo::Default:
Daniel Dunbar1358b202009-01-26 21:26:08 +00001242 case ABIArgInfo::Ignore:
Daniel Dunbare126ab12008-09-10 02:41:04 +00001243 case ABIArgInfo::Coerce:
Daniel Dunbare126ab12008-09-10 02:41:04 +00001244 break;
Daniel Dunbar22e30052008-09-11 01:48:57 +00001245
1246 case ABIArgInfo::ByVal:
1247 case ABIArgInfo::Expand:
1248 assert(0 && "Invalid ABI kind for return argument");
Daniel Dunbarfc1a9c42008-09-09 23:27:19 +00001249 }
1250
1251 for (CallArgList::const_iterator I = CallArgs.begin(), E = CallArgs.end();
1252 I != E; ++I) {
Daniel Dunbarf98eeff2008-10-13 17:02:26 +00001253 ABIArgInfo ArgInfo = getABIArgumentInfo(I->second, CGM.getTypes());
Daniel Dunbarfc1a9c42008-09-09 23:27:19 +00001254 RValue RV = I->first;
Daniel Dunbar04d35782008-09-17 00:51:38 +00001255
1256 switch (ArgInfo.getKind()) {
1257 case ABIArgInfo::ByVal: // Default is byval
1258 case ABIArgInfo::Default:
1259 if (RV.isScalar()) {
1260 Args.push_back(RV.getScalarVal());
1261 } else if (RV.isComplex()) {
1262 // Make a temporary alloca to pass the argument.
1263 Args.push_back(CreateTempAlloca(ConvertType(I->second)));
1264 StoreComplexToAddr(RV.getComplexVal(), Args.back(), false);
1265 } else {
1266 Args.push_back(RV.getAggregateAddr());
1267 }
1268 break;
1269
Daniel Dunbar1358b202009-01-26 21:26:08 +00001270 case ABIArgInfo::Ignore:
1271 break;
1272
Daniel Dunbar04d35782008-09-17 00:51:38 +00001273 case ABIArgInfo::StructRet:
1274 case ABIArgInfo::Coerce:
1275 assert(0 && "Invalid ABI kind for non-return argument");
1276 break;
1277
1278 case ABIArgInfo::Expand:
1279 ExpandTypeToArgs(I->second, RV, Args);
1280 break;
Daniel Dunbarfc1a9c42008-09-09 23:27:19 +00001281 }
1282 }
1283
1284 llvm::CallInst *CI = Builder.CreateCall(Callee,&Args[0],&Args[0]+Args.size());
Daniel Dunbar1c8d1ba2009-01-31 02:54:56 +00001285 const llvm::Type *FnType =
1286 cast<llvm::PointerType>(Callee->getType())->getElementType();
1287 CGFunctionInfo CallInfo(RetTy, CallArgs,
1288 cast<llvm::FunctionType>(FnType)->isVarArg());
Daniel Dunbarfc1a9c42008-09-09 23:27:19 +00001289
Daniel Dunbarbccb0682008-09-10 00:32:18 +00001290 // FIXME: Provide TargetDecl so nounwind, noreturn, etc, etc get set.
Devang Patela85a9ef2008-09-25 21:02:23 +00001291 CodeGen::AttributeListType AttributeList;
Daniel Dunbarebbb8f32009-01-31 02:19:00 +00001292 CGM.ConstructAttributeList(0, CallInfo, AttributeList);
Devang Patela85a9ef2008-09-25 21:02:23 +00001293 CI->setAttributes(llvm::AttrListPtr::get(AttributeList.begin(),
Daniel Dunbarebbb8f32009-01-31 02:19:00 +00001294 AttributeList.size()));
1295
Daniel Dunbarfc1a9c42008-09-09 23:27:19 +00001296 if (const llvm::Function *F = dyn_cast<llvm::Function>(Callee))
1297 CI->setCallingConv(F->getCallingConv());
1298 if (CI->getType() != llvm::Type::VoidTy)
1299 CI->setName("call");
Daniel Dunbare126ab12008-09-10 02:41:04 +00001300
1301 switch (RetAI.getKind()) {
1302 case ABIArgInfo::StructRet:
1303 if (RetTy->isAnyComplexType())
Daniel Dunbar04d35782008-09-17 00:51:38 +00001304 return RValue::getComplex(LoadComplexFromAddr(Args[0], false));
Daniel Dunbar17d35372008-12-18 04:52:14 +00001305 else if (CodeGenFunction::hasAggregateLLVMType(RetTy))
Daniel Dunbar04d35782008-09-17 00:51:38 +00001306 return RValue::getAggregate(Args[0]);
Daniel Dunbar17d35372008-12-18 04:52:14 +00001307 else
1308 return RValue::get(Builder.CreateLoad(Args[0]));
Daniel Dunbar22e30052008-09-11 01:48:57 +00001309
Daniel Dunbare126ab12008-09-10 02:41:04 +00001310 case ABIArgInfo::Default:
1311 return RValue::get(RetTy->isVoidType() ? 0 : CI);
1312
Daniel Dunbar1358b202009-01-26 21:26:08 +00001313 case ABIArgInfo::Ignore:
Daniel Dunbar5c9c7f02009-01-29 08:24:57 +00001314 if (RetTy->isVoidType())
1315 return RValue::get(0);
1316 if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
1317 llvm::Value *Res =
1318 llvm::UndefValue::get(llvm::PointerType::getUnqual(ConvertType(RetTy)));
1319 return RValue::getAggregate(Res);
1320 }
1321 return RValue::get(llvm::UndefValue::get(ConvertType(RetTy)));
Daniel Dunbar1358b202009-01-26 21:26:08 +00001322
Daniel Dunbar73d66602008-09-10 07:04:09 +00001323 case ABIArgInfo::Coerce: {
Daniel Dunbar708d8a82009-01-27 01:36:03 +00001324 llvm::Value *V = CreateTempAlloca(ConvertType(RetTy), "coerce");
1325 CreateCoercedStore(CI, V, *this);
Anders Carlssonfccf7472008-11-25 22:21:48 +00001326 if (RetTy->isAnyComplexType())
1327 return RValue::getComplex(LoadComplexFromAddr(V, false));
Daniel Dunbar1358b202009-01-26 21:26:08 +00001328 else if (CodeGenFunction::hasAggregateLLVMType(RetTy))
Anders Carlssonfccf7472008-11-25 22:21:48 +00001329 return RValue::getAggregate(V);
Daniel Dunbar1358b202009-01-26 21:26:08 +00001330 else
1331 return RValue::get(Builder.CreateLoad(V));
Daniel Dunbar73d66602008-09-10 07:04:09 +00001332 }
Daniel Dunbar22e30052008-09-11 01:48:57 +00001333
1334 case ABIArgInfo::ByVal:
1335 case ABIArgInfo::Expand:
1336 assert(0 && "Invalid ABI kind for return argument");
Daniel Dunbarfc1a9c42008-09-09 23:27:19 +00001337 }
Daniel Dunbare126ab12008-09-10 02:41:04 +00001338
1339 assert(0 && "Unhandled ABIArgInfo::Kind");
1340 return RValue::get(0);
Daniel Dunbarfc1a9c42008-09-09 23:27:19 +00001341}