CGCall.cpp revision f04d69bbb25eb681fff1a108f13f67c6ca70cf6a
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 306f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarstatic llvm::cl::opt<bool> 316f3e7fac422fb0c50e1579edf49a797797c821ccDaniel DunbarUseX86_64ABI("use-x86_64-abi", 326f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar llvm::cl::desc("Enable use of experimental x86_64 ABI."), 336f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar llvm::cl::init(false)); 346f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 350dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar/***/ 360dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 370dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar// FIXME: Use iterator and sidestep silly type array creation. 380dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 3945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel DunbarCGFunctionInfo::CGFunctionInfo(const FunctionTypeNoProto *FTNP) 4045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar : IsVariadic(true) 4145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar{ 4245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ArgTypes.push_back(FTNP->getResultType()); 4345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar} 4445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 4545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel DunbarCGFunctionInfo::CGFunctionInfo(const FunctionTypeProto *FTP) 4645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar : IsVariadic(FTP->isVariadic()) 4745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar{ 4845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ArgTypes.push_back(FTP->getResultType()); 4945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i) 5045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ArgTypes.push_back(FTP->getArgType(i)); 5145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar} 5245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 5345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar// FIXME: Is there really any reason to have this still? 540dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel DunbarCGFunctionInfo::CGFunctionInfo(const FunctionDecl *FD) 550dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar{ 560dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar const FunctionType *FTy = FD->getType()->getAsFunctionType(); 570dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar const FunctionTypeProto *FTP = dyn_cast<FunctionTypeProto>(FTy); 5845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 590dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back(FTy->getResultType()); 6045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar if (FTP) { 6145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar IsVariadic = FTP->isVariadic(); 620dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i) 630dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back(FTP->getArgType(i)); 6445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } else { 6545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar IsVariadic = true; 6645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 670dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 680dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 690dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel DunbarCGFunctionInfo::CGFunctionInfo(const ObjCMethodDecl *MD, 700dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar const ASTContext &Context) 7145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar : IsVariadic(MD->isVariadic()) 720dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar{ 730dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back(MD->getResultType()); 740dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back(MD->getSelfDecl()->getType()); 750dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back(Context.getObjCSelType()); 760dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar for (ObjCMethodDecl::param_const_iterator i = MD->param_begin(), 770dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar e = MD->param_end(); i != e; ++i) 780dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back((*i)->getType()); 790dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 800dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 815323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarArgTypeIterator CGFunctionInfo::argtypes_begin() const { 825323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar return ArgTypes.begin(); 835323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar} 845323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 855323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarArgTypeIterator CGFunctionInfo::argtypes_end() const { 865323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar return ArgTypes.end(); 870dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 880dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 890dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar/***/ 900dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 915323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarCGCallInfo::CGCallInfo(QualType _ResultType, const CallArgList &_Args) { 925323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar ArgTypes.push_back(_ResultType); 935323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar for (CallArgList::const_iterator i = _Args.begin(), e = _Args.end(); i!=e; ++i) 940dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar ArgTypes.push_back(i->second); 950dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 960dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar 975323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarArgTypeIterator CGCallInfo::argtypes_begin() const { 985323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar return ArgTypes.begin(); 995323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar} 1005323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 1015323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel DunbarArgTypeIterator CGCallInfo::argtypes_end() const { 1025323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar return ArgTypes.end(); 1030dbe227feccf6a8dbadfff8ca3f80416b7bf2f28Daniel Dunbar} 10417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 10517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar/***/ 10617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 1078951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar/// ABIArgInfo - Helper class to encapsulate information about how a 1088951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar/// specific C type should be passed to or returned from a function. 1092c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarclass ABIArgInfo { 1102c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarpublic: 1112c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar enum Kind { 1122c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar Default, 1133aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar StructRet, /// Only valid for return values. The return value 1143aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar /// should be passed through a pointer to a caller 1153aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar /// allocated location passed as an implicit first 1163aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar /// argument to the function. 1178951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 11811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar Ignore, /// Ignore the argument (treat as void). Useful for 11911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar /// void and empty structs. 12011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 1215627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Coerce, /// Only valid for aggregate return types, the argument 1225627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar /// should be accessed by coercion to a provided type. 1238951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 1248951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar ByVal, /// Only valid for aggregate argument types. The 1258951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar /// structure should be passed "byval" with the 1268951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar /// specified alignment (0 indicates default 1278951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar /// alignment). 1288951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 1298951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar Expand, /// Only valid for aggregate argument types. The 1308951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar /// structure should be expanded into consecutive 1315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar /// arguments for its constituent fields. Currently 1325627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar /// expand is only allowed on structures whose fields 1335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar /// are all scalar types or are themselves expandable 1345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar /// types. 1358951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 1368951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar KindFirst=Default, KindLast=Expand 1372c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar }; 1382c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 1392c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarprivate: 1402c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar Kind TheKind; 141639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar const llvm::Type *TypeData; 1428951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar unsigned UIntData; 1432c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 1448951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar ABIArgInfo(Kind K, const llvm::Type *TD=0, 1458951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar unsigned UI=0) : TheKind(K), 1468951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar TypeData(TD), 1478951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar UIntData(0) {} 1482c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbarpublic: 1492c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar static ABIArgInfo getDefault() { 1508951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar return ABIArgInfo(Default); 1512c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 1522c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar static ABIArgInfo getStructRet() { 1538951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar return ABIArgInfo(StructRet); 1542c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 15511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar static ABIArgInfo getIgnore() { 15611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar return ABIArgInfo(Ignore); 15711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar } 158639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar static ABIArgInfo getCoerce(const llvm::Type *T) { 1592c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar return ABIArgInfo(Coerce, T); 1602c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 1618951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar static ABIArgInfo getByVal(unsigned Alignment) { 1628951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar return ABIArgInfo(ByVal, 0, Alignment); 1638951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 1645627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar static ABIArgInfo getExpand() { 1655627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar return ABIArgInfo(Expand); 1665627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 1672c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 1682c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar Kind getKind() const { return TheKind; } 1692c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar bool isDefault() const { return TheKind == Default; } 1702c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar bool isStructRet() const { return TheKind == StructRet; } 17111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar bool isIgnore() const { return TheKind == Ignore; } 1722c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar bool isCoerce() const { return TheKind == Coerce; } 1738951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar bool isByVal() const { return TheKind == ByVal; } 1745627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar bool isExpand() const { return TheKind == Expand; } 17545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 17645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar // Coerce accessors 177639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar const llvm::Type *getCoerceToType() const { 17845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar assert(TheKind == Coerce && "Invalid kind!"); 17945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar return TypeData; 18045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 1818951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 1828951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar // ByVal accessors 1838951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar unsigned getByValAlignment() const { 1848951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(TheKind == ByVal && "Invalid kind!"); 1858951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar return UIntData; 1868951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 1872c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar}; 1882c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 1892c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar/***/ 1902c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 1916b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/* FIXME: All of this stuff should be part of the target interface 1926b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar somehow. It is currently here because it is not clear how to factor 1936b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar the targets to support this, since the Targets currently live in a 1946b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar layer below types n'stuff. 1956b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar */ 1966b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 1976b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// ABIInfo - Target specific hooks for defining how a type should be 1986b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// passed or returned from functions. 1996b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarclass clang::ABIInfo { 2006b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarpublic: 2016b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar virtual ~ABIInfo(); 2026b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 2036b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar virtual ABIArgInfo classifyReturnType(QualType RetTy, 2046b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const = 0; 2056b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 2066b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar virtual ABIArgInfo classifyArgumentType(QualType Ty, 2076b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const = 0; 2086b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}; 2096b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 2106b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIInfo::~ABIInfo() {} 2116b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 212834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// isEmptyStruct - Return true iff a structure has no non-empty 213834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// members. Note that a structure with a flexible array member is not 214834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// considered empty. 215834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic bool isEmptyStruct(QualType T) { 216834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const RecordType *RT = T->getAsStructureType(); 217834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (!RT) 218834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return 0; 219834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const RecordDecl *RD = RT->getDecl(); 220834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (RD->hasFlexibleArrayMember()) 221834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return false; 222f8d49f64ef6ab7e632717a31631fc289aab69428Douglas Gregor for (RecordDecl::field_iterator i = RD->field_begin(), 223834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar e = RD->field_end(); i != e; ++i) { 224834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const FieldDecl *FD = *i; 225834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (!isEmptyStruct(FD->getType())) 226834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return false; 227834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 228834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return true; 229834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar} 230834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 231834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// isSingleElementStruct - Determine if a structure is a "single 232834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// element struct", i.e. it has exactly one non-empty field or 233834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// exactly one field which is itself a single element 234834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// struct. Structures with flexible array members are never 235834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// considered single element structs. 236834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// 237834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// \return The field declaration for the single non-empty field, if 238834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar/// it exists. 239834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic const FieldDecl *isSingleElementStruct(QualType T) { 240834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const RecordType *RT = T->getAsStructureType(); 241834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (!RT) 242834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return 0; 243834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 244834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const RecordDecl *RD = RT->getDecl(); 245834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (RD->hasFlexibleArrayMember()) 246834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return 0; 247834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 248834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const FieldDecl *Found = 0; 249f8d49f64ef6ab7e632717a31631fc289aab69428Douglas Gregor for (RecordDecl::field_iterator i = RD->field_begin(), 250834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar e = RD->field_end(); i != e; ++i) { 251834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const FieldDecl *FD = *i; 252834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar QualType FT = FD->getType(); 253834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 254834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (isEmptyStruct(FT)) { 255834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // Ignore 256834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } else if (Found) { 257834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return 0; 258834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } else if (!CodeGenFunction::hasAggregateLLVMType(FT)) { 259834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar Found = FD; 260834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } else { 261834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar Found = isSingleElementStruct(FT); 262834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (!Found) 263834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return 0; 264834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 265834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 266834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 267834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return Found; 268834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar} 269834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 270834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic bool is32Or64BitBasicType(QualType Ty, ASTContext &Context) { 271834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (!Ty->getAsBuiltinType() && !Ty->isPointerType()) 272834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return false; 273834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 274834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar uint64_t Size = Context.getTypeSize(Ty); 275834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return Size == 32 || Size == 64; 276834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar} 277834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 278834af456588587194337bb32671fb9329e73a7f7Daniel Dunbarstatic bool areAllFields32Or64BitBasicType(const RecordDecl *RD, 279834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar ASTContext &Context) { 280f8d49f64ef6ab7e632717a31631fc289aab69428Douglas Gregor for (RecordDecl::field_iterator i = RD->field_begin(), 281834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar e = RD->field_end(); i != e; ++i) { 282834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const FieldDecl *FD = *i; 283834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 284834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (!is32Or64BitBasicType(FD->getType(), Context)) 285834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return false; 286834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 287834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // If this is a bit-field we need to make sure it is still a 288834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // 32-bit or 64-bit type. 289834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (Expr *BW = FD->getBitWidth()) { 290834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar unsigned Width = BW->getIntegerConstantExprValue(Context).getZExtValue(); 291834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (Width <= 16) 292834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return false; 293834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 294834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 295834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return true; 296834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar} 297834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 2986b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarnamespace { 2996b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// DefaultABIInfo - The default implementation for ABI specific 3006b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// details. This implementation provides information which results in 3016b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// sensible LLVM IR generation, but does not conform to any 3026b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// particular ABI. 3036b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarclass DefaultABIInfo : public ABIInfo { 3046b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar virtual ABIArgInfo classifyReturnType(QualType RetTy, 3056b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const; 3066b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 3076b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar virtual ABIArgInfo classifyArgumentType(QualType RetTy, 3086b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const; 3096b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}; 3106b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 3116b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar/// X86_32ABIInfo - The X86-32 ABI information. 3126b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarclass X86_32ABIInfo : public ABIInfo { 3136b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarpublic: 3146b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar virtual ABIArgInfo classifyReturnType(QualType RetTy, 3156b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const; 3166b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 3176b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar virtual ABIArgInfo classifyArgumentType(QualType RetTy, 3186b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const; 3196b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar}; 3206b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar} 3216b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 3226b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo X86_32ABIInfo::classifyReturnType(QualType RetTy, 3236b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const { 3242c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(RetTy)) { 325834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // Classify "single element" structs as their element type. 326834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar const FieldDecl *SeltFD = isSingleElementStruct(RetTy); 327834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (SeltFD) { 328834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar QualType SeltTy = SeltFD->getType()->getDesugaredType(); 329834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (const BuiltinType *BT = SeltTy->getAsBuiltinType()) { 330834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // FIXME: This is gross, it would be nice if we could just 331834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // pass back SeltTy and have clients deal with it. Is it worth 332834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // supporting coerce to both LLVM and clang Types? 333834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (BT->isIntegerType()) { 334834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar uint64_t Size = Context.getTypeSize(SeltTy); 335834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getCoerce(llvm::IntegerType::get((unsigned) Size)); 336834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } else if (BT->getKind() == BuiltinType::Float) { 337834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getCoerce(llvm::Type::FloatTy); 338834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } else if (BT->getKind() == BuiltinType::Double) { 339834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getCoerce(llvm::Type::DoubleTy); 340834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 341834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } else if (SeltTy->isPointerType()) { 342834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // FIXME: It would be really nice if this could come out as 343834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // the proper pointer type. 344834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar llvm::Type *PtrTy = 345834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar llvm::PointerType::getUnqual(llvm::Type::Int8Ty); 346834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getCoerce(PtrTy); 347834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 348834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 349834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 350639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar uint64_t Size = Context.getTypeSize(RetTy); 351639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar if (Size == 8) { 352639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar return ABIArgInfo::getCoerce(llvm::Type::Int8Ty); 353639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } else if (Size == 16) { 354639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar return ABIArgInfo::getCoerce(llvm::Type::Int16Ty); 355639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } else if (Size == 32) { 356639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar return ABIArgInfo::getCoerce(llvm::Type::Int32Ty); 357639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } else if (Size == 64) { 358639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar return ABIArgInfo::getCoerce(llvm::Type::Int64Ty); 359639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } else { 360639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar return ABIArgInfo::getStructRet(); 361639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } 3622c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } else { 3632c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar return ABIArgInfo::getDefault(); 3642c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 3652c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar} 3662c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 3676b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty, 3686b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const { 369f035738e346da0a82538ab236aef218a27373635Daniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(Ty)) { 370834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // Structures with flexible arrays are always byval. 371834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (const RecordType *RT = Ty->getAsStructureType()) 372834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (RT->getDecl()->hasFlexibleArrayMember()) 373834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getByVal(0); 374834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 375834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // Expand empty structs (i.e. ignore) 376834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar uint64_t Size = Context.getTypeSize(Ty); 377834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (Ty->isStructureType() && Size == 0) 378834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getExpand(); 379834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 380834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // Expand structs with size <= 128-bits which consist only of 381834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // basic types (int, long long, float, double, xxx*). This is 382834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar // non-recursive and does not ignore empty fields. 383834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (const RecordType *RT = Ty->getAsStructureType()) { 384834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar if (Context.getTypeSize(Ty) <= 4*32 && 385834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar areAllFields32Or64BitBasicType(RT->getDecl(), Context)) 386834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar return ABIArgInfo::getExpand(); 387834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar } 388834af456588587194337bb32671fb9329e73a7f7Daniel Dunbar 3898951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar return ABIArgInfo::getByVal(0); 3908951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } else { 3918951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar return ABIArgInfo::getDefault(); 3928951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 3938951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar} 3948951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 3956f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarnamespace { 3966f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar/// X86_32ABIInfo - The X86_64 ABI information. 3976f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarclass X86_64ABIInfo : public ABIInfo { 3986f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar enum Class { 3996f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Integer = 0, 4006f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar SSE, 4016f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar SSEUp, 4026f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar X87, 4036f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar X87Up, 4046f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar ComplexX87, 4056f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar NoClass, 4066f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Memory 4076f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar }; 4086f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 4096f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// classify - Determine the x86_64 register classes in which the 4106f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// given type T should be passed. 4116f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// 4126f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// \param Lo - The classification for the low word of the type. 4136f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// \param Hi - The classification for the high word of the type. 414f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar /// \param OffsetBase - The byte position of the type in the root 415f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar /// structure. Some parameters are classified different depending on 416f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar /// whether they straddle an eightbyte boundary. 4176f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// 4186f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// If a word is unused its result will be NoClass; if a type should 4196f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// be passed in Memory then at least the classification of \arg Lo 4206f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// will be Memory. 4216f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// 4226f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// The \arg Lo class will be NoClass iff the argument is ignored. 4236f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// 4246f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// If the \arg Lo class is ComplexX87, then the \arg Hi class will 4256f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar /// be NoClass. 426f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar void classify(QualType T, ASTContext &Context, unsigned OffsetBase, 4276f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Class &Lo, Class &Hi) const; 4286f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 4296f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarpublic: 4306f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar virtual ABIArgInfo classifyReturnType(QualType RetTy, 4316f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar ASTContext &Context) const; 4326f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 4336f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar virtual ABIArgInfo classifyArgumentType(QualType RetTy, 4346f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar ASTContext &Context) const; 4356f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar}; 4366f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar} 4376f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 4386f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbarvoid X86_64ABIInfo::classify(QualType Ty, 4396f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar ASTContext &Context, 440f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar unsigned OffsetBase, 4416f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Class &Lo, Class &Hi) const { 4426f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Lo = Memory; 4436f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Hi = NoClass; 4446f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar if (const BuiltinType *BT = Ty->getAsBuiltinType()) { 4456f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar BuiltinType::Kind k = BT->getKind(); 4466f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 44711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar if (k == BuiltinType::Void) { 44811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar Lo = NoClass; 44911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar } else if (k >= BuiltinType::Bool && k <= BuiltinType::LongLong) { 4506f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Lo = Integer; 4516f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar } else if (k == BuiltinType::Float || k == BuiltinType::Double) { 4526f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Lo = SSE; 4536f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar } else if (k == BuiltinType::LongDouble) { 4546f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Lo = X87; 4556f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Hi = X87Up; 4566f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar } 4577a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar 4587a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar // FIXME: _Decimal32 and _Decimal64 are SSE. 4597a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar // FIXME: _float128 and _Decimal128 are (SSE, SSEUp). 4606f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // FIXME: __int128 is (Integer, Integer). 4616f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar } else if (Ty->isPointerLikeType() || Ty->isBlockPointerType() || 4626f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Ty->isObjCQualifiedInterfaceType()) { 4636f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Lo = Integer; 4647a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar } else if (const VectorType *VT = Ty->getAsVectorType()) { 4657a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar unsigned Size = Context.getTypeSize(VT); 4667a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar if (Size == 64) { 4677a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar // FIXME: For some reason, gcc appears to be treating <1 x 4687a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar // double> as INTEGER; this seems wrong, but we will match for 4697a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar // now (icc rejects <1 x double>, so...). 4707a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar Lo = (VT->getElementType() == Context.DoubleTy) ? Integer : SSE; 4717a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar } else if (Size == 128) { 4727a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar Lo = SSE; 4737a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar Hi = SSEUp; 4747a6605d8be0fc30f1846657ee8133387b1b85296Daniel Dunbar } 4756f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar } else if (const ComplexType *CT = Ty->getAsComplexType()) { 4766f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar QualType ET = CT->getElementType(); 4776f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 478eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar if (ET->isIntegerType()) { 479eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar unsigned Size = Context.getTypeSize(Ty); 480eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar if (Size <= 64) 481eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar Lo = Integer; 482eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar else if (Size <= 128) 483eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar Lo = Hi = Integer; 484eac48dc189154eea5067310c5dd257dfe07c29aaDaniel Dunbar } else if (ET == Context.FloatTy) 4856f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Lo = SSE; 4866f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar else if (ET == Context.DoubleTy) 4876f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Lo = Hi = SSE; 4886f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar else if (ET == Context.LongDoubleTy) 4896f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar Lo = ComplexX87; 490f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar 491f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar // If this complex type crosses an eightbyte boundary then it 492f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar // should be split. 493f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar unsigned EB_Real = (OffsetBase) >> 3; 494f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar unsigned EB_Imag = (OffsetBase + Context.getTypeSize(ET)) >> 3; 495f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar if (Hi == NoClass && EB_Real != EB_Imag) 496f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar Hi = Lo; 49799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar } else if (const RecordType *RT = Ty->getAsRecordType()) { 49899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar unsigned Size = Context.getTypeSize(Ty); 49999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 50099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger 50199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // than two eightbytes, ..., it has class MEMORY. 50299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar if (Size > 128) 50399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar return; 50499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 50599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar const RecordDecl *RD = RT->getDecl(); 50699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 50799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // Assume variable sized types are passed in memory. 50899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar if (RD->hasFlexibleArrayMember()) 50999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar return; 51099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 51199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); 51299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 51399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // Reset Lo class, this will be recomputed. 51499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar Lo = NoClass; 51599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar unsigned idx = 0; 51699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar for (RecordDecl::field_iterator i = RD->field_begin(), 51799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar e = RD->field_end(); i != e; ++i, ++idx) { 518f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar unsigned Offset = OffsetBase + Layout.getFieldOffset(idx); 51999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 52099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned 52199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // fields, it has class MEMORY. 52299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar if (Offset % Context.getTypeAlign(i->getType())) { 52399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar Lo = Memory; 52499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar return; 52599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar } 52699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 52799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // Determine which half of the structure we are classifying. 52899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // 52999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // AMD64-ABI 3.2.3p2: Rule 3. f the size of the aggregate 53099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // exceeds a single eightbyte, each is classified 53199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // separately. Each eightbyte gets initialized to class 53299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // NO_CLASS. 53399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar Class &Target = Offset < 64 ? Lo : Hi; 53499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 53599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // Classify this field. 53699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar Class FieldLo, FieldHi; 537f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar classify(i->getType(), Context, Offset, FieldLo, FieldHi); 53899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 53999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // Merge the lo field classifcation. 54099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // 54199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // AMD64-ABI 3.2.3p2: Rule 4. Each field of an object is 54299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // classified recursively so that always two fields are 54399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // considered. The resulting class is calculated according to 54499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // the classes of the fields in the eightbyte: 54599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // 54699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // (a) If both classes are equal, this is the resulting class. 54799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // 54899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // (b) If one of the classes is NO_CLASS, the resulting class is 54999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // the other class. 55099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // 55199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // (c) If one of the classes is MEMORY, the result is the MEMORY 55299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // class. 55399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // 55499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // (d) If one of the classes is INTEGER, the result is the 55599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // INTEGER. 55699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // 55799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // (e) If one of the classes is X87, X87UP, COMPLEX_X87 class, 55899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // MEMORY is used as class. 55999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // 56099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // (f) Otherwise class SSE is used. 56199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar if (Target == FieldLo || FieldLo == NoClass) ; 56299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar else if (FieldLo == Memory) { 56399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // Memory is never over-ridden, just bail. 56499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar Lo = Memory; 56599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar return; 56699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar } 5677f102f8c815a38e7df72b7d032c31529b98047f7Daniel Dunbar else if (Target == NoClass) 5687f102f8c815a38e7df72b7d032c31529b98047f7Daniel Dunbar Target = FieldLo; 56999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar else if (Target == Integer || FieldLo == Integer) 57099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar Target = Integer; 57199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar else if (FieldLo == X87 || FieldLo == X87Up || FieldLo == ComplexX87) { 57299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // As before, just bail once we generate a memory class. 57399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar Lo = Memory; 57499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar return; 57599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar } else 57699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar Target = SSE; 57799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 57899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // It isn't clear from the ABI spec what the role of the high 57999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // classification is here, but since this should only happen 58099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // when we have a struct with a two eightbyte member, we can 58199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // just push the field high class into the overall high class. 58299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar if (FieldHi != NoClass) 58399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar Hi = FieldHi; 58499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar } 58599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 58699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // AMD64-ABI 3.2.3p2: Rule 5. Then a post merger cleanup is done: 58799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // 58899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // (a) If one of the classes is MEMORY, the whole argument is 58999037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // passed in memory. 59099037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // 59199037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // (b) If SSEUP is not preceeded by SSE, it is converted to SSE. 59299037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar 59399037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // The first of these conditions is guaranteed by how we implement 59499037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // the merge (just bail). I don't believe the second is actually 59599037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar // possible at all. 59699037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar assert(Lo != Memory && "Unexpected memory classification."); 59799037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar if (Hi == SSEUp && Lo != SSE) 59899037e5a2118bc194251a8033a0885810bf61c95Daniel Dunbar Hi = SSE; 5996f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar } 6006f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar} 6016f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 602d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel DunbarABIArgInfo X86_64ABIInfo::classifyReturnType(QualType RetTy, 603d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar ASTContext &Context) const { 6046f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // AMD64-ABI 3.2.3p4: Rule 1. Classify the return type with the 6056f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // classification algorithm. 6066f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar X86_64ABIInfo::Class Lo, Hi; 607f04d69bbb25eb681fff1a108f13f67c6ca70cf6aDaniel Dunbar classify(RetTy, Context, 0, Lo, Hi); 6086f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 6096f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar const llvm::Type *ResType = 0; 6106f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar switch (Lo) { 6116f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case NoClass: 61211434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar return ABIArgInfo::getIgnore(); 6136f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 6146f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case SSEUp: 6156f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case X87Up: 6166f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar assert(0 && "Invalid classification for lo word."); 6176f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 6186f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // AMD64-ABI 3.2.3p4: Rule 2. Types of class memory are returned via 6196f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // hidden argument, i.e. structret. 6206f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case Memory: 6216f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar return ABIArgInfo::getStructRet(); 6226f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 6236f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // AMD64-ABI 3.2.3p4: Rule 3. If the class is INTEGER, the next 6246f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // available register of the sequence %rax, %rdx is used. 6256f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case Integer: 6266f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar ResType = llvm::Type::Int64Ty; break; 6276f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 6286f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // AMD64-ABI 3.2.3p4: Rule 4. If the class is SSE, the next 6296f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // available SSE register of the sequence %xmm0, %xmm1 is used. 6306f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case SSE: 6316f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar ResType = llvm::Type::DoubleTy; break; 6326f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 6336f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // AMD64-ABI 3.2.3p4: Rule 6. If the class is X87, the value is 6346f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // returned on the X87 stack in %st0 as 80-bit x87 number. 6356f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case X87: 6366f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar ResType = llvm::Type::X86_FP80Ty; break; 6376f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 6386f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // AMD64-ABI 3.2.3p4: Rule 8. If the class is COMPLEX_X87, the real 6396f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // part of the value is returned in %st0 and the imaginary part in 6406f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // %st1. 6416f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case ComplexX87: 6426f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar assert(Hi == NoClass && "Unexpected ComplexX87 classification."); 6436f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar ResType = llvm::VectorType::get(llvm::Type::X86_FP80Ty, 2); 6446f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar break; 6456f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar } 6466f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 6476f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar switch (Hi) { 6486f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // Memory was handled previously, and ComplexX87 and X87 should 6496f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // never occur as hi classes. 6506f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case Memory: 6516f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case X87: 6526f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case ComplexX87: 6536f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar assert(0 && "Invalid classification for hi word."); 6546f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 6556f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case NoClass: break; 6566f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case Integer: 657b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar ResType = llvm::StructType::get(ResType, llvm::Type::Int64Ty, NULL); 658b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar break; 6596f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case SSE: 660b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar ResType = llvm::StructType::get(ResType, llvm::Type::DoubleTy, NULL); 661b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar break; 6626f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 6636f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // AMD64-ABI 3.2.3p4: Rule 5. If the class is SSEUP, the eightbyte 6646f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // is passed in the upper half of the last used SSE register. 6656f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // 6666f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // SSEUP should always be preceeded by SSE, just widen. 6676f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case SSEUp: 6686f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar assert(Lo == SSE && "Unexpected SSEUp classification."); 6696f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar ResType = llvm::VectorType::get(llvm::Type::DoubleTy, 2); 6706f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar break; 6716f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 6726f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // AMD64-ABI 3.2.3p4: Rule 7. If the class is X87UP, the value is 673b0e14f2a878c1a823341d34ca8f8fe60419fb9efDaniel Dunbar // returned together with the previous X87 value in %st0. 6746f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // 6756f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // X87UP should always be preceeded by X87, so we don't need to do 6766f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar // anything here. 6776f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar case X87Up: 6786f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar assert(Lo == X87 && "Unexpected X87Up classification."); 6796f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar break; 6806f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar } 6816f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar 6826f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar return ABIArgInfo::getCoerce(ResType); 683d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar} 684d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar 685d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel DunbarABIArgInfo X86_64ABIInfo::classifyArgumentType(QualType Ty, 686d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar ASTContext &Context) const { 687d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar return ABIArgInfo::getDefault(); 688d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar} 689d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar 6906b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo DefaultABIInfo::classifyReturnType(QualType RetTy, 6916b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const { 6926b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar return ABIArgInfo::getDefault(); 6936b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar} 6946b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 6956b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel DunbarABIArgInfo DefaultABIInfo::classifyArgumentType(QualType Ty, 6966b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ASTContext &Context) const { 6976b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar return ABIArgInfo::getDefault(); 6986b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar} 6996b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 7006b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarconst ABIInfo &CodeGenTypes::getABIInfo() const { 7016b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar if (TheABIInfo) 7026b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar return *TheABIInfo; 7036b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 7046b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar // For now we just cache this in the CodeGenTypes and don't bother 7056b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar // to free it. 7066b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar const char *TargetPrefix = getContext().Target.getTargetPrefix(); 7076b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar if (strcmp(TargetPrefix, "x86") == 0) { 708d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar switch (getContext().Target.getPointerWidth(0)) { 709d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar case 32: 7106b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar return *(TheABIInfo = new X86_32ABIInfo()); 711d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar case 64: 7126f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar if (UseX86_64ABI) 7136f3e7fac422fb0c50e1579edf49a797797c821ccDaniel Dunbar return *(TheABIInfo = new X86_64ABIInfo()); 714d4edfe4746c66d2ac452c8a8d7cac17192283e75Daniel Dunbar } 7156b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar } 7166b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 7176b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar return *(TheABIInfo = new DefaultABIInfo); 7186b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar} 7196b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar 7206b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar// getABIReturnInfo - Wrap the ABIInfo getABIReturnInfo, altering 7216b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar// "default" types to StructRet when appropriate for simplicity. 7226b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarstatic ABIArgInfo getABIReturnInfo(QualType Ty, CodeGenTypes &CGT) { 7236b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar assert(!Ty->isArrayType() && 7246b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar "Array types cannot be passed directly."); 7256b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo Info = CGT.getABIInfo().classifyReturnType(Ty, CGT.getContext()); 726f035738e346da0a82538ab236aef218a27373635Daniel Dunbar // Ensure default on aggregate types is StructRet. 727f035738e346da0a82538ab236aef218a27373635Daniel Dunbar if (Info.isDefault() && CodeGenFunction::hasAggregateLLVMType(Ty)) 728f035738e346da0a82538ab236aef218a27373635Daniel Dunbar return ABIArgInfo::getStructRet(); 729f035738e346da0a82538ab236aef218a27373635Daniel Dunbar return Info; 730f035738e346da0a82538ab236aef218a27373635Daniel Dunbar} 731f035738e346da0a82538ab236aef218a27373635Daniel Dunbar 7326b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar// getABIArgumentInfo - Wrap the ABIInfo getABIReturnInfo, altering 7336b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar// "default" types to ByVal when appropriate for simplicity. 7346b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbarstatic ABIArgInfo getABIArgumentInfo(QualType Ty, CodeGenTypes &CGT) { 7356b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar assert(!Ty->isArrayType() && 7366b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar "Array types cannot be passed directly."); 7376b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo Info = CGT.getABIInfo().classifyArgumentType(Ty, CGT.getContext()); 738f035738e346da0a82538ab236aef218a27373635Daniel Dunbar // Ensure default on aggregate types is ByVal. 739f035738e346da0a82538ab236aef218a27373635Daniel Dunbar if (Info.isDefault() && CodeGenFunction::hasAggregateLLVMType(Ty)) 740f035738e346da0a82538ab236aef218a27373635Daniel Dunbar return ABIArgInfo::getByVal(0); 741f035738e346da0a82538ab236aef218a27373635Daniel Dunbar return Info; 742f035738e346da0a82538ab236aef218a27373635Daniel Dunbar} 743f035738e346da0a82538ab236aef218a27373635Daniel Dunbar 7442c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar/***/ 7452c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 7465627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarvoid CodeGenTypes::GetExpandedTypes(QualType Ty, 7475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar std::vector<const llvm::Type*> &ArgTys) { 7485627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordType *RT = Ty->getAsStructureType(); 7495627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RT && "Can only expand structure types."); 7505627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordDecl *RD = RT->getDecl(); 7515627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(!RD->hasFlexibleArrayMember() && 7525627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar "Cannot expand structure with flexible array."); 7535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 754f8d49f64ef6ab7e632717a31631fc289aab69428Douglas Gregor for (RecordDecl::field_iterator i = RD->field_begin(), 7555627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar e = RD->field_end(); i != e; ++i) { 7565627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const FieldDecl *FD = *i; 7575627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(!FD->isBitField() && 7585627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar "Cannot expand structure with bit-field members."); 7595627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 7605627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar QualType FT = FD->getType(); 7615627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(FT)) { 7625627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar GetExpandedTypes(FT, ArgTys); 7635627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 7645627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ArgTys.push_back(ConvertType(FT)); 7655627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 7665627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 7675627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar} 7685627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 7695627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarllvm::Function::arg_iterator 7705627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeFromArgs(QualType Ty, LValue LV, 7715627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Function::arg_iterator AI) { 7725627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordType *RT = Ty->getAsStructureType(); 7735627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RT && "Can only expand structure types."); 7745627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 7755627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar RecordDecl *RD = RT->getDecl(); 7765627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(LV.isSimple() && 7775627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar "Unexpected non-simple lvalue during struct expansion."); 7785627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Value *Addr = LV.getAddress(); 7795627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar for (RecordDecl::field_iterator i = RD->field_begin(), 7805627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar e = RD->field_end(); i != e; ++i) { 7815627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar FieldDecl *FD = *i; 7825627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar QualType FT = FD->getType(); 7835627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 7845627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // FIXME: What are the right qualifiers here? 7855627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar LValue LV = EmitLValueForField(Addr, FD, false, 0); 7865627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(FT)) { 7875627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar AI = ExpandTypeFromArgs(FT, LV, AI); 7885627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 7895627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar EmitStoreThroughLValue(RValue::get(AI), LV, FT); 7905627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ++AI; 7915627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 7925627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 7935627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 7945627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar return AI; 7955627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar} 7965627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 7975627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbarvoid 7985627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel DunbarCodeGenFunction::ExpandTypeToArgs(QualType Ty, RValue RV, 7995627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::SmallVector<llvm::Value*, 16> &Args) { 8005627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar const RecordType *RT = Ty->getAsStructureType(); 8015627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RT && "Can only expand structure types."); 8025627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 8035627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar RecordDecl *RD = RT->getDecl(); 8045627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RV.isAggregate() && "Unexpected rvalue during struct expansion"); 8055627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Value *Addr = RV.getAggregateAddr(); 8065627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar for (RecordDecl::field_iterator i = RD->field_begin(), 8075627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar e = RD->field_end(); i != e; ++i) { 8085627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar FieldDecl *FD = *i; 8095627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar QualType FT = FD->getType(); 8105627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 8115627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // FIXME: What are the right qualifiers here? 8125627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar LValue LV = EmitLValueForField(Addr, FD, false, 0); 8135627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(FT)) { 8145627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ExpandTypeToArgs(FT, RValue::getAggregate(LV.getAddress()), Args); 8155627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 8165627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar RValue RV = EmitLoadOfLValue(LV, FT); 8175627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(RV.isScalar() && 8185627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar "Unexpected non-scalar rvalue during struct expansion."); 8195627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Args.push_back(RV.getScalarVal()); 8205627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 8215627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 8225627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar} 8235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 8245627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar/***/ 8255627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 82645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbarconst llvm::FunctionType * 82762d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel DunbarCodeGenTypes::GetFunctionType(const CGCallInfo &CI, bool IsVariadic) { 82862d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar return GetFunctionType(CI.argtypes_begin(), CI.argtypes_end(), IsVariadic); 82962d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar} 83062d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar 83162d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbarconst llvm::FunctionType * 83245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel DunbarCodeGenTypes::GetFunctionType(const CGFunctionInfo &FI) { 83362d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar return GetFunctionType(FI.argtypes_begin(), FI.argtypes_end(), FI.isVariadic()); 83462d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar} 83562d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar 83662d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbarconst llvm::FunctionType * 83762d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel DunbarCodeGenTypes::GetFunctionType(ArgTypeIterator begin, ArgTypeIterator end, 83862d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar bool IsVariadic) { 83945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar std::vector<const llvm::Type*> ArgTys; 84045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 84145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar const llvm::Type *ResultType = 0; 84245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 84345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar QualType RetTy = *begin; 8446b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo RetAI = getABIReturnInfo(RetTy, *this); 8458951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (RetAI.getKind()) { 8468951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 8478951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 8488951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 8498951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 85045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar case ABIArgInfo::Default: 85145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar if (RetTy->isVoidType()) { 85245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ResultType = llvm::Type::VoidTy; 85345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } else { 85462d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar ResultType = ConvertType(RetTy); 85545c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 85645c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar break; 85745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 85845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar case ABIArgInfo::StructRet: { 85945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ResultType = llvm::Type::VoidTy; 86062d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar const llvm::Type *STy = ConvertType(RetTy); 86145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ArgTys.push_back(llvm::PointerType::get(STy, RetTy.getAddressSpace())); 86245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar break; 86345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 86445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 86511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 86611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar ResultType = llvm::Type::VoidTy; 86711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar break; 86811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 86945c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar case ABIArgInfo::Coerce: 870639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar ResultType = RetAI.getCoerceToType(); 87145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar break; 87245c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 87345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 87445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar for (++begin; begin != end; ++begin) { 8756b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo AI = getABIArgumentInfo(*begin, *this); 87662d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar const llvm::Type *Ty = ConvertType(*begin); 8778951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 8788951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (AI.getKind()) { 87911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 88011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar break; 88111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 8825627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Coerce: 8838951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::StructRet: 8848951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for non-return argument"); 8858951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 8868951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 88745c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar // byval arguments are always on the stack, which is addr space #0. 88845c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar ArgTys.push_back(llvm::PointerType::getUnqual(Ty)); 8898951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(AI.getByValAlignment() == 0 && "FIXME: alignment unhandled"); 8908951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 8918951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 8928951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Default: 8938951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar ArgTys.push_back(Ty); 8948951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 8958951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 8968951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 8975627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar GetExpandedTypes(*begin, ArgTys); 8988951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 8998951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 90045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar } 90145c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 90262d5c1b5038cdaa4a887a03c37fe1e8d00166ea0Daniel Dunbar return llvm::FunctionType::get(ResultType, ArgTys, IsVariadic); 90345c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar} 90445c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar 905b768807c49a1c7085def099b848631856af766faDaniel Dunbarbool CodeGenModule::ReturnTypeUsesSret(QualType RetTy) { 9066b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar return getABIReturnInfo(RetTy, getTypes()).isStructRet(); 9073913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar} 9083913f184c84135fb4612743f1faa6c1edd2dd055Daniel Dunbar 909761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patelvoid CodeGenModule::ConstructAttributeList(const Decl *TargetDecl, 9102c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar ArgTypeIterator begin, 9112c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar ArgTypeIterator end, 912761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel AttributeListType &PAL) { 9135323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar unsigned FuncAttrs = 0; 914a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel unsigned RetAttrs = 0; 9155323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 9165323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar if (TargetDecl) { 9175323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar if (TargetDecl->getAttr<NoThrowAttr>()) 918761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel FuncAttrs |= llvm::Attribute::NoUnwind; 9195323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar if (TargetDecl->getAttr<NoReturnAttr>()) 920761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel FuncAttrs |= llvm::Attribute::NoReturn; 921232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson if (TargetDecl->getAttr<PureAttr>()) 922232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson FuncAttrs |= llvm::Attribute::ReadOnly; 923232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson if (TargetDecl->getAttr<ConstAttr>()) 924232eb7d33b96ad8f99de3b5ae840421b3a7c6cb7Anders Carlsson FuncAttrs |= llvm::Attribute::ReadNone; 9255323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 9265323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 9272c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar QualType RetTy = *begin; 9285323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar unsigned Index = 1; 9296b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo RetAI = getABIReturnInfo(RetTy, getTypes()); 93045c25ba11cbf8c9a461def5b03f6ee9481e06769Daniel Dunbar switch (RetAI.getKind()) { 9312c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Default: 9322c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (RetTy->isPromotableIntegerType()) { 9332c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (RetTy->isSignedIntegerType()) { 934a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel RetAttrs |= llvm::Attribute::SExt; 9352c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } else if (RetTy->isUnsignedIntegerType()) { 936a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel RetAttrs |= llvm::Attribute::ZExt; 9372c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 9382c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 9392c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 9402c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 9412c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::StructRet: 942761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel PAL.push_back(llvm::AttributeWithIndex::get(Index, 943761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel llvm::Attribute::StructRet| 944761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel llvm::Attribute::NoAlias)); 9455323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar ++Index; 9462c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 9472c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 94811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 9492c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Coerce: 9502c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 9518951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 9528951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 9538951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 9548951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 9555323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 9562c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 957a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel if (RetAttrs) 958a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel PAL.push_back(llvm::AttributeWithIndex::get(0, RetAttrs)); 9595627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar for (++begin; begin != end; ++begin) { 9605323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar QualType ParamType = *begin; 961761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel unsigned Attributes = 0; 9626b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo AI = getABIArgumentInfo(ParamType, getTypes()); 9638951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 9648951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (AI.getKind()) { 9658951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::StructRet: 9665627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Coerce: 9678951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for non-return argument"); 9688951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 9698951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 970761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel Attributes |= llvm::Attribute::ByVal; 9718951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(AI.getByValAlignment() == 0 && "FIXME: alignment unhandled"); 9728951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 9738951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 9748951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Default: 9758951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar if (ParamType->isPromotableIntegerType()) { 9768951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar if (ParamType->isSignedIntegerType()) { 977761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel Attributes |= llvm::Attribute::SExt; 9788951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } else if (ParamType->isUnsignedIntegerType()) { 979761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel Attributes |= llvm::Attribute::ZExt; 9808951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 9815323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 9828951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 9838951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 98411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 98511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar // Skip increment, no matching LLVM parameter. 98611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar continue; 98711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 9885627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Expand: { 9895627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar std::vector<const llvm::Type*> Tys; 9905627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // FIXME: This is rather inefficient. Do we ever actually need 9915627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // to do anything here? The result should be just reconstructed 9925627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // on the other side, so extension should be a non-issue. 9935627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar getTypes().GetExpandedTypes(ParamType, Tys); 9945627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Index += Tys.size(); 9955627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar continue; 9965627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 9975323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 9988951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 999761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel if (Attributes) 1000761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel PAL.push_back(llvm::AttributeWithIndex::get(Index, Attributes)); 10015627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ++Index; 10025323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar } 1003a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel if (FuncAttrs) 1004a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel PAL.push_back(llvm::AttributeWithIndex::get(~0, FuncAttrs)); 1005a2c6912c416c2d9f79d18f3a88ab0ae2609286c3Devang Patel 10065323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar} 10075323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar 100817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbarvoid CodeGenFunction::EmitFunctionProlog(llvm::Function *Fn, 100917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar QualType RetTy, 101017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar const FunctionArgList &Args) { 101117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // Emit allocs for param decls. Give the LLVM Argument nodes names. 101217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar llvm::Function::arg_iterator AI = Fn->arg_begin(); 101317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 101417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // Name the struct return argument. 10152c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (CGM.ReturnTypeUsesSret(RetTy)) { 101617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar AI->setName("agg.result"); 101717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar ++AI; 101817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 101917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 102017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end(); 10215627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar i != e; ++i) { 102217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar const VarDecl *Arg = i->first; 10235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar QualType Ty = i->second; 10246b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo ArgI = getABIArgumentInfo(Ty, CGM.getTypes()); 10258951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 10268951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar switch (ArgI.getKind()) { 10278951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 10288951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Default: { 10298951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(AI != Fn->arg_end() && "Argument mismatch!"); 10308951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar llvm::Value* V = AI; 10315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (!getContext().typesAreCompatible(Ty, Arg->getType())) { 10328951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar // This must be a promotion, for something like 10338951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar // "void a(x) short x; {..." 10345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar V = EmitScalarConversion(V, Ty, Arg->getType()); 103517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 10368951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar EmitParmDecl(*Arg, V); 10378951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 10388951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 10398951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 10405627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Expand: { 10415627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // If this was structure was expand into multiple arguments then 10425627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // we need to create a temporary and reconstruct it from the 10435627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // arguments. 104439f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner std::string Name = Arg->getNameAsString(); 10455627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Value *Temp = CreateTempAlloca(ConvertType(Ty), 10465627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar (Name + ".addr").c_str()); 10475627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // FIXME: What are the right qualifiers here? 10485627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar llvm::Function::arg_iterator End = 10495627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ExpandTypeFromArgs(Ty, LValue::MakeAddr(Temp,0), AI); 10505627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar EmitParmDecl(*Arg, Temp); 10515627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 10525627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // Name the arguments used in expansion and increment AI. 10535627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar unsigned Index = 0; 10545627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar for (; AI != End; ++AI, ++Index) 10555627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar AI->setName(Name + "." + llvm::utostr(Index)); 10565627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar continue; 10575627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 105811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 105911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 106011434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar break; 106111434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 10625627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Coerce: 10638951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::StructRet: 10648951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for non-return argument"); 10658951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar } 10665627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 10675627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ++AI; 106817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 106917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar assert(AI == Fn->arg_end() && "Argument mismatch!"); 107017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar} 107117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 107254d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// CreateCoercedLoad - Create a load from \arg SrcPtr interpreted as 107354d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// a pointer to an object of type \arg Ty. 107454d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// 107554d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// This safely handles the case when the src type is smaller than the 107654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// destination type; in this situation the values of bits which not 107754d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// present in the src are undefined. 107854d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbarstatic llvm::Value *CreateCoercedLoad(llvm::Value *SrcPtr, 107954d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar const llvm::Type *Ty, 108054d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar CodeGenFunction &CGF) { 108154d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar const llvm::Type *SrcTy = 108254d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar cast<llvm::PointerType>(SrcPtr->getType())->getElementType(); 108354d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar unsigned SrcSize = CGF.CGM.getTargetData().getTypePaddedSize(SrcTy); 108454d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar unsigned DstSize = CGF.CGM.getTargetData().getTypePaddedSize(Ty); 108554d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar 108654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar // If load is legal, just bitcase the src pointer. 108754d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar if (SrcSize == DstSize) { 108854d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar llvm::Value *Casted = 108954d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar CGF.Builder.CreateBitCast(SrcPtr, llvm::PointerType::getUnqual(Ty)); 109054d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar return CGF.Builder.CreateLoad(Casted); 109154d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar } else { 109254d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar assert(SrcSize < DstSize && "Coercion is losing source bits!"); 109354d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar 109454d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar // Otherwise do coercion through memory. This is stupid, but 109554d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar // simple. 109654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar llvm::Value *Tmp = CGF.CreateTempAlloca(Ty); 109754d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar llvm::Value *Casted = 109854d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(SrcTy)); 109954d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar CGF.Builder.CreateStore(CGF.Builder.CreateLoad(SrcPtr), Casted); 110054d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar return CGF.Builder.CreateLoad(Tmp); 110154d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar } 110254d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar} 110354d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar 110454d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// CreateCoercedStore - Create a store to \arg DstPtr from \arg Src, 110554d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// where the source and destination may have different types. 110654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// 110754d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// This safely handles the case when the src type is larger than the 110854d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar/// destination type; the upper bits of the src will be lost. 110954d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbarstatic void CreateCoercedStore(llvm::Value *Src, 111054d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar llvm::Value *DstPtr, 111154d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar CodeGenFunction &CGF) { 111254d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar const llvm::Type *SrcTy = Src->getType(); 111354d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar const llvm::Type *DstTy = 111454d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar cast<llvm::PointerType>(DstPtr->getType())->getElementType(); 111554d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar 111654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar unsigned SrcSize = CGF.CGM.getTargetData().getTypePaddedSize(SrcTy); 111754d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar unsigned DstSize = CGF.CGM.getTargetData().getTypePaddedSize(DstTy); 111854d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar 111954d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar // If store is legal, just bitcase the src pointer. 112054d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar if (SrcSize == DstSize) { 112154d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar llvm::Value *Casted = 112254d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar CGF.Builder.CreateBitCast(DstPtr, llvm::PointerType::getUnqual(SrcTy)); 112354d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar CGF.Builder.CreateStore(Src, Casted); 112454d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar } else { 112554d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar assert(SrcSize > DstSize && "Coercion is missing bits!"); 112654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar 112754d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar // Otherwise do coercion through memory. This is stupid, but 112854d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar // simple. 112954d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar llvm::Value *Tmp = CGF.CreateTempAlloca(SrcTy); 113054d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar CGF.Builder.CreateStore(Src, Tmp); 113154d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar llvm::Value *Casted = 113254d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar CGF.Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(DstTy)); 113354d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar CGF.Builder.CreateStore(CGF.Builder.CreateLoad(Casted), DstPtr); 113454d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar } 113554d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar} 113654d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar 113717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbarvoid CodeGenFunction::EmitFunctionEpilog(QualType RetTy, 113817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar llvm::Value *ReturnValue) { 11392c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar llvm::Value *RV = 0; 11402c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 11412c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar // Functions with no result always return void. 11422c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (ReturnValue) { 11436b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo RetAI = getABIReturnInfo(RetTy, CGM.getTypes()); 11442c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 11452c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar switch (RetAI.getKind()) { 11462c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::StructRet: 11473aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar if (RetTy->isAnyComplexType()) { 11483aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar // FIXME: Volatile 11493aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar ComplexPairTy RT = LoadComplexFromAddr(ReturnValue, false); 11503aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar StoreComplexToAddr(RT, CurFn->arg_begin(), false); 11513aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) { 11523aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar EmitAggregateCopy(CurFn->arg_begin(), ReturnValue, RetTy); 11533aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar } else { 11543aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar Builder.CreateStore(Builder.CreateLoad(ReturnValue), 11553aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar CurFn->arg_begin()); 11563aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar } 11572c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 11588951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 11592c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Default: 11602c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar RV = Builder.CreateLoad(ReturnValue); 11612c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 11622c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 116311434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 116411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar break; 116511434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 1166639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar case ABIArgInfo::Coerce: { 116754d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar RV = CreateCoercedLoad(ReturnValue, RetAI.getCoerceToType(), *this); 11688951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar break; 1169639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } 11708951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 11718951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 11728951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 11738951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 117417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 117517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 11762c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 11772c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (RV) { 11782c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar Builder.CreateRet(RV); 11792c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } else { 11802c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar Builder.CreateRetVoid(); 11812c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar } 118217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar} 118317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 118417b708d61827cd86278e9580b041dd6cbadf07d3Daniel DunbarRValue CodeGenFunction::EmitCall(llvm::Value *Callee, 11852c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar QualType RetTy, 118617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar const CallArgList &CallArgs) { 118717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar llvm::SmallVector<llvm::Value*, 16> Args; 118817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 118917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // Handle struct-return functions by passing a pointer to the 119017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // location that we would like to return into. 11916b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo RetAI = getABIReturnInfo(RetTy, CGM.getTypes()); 11922c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar switch (RetAI.getKind()) { 11932c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::StructRet: 119417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar // Create a temporary alloca to hold the result of the call. :( 11955627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Args.push_back(CreateTempAlloca(ConvertType(RetTy))); 11962c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 11972c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 11982c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Default: 119911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 12002c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Coerce: 12012c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar break; 12028951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 12038951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 12048951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 12058951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 120617b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 120717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 120817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar for (CallArgList::const_iterator I = CallArgs.begin(), E = CallArgs.end(); 120917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar I != E; ++I) { 12106b1da0ea19c12346192f5ea4d70872c13bfcc82aDaniel Dunbar ABIArgInfo ArgInfo = getABIArgumentInfo(I->second, CGM.getTypes()); 121117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar RValue RV = I->first; 12125627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 12135627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar switch (ArgInfo.getKind()) { 12145627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::ByVal: // Default is byval 12155627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Default: 12165627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar if (RV.isScalar()) { 12175627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Args.push_back(RV.getScalarVal()); 12185627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else if (RV.isComplex()) { 12195627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar // Make a temporary alloca to pass the argument. 12205627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Args.push_back(CreateTempAlloca(ConvertType(I->second))); 12215627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar StoreComplexToAddr(RV.getComplexVal(), Args.back(), false); 12225627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } else { 12235627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar Args.push_back(RV.getAggregateAddr()); 12245627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar } 12255627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar break; 12265627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 122711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 122811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar break; 122911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 12305627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::StructRet: 12315627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Coerce: 12325627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar assert(0 && "Invalid ABI kind for non-return argument"); 12335627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar break; 12345627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar 12355627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar case ABIArgInfo::Expand: 12365627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar ExpandTypeToArgs(I->second, RV, Args); 12375627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar break; 123817b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 123917b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 124017b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 124117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar llvm::CallInst *CI = Builder.CreateCall(Callee,&Args[0],&Args[0]+Args.size()); 12422c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar CGCallInfo CallInfo(RetTy, CallArgs); 124317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 12445323a4b0a1c248fa2ffdf886bb41a5d8fba71d2dDaniel Dunbar // FIXME: Provide TargetDecl so nounwind, noreturn, etc, etc get set. 1245761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel CodeGen::AttributeListType AttributeList; 1246761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel CGM.ConstructAttributeList(0, 1247b768807c49a1c7085def099b848631856af766faDaniel Dunbar CallInfo.argtypes_begin(), CallInfo.argtypes_end(), 1248761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel AttributeList); 1249761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel CI->setAttributes(llvm::AttrListPtr::get(AttributeList.begin(), 1250761d7f78e2dac7ea5f35828c2271e60d91e106ceDevang Patel AttributeList.size())); 125117b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar 125217b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar if (const llvm::Function *F = dyn_cast<llvm::Function>(Callee)) 125317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar CI->setCallingConv(F->getCallingConv()); 125417b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar if (CI->getType() != llvm::Type::VoidTy) 125517b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar CI->setName("call"); 12562c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 12572c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar switch (RetAI.getKind()) { 12582c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::StructRet: 12592c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar if (RetTy->isAnyComplexType()) 12605627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar return RValue::getComplex(LoadComplexFromAddr(Args[0], false)); 12613aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) 12625627377df5439a1d3d46a4e4cef4ae44f84a322bDaniel Dunbar return RValue::getAggregate(Args[0]); 12633aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar else 12643aea8cac3ec9ad03b1d2b002f38a0d42a70483c8Daniel Dunbar return RValue::get(Builder.CreateLoad(Args[0])); 12658951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 12662c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar case ABIArgInfo::Default: 12672c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar return RValue::get(RetTy->isVoidType() ? 0 : CI); 12682c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 126911434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar case ABIArgInfo::Ignore: 1270cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar if (RetTy->isVoidType()) 1271cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar return RValue::get(0); 1272cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar if (CodeGenFunction::hasAggregateLLVMType(RetTy)) { 1273cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar llvm::Value *Res = 1274cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar llvm::UndefValue::get(llvm::PointerType::getUnqual(ConvertType(RetTy))); 1275cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar return RValue::getAggregate(Res); 1276cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar } 1277cc039fea2e985214e00387ce7404d358f56cf301Daniel Dunbar return RValue::get(llvm::UndefValue::get(ConvertType(RetTy))); 127811434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar 1279639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar case ABIArgInfo::Coerce: { 128054d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar llvm::Value *V = CreateTempAlloca(ConvertType(RetTy), "coerce"); 128154d1ccbfcf19ddf39444f1b4018dd79487cc847bDaniel Dunbar CreateCoercedStore(CI, V, *this); 1282ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson if (RetTy->isAnyComplexType()) 1283ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson return RValue::getComplex(LoadComplexFromAddr(V, false)); 128411434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) 1285ad3d6917dabbdab3399ff8307240aad58247d2e3Anders Carlsson return RValue::getAggregate(V); 128611434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar else 128711434925bf81c932c6c8fe3533bc0ba900d50dc2Daniel Dunbar return RValue::get(Builder.CreateLoad(V)); 1288639ffe47097d01249b98b7acd102aaad6697b43aDaniel Dunbar } 12898951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar 12908951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::ByVal: 12918951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar case ABIArgInfo::Expand: 12928951dbd225580173193ec9db503d9d9844ff97d6Daniel Dunbar assert(0 && "Invalid ABI kind for return argument"); 129317b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar } 12942c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar 12952c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar assert(0 && "Unhandled ABIArgInfo::Kind"); 12962c8e0f32b9c33686be23c70add0b97490903de9fDaniel Dunbar return RValue::get(0); 129717b708d61827cd86278e9580b041dd6cbadf07d3Daniel Dunbar} 1298