CGFunctionInfo.h revision 176edba5311f6eff0cad2631449885ddf4fbc9ea
18b54999a831bb195c08541ca995ef0505c96193fMark Lacey//==-- CGFunctionInfo.h - Representation of function argument/return types -==// 28b54999a831bb195c08541ca995ef0505c96193fMark Lacey// 38b54999a831bb195c08541ca995ef0505c96193fMark Lacey// The LLVM Compiler Infrastructure 48b54999a831bb195c08541ca995ef0505c96193fMark Lacey// 58b54999a831bb195c08541ca995ef0505c96193fMark Lacey// This file is distributed under the University of Illinois Open Source 68b54999a831bb195c08541ca995ef0505c96193fMark Lacey// License. See LICENSE.TXT for details. 78b54999a831bb195c08541ca995ef0505c96193fMark Lacey// 88b54999a831bb195c08541ca995ef0505c96193fMark Lacey//===----------------------------------------------------------------------===// 98b54999a831bb195c08541ca995ef0505c96193fMark Lacey// 108b54999a831bb195c08541ca995ef0505c96193fMark Lacey// Defines CGFunctionInfo and associated types used in representing the 118b54999a831bb195c08541ca995ef0505c96193fMark Lacey// LLVM source types and ABI-coerced types for function arguments and 128b54999a831bb195c08541ca995ef0505c96193fMark Lacey// return values. 138b54999a831bb195c08541ca995ef0505c96193fMark Lacey// 148b54999a831bb195c08541ca995ef0505c96193fMark Lacey//===----------------------------------------------------------------------===// 158b54999a831bb195c08541ca995ef0505c96193fMark Lacey 16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#ifndef LLVM_CLANG_CODEGEN_CGFUNCTIONINFO_H 17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#define LLVM_CLANG_CODEGEN_CGFUNCTIONINFO_H 188b54999a831bb195c08541ca995ef0505c96193fMark Lacey 198b54999a831bb195c08541ca995ef0505c96193fMark Lacey#include "clang/AST/CanonicalType.h" 208b54999a831bb195c08541ca995ef0505c96193fMark Lacey#include "clang/AST/Type.h" 218b54999a831bb195c08541ca995ef0505c96193fMark Lacey#include "llvm/ADT/FoldingSet.h" 228b54999a831bb195c08541ca995ef0505c96193fMark Lacey#include <cassert> 238b54999a831bb195c08541ca995ef0505c96193fMark Lacey 248b54999a831bb195c08541ca995ef0505c96193fMark Laceynamespace llvm { 258b54999a831bb195c08541ca995ef0505c96193fMark Lacey class Type; 26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines class StructType; 278b54999a831bb195c08541ca995ef0505c96193fMark Lacey} 288b54999a831bb195c08541ca995ef0505c96193fMark Lacey 298b54999a831bb195c08541ca995ef0505c96193fMark Laceynamespace clang { 30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass Decl; 31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 328b54999a831bb195c08541ca995ef0505c96193fMark Laceynamespace CodeGen { 338b54999a831bb195c08541ca995ef0505c96193fMark Lacey 348b54999a831bb195c08541ca995ef0505c96193fMark Lacey/// ABIArgInfo - Helper class to encapsulate information about how a 358b54999a831bb195c08541ca995ef0505c96193fMark Lacey/// specific C type should be passed to or returned from a function. 368b54999a831bb195c08541ca995ef0505c96193fMark Laceyclass ABIArgInfo { 378b54999a831bb195c08541ca995ef0505c96193fMark Laceypublic: 386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines enum Kind : uint8_t { 398b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// Direct - Pass the argument directly using the normal converted LLVM 408b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// type, or by coercing to another specified type stored in 418b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// 'CoerceToType'). If an offset is specified (in UIntData), then the 428b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// argument passed is offset by some number of bytes in the memory 438b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// representation. A dummy argument is emitted before the real argument 448b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// if the specified type stored in "PaddingType" is not zero. 458b54999a831bb195c08541ca995ef0505c96193fMark Lacey Direct, 468b54999a831bb195c08541ca995ef0505c96193fMark Lacey 478b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// Extend - Valid only for integer argument types. Same as 'direct' 488b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// but also emit a zero/sign extension attribute. 498b54999a831bb195c08541ca995ef0505c96193fMark Lacey Extend, 508b54999a831bb195c08541ca995ef0505c96193fMark Lacey 518b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// Indirect - Pass the argument indirectly via a hidden pointer 528b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// with the specified alignment (0 indicates default alignment). 538b54999a831bb195c08541ca995ef0505c96193fMark Lacey Indirect, 548b54999a831bb195c08541ca995ef0505c96193fMark Lacey 558b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// Ignore - Ignore the argument (treat as void). Useful for void and 568b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// empty structs. 578b54999a831bb195c08541ca995ef0505c96193fMark Lacey Ignore, 588b54999a831bb195c08541ca995ef0505c96193fMark Lacey 598b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// Expand - Only valid for aggregate argument types. The structure should 608b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// be expanded into consecutive arguments for its constituent fields. 618b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// Currently expand is only allowed on structures whose fields 628b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// are all scalar types or are themselves expandable types. 638b54999a831bb195c08541ca995ef0505c96193fMark Lacey Expand, 648b54999a831bb195c08541ca995ef0505c96193fMark Lacey 65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// InAlloca - Pass the argument directly using the LLVM inalloca attribute. 66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// This is similar to 'direct', except it only applies to arguments stored 67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// in memory and forbids any implicit copies. When applied to a return 68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// type, it means the value is returned indirectly via an implicit sret 69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// parameter stored in the argument struct. 70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines InAlloca, 71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines KindFirst = Direct, 72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines KindLast = InAlloca 738b54999a831bb195c08541ca995ef0505c96193fMark Lacey }; 748b54999a831bb195c08541ca995ef0505c96193fMark Lacey 758b54999a831bb195c08541ca995ef0505c96193fMark Laceyprivate: 766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::Type *TypeData; // isDirect() || isExtend() 778b54999a831bb195c08541ca995ef0505c96193fMark Lacey llvm::Type *PaddingType; 786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines union { 796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned DirectOffset; // isDirect() || isExtend() 806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned IndirectAlign; // isIndirect() 816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned AllocaFieldIndex; // isInAlloca() 826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Kind TheKind; 846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool PaddingInReg : 1; 856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool InAllocaSRet : 1; // isInAlloca() 866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool IndirectByVal : 1; // isIndirect() 876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool IndirectRealign : 1; // isIndirect() 886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool SRetAfterThis : 1; // isIndirect() 896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool InReg : 1; // isDirect() || isExtend() || isIndirect() 90176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool CanBeFlattened: 1; // isDirect() 918b54999a831bb195c08541ca995ef0505c96193fMark Lacey 926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ABIArgInfo(Kind K) 936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : PaddingType(nullptr), TheKind(K), PaddingInReg(false), InReg(false) {} 948b54999a831bb195c08541ca995ef0505c96193fMark Lacey 958b54999a831bb195c08541ca995ef0505c96193fMark Laceypublic: 966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ABIArgInfo() 976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : TypeData(nullptr), PaddingType(nullptr), DirectOffset(0), 986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TheKind(Direct), PaddingInReg(false), InReg(false) {} 996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static ABIArgInfo getDirect(llvm::Type *T = nullptr, unsigned Offset = 0, 101176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::Type *Padding = nullptr, 102176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool CanBeFlattened = true) { 1036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto AI = ABIArgInfo(Direct); 1046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AI.setCoerceToType(T); 1056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AI.setDirectOffset(Offset); 1066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AI.setPaddingType(Padding); 107176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines AI.setCanBeFlattened(CanBeFlattened); 1086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return AI; 1098b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 1106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static ABIArgInfo getDirectInReg(llvm::Type *T = nullptr) { 1116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto AI = getDirect(T); 1126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AI.setInReg(true); 1136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return AI; 1148b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 1156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static ABIArgInfo getExtend(llvm::Type *T = nullptr) { 1166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto AI = ABIArgInfo(Extend); 1176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AI.setCoerceToType(T); 1186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AI.setDirectOffset(0); 1196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return AI; 1208b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 1216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static ABIArgInfo getExtendInReg(llvm::Type *T = nullptr) { 1226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto AI = getExtend(T); 1236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AI.setInReg(true); 1246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return AI; 1258b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 1268b54999a831bb195c08541ca995ef0505c96193fMark Lacey static ABIArgInfo getIgnore() { 1276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return ABIArgInfo(Ignore); 1288b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 1296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static ABIArgInfo getIndirect(unsigned Alignment, bool ByVal = true, 1306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool Realign = false, 1316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::Type *Padding = nullptr) { 1326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto AI = ABIArgInfo(Indirect); 1336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AI.setIndirectAlign(Alignment); 1346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AI.setIndirectByVal(ByVal); 1356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AI.setIndirectRealign(Realign); 1366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AI.setSRetAfterThis(false); 1376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AI.setPaddingType(Padding); 1386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return AI; 1398b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 1406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static ABIArgInfo getIndirectInReg(unsigned Alignment, bool ByVal = true, 1416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool Realign = false) { 1426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto AI = getIndirect(Alignment, ByVal, Realign); 1436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AI.setInReg(true); 1446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return AI; 145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static ABIArgInfo getInAlloca(unsigned FieldIndex) { 1476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto AI = ABIArgInfo(InAlloca); 1486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AI.setInAllocaFieldIndex(FieldIndex); 1496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return AI; 1508b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 1518b54999a831bb195c08541ca995ef0505c96193fMark Lacey static ABIArgInfo getExpand() { 1526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return ABIArgInfo(Expand); 1538b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 1548b54999a831bb195c08541ca995ef0505c96193fMark Lacey static ABIArgInfo getExpandWithPadding(bool PaddingInReg, 1558b54999a831bb195c08541ca995ef0505c96193fMark Lacey llvm::Type *Padding) { 1566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines auto AI = getExpand(); 1576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AI.setPaddingInReg(PaddingInReg); 1586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AI.setPaddingType(Padding); 1596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return AI; 1608b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 1618b54999a831bb195c08541ca995ef0505c96193fMark Lacey 1628b54999a831bb195c08541ca995ef0505c96193fMark Lacey Kind getKind() const { return TheKind; } 1638b54999a831bb195c08541ca995ef0505c96193fMark Lacey bool isDirect() const { return TheKind == Direct; } 164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isInAlloca() const { return TheKind == InAlloca; } 1658b54999a831bb195c08541ca995ef0505c96193fMark Lacey bool isExtend() const { return TheKind == Extend; } 1668b54999a831bb195c08541ca995ef0505c96193fMark Lacey bool isIgnore() const { return TheKind == Ignore; } 1678b54999a831bb195c08541ca995ef0505c96193fMark Lacey bool isIndirect() const { return TheKind == Indirect; } 1688b54999a831bb195c08541ca995ef0505c96193fMark Lacey bool isExpand() const { return TheKind == Expand; } 1698b54999a831bb195c08541ca995ef0505c96193fMark Lacey 1706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool canHaveCoerceToType() const { return isDirect() || isExtend(); } 1718b54999a831bb195c08541ca995ef0505c96193fMark Lacey 1728b54999a831bb195c08541ca995ef0505c96193fMark Lacey // Direct/Extend accessors 1738b54999a831bb195c08541ca995ef0505c96193fMark Lacey unsigned getDirectOffset() const { 1748b54999a831bb195c08541ca995ef0505c96193fMark Lacey assert((isDirect() || isExtend()) && "Not a direct or extend kind"); 1756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return DirectOffset; 1768b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 1776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setDirectOffset(unsigned Offset) { 1786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert((isDirect() || isExtend()) && "Not a direct or extend kind"); 1796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DirectOffset = Offset; 1808b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 1818b54999a831bb195c08541ca995ef0505c96193fMark Lacey 1826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::Type *getPaddingType() const { return PaddingType; } 1836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setPaddingType(llvm::Type *T) { PaddingType = T; } 1856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1868b54999a831bb195c08541ca995ef0505c96193fMark Lacey bool getPaddingInReg() const { 1878b54999a831bb195c08541ca995ef0505c96193fMark Lacey return PaddingInReg; 1888b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 1896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setPaddingInReg(bool PIR) { 1906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PaddingInReg = PIR; 1916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 1928b54999a831bb195c08541ca995ef0505c96193fMark Lacey 1938b54999a831bb195c08541ca995ef0505c96193fMark Lacey llvm::Type *getCoerceToType() const { 1948b54999a831bb195c08541ca995ef0505c96193fMark Lacey assert(canHaveCoerceToType() && "Invalid kind!"); 1958b54999a831bb195c08541ca995ef0505c96193fMark Lacey return TypeData; 1968b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 1978b54999a831bb195c08541ca995ef0505c96193fMark Lacey 1988b54999a831bb195c08541ca995ef0505c96193fMark Lacey void setCoerceToType(llvm::Type *T) { 1998b54999a831bb195c08541ca995ef0505c96193fMark Lacey assert(canHaveCoerceToType() && "Invalid kind!"); 2008b54999a831bb195c08541ca995ef0505c96193fMark Lacey TypeData = T; 2018b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 2028b54999a831bb195c08541ca995ef0505c96193fMark Lacey 2038b54999a831bb195c08541ca995ef0505c96193fMark Lacey bool getInReg() const { 2048b54999a831bb195c08541ca995ef0505c96193fMark Lacey assert((isDirect() || isExtend() || isIndirect()) && "Invalid kind!"); 2058b54999a831bb195c08541ca995ef0505c96193fMark Lacey return InReg; 2068b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 2078b54999a831bb195c08541ca995ef0505c96193fMark Lacey 2086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setInReg(bool IR) { 2096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert((isDirect() || isExtend() || isIndirect()) && "Invalid kind!"); 2106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines InReg = IR; 2116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 2126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2138b54999a831bb195c08541ca995ef0505c96193fMark Lacey // Indirect accessors 2148b54999a831bb195c08541ca995ef0505c96193fMark Lacey unsigned getIndirectAlign() const { 2156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(isIndirect() && "Invalid kind!"); 2166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return IndirectAlign; 2176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 2186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setIndirectAlign(unsigned IA) { 2196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(isIndirect() && "Invalid kind!"); 2206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IndirectAlign = IA; 2218b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 2228b54999a831bb195c08541ca995ef0505c96193fMark Lacey 2238b54999a831bb195c08541ca995ef0505c96193fMark Lacey bool getIndirectByVal() const { 2246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(isIndirect() && "Invalid kind!"); 2256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return IndirectByVal; 2266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 2276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setIndirectByVal(unsigned IBV) { 2286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(isIndirect() && "Invalid kind!"); 2296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IndirectByVal = IBV; 2308b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 2318b54999a831bb195c08541ca995ef0505c96193fMark Lacey 2328b54999a831bb195c08541ca995ef0505c96193fMark Lacey bool getIndirectRealign() const { 2336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(isIndirect() && "Invalid kind!"); 2346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return IndirectRealign; 2356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 2366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setIndirectRealign(bool IR) { 2376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(isIndirect() && "Invalid kind!"); 2386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IndirectRealign = IR; 2396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 2406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool isSRetAfterThis() const { 2426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(isIndirect() && "Invalid kind!"); 2436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return SRetAfterThis; 2446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 2456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setSRetAfterThis(bool AfterThis) { 2466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(isIndirect() && "Invalid kind!"); 2476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SRetAfterThis = AfterThis; 2488b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 2498b54999a831bb195c08541ca995ef0505c96193fMark Lacey 250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned getInAllocaFieldIndex() const { 2516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(isInAlloca() && "Invalid kind!"); 2526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return AllocaFieldIndex; 2536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 2546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setInAllocaFieldIndex(unsigned FieldIndex) { 2556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(isInAlloca() && "Invalid kind!"); 2566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines AllocaFieldIndex = FieldIndex; 257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 258651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 259651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// \brief Return true if this field of an inalloca struct should be returned 260651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// to implement a struct return calling convention. 261651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool getInAllocaSRet() const { 2626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(isInAlloca() && "Invalid kind!"); 2636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return InAllocaSRet; 264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 265651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void setInAllocaSRet(bool SRet) { 2676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(isInAlloca() && "Invalid kind!"); 2686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines InAllocaSRet = SRet; 269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 271176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool getCanBeFlattened() const { 272176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(isDirect() && "Invalid kind!"); 273176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return CanBeFlattened; 274176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 275176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 276176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines void setCanBeFlattened(bool Flatten) { 277176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines assert(isDirect() && "Invalid kind!"); 278176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CanBeFlattened = Flatten; 279176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 280176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2818b54999a831bb195c08541ca995ef0505c96193fMark Lacey void dump() const; 2828b54999a831bb195c08541ca995ef0505c96193fMark Lacey}; 2838b54999a831bb195c08541ca995ef0505c96193fMark Lacey 2848b54999a831bb195c08541ca995ef0505c96193fMark Lacey/// A class for recording the number of arguments that a function 2858b54999a831bb195c08541ca995ef0505c96193fMark Lacey/// signature requires. 2868b54999a831bb195c08541ca995ef0505c96193fMark Laceyclass RequiredArgs { 2878b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// The number of required arguments, or ~0 if the signature does 2888b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// not permit optional arguments. 2898b54999a831bb195c08541ca995ef0505c96193fMark Lacey unsigned NumRequired; 2908b54999a831bb195c08541ca995ef0505c96193fMark Laceypublic: 2918b54999a831bb195c08541ca995ef0505c96193fMark Lacey enum All_t { All }; 2928b54999a831bb195c08541ca995ef0505c96193fMark Lacey 2938b54999a831bb195c08541ca995ef0505c96193fMark Lacey RequiredArgs(All_t _) : NumRequired(~0U) {} 2948b54999a831bb195c08541ca995ef0505c96193fMark Lacey explicit RequiredArgs(unsigned n) : NumRequired(n) { 2958b54999a831bb195c08541ca995ef0505c96193fMark Lacey assert(n != ~0U); 2968b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 2978b54999a831bb195c08541ca995ef0505c96193fMark Lacey 2988b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// Compute the arguments required by the given formal prototype, 2998b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// given that there may be some additional, non-formal arguments 3008b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// in play. 3018b54999a831bb195c08541ca995ef0505c96193fMark Lacey static RequiredArgs forPrototypePlus(const FunctionProtoType *prototype, 3028b54999a831bb195c08541ca995ef0505c96193fMark Lacey unsigned additional) { 3038b54999a831bb195c08541ca995ef0505c96193fMark Lacey if (!prototype->isVariadic()) return All; 304651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return RequiredArgs(prototype->getNumParams() + additional); 3058b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 3068b54999a831bb195c08541ca995ef0505c96193fMark Lacey 3078b54999a831bb195c08541ca995ef0505c96193fMark Lacey static RequiredArgs forPrototype(const FunctionProtoType *prototype) { 3088b54999a831bb195c08541ca995ef0505c96193fMark Lacey return forPrototypePlus(prototype, 0); 3098b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 3108b54999a831bb195c08541ca995ef0505c96193fMark Lacey 3118b54999a831bb195c08541ca995ef0505c96193fMark Lacey static RequiredArgs forPrototype(CanQual<FunctionProtoType> prototype) { 3128b54999a831bb195c08541ca995ef0505c96193fMark Lacey return forPrototype(prototype.getTypePtr()); 3138b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 3148b54999a831bb195c08541ca995ef0505c96193fMark Lacey 3158b54999a831bb195c08541ca995ef0505c96193fMark Lacey static RequiredArgs forPrototypePlus(CanQual<FunctionProtoType> prototype, 3168b54999a831bb195c08541ca995ef0505c96193fMark Lacey unsigned additional) { 3178b54999a831bb195c08541ca995ef0505c96193fMark Lacey return forPrototypePlus(prototype.getTypePtr(), additional); 3188b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 3198b54999a831bb195c08541ca995ef0505c96193fMark Lacey 3208b54999a831bb195c08541ca995ef0505c96193fMark Lacey bool allowsOptionalArgs() const { return NumRequired != ~0U; } 3218b54999a831bb195c08541ca995ef0505c96193fMark Lacey unsigned getNumRequiredArgs() const { 3228b54999a831bb195c08541ca995ef0505c96193fMark Lacey assert(allowsOptionalArgs()); 3238b54999a831bb195c08541ca995ef0505c96193fMark Lacey return NumRequired; 3248b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 3258b54999a831bb195c08541ca995ef0505c96193fMark Lacey 3268b54999a831bb195c08541ca995ef0505c96193fMark Lacey unsigned getOpaqueData() const { return NumRequired; } 3278b54999a831bb195c08541ca995ef0505c96193fMark Lacey static RequiredArgs getFromOpaqueData(unsigned value) { 3288b54999a831bb195c08541ca995ef0505c96193fMark Lacey if (value == ~0U) return All; 3298b54999a831bb195c08541ca995ef0505c96193fMark Lacey return RequiredArgs(value); 3308b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 3318b54999a831bb195c08541ca995ef0505c96193fMark Lacey}; 3328b54999a831bb195c08541ca995ef0505c96193fMark Lacey 3338b54999a831bb195c08541ca995ef0505c96193fMark Lacey/// CGFunctionInfo - Class to encapsulate the information about a 3348b54999a831bb195c08541ca995ef0505c96193fMark Lacey/// function definition. 3358b54999a831bb195c08541ca995ef0505c96193fMark Laceyclass CGFunctionInfo : public llvm::FoldingSetNode { 3368b54999a831bb195c08541ca995ef0505c96193fMark Lacey struct ArgInfo { 3378b54999a831bb195c08541ca995ef0505c96193fMark Lacey CanQualType type; 3388b54999a831bb195c08541ca995ef0505c96193fMark Lacey ABIArgInfo info; 3398b54999a831bb195c08541ca995ef0505c96193fMark Lacey }; 3408b54999a831bb195c08541ca995ef0505c96193fMark Lacey 3418b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// The LLVM::CallingConv to use for this function (as specified by the 3428b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// user). 3438b54999a831bb195c08541ca995ef0505c96193fMark Lacey unsigned CallingConvention : 8; 3448b54999a831bb195c08541ca995ef0505c96193fMark Lacey 3458b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// The LLVM::CallingConv to actually use for this function, which may 3468b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// depend on the ABI. 3478b54999a831bb195c08541ca995ef0505c96193fMark Lacey unsigned EffectiveCallingConvention : 8; 3488b54999a831bb195c08541ca995ef0505c96193fMark Lacey 3498b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// The clang::CallingConv that this was originally created with. 3508b54999a831bb195c08541ca995ef0505c96193fMark Lacey unsigned ASTCallingConvention : 8; 3518b54999a831bb195c08541ca995ef0505c96193fMark Lacey 352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// Whether this is an instance method. 353651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned InstanceMethod : 1; 354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3558b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// Whether this function is noreturn. 3568b54999a831bb195c08541ca995ef0505c96193fMark Lacey unsigned NoReturn : 1; 3578b54999a831bb195c08541ca995ef0505c96193fMark Lacey 3588b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// Whether this function is returns-retained. 3598b54999a831bb195c08541ca995ef0505c96193fMark Lacey unsigned ReturnsRetained : 1; 3608b54999a831bb195c08541ca995ef0505c96193fMark Lacey 3618b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// How many arguments to pass inreg. 3628b54999a831bb195c08541ca995ef0505c96193fMark Lacey unsigned HasRegParm : 1; 3638b54999a831bb195c08541ca995ef0505c96193fMark Lacey unsigned RegParm : 4; 3648b54999a831bb195c08541ca995ef0505c96193fMark Lacey 3658b54999a831bb195c08541ca995ef0505c96193fMark Lacey RequiredArgs Required; 3668b54999a831bb195c08541ca995ef0505c96193fMark Lacey 367651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// The struct representing all arguments passed in memory. Only used when 368651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// passing non-trivial types with inalloca. Not part of the profile. 369651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::StructType *ArgStruct; 370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3718b54999a831bb195c08541ca995ef0505c96193fMark Lacey unsigned NumArgs; 3728b54999a831bb195c08541ca995ef0505c96193fMark Lacey ArgInfo *getArgsBuffer() { 3738b54999a831bb195c08541ca995ef0505c96193fMark Lacey return reinterpret_cast<ArgInfo*>(this+1); 3748b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 3758b54999a831bb195c08541ca995ef0505c96193fMark Lacey const ArgInfo *getArgsBuffer() const { 3768b54999a831bb195c08541ca995ef0505c96193fMark Lacey return reinterpret_cast<const ArgInfo*>(this + 1); 3778b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 3788b54999a831bb195c08541ca995ef0505c96193fMark Lacey 3798b54999a831bb195c08541ca995ef0505c96193fMark Lacey CGFunctionInfo() : Required(RequiredArgs::All) {} 3808b54999a831bb195c08541ca995ef0505c96193fMark Lacey 3818b54999a831bb195c08541ca995ef0505c96193fMark Laceypublic: 3828b54999a831bb195c08541ca995ef0505c96193fMark Lacey static CGFunctionInfo *create(unsigned llvmCC, 383651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool InstanceMethod, 3848b54999a831bb195c08541ca995ef0505c96193fMark Lacey const FunctionType::ExtInfo &extInfo, 3858b54999a831bb195c08541ca995ef0505c96193fMark Lacey CanQualType resultType, 3868b54999a831bb195c08541ca995ef0505c96193fMark Lacey ArrayRef<CanQualType> argTypes, 3878b54999a831bb195c08541ca995ef0505c96193fMark Lacey RequiredArgs required); 3888b54999a831bb195c08541ca995ef0505c96193fMark Lacey 3898b54999a831bb195c08541ca995ef0505c96193fMark Lacey typedef const ArgInfo *const_arg_iterator; 3908b54999a831bb195c08541ca995ef0505c96193fMark Lacey typedef ArgInfo *arg_iterator; 3918b54999a831bb195c08541ca995ef0505c96193fMark Lacey 392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef llvm::iterator_range<arg_iterator> arg_range; 393651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef llvm::iterator_range<const_arg_iterator> arg_const_range; 394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 395651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines arg_range arguments() { return arg_range(arg_begin(), arg_end()); } 396651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines arg_const_range arguments() const { 397651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return arg_const_range(arg_begin(), arg_end()); 398651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 399651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 4008b54999a831bb195c08541ca995ef0505c96193fMark Lacey const_arg_iterator arg_begin() const { return getArgsBuffer() + 1; } 4018b54999a831bb195c08541ca995ef0505c96193fMark Lacey const_arg_iterator arg_end() const { return getArgsBuffer() + 1 + NumArgs; } 4028b54999a831bb195c08541ca995ef0505c96193fMark Lacey arg_iterator arg_begin() { return getArgsBuffer() + 1; } 4038b54999a831bb195c08541ca995ef0505c96193fMark Lacey arg_iterator arg_end() { return getArgsBuffer() + 1 + NumArgs; } 4048b54999a831bb195c08541ca995ef0505c96193fMark Lacey 4058b54999a831bb195c08541ca995ef0505c96193fMark Lacey unsigned arg_size() const { return NumArgs; } 4068b54999a831bb195c08541ca995ef0505c96193fMark Lacey 4078b54999a831bb195c08541ca995ef0505c96193fMark Lacey bool isVariadic() const { return Required.allowsOptionalArgs(); } 4088b54999a831bb195c08541ca995ef0505c96193fMark Lacey RequiredArgs getRequiredArgs() const { return Required; } 409176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned getNumRequiredArgs() const { 410176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return isVariadic() ? getRequiredArgs().getNumRequiredArgs() : arg_size(); 411176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 4128b54999a831bb195c08541ca995ef0505c96193fMark Lacey 413651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isInstanceMethod() const { return InstanceMethod; } 414651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 4158b54999a831bb195c08541ca995ef0505c96193fMark Lacey bool isNoReturn() const { return NoReturn; } 4168b54999a831bb195c08541ca995ef0505c96193fMark Lacey 4178b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// In ARC, whether this function retains its return value. This 4188b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// is not always reliable for call sites. 4198b54999a831bb195c08541ca995ef0505c96193fMark Lacey bool isReturnsRetained() const { return ReturnsRetained; } 4208b54999a831bb195c08541ca995ef0505c96193fMark Lacey 4218b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// getASTCallingConvention() - Return the AST-specified calling 4228b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// convention. 4238b54999a831bb195c08541ca995ef0505c96193fMark Lacey CallingConv getASTCallingConvention() const { 4248b54999a831bb195c08541ca995ef0505c96193fMark Lacey return CallingConv(ASTCallingConvention); 4258b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 4268b54999a831bb195c08541ca995ef0505c96193fMark Lacey 4278b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// getCallingConvention - Return the user specified calling 4288b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// convention, which has been translated into an LLVM CC. 4298b54999a831bb195c08541ca995ef0505c96193fMark Lacey unsigned getCallingConvention() const { return CallingConvention; } 4308b54999a831bb195c08541ca995ef0505c96193fMark Lacey 4318b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// getEffectiveCallingConvention - Return the actual calling convention to 4328b54999a831bb195c08541ca995ef0505c96193fMark Lacey /// use, which may depend on the ABI. 4338b54999a831bb195c08541ca995ef0505c96193fMark Lacey unsigned getEffectiveCallingConvention() const { 4348b54999a831bb195c08541ca995ef0505c96193fMark Lacey return EffectiveCallingConvention; 4358b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 4368b54999a831bb195c08541ca995ef0505c96193fMark Lacey void setEffectiveCallingConvention(unsigned Value) { 4378b54999a831bb195c08541ca995ef0505c96193fMark Lacey EffectiveCallingConvention = Value; 4388b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 4398b54999a831bb195c08541ca995ef0505c96193fMark Lacey 4408b54999a831bb195c08541ca995ef0505c96193fMark Lacey bool getHasRegParm() const { return HasRegParm; } 4418b54999a831bb195c08541ca995ef0505c96193fMark Lacey unsigned getRegParm() const { return RegParm; } 4428b54999a831bb195c08541ca995ef0505c96193fMark Lacey 4438b54999a831bb195c08541ca995ef0505c96193fMark Lacey FunctionType::ExtInfo getExtInfo() const { 4448b54999a831bb195c08541ca995ef0505c96193fMark Lacey return FunctionType::ExtInfo(isNoReturn(), 4458b54999a831bb195c08541ca995ef0505c96193fMark Lacey getHasRegParm(), getRegParm(), 4468b54999a831bb195c08541ca995ef0505c96193fMark Lacey getASTCallingConvention(), 4478b54999a831bb195c08541ca995ef0505c96193fMark Lacey isReturnsRetained()); 4488b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 4498b54999a831bb195c08541ca995ef0505c96193fMark Lacey 4508b54999a831bb195c08541ca995ef0505c96193fMark Lacey CanQualType getReturnType() const { return getArgsBuffer()[0].type; } 4518b54999a831bb195c08541ca995ef0505c96193fMark Lacey 4528b54999a831bb195c08541ca995ef0505c96193fMark Lacey ABIArgInfo &getReturnInfo() { return getArgsBuffer()[0].info; } 4538b54999a831bb195c08541ca995ef0505c96193fMark Lacey const ABIArgInfo &getReturnInfo() const { return getArgsBuffer()[0].info; } 4548b54999a831bb195c08541ca995ef0505c96193fMark Lacey 455651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// \brief Return true if this function uses inalloca arguments. 456651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool usesInAlloca() const { return ArgStruct; } 457651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 458651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// \brief Get the struct type used to represent all the arguments in memory. 459651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::StructType *getArgStruct() const { return ArgStruct; } 460651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void setArgStruct(llvm::StructType *Ty) { ArgStruct = Ty; } 461651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 4628b54999a831bb195c08541ca995ef0505c96193fMark Lacey void Profile(llvm::FoldingSetNodeID &ID) { 4638b54999a831bb195c08541ca995ef0505c96193fMark Lacey ID.AddInteger(getASTCallingConvention()); 464651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ID.AddBoolean(InstanceMethod); 4658b54999a831bb195c08541ca995ef0505c96193fMark Lacey ID.AddBoolean(NoReturn); 4668b54999a831bb195c08541ca995ef0505c96193fMark Lacey ID.AddBoolean(ReturnsRetained); 4678b54999a831bb195c08541ca995ef0505c96193fMark Lacey ID.AddBoolean(HasRegParm); 4688b54999a831bb195c08541ca995ef0505c96193fMark Lacey ID.AddInteger(RegParm); 4698b54999a831bb195c08541ca995ef0505c96193fMark Lacey ID.AddInteger(Required.getOpaqueData()); 4708b54999a831bb195c08541ca995ef0505c96193fMark Lacey getReturnType().Profile(ID); 471651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &I : arguments()) 472651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines I.type.Profile(ID); 4738b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 4748b54999a831bb195c08541ca995ef0505c96193fMark Lacey static void Profile(llvm::FoldingSetNodeID &ID, 475651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool InstanceMethod, 4768b54999a831bb195c08541ca995ef0505c96193fMark Lacey const FunctionType::ExtInfo &info, 4778b54999a831bb195c08541ca995ef0505c96193fMark Lacey RequiredArgs required, 4788b54999a831bb195c08541ca995ef0505c96193fMark Lacey CanQualType resultType, 4798b54999a831bb195c08541ca995ef0505c96193fMark Lacey ArrayRef<CanQualType> argTypes) { 4808b54999a831bb195c08541ca995ef0505c96193fMark Lacey ID.AddInteger(info.getCC()); 481651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ID.AddBoolean(InstanceMethod); 4828b54999a831bb195c08541ca995ef0505c96193fMark Lacey ID.AddBoolean(info.getNoReturn()); 4838b54999a831bb195c08541ca995ef0505c96193fMark Lacey ID.AddBoolean(info.getProducesResult()); 4848b54999a831bb195c08541ca995ef0505c96193fMark Lacey ID.AddBoolean(info.getHasRegParm()); 4858b54999a831bb195c08541ca995ef0505c96193fMark Lacey ID.AddInteger(info.getRegParm()); 4868b54999a831bb195c08541ca995ef0505c96193fMark Lacey ID.AddInteger(required.getOpaqueData()); 4878b54999a831bb195c08541ca995ef0505c96193fMark Lacey resultType.Profile(ID); 4888b54999a831bb195c08541ca995ef0505c96193fMark Lacey for (ArrayRef<CanQualType>::iterator 4898b54999a831bb195c08541ca995ef0505c96193fMark Lacey i = argTypes.begin(), e = argTypes.end(); i != e; ++i) { 4908b54999a831bb195c08541ca995ef0505c96193fMark Lacey i->Profile(ID); 4918b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 4928b54999a831bb195c08541ca995ef0505c96193fMark Lacey } 4938b54999a831bb195c08541ca995ef0505c96193fMark Lacey}; 4948b54999a831bb195c08541ca995ef0505c96193fMark Lacey 4958b54999a831bb195c08541ca995ef0505c96193fMark Lacey} // end namespace CodeGen 4968b54999a831bb195c08541ca995ef0505c96193fMark Lacey} // end namespace clang 4978b54999a831bb195c08541ca995ef0505c96193fMark Lacey 4988b54999a831bb195c08541ca995ef0505c96193fMark Lacey#endif 499