CGCall.cpp revision bb36d331f439f49859efcfb4435c61762fbba6f9
10dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//===----- CGCall.h - Encapsulate calling convention details ----*- C++ -*-===// 20dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// 30dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// The LLVM Compiler Infrastructure 40dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// 50dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// This file is distributed under the University of Illinois Open Source 60dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// License. See LICENSE.TXT for details. 70dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// 80dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//===----------------------------------------------------------------------===// 90dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// 100dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// These classes wrap the information about a call or function 110dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// definition used to handle ABI compliancy. 120dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// 130dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar//===----------------------------------------------------------------------===// 140dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 150dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "CGCall.h" 160dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "CodeGenFunction.h" 17b768807c49a1c7085def099b848631856af766faDaniel Dunbar#include "CodeGenModule.h" 186b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar#include "clang/Basic/TargetInfo.h" 190dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "clang/AST/ASTContext.h" 200dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "clang/AST/Decl.h" 210dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar#include "clang/AST/DeclObjC.h" 2299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar#include "clang/AST/RecordLayout.h" 235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar#include "llvm/ADT/StringExtras.h" 24d0646bd7c11c12b34971b55e5c1bdd8439401b4cDevang Patel#include "llvm/Attributes.h" 256f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar#include "llvm/Support/CommandLine.h" 2654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar#include "llvm/Target/TargetData.h" 270dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarusing namespace clang; 280dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbarusing namespace CodeGen; 290dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 300dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar/***/ 310dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 320dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// FIXME: Use iterator and sidestep silly type array creation. 330dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 34bb36d331f439f49859efcfb4435c61762fbba6f9Daniel DunbarCGFunctionInfo::CGFunctionInfo(const FunctionTypeNoProto *FTNP) { 3545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ArgTypes.push_back(FTNP->getResultType()); 3645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar} 3745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 38bb36d331f439f49859efcfb4435c61762fbba6f9Daniel DunbarCGFunctionInfo::CGFunctionInfo(const FunctionTypeProto *FTP) { 3945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ArgTypes.push_back(FTP->getResultType()); 4045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i) 4145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ArgTypes.push_back(FTP->getArgType(i)); 4245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar} 4345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 4445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar// FIXME: Is there really any reason to have this still? 45bb36d331f439f49859efcfb4435c61762fbba6f9Daniel DunbarCGFunctionInfo::CGFunctionInfo(const FunctionDecl *FD) { 460dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar const FunctionType *FTy = FD->getType()->getAsFunctionType(); 470dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar const FunctionTypeProto *FTP = dyn_cast<FunctionTypeProto>(FTy); 4845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 490dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back(FTy->getResultType()); 5045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar if (FTP) { 510dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i) 520dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back(FTP->getArgType(i)); 5345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 540dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 550dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 560dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel DunbarCGFunctionInfo::CGFunctionInfo(const ObjCMethodDecl *MD, 57bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar const ASTContext &Context) { 580dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back(MD->getResultType()); 590dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back(MD->getSelfDecl()->getType()); 600dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back(Context.getObjCSelType()); 610dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar for (ObjCMethodDecl::param_const_iterator i = MD->param_begin(), 620dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar e = MD->param_end(); i != e; ++i) 630dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back((*i)->getType()); 640dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 650dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 66bb36d331f439f49859efcfb4435c61762fbba6f9Daniel DunbarCGFunctionInfo::CGFunctionInfo(QualType ResTy, const CallArgList &Args) { 67725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar ArgTypes.push_back(ResTy); 68725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar for (CallArgList::const_iterator i = Args.begin(), e = Args.end(); 69725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar i != e; ++i) 700dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back(i->second); 710dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 720dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 73bb36d331f439f49859efcfb4435c61762fbba6f9Daniel DunbarCGFunctionInfo::CGFunctionInfo(QualType ResTy, const FunctionArgList &Args) { 74bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar ArgTypes.push_back(ResTy); 75bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end(); 76bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar i != e; ++i) 77bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar ArgTypes.push_back(i->second); 78bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar} 79bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar 80725ad31086e3d6c41afa10c43db44f2e7060a961Daniel DunbarArgTypeIterator CGFunctionInfo::argtypes_begin() const { 815323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar return ArgTypes.begin(); 825323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar} 835323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 84725ad31086e3d6c41afa10c43db44f2e7060a961Daniel DunbarArgTypeIterator CGFunctionInfo::argtypes_end() const { 855323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar return ArgTypes.end(); 860dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 8717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 8817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar/***/ 8917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 908951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar/// ABIArgInfo - Helper class to encapsulate information about how a 918951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar/// specific C type should be passed to or returned from a function. 922c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarclass ABIArgInfo { 932c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarpublic: 942c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar enum Kind { 952c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar Default, 963aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar StructRet, /// Only valid for return values. The return value 973aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar /// should be passed through a pointer to a caller 983aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar /// allocated location passed as an implicit first 993aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar /// argument to the function. 1008951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 10111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar Ignore, /// Ignore the argument (treat as void). Useful for 10211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar /// void and empty structs. 10311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 1045627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Coerce, /// Only valid for aggregate return types, the argument 1055627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar /// should be accessed by coercion to a provided type. 1068951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 1078951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar ByVal, /// Only valid for aggregate argument types. The 1088951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar /// structure should be passed "byval" with the 1098951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar /// specified alignment (0 indicates default 1108951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar /// alignment). 1118951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 1128951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar Expand, /// Only valid for aggregate argument types. The 1138951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar /// structure should be expanded into consecutive 1145627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar /// arguments for its constituent fields. Currently 1155627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar /// expand is only allowed on structures whose fields 1165627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar /// are all scalar types or are themselves expandable 1175627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar /// types. 1188951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 1198951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar KindFirst=Default, KindLast=Expand 1202c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar }; 1212c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 1222c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarprivate: 1232c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar Kind TheKind; 124639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar const llvm::Type *TypeData; 1258951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar unsigned UIntData; 1262c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 1278951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar ABIArgInfo(Kind K, const llvm::Type *TD=0, 1288951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar unsigned UI=0) : TheKind(K), 1298951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar TypeData(TD), 1308951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar UIntData(0) {} 1312c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarpublic: 1322c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar static ABIArgInfo getDefault() { 1338951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar return ABIArgInfo(Default); 1342c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 1352c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar static ABIArgInfo getStructRet() { 1368951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar return ABIArgInfo(StructRet); 1372c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 13811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar static ABIArgInfo getIgnore() { 13911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar return ABIArgInfo(Ignore); 14011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar } 141639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar static ABIArgInfo getCoerce(const llvm::Type *T) { 1422c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar return ABIArgInfo(Coerce, T); 1432c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 1448951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar static ABIArgInfo getByVal(unsigned Alignment) { 1458951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar return ABIArgInfo(ByVal, 0, Alignment); 1468951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 1475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar static ABIArgInfo getExpand() { 1485627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar return ABIArgInfo(Expand); 1495627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 1502c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 1512c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar Kind getKind() const { return TheKind; } 1522c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar bool isDefault() const { return TheKind == Default; } 1532c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar bool isStructRet() const { return TheKind == StructRet; } 15411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar bool isIgnore() const { return TheKind == Ignore; } 1552c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar bool isCoerce() const { return TheKind == Coerce; } 1568951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar bool isByVal() const { return TheKind == ByVal; } 1575627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar bool isExpand() const { return TheKind == Expand; } 15845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 15945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar // Coerce accessors 160639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar const llvm::Type *getCoerceToType() const { 16145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar assert(TheKind == Coerce && "Invalid kind!"); 16245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar return TypeData; 16345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 1648951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 1658951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar // ByVal accessors 1668951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar unsigned getByValAlignment() const { 1678951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(TheKind == ByVal && "Invalid kind!"); 1688951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar return UIntData; 1698951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 1702c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar}; 1712c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 1722c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar/***/ 1732c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 1746b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/* FIXME: All of this stuff should be part of the target interface 1756b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar somehow. It is currently here because it is not clear how to factor 1766b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar the targets to support this, since the Targets currently live in a 1776b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar layer below types n'stuff. 1786b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar */ 1796b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 1806b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// ABIInfo - Target specific hooks for defining how a type should be 1816b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// passed or returned from functions. 1826b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarclass clang::ABIInfo { 1836b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarpublic: 1846b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar virtual ~ABIInfo(); 1856b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 1866b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar virtual ABIArgInfo classifyReturnType(QualType RetTy, 1876b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const = 0; 1886b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 1896b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar virtual ABIArgInfo classifyArgumentType(QualType Ty, 1906b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const = 0; 1916b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}; 1926b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 1936b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIInfo::~ABIInfo() {} 1946b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 195834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// isEmptyStruct - Return true iff a structure has no non-empty 196834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// members. Note that a structure with a flexible array member is not 197834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// considered empty. 198834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic bool isEmptyStruct(QualType T) { 199834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const RecordType *RT = T->getAsStructureType(); 200834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (!RT) 201834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return 0; 202834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const RecordDecl *RD = RT->getDecl(); 203834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (RD->hasFlexibleArrayMember()) 204834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return false; 205f8d49f64ef6ab7e632717a31631fc289aab69428Douglas Gregor for (RecordDecl::field_iterator i = RD->field_begin(), 206834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar e = RD->field_end(); i != e; ++i) { 207834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const FieldDecl *FD = *i; 208834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (!isEmptyStruct(FD->getType())) 209834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return false; 210834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 211834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return true; 212834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar} 213834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 214834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// isSingleElementStruct - Determine if a structure is a "single 215834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// element struct", i.e. it has exactly one non-empty field or 216834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// exactly one field which is itself a single element 217834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// struct. Structures with flexible array members are never 218834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// considered single element structs. 219834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// 220834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// \return The field declaration for the single non-empty field, if 221834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// it exists. 222834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic const FieldDecl *isSingleElementStruct(QualType T) { 223834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const RecordType *RT = T->getAsStructureType(); 224834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (!RT) 225834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return 0; 226834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 227834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const RecordDecl *RD = RT->getDecl(); 228834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (RD->hasFlexibleArrayMember()) 229834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return 0; 230834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 231834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const FieldDecl *Found = 0; 232f8d49f64ef6ab7e632717a31631fc289aab69428Douglas Gregor for (RecordDecl::field_iterator i = RD->field_begin(), 233834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar e = RD->field_end(); i != e; ++i) { 234834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const FieldDecl *FD = *i; 235834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar QualType FT = FD->getType(); 236834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 237834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (isEmptyStruct(FT)) { 238834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // Ignore 239834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } else if (Found) { 240834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return 0; 241834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } else if (!CodeGenFunction::hasAggregateLLVMType(FT)) { 242834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar Found = FD; 243834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } else { 244834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar Found = isSingleElementStruct(FT); 245834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (!Found) 246834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return 0; 247834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 248834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 249834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 250834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return Found; 251834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar} 252834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 253834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic bool is32Or64BitBasicType(QualType Ty, ASTContext &Context) { 254834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (!Ty->getAsBuiltinType() && !Ty->isPointerType()) 255834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return false; 256834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 257834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar uint64_t Size = Context.getTypeSize(Ty); 258834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return Size == 32 || Size == 64; 259834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar} 260834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 261834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic bool areAllFields32Or64BitBasicType(const RecordDecl *RD, 262834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar ASTContext &Context) { 263f8d49f64ef6ab7e632717a31631fc289aab69428Douglas Gregor for (RecordDecl::field_iterator i = RD->field_begin(), 264834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar e = RD->field_end(); i != e; ++i) { 265834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const FieldDecl *FD = *i; 266834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 267834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (!is32Or64BitBasicType(FD->getType(), Context)) 268834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return false; 269834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 270834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // If this is a bit-field we need to make sure it is still a 271834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // 32-bit or 64-bit type. 272834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (Expr *BW = FD->getBitWidth()) { 273834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar unsigned Width = BW->getIntegerConstantExprValue(Context).getZExtValue(); 274834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (Width <= 16) 275834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return false; 276834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 277834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 278834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return true; 279834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar} 280834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 2816b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarnamespace { 2826b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// DefaultABIInfo - The default implementation for ABI specific 2836b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// details. This implementation provides information which results in 2846b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// sensible LLVM IR generation, but does not conform to any 2856b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// particular ABI. 2866b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarclass DefaultABIInfo : public ABIInfo { 2876b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar virtual ABIArgInfo classifyReturnType(QualType RetTy, 2886b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const; 2896b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 2906b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar virtual ABIArgInfo classifyArgumentType(QualType RetTy, 2916b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const; 2926b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}; 2936b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 2946b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// X86_32ABIInfo - The X86-32 ABI information. 2956b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarclass X86_32ABIInfo : public ABIInfo { 2966b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarpublic: 2976b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar virtual ABIArgInfo classifyReturnType(QualType RetTy, 2986b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const; 2996b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 3006b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar virtual ABIArgInfo classifyArgumentType(QualType RetTy, 3016b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const; 3026b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}; 3036b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar} 3046b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 3056b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo X86_32ABIInfo::classifyReturnType(QualType RetTy, 3066b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const { 3072c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(RetTy)) { 308834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // Classify "single element" structs as their element type. 309834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const FieldDecl *SeltFD = isSingleElementStruct(RetTy); 310834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (SeltFD) { 311834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar QualType SeltTy = SeltFD->getType()->getDesugaredType(); 312834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (const BuiltinType *BT = SeltTy->getAsBuiltinType()) { 313834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // FIXME: This is gross, it would be nice if we could just 314834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // pass back SeltTy and have clients deal with it. Is it worth 315834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // supporting coerce to both LLVM and clang Types? 316834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (BT->isIntegerType()) { 317834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar uint64_t Size = Context.getTypeSize(SeltTy); 318834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getCoerce(llvm::IntegerType::get((unsigned) Size)); 319834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } else if (BT->getKind() == BuiltinType::Float) { 320834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getCoerce(llvm::Type::FloatTy); 321834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } else if (BT->getKind() == BuiltinType::Double) { 322834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getCoerce(llvm::Type::DoubleTy); 323834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 324834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } else if (SeltTy->isPointerType()) { 325834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // FIXME: It would be really nice if this could come out as 326834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // the proper pointer type. 327834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar llvm::Type *PtrTy = 328834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar llvm::PointerType::getUnqual(llvm::Type::Int8Ty); 329834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getCoerce(PtrTy); 330834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 331834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 332834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 333639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar uint64_t Size = Context.getTypeSize(RetTy); 334639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar if (Size == 8) { 335639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar return ABIArgInfo::getCoerce(llvm::Type::Int8Ty); 336639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } else if (Size == 16) { 337639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar return ABIArgInfo::getCoerce(llvm::Type::Int16Ty); 338639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } else if (Size == 32) { 339639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar return ABIArgInfo::getCoerce(llvm::Type::Int32Ty); 340639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } else if (Size == 64) { 341639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar return ABIArgInfo::getCoerce(llvm::Type::Int64Ty); 342639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } else { 343639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar return ABIArgInfo::getStructRet(); 344639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } 3452c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } else { 3462c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar return ABIArgInfo::getDefault(); 3472c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 3482c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar} 3492c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 3506b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty, 3516b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const { 352f035738e346da0a82538ab236aef218a27373635Daniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(Ty)) { 353834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // Structures with flexible arrays are always byval. 354834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (const RecordType *RT = Ty->getAsStructureType()) 355834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (RT->getDecl()->hasFlexibleArrayMember()) 356834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getByVal(0); 357834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 358834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // Expand empty structs (i.e. ignore) 359834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar uint64_t Size = Context.getTypeSize(Ty); 360834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (Ty->isStructureType() && Size == 0) 361834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getExpand(); 362834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 363834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // Expand structs with size <= 128-bits which consist only of 364834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // basic types (int, long long, float, double, xxx*). This is 365834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // non-recursive and does not ignore empty fields. 366834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (const RecordType *RT = Ty->getAsStructureType()) { 367834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (Context.getTypeSize(Ty) <= 4*32 && 368834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar areAllFields32Or64BitBasicType(RT->getDecl(), Context)) 369834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getExpand(); 370834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 371834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 3728951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar return ABIArgInfo::getByVal(0); 3738951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } else { 3748951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar return ABIArgInfo::getDefault(); 3758951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 3768951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar} 3778951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 3786f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarnamespace { 379c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar/// X86_64ABIInfo - The X86_64 ABI information. 3806f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarclass X86_64ABIInfo : public ABIInfo { 3816f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar enum Class { 3826f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Integer = 0, 3836f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar SSE, 3846f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar SSEUp, 3856f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar X87, 3866f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar X87Up, 3876f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar ComplexX87, 3886f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar NoClass, 3896f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Memory 3906f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar }; 3916f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 3928562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar /// merge - Implement the X86_64 ABI merging algorithm. 3938562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar /// 394c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar /// Merge an accumulating classification \arg Accum with a field 395c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar /// classification \arg Field. 396c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar /// 397c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar /// \param Accum - The accumulating classification. This should 398c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar /// always be either NoClass or the result of a previous merge 399c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar /// call. In addition, this should never be Memory (the caller 400c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar /// should just return Memory for the aggregate). 401c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Class merge(Class Accum, Class Field) const; 4028562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar 4036f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// classify - Determine the x86_64 register classes in which the 4046f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// given type T should be passed. 4056f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// 406c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar /// \param Lo - The classification for the parts of the type 407c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar /// residing in the low word of the containing object. 408c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar /// 409c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar /// \param Hi - The classification for the parts of the type 410c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar /// residing in the high word of the containing object. 411c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar /// 412c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar /// \param OffsetBase - The bit offset of this type in the 413cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar /// containing object. Some parameters are classified different 414cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar /// depending on whether they straddle an eightbyte boundary. 4156f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// 4166f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// If a word is unused its result will be NoClass; if a type should 4176f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// be passed in Memory then at least the classification of \arg Lo 4186f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// will be Memory. 4196f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// 4206f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// The \arg Lo class will be NoClass iff the argument is ignored. 4216f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// 4226f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// If the \arg Lo class is ComplexX87, then the \arg Hi class will 4236f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// be NoClass. 424e620ecdd4104285e09fe585e90f720459b80259bDaniel Dunbar void classify(QualType T, ASTContext &Context, uint64_t OffsetBase, 4256f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Class &Lo, Class &Hi) const; 426c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar 4276f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarpublic: 4286f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar virtual ABIArgInfo classifyReturnType(QualType RetTy, 4296f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar ASTContext &Context) const; 4306f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 4316f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar virtual ABIArgInfo classifyArgumentType(QualType RetTy, 4326f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar ASTContext &Context) const; 4336f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar}; 4346f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar} 4356f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 436c450357c436c05aa02ef88d406de962d98ac50beDaniel DunbarX86_64ABIInfo::Class X86_64ABIInfo::merge(Class Accum, 437c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Class Field) const { 4388562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // AMD64-ABI 3.2.3p2: Rule 4. Each field of an object is 4398562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // classified recursively so that always two fields are 4408562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // considered. The resulting class is calculated according to 4418562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // the classes of the fields in the eightbyte: 4428562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // 4438562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // (a) If both classes are equal, this is the resulting class. 4448562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // 4458562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // (b) If one of the classes is NO_CLASS, the resulting class is 4468562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // the other class. 4478562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // 4488562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // (c) If one of the classes is MEMORY, the result is the MEMORY 4498562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // class. 4508562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // 4518562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // (d) If one of the classes is INTEGER, the result is the 4528562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // INTEGER. 4538562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // 4548562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // (e) If one of the classes is X87, X87UP, COMPLEX_X87 class, 4558562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // MEMORY is used as class. 4568562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // 4578562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // (f) Otherwise class SSE is used. 458c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar assert((Accum == NoClass || Accum == Integer || 459c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Accum == SSE || Accum == SSEUp) && 460c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar "Invalid accumulated classification during merge."); 461c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar if (Accum == Field || Field == NoClass) 462c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar return Accum; 463c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar else if (Field == Memory) 464c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar return Memory; 465c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar else if (Accum == NoClass) 466c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar return Field; 467c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar else if (Accum == Integer || Field == Integer) 468c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar return Integer; 469c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar else if (Field == X87 || Field == X87Up || Field == ComplexX87) 470c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar return Memory; 4718562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar else 472c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar return SSE; 4738562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar} 4748562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar 4756f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarvoid X86_64ABIInfo::classify(QualType Ty, 4766f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar ASTContext &Context, 477e620ecdd4104285e09fe585e90f720459b80259bDaniel Dunbar uint64_t OffsetBase, 4786f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Class &Lo, Class &Hi) const { 4799a82b52ae83fa1c09266b2fa5f0375392f7d127fDaniel Dunbar // FIXME: This code can be simplified by introducing a simple value 4809a82b52ae83fa1c09266b2fa5f0375392f7d127fDaniel Dunbar // class for Class pairs with appropriate constructor methods for 4819a82b52ae83fa1c09266b2fa5f0375392f7d127fDaniel Dunbar // the various situations. 4829a82b52ae83fa1c09266b2fa5f0375392f7d127fDaniel Dunbar 483c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Lo = Hi = NoClass; 484c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar 485c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Class &Current = OffsetBase < 64 ? Lo : Hi; 486c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Current = Memory; 487c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar 4886f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar if (const BuiltinType *BT = Ty->getAsBuiltinType()) { 4896f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar BuiltinType::Kind k = BT->getKind(); 4906f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 49111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar if (k == BuiltinType::Void) { 492c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Current = NoClass; 49311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar } else if (k >= BuiltinType::Bool && k <= BuiltinType::LongLong) { 494c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Current = Integer; 4956f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar } else if (k == BuiltinType::Float || k == BuiltinType::Double) { 496c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Current = SSE; 4976f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar } else if (k == BuiltinType::LongDouble) { 4986f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Lo = X87; 4996f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Hi = X87Up; 5006f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar } 5017a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar // FIXME: _Decimal32 and _Decimal64 are SSE. 5027a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar // FIXME: _float128 and _Decimal128 are (SSE, SSEUp). 5036f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // FIXME: __int128 is (Integer, Integer). 5046f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar } else if (Ty->isPointerLikeType() || Ty->isBlockPointerType() || 5056f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Ty->isObjCQualifiedInterfaceType()) { 506c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Current = Integer; 5077a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar } else if (const VectorType *VT = Ty->getAsVectorType()) { 508e620ecdd4104285e09fe585e90f720459b80259bDaniel Dunbar uint64_t Size = Context.getTypeSize(VT); 5097a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar if (Size == 64) { 510d4cd1b07169c698bd003be102bd73a7da7e24b25Daniel Dunbar // gcc passes <1 x double> in memory. 511c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar if (VT->getElementType() == Context.DoubleTy) 512d4cd1b07169c698bd003be102bd73a7da7e24b25Daniel Dunbar return; 513d4cd1b07169c698bd003be102bd73a7da7e24b25Daniel Dunbar 514c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Current = SSE; 515e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar 516e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar // If this type crosses an eightbyte boundary, it should be 517e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar // split. 518cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar if (OffsetBase && OffsetBase != 64) 519e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar Hi = Lo; 5207a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar } else if (Size == 128) { 5217a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar Lo = SSE; 5227a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar Hi = SSEUp; 5237a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar } 5246f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar } else if (const ComplexType *CT = Ty->getAsComplexType()) { 5256f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar QualType ET = CT->getElementType(); 5266f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 527e33edf150adc44a34c5f6c8ed6109f6dcd2f70c6Daniel Dunbar uint64_t Size = Context.getTypeSize(Ty); 528eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar if (ET->isIntegerType()) { 529eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar if (Size <= 64) 530c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Current = Integer; 531eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar else if (Size <= 128) 532eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar Lo = Hi = Integer; 533eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar } else if (ET == Context.FloatTy) 534c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Current = SSE; 5356f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar else if (ET == Context.DoubleTy) 5366f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Lo = Hi = SSE; 5376f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar else if (ET == Context.LongDoubleTy) 538c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Current = ComplexX87; 539f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar 540f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar // If this complex type crosses an eightbyte boundary then it 541f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar // should be split. 542cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar uint64_t EB_Real = (OffsetBase) / 64; 543cdf920ed6c610e21fc899ada93370a68c900d180Daniel Dunbar uint64_t EB_Imag = (OffsetBase + Context.getTypeSize(ET)) / 64; 544f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar if (Hi == NoClass && EB_Real != EB_Imag) 545f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar Hi = Lo; 5468562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar } else if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty)) { 5478562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // Arrays are treated like structures. 5488562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar 5498562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar uint64_t Size = Context.getTypeSize(Ty); 5508562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar 5518562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger 5528562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // than two eightbytes, ..., it has class MEMORY. 5538562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar if (Size > 128) 5548562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar return; 5558562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar 5568562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned 5578562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // fields, it has class MEMORY. 5588562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // 5598562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // Only need to check alignment of array base. 560c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar if (OffsetBase % Context.getTypeAlign(AT->getElementType())) 5618562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar return; 5628562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar 5638562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // Otherwise implement simplified merge. We could be smarter about 5648562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // this, but it isn't worth it and would be harder to verify. 565c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Current = NoClass; 5668562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar uint64_t EltSize = Context.getTypeSize(AT->getElementType()); 5678562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar uint64_t ArraySize = AT->getSize().getZExtValue(); 5688562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar for (uint64_t i=0, Offset=OffsetBase; i<ArraySize; ++i, Offset += EltSize) { 5698562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar Class FieldLo, FieldHi; 5708562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar classify(AT->getElementType(), Context, Offset, FieldLo, FieldHi); 571c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Lo = merge(Lo, FieldLo); 572c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Hi = merge(Hi, FieldHi); 573c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar if (Lo == Memory || Hi == Memory) 574c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar break; 5758562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar } 576c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar 577c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar // Do post merger cleanup (see below). Only case we worry about is Memory. 578c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar if (Hi == Memory) 579c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Lo = Memory; 580c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp array classification."); 58199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar } else if (const RecordType *RT = Ty->getAsRecordType()) { 582e620ecdd4104285e09fe585e90f720459b80259bDaniel Dunbar uint64_t Size = Context.getTypeSize(Ty); 58399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 58499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger 58599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // than two eightbytes, ..., it has class MEMORY. 58699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar if (Size > 128) 58799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar return; 58899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 58999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar const RecordDecl *RD = RT->getDecl(); 59099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 59199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // Assume variable sized types are passed in memory. 59299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar if (RD->hasFlexibleArrayMember()) 59399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar return; 59499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 59599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); 59699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 59799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // Reset Lo class, this will be recomputed. 598c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Current = NoClass; 59999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar unsigned idx = 0; 60099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar for (RecordDecl::field_iterator i = RD->field_begin(), 60199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar e = RD->field_end(); i != e; ++i, ++idx) { 6028562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx); 60399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 6048562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned 6058562ae74ae0ff0a64b46ef5ebea8e7ce0f76fa00Daniel Dunbar // fields, it has class MEMORY. 60699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar if (Offset % Context.getTypeAlign(i->getType())) { 60799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar Lo = Memory; 60899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar return; 60999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar } 61099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 61199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // Classify this field. 612c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar // 613c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar // AMD64-ABI 3.2.3p2: Rule 3. If the size of the aggregate 614c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar // exceeds a single eightbyte, each is classified 615c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar // separately. Each eightbyte gets initialized to class 616c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar // NO_CLASS. 61799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar Class FieldLo, FieldHi; 618f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar classify(i->getType(), Context, Offset, FieldLo, FieldHi); 619c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Lo = merge(Lo, FieldLo); 620c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Hi = merge(Hi, FieldHi); 621c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar if (Lo == Memory || Hi == Memory) 622c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar break; 62399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar } 62499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 62599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // AMD64-ABI 3.2.3p2: Rule 5. Then a post merger cleanup is done: 62699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // 62799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // (a) If one of the classes is MEMORY, the whole argument is 62899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // passed in memory. 62999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // 63099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // (b) If SSEUP is not preceeded by SSE, it is converted to SSE. 63199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 63299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // The first of these conditions is guaranteed by how we implement 633c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar // the merge (just bail). 634c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar // 635c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar // The second condition occurs in the case of unions; for example 636c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar // union { _Complex double; unsigned; }. 637c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar if (Hi == Memory) 638c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Lo = Memory; 63999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar if (Hi == SSEUp && Lo != SSE) 640c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar Hi = SSE; 6416f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar } 6426f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar} 6436f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 644c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar 645d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel DunbarABIArgInfo X86_64ABIInfo::classifyReturnType(QualType RetTy, 646d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar ASTContext &Context) const { 6476f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // AMD64-ABI 3.2.3p4: Rule 1. Classify the return type with the 6486f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // classification algorithm. 6496f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar X86_64ABIInfo::Class Lo, Hi; 650f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar classify(RetTy, Context, 0, Lo, Hi); 6516f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 652c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar // Check some invariants. 653c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar assert((Hi != Memory || Lo == Memory) && "Invalid memory classification."); 654c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar assert((Lo != NoClass || Hi == NoClass) && "Invalid null classification."); 655c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification."); 656c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar 6576f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar const llvm::Type *ResType = 0; 6586f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar switch (Lo) { 6596f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case NoClass: 66011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar return ABIArgInfo::getIgnore(); 6616f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 6626f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case SSEUp: 6636f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case X87Up: 6646f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar assert(0 && "Invalid classification for lo word."); 6656f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 666c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar // AMD64-ABI 3.2.3p4: Rule 2. Types of class memory are returned via 667c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar // hidden argument, i.e. structret. 6686f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case Memory: 6696f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar return ABIArgInfo::getStructRet(); 6706f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 6716f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // AMD64-ABI 3.2.3p4: Rule 3. If the class is INTEGER, the next 6726f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // available register of the sequence %rax, %rdx is used. 6736f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case Integer: 6746f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar ResType = llvm::Type::Int64Ty; break; 6756f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 6766f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // AMD64-ABI 3.2.3p4: Rule 4. If the class is SSE, the next 6776f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // available SSE register of the sequence %xmm0, %xmm1 is used. 6786f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case SSE: 6796f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar ResType = llvm::Type::DoubleTy; break; 6806f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 6816f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // AMD64-ABI 3.2.3p4: Rule 6. If the class is X87, the value is 6826f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // returned on the X87 stack in %st0 as 80-bit x87 number. 6836f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case X87: 6846f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar ResType = llvm::Type::X86_FP80Ty; break; 6856f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 686c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar // AMD64-ABI 3.2.3p4: Rule 8. If the class is COMPLEX_X87, the real 687c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar // part of the value is returned in %st0 and the imaginary part in 688c450357c436c05aa02ef88d406de962d98ac50beDaniel Dunbar // %st1. 6896f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case ComplexX87: 6906f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar assert(Hi == NoClass && "Unexpected ComplexX87 classification."); 6916f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar ResType = llvm::VectorType::get(llvm::Type::X86_FP80Ty, 2); 6926f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar break; 6936f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar } 6946f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 6956f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar switch (Hi) { 6966f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // Memory was handled previously, and ComplexX87 and X87 should 6976f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // never occur as hi classes. 6986f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case Memory: 6996f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case X87: 7006f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case ComplexX87: 7016f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar assert(0 && "Invalid classification for hi word."); 7026f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 7036f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case NoClass: break; 7046f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case Integer: 705b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar ResType = llvm::StructType::get(ResType, llvm::Type::Int64Ty, NULL); 706b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar break; 7076f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case SSE: 708b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar ResType = llvm::StructType::get(ResType, llvm::Type::DoubleTy, NULL); 709b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar break; 7106f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 7116f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // AMD64-ABI 3.2.3p4: Rule 5. If the class is SSEUP, the eightbyte 7126f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // is passed in the upper half of the last used SSE register. 7136f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // 7146f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // SSEUP should always be preceeded by SSE, just widen. 7156f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case SSEUp: 7166f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar assert(Lo == SSE && "Unexpected SSEUp classification."); 7176f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar ResType = llvm::VectorType::get(llvm::Type::DoubleTy, 2); 7186f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar break; 7196f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 7206f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // AMD64-ABI 3.2.3p4: Rule 7. If the class is X87UP, the value is 721b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar // returned together with the previous X87 value in %st0. 7226f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // 7236f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // X87UP should always be preceeded by X87, so we don't need to do 7246f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // anything here. 7256f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case X87Up: 7266f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar assert(Lo == X87 && "Unexpected X87Up classification."); 7276f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar break; 7286f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar } 7296f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 7306f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar return ABIArgInfo::getCoerce(ResType); 731d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar} 732d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar 733d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel DunbarABIArgInfo X86_64ABIInfo::classifyArgumentType(QualType Ty, 734d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar ASTContext &Context) const { 735d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar return ABIArgInfo::getDefault(); 736d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar} 737d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar 7386b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo DefaultABIInfo::classifyReturnType(QualType RetTy, 7396b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const { 7406b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar return ABIArgInfo::getDefault(); 7416b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar} 7426b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 7436b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo DefaultABIInfo::classifyArgumentType(QualType Ty, 7446b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const { 7456b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar return ABIArgInfo::getDefault(); 7466b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar} 7476b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 7486b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarconst ABIInfo &CodeGenTypes::getABIInfo() const { 7496b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar if (TheABIInfo) 7506b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar return *TheABIInfo; 7516b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 7526b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar // For now we just cache this in the CodeGenTypes and don't bother 7536b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar // to free it. 7546b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar const char *TargetPrefix = getContext().Target.getTargetPrefix(); 7556b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar if (strcmp(TargetPrefix, "x86") == 0) { 756d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar switch (getContext().Target.getPointerWidth(0)) { 757d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar case 32: 7586b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar return *(TheABIInfo = new X86_32ABIInfo()); 759d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar case 64: 76011a76ed8e34901f2b997896a8c0833c6c17bc586Daniel Dunbar return *(TheABIInfo = new X86_64ABIInfo()); 761d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar } 7626b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar } 7636b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 7646b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar return *(TheABIInfo = new DefaultABIInfo); 7656b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar} 7666b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 7676b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar// getABIReturnInfo - Wrap the ABIInfo getABIReturnInfo, altering 7686b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar// "default" types to StructRet when appropriate for simplicity. 7696b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarstatic ABIArgInfo getABIReturnInfo(QualType Ty, CodeGenTypes &CGT) { 7706b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar assert(!Ty->isArrayType() && 7716b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar "Array types cannot be passed directly."); 7726b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo Info = CGT.getABIInfo().classifyReturnType(Ty, CGT.getContext()); 773f035738e346da0a82538ab236aef218a27373635Daniel Dunbar // Ensure default on aggregate types is StructRet. 774f035738e346da0a82538ab236aef218a27373635Daniel Dunbar if (Info.isDefault() && CodeGenFunction::hasAggregateLLVMType(Ty)) 775f035738e346da0a82538ab236aef218a27373635Daniel Dunbar return ABIArgInfo::getStructRet(); 776f035738e346da0a82538ab236aef218a27373635Daniel Dunbar return Info; 777f035738e346da0a82538ab236aef218a27373635Daniel Dunbar} 778f035738e346da0a82538ab236aef218a27373635Daniel Dunbar 7796b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar// getABIArgumentInfo - Wrap the ABIInfo getABIReturnInfo, altering 7806b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar// "default" types to ByVal when appropriate for simplicity. 7816b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarstatic ABIArgInfo getABIArgumentInfo(QualType Ty, CodeGenTypes &CGT) { 7826b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar assert(!Ty->isArrayType() && 7836b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar "Array types cannot be passed directly."); 7846b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo Info = CGT.getABIInfo().classifyArgumentType(Ty, CGT.getContext()); 785f035738e346da0a82538ab236aef218a27373635Daniel Dunbar // Ensure default on aggregate types is ByVal. 786f035738e346da0a82538ab236aef218a27373635Daniel Dunbar if (Info.isDefault() && CodeGenFunction::hasAggregateLLVMType(Ty)) 787f035738e346da0a82538ab236aef218a27373635Daniel Dunbar return ABIArgInfo::getByVal(0); 788f035738e346da0a82538ab236aef218a27373635Daniel Dunbar return Info; 789f035738e346da0a82538ab236aef218a27373635Daniel Dunbar} 790f035738e346da0a82538ab236aef218a27373635Daniel Dunbar 7912c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar/***/ 7922c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 7935627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarvoid CodeGenTypes::GetExpandedTypes(QualType Ty, 7945627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar std::vector<const llvm::Type*> &ArgTys) { 7955627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordType *RT = Ty->getAsStructureType(); 7965627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RT && "Can only expand structure types."); 7975627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordDecl *RD = RT->getDecl(); 7985627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(!RD->hasFlexibleArrayMember() && 7995627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar "Cannot expand structure with flexible array."); 8005627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 801f8d49f64ef6ab7e632717a31631fc289aab69428Douglas Gregor for (RecordDecl::field_iterator i = RD->field_begin(), 8025627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar e = RD->field_end(); i != e; ++i) { 8035627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const FieldDecl *FD = *i; 8045627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(!FD->isBitField() && 8055627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar "Cannot expand structure with bit-field members."); 8065627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 8075627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar QualType FT = FD->getType(); 8085627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(FT)) { 8095627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar GetExpandedTypes(FT, ArgTys); 8105627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 8115627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ArgTys.push_back(ConvertType(FT)); 8125627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 8135627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 8145627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar} 8155627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 8165627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarllvm::Function::arg_iterator 8175627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV, 8185627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Function::arg_iterator AI) { 8195627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordType *RT = Ty->getAsStructureType(); 8205627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RT && "Can only expand structure types."); 8215627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 8225627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar RecordDecl *RD = RT->getDecl(); 8235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(LV.isSimple() && 8245627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar "Unexpected non-simple lvalue during struct expansion."); 8255627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Value *Addr = LV.getAddress(); 8265627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar for (RecordDecl::field_iterator i = RD->field_begin(), 8275627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar e = RD->field_end(); i != e; ++i) { 8285627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar FieldDecl *FD = *i; 8295627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar QualType FT = FD->getType(); 8305627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 8315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // FIXME: What are the right qualifiers here? 8325627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar LValue LV = EmitLValueForField(Addr, FD, false, 0); 8335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(FT)) { 8345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar AI = ExpandTypeFromArgs(FT, LV, AI); 8355627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 8365627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar EmitStoreThroughLValue(RValue::get(AI), LV, FT); 8375627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ++AI; 8385627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 8395627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 8405627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 8415627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar return AI; 8425627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar} 8435627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 8445627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarvoid 8455627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV, 8465627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::SmallVector<llvm::Value*, 16> &Args) { 8475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordType *RT = Ty->getAsStructureType(); 8485627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RT && "Can only expand structure types."); 8495627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 8505627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar RecordDecl *RD = RT->getDecl(); 8515627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RV.isAggregate() && "Unexpected rvalue during struct expansion"); 8525627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Value *Addr = RV.getAggregateAddr(); 8535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar for (RecordDecl::field_iterator i = RD->field_begin(), 8545627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar e = RD->field_end(); i != e; ++i) { 8555627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar FieldDecl *FD = *i; 8565627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar QualType FT = FD->getType(); 8575627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 8585627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // FIXME: What are the right qualifiers here? 8595627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar LValue LV = EmitLValueForField(Addr, FD, false, 0); 8605627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(FT)) { 8615627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ExpandTypeToArgs(FT, RValue::getAggregate(LV.getAddress()), Args); 8625627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 8635627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar RValue RV = EmitLoadOfLValue(LV, FT); 8645627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RV.isScalar() && 8655627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar "Unexpected non-scalar rvalue during struct expansion."); 8665627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Args.push_back(RV.getScalarVal()); 8675627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 8685627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 8695627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar} 8705627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 871275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// CreateCoercedLoad - Create a load from \arg SrcPtr interpreted as 872275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// a pointer to an object of type \arg Ty. 873275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// 874275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// This safely handles the case when the src type is smaller than the 875275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// destination type; in this situation the values of bits which not 876275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// present in the src are undefined. 877275e10d62af4a129a8559253958296d8659684c9Daniel Dunbarstatic llvm::Value *CreateCoercedLoad(llvm::Value *SrcPtr, 878275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar const llvm::Type *Ty, 879275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CodeGenFunction &CGF) { 880275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar const llvm::Type *SrcTy = 881275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar cast<llvm::PointerType>(SrcPtr->getType())->getElementType(); 882275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar uint64_t SrcSize = CGF.CGM.getTargetData().getTypePaddedSize(SrcTy); 883275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar uint64_t DstSize = CGF.CGM.getTargetData().getTypePaddedSize(Ty); 884275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar 885275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar // If load is legal, just bitcase the src pointer. 886275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar if (SrcSize == DstSize) { 887275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar llvm::Value *Casted = 888275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CGF.Builder.CreateBitCast(SrcPtr, llvm::PointerType::getUnqual(Ty)); 889275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar return CGF.Builder.CreateLoad(Casted); 890275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar } else { 891275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar assert(SrcSize < DstSize && "Coercion is losing source bits!"); 892275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar 893275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar // Otherwise do coercion through memory. This is stupid, but 894275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar // simple. 895275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar llvm::Value *Tmp = CGF.CreateTempAlloca(Ty); 896275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar llvm::Value *Casted = 897275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(SrcTy)); 898275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CGF.Builder.CreateStore(CGF.Builder.CreateLoad(SrcPtr), Casted); 899275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar return CGF.Builder.CreateLoad(Tmp); 900275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar } 901275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar} 902275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar 903275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// CreateCoercedStore - Create a store to \arg DstPtr from \arg Src, 904275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// where the source and destination may have different types. 905275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// 906275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// This safely handles the case when the src type is larger than the 907275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar/// destination type; the upper bits of the src will be lost. 908275e10d62af4a129a8559253958296d8659684c9Daniel Dunbarstatic void CreateCoercedStore(llvm::Value *Src, 909275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar llvm::Value *DstPtr, 910275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CodeGenFunction &CGF) { 911275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar const llvm::Type *SrcTy = Src->getType(); 912275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar const llvm::Type *DstTy = 913275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar cast<llvm::PointerType>(DstPtr->getType())->getElementType(); 914275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar 915275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar uint64_t SrcSize = CGF.CGM.getTargetData().getTypePaddedSize(SrcTy); 916275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar uint64_t DstSize = CGF.CGM.getTargetData().getTypePaddedSize(DstTy); 917275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar 918275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar // If store is legal, just bitcase the src pointer. 919275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar if (SrcSize == DstSize) { 920275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar llvm::Value *Casted = 921275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CGF.Builder.CreateBitCast(DstPtr, llvm::PointerType::getUnqual(SrcTy)); 922275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CGF.Builder.CreateStore(Src, Casted); 923275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar } else { 924275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar assert(SrcSize > DstSize && "Coercion is missing bits!"); 925275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar 926275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar // Otherwise do coercion through memory. This is stupid, but 927275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar // simple. 928275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar llvm::Value *Tmp = CGF.CreateTempAlloca(SrcTy); 929275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CGF.Builder.CreateStore(Src, Tmp); 930275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar llvm::Value *Casted = 931275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(DstTy)); 932275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar CGF.Builder.CreateStore(CGF.Builder.CreateLoad(Casted), DstPtr); 933275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar } 934275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar} 935275e10d62af4a129a8559253958296d8659684c9Daniel Dunbar 9365627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar/***/ 9375627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 938bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbarbool CodeGenModule::ReturnTypeUsesSret(QualType RetTy) { 939bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar return getABIReturnInfo(RetTy, getTypes()).isStructRet(); 940bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar} 941bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar 94245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbarconst llvm::FunctionType * 943bb36d331f439f49859efcfb4435c61762fbba6f9Daniel DunbarCodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool IsVariadic) { 94445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar std::vector<const llvm::Type*> ArgTys; 94545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 94645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar const llvm::Type *ResultType = 0; 94745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 94836b5f5ee026b6725bff9c5b8faba635d7dfeeb7dDaniel Dunbar ArgTypeIterator begin = FI.argtypes_begin(), end = FI.argtypes_end(); 94945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar QualType RetTy = *begin; 9506b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo RetAI = getABIReturnInfo(RetTy, *this); 9518951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (RetAI.getKind()) { 9528951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 9538951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 9548951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 9558951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 95645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar case ABIArgInfo::Default: 95745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar if (RetTy->isVoidType()) { 95845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ResultType = llvm::Type::VoidTy; 95945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } else { 96062d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar ResultType = ConvertType(RetTy); 96145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 96245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar break; 96345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 96445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar case ABIArgInfo::StructRet: { 96545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ResultType = llvm::Type::VoidTy; 96662d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar const llvm::Type *STy = ConvertType(RetTy); 96745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ArgTys.push_back(llvm::PointerType::get(STy, RetTy.getAddressSpace())); 96845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar break; 96945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 97045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 97111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 97211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar ResultType = llvm::Type::VoidTy; 97311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar break; 97411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 97545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar case ABIArgInfo::Coerce: 976639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar ResultType = RetAI.getCoerceToType(); 97745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar break; 97845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 97945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 98045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar for (++begin; begin != end; ++begin) { 9816b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo AI = getABIArgumentInfo(*begin, *this); 98262d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar const llvm::Type *Ty = ConvertType(*begin); 9838951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 9848951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (AI.getKind()) { 98511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 98611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar break; 98711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 9885627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Coerce: 9898951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::StructRet: 9908951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for non-return argument"); 9918951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 9928951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 99345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar // byval arguments are always on the stack, which is addr space #0. 99445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ArgTys.push_back(llvm::PointerType::getUnqual(Ty)); 9958951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(AI.getByValAlignment() == 0 && "FIXME: alignment unhandled"); 9968951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 9978951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 9988951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Default: 9998951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar ArgTys.push_back(Ty); 10008951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 10018951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 10028951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 10035627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar GetExpandedTypes(*begin, ArgTys); 10048951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 10058951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 100645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 100745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 1008bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar return llvm::FunctionType::get(ResultType, ArgTys, IsVariadic); 10093913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar} 10103913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar 1011761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patelvoid CodeGenModule::ConstructAttributeList(const Decl *TargetDecl, 1012725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar const CGFunctionInfo &Info, 1013761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel AttributeListType &PAL) { 10145323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar unsigned FuncAttrs = 0; 1015a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel unsigned RetAttrs = 0; 10165323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 10175323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar if (TargetDecl) { 10185323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar if (TargetDecl->getAttr<NoThrowAttr>()) 1019761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel FuncAttrs |= llvm::Attribute::NoUnwind; 10205323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar if (TargetDecl->getAttr<NoReturnAttr>()) 1021761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel FuncAttrs |= llvm::Attribute::NoReturn; 1022232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson if (TargetDecl->getAttr<PureAttr>()) 1023232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson FuncAttrs |= llvm::Attribute::ReadOnly; 1024232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson if (TargetDecl->getAttr<ConstAttr>()) 1025232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson FuncAttrs |= llvm::Attribute::ReadNone; 10265323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 10275323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 1028725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar ArgTypeIterator begin = Info.argtypes_begin(), end = Info.argtypes_end(); 10292c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar QualType RetTy = *begin; 10305323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar unsigned Index = 1; 10316b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo RetAI = getABIReturnInfo(RetTy, getTypes()); 103245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar switch (RetAI.getKind()) { 10332c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Default: 10342c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (RetTy->isPromotableIntegerType()) { 10352c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (RetTy->isSignedIntegerType()) { 1036a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel RetAttrs |= llvm::Attribute::SExt; 10372c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } else if (RetTy->isUnsignedIntegerType()) { 1038a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel RetAttrs |= llvm::Attribute::ZExt; 10392c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 10402c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 10412c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 10422c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 10432c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::StructRet: 1044761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel PAL.push_back(llvm::AttributeWithIndex::get(Index, 1045725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar llvm::Attribute::StructRet | 1046725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar llvm::Attribute::NoAlias)); 10475323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar ++Index; 10482c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 10492c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 105011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 10512c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Coerce: 10522c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 10538951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 10548951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 10558951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 10568951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 10575323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 10582c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 1059a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel if (RetAttrs) 1060a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel PAL.push_back(llvm::AttributeWithIndex::get(0, RetAttrs)); 10615627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar for (++begin; begin != end; ++begin) { 10625323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar QualType ParamType = *begin; 1063761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel unsigned Attributes = 0; 10646b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo AI = getABIArgumentInfo(ParamType, getTypes()); 10658951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 10668951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (AI.getKind()) { 10678951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::StructRet: 10685627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Coerce: 10698951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for non-return argument"); 10708951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 10718951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 1072761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel Attributes |= llvm::Attribute::ByVal; 10738951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(AI.getByValAlignment() == 0 && "FIXME: alignment unhandled"); 10748951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 10758951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 10768951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Default: 10778951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar if (ParamType->isPromotableIntegerType()) { 10788951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar if (ParamType->isSignedIntegerType()) { 1079761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel Attributes |= llvm::Attribute::SExt; 10808951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } else if (ParamType->isUnsignedIntegerType()) { 1081761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel Attributes |= llvm::Attribute::ZExt; 10828951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 10835323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 10848951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 10858951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 108611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 108711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar // Skip increment, no matching LLVM parameter. 108811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar continue; 108911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 10905627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Expand: { 10915627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar std::vector<const llvm::Type*> Tys; 10925627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // FIXME: This is rather inefficient. Do we ever actually need 10935627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // to do anything here? The result should be just reconstructed 10945627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // on the other side, so extension should be a non-issue. 10955627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar getTypes().GetExpandedTypes(ParamType, Tys); 10965627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Index += Tys.size(); 10975627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar continue; 10985627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 10995323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 11008951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 1101761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel if (Attributes) 1102761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel PAL.push_back(llvm::AttributeWithIndex::get(Index, Attributes)); 11035627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ++Index; 11045323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 1105a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel if (FuncAttrs) 1106a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel PAL.push_back(llvm::AttributeWithIndex::get(~0, FuncAttrs)); 1107a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel 11085323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar} 11095323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 111017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbarvoid CodeGenFunction::EmitFunctionProlog(llvm::Function *Fn, 111117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar QualType RetTy, 111217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar const FunctionArgList &Args) { 1113bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar CGFunctionInfo FnInfo(RetTy, Args); 1114bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar 111517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // Emit allocs for param decls. Give the LLVM Argument nodes names. 111617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar llvm::Function::arg_iterator AI = Fn->arg_begin(); 111717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 111817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // Name the struct return argument. 11192c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (CGM.ReturnTypeUsesSret(RetTy)) { 112017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar AI->setName("agg.result"); 112117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar ++AI; 112217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 112317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 112417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end(); 11255627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar i != e; ++i) { 112617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar const VarDecl *Arg = i->first; 11275627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar QualType Ty = i->second; 11286b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo ArgI = getABIArgumentInfo(Ty, CGM.getTypes()); 11298951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 11308951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (ArgI.getKind()) { 11318951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 11328951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Default: { 11338951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(AI != Fn->arg_end() && "Argument mismatch!"); 11348951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar llvm::Value* V = AI; 11355627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (!getContext().typesAreCompatible(Ty, Arg->getType())) { 11368951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar // This must be a promotion, for something like 11378951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar // "void a(x) short x; {..." 11385627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar V = EmitScalarConversion(V, Ty, Arg->getType()); 113917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 11408951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar EmitParmDecl(*Arg, V); 11418951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 11428951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 11438951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 11445627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Expand: { 11455627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // If this was structure was expand into multiple arguments then 11465627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // we need to create a temporary and reconstruct it from the 11475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // arguments. 114839f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner std::string Name = Arg->getNameAsString(); 11495627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Value *Temp = CreateTempAlloca(ConvertType(Ty), 11505627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar (Name + ".addr").c_str()); 11515627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // FIXME: What are the right qualifiers here? 11525627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Function::arg_iterator End = 11535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ExpandTypeFromArgs(Ty, LValue::MakeAddr(Temp,0), AI); 11545627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar EmitParmDecl(*Arg, Temp); 11555627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 11565627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // Name the arguments used in expansion and increment AI. 11575627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar unsigned Index = 0; 11585627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar for (; AI != End; ++AI, ++Index) 11595627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar AI->setName(Name + "." + llvm::utostr(Index)); 11605627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar continue; 11615627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 116211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 116311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 116411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar break; 116511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 11665627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Coerce: 11678951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::StructRet: 11688951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for non-return argument"); 11698951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 11705627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 11715627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ++AI; 117217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 117317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar assert(AI == Fn->arg_end() && "Argument mismatch!"); 117417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar} 117517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 117617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbarvoid CodeGenFunction::EmitFunctionEpilog(QualType RetTy, 117717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar llvm::Value *ReturnValue) { 11782c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar llvm::Value *RV = 0; 11792c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 11802c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar // Functions with no result always return void. 11812c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (ReturnValue) { 11826b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo RetAI = getABIReturnInfo(RetTy, CGM.getTypes()); 11832c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 11842c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar switch (RetAI.getKind()) { 11852c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::StructRet: 11863aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar if (RetTy->isAnyComplexType()) { 11873aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar // FIXME: Volatile 11883aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar ComplexPairTy RT = LoadComplexFromAddr(ReturnValue, false); 11893aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar StoreComplexToAddr(RT, CurFn->arg_begin(), false); 11903aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) { 11913aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar EmitAggregateCopy(CurFn->arg_begin(), ReturnValue, RetTy); 11923aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar } else { 11933aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar Builder.CreateStore(Builder.CreateLoad(ReturnValue), 11943aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar CurFn->arg_begin()); 11953aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar } 11962c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 11978951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 11982c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Default: 11992c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar RV = Builder.CreateLoad(ReturnValue); 12002c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 12012c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 120211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 120311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar break; 120411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 1205639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar case ABIArgInfo::Coerce: { 120654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar RV = CreateCoercedLoad(ReturnValue, RetAI.getCoerceToType(), *this); 12078951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 1208639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } 12098951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 12108951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 12118951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 12128951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 121317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 121417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 12152c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 12162c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (RV) { 12172c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar Builder.CreateRet(RV); 12182c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } else { 12192c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar Builder.CreateRetVoid(); 12202c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 122117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar} 122217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 122317b708d61827cd86278e9580b041dd6cbadf07d3Daniel DunbarRValue CodeGenFunction::EmitCall(llvm::Value *Callee, 1224bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar const CGFunctionInfo &CallInfo, 122517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar const CallArgList &CallArgs) { 122617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar llvm::SmallVector<llvm::Value*, 16> Args; 122717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 122817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // Handle struct-return functions by passing a pointer to the 122917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // location that we would like to return into. 1230bb36d331f439f49859efcfb4435c61762fbba6f9Daniel Dunbar QualType RetTy = CallInfo.getReturnType(); 12316b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo RetAI = getABIReturnInfo(RetTy, CGM.getTypes()); 12322c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar switch (RetAI.getKind()) { 12332c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::StructRet: 123417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // Create a temporary alloca to hold the result of the call. :( 12355627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Args.push_back(CreateTempAlloca(ConvertType(RetTy))); 12362c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 12372c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 12382c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Default: 123911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 12402c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Coerce: 12412c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 12428951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 12438951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 12448951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 12458951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 124617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 124717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 124817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar for (CallArgList::const_iterator I = CallArgs.begin(), E = CallArgs.end(); 124917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar I != E; ++I) { 12506b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo ArgInfo = getABIArgumentInfo(I->second, CGM.getTypes()); 125117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar RValue RV = I->first; 12525627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 12535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar switch (ArgInfo.getKind()) { 12545627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::ByVal: // Default is byval 12555627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Default: 12565627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (RV.isScalar()) { 12575627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Args.push_back(RV.getScalarVal()); 12585627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else if (RV.isComplex()) { 12595627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // Make a temporary alloca to pass the argument. 12605627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Args.push_back(CreateTempAlloca(ConvertType(I->second))); 12615627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar StoreComplexToAddr(RV.getComplexVal(), Args.back(), false); 12625627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 12635627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Args.push_back(RV.getAggregateAddr()); 12645627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 12655627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar break; 12665627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 126711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 126811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar break; 126911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 12705627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::StructRet: 12715627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Coerce: 12725627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(0 && "Invalid ABI kind for non-return argument"); 12735627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar break; 12745627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 12755627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Expand: 12765627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ExpandTypeToArgs(I->second, RV, Args); 12775627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar break; 127817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 127917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 128017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 128117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar llvm::CallInst *CI = Builder.CreateCall(Callee,&Args[0],&Args[0]+Args.size()); 128217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 12835323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar // FIXME: Provide TargetDecl so nounwind, noreturn, etc, etc get set. 1284761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel CodeGen::AttributeListType AttributeList; 1285725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar CGM.ConstructAttributeList(0, CallInfo, AttributeList); 1286761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel CI->setAttributes(llvm::AttrListPtr::get(AttributeList.begin(), 1287725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar AttributeList.size())); 1288725ad31086e3d6c41afa10c43db44f2e7060a961Daniel Dunbar 128917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar if (const llvm::Function *F = dyn_cast<llvm::Function>(Callee)) 129017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar CI->setCallingConv(F->getCallingConv()); 129117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar if (CI->getType() != llvm::Type::VoidTy) 129217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar CI->setName("call"); 12932c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 12942c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar switch (RetAI.getKind()) { 12952c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::StructRet: 12962c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (RetTy->isAnyComplexType()) 12975627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar return RValue::getComplex(LoadComplexFromAddr(Args[0], false)); 12983aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) 12995627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar return RValue::getAggregate(Args[0]); 13003aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar else 13013aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar return RValue::get(Builder.CreateLoad(Args[0])); 13028951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 13032c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Default: 13042c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar return RValue::get(RetTy->isVoidType() ? 0 : CI); 13052c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 130611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 1307cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar if (RetTy->isVoidType()) 1308cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar return RValue::get(0); 1309cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(RetTy)) { 1310cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar llvm::Value *Res = 1311cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar llvm::UndefValue::get(llvm::PointerType::getUnqual(ConvertType(RetTy))); 1312cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar return RValue::getAggregate(Res); 1313cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar } 1314cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar return RValue::get(llvm::UndefValue::get(ConvertType(RetTy))); 131511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 1316639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar case ABIArgInfo::Coerce: { 131754d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar llvm::Value *V = CreateTempAlloca(ConvertType(RetTy), "coerce"); 131854d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar CreateCoercedStore(CI, V, *this); 1319ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson if (RetTy->isAnyComplexType()) 1320ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson return RValue::getComplex(LoadComplexFromAddr(V, false)); 132111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) 1322ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson return RValue::getAggregate(V); 132311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar else 132411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar return RValue::get(Builder.CreateLoad(V)); 1325639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } 13268951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 13278951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 13288951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 13298951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 133017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 13312c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 13322c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar assert(0 && "Unhandled ABIArgInfo::Kind"); 13332c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar return RValue::get(0); 133417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar} 1335