14967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//==-- SwiftCallingConv.h - Swift ABI lowering -----------------------------==// 24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// The LLVM Compiler Infrastructure 44967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 54967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source 64967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// License. See LICENSE.TXT for details. 74967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 84967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//===----------------------------------------------------------------------===// 94967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Defines constants and types related to Swift ABI lowering. 114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//===----------------------------------------------------------------------===// 134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#ifndef LLVM_CLANG_CODEGEN_SWIFTCALLINGCONV_H 154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define LLVM_CLANG_CODEGEN_SWIFTCALLINGCONV_H 164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/AST/CanonicalType.h" 184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/AST/CharUnits.h" 194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/AST/Type.h" 204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "llvm/ADT/FoldingSet.h" 214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "llvm/Support/TrailingObjects.h" 224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include <cassert> 234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace llvm { 254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar class IntegerType; 264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar class Type; 274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar class StructType; 284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar class VectorType; 294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace clang { 324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass Decl; 334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass FieldDecl; 344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass ASTRecordLayout; 354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace CodeGen { 374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass ABIArgInfo; 384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass CodeGenModule; 394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass CGFunctionInfo; 404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace swiftcall { 424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass SwiftAggLowering { 444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CodeGenModule &CGM; 454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar struct StorageEntry { 474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CharUnits Begin; 484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CharUnits End; 494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::Type *Type; 504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar CharUnits getWidth() const { 524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return End - Begin; 534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar }; 554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SmallVector<StorageEntry, 4> Entries; 564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool Finished = false; 574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic: 594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SwiftAggLowering(CodeGenModule &CGM) : CGM(CGM) {} 604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void addOpaqueData(CharUnits begin, CharUnits end) { 624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar addEntry(nullptr, begin, end); 634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void addTypedData(QualType type, CharUnits begin); 664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void addTypedData(const RecordDecl *record, CharUnits begin); 674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void addTypedData(const RecordDecl *record, CharUnits begin, 684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const ASTRecordLayout &layout); 694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void addTypedData(llvm::Type *type, CharUnits begin); 704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void addTypedData(llvm::Type *type, CharUnits begin, CharUnits end); 714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void finish(); 734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// Does this lowering require passing any data? 754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool empty() const { 764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar assert(Finished && "didn't finish lowering before calling empty()"); 774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return Entries.empty(); 784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// According to the target Swift ABI, should a value with this lowering 814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// be passed indirectly? 824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// 834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// Note that this decision is based purely on the data layout of the 844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// value and does not consider whether the type is address-only, 854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// must be passed indirectly to match a function abstraction pattern, or 864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// anything else that is expected to be handled by high-level lowering. 874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// 884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \param asReturnValue - if true, answer whether it should be passed 894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// indirectly as a return value; if false, answer whether it should be 904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// passed indirectly as an argument 914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool shouldPassIndirectly(bool asReturnValue) const; 924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar using EnumerationCallback = 944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::function_ref<void(CharUnits offset, llvm::Type *type)>; 954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// Enumerate the expanded components of this type. 974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// 984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// The component types will always be legal vector, floating-point, 994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// integer, or pointer types. 1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void enumerateComponents(EnumerationCallback callback) const; 1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// Return the types for a coerce-and-expand operation. 1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// 1044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// The first type matches the memory layout of the data that's been 1054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// added to this structure, including explicit [N x i8] arrays for any 1064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// internal padding. 1074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// 1084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// The second type removes any internal padding members and, if only 1094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// one element remains, is simply that element type. 1104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar std::pair<llvm::StructType*, llvm::Type*> getCoerceAndExpandTypes() const; 1114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarprivate: 1134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void addBitFieldData(const FieldDecl *field, CharUnits begin, 1144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar uint64_t bitOffset); 1154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void addLegalTypedData(llvm::Type *type, CharUnits begin, CharUnits end); 1164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void addEntry(llvm::Type *type, CharUnits begin, CharUnits end); 1174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void splitVectorEntry(unsigned index); 1184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}; 1194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// Return the maximum voluntary integer size for the current target. 1214967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarCharUnits getMaximumVoluntaryIntegerSize(CodeGenModule &CGM); 1224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// Return the Swift CC's notion of the natural alignment of a type. 1244967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarCharUnits getNaturalAlignment(CodeGenModule &CGM, llvm::Type *type); 1254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// Is the given integer type "legal" for Swift's perspective on the 1274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// current platform? 1284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool isLegalIntegerType(CodeGenModule &CGM, llvm::IntegerType *type); 1294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// Is the given vector type "legal" for Swift's perspective on the 1314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// current platform? 1324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool isLegalVectorType(CodeGenModule &CGM, CharUnits vectorSize, 1334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::VectorType *vectorTy); 1344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool isLegalVectorType(CodeGenModule &CGM, CharUnits vectorSize, 1354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::Type *eltTy, unsigned numElts); 1364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// Minimally split a legal vector type. 1384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstd::pair<llvm::Type*, unsigned> 1394967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarsplitLegalVectorType(CodeGenModule &CGM, CharUnits vectorSize, 1404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::VectorType *vectorTy); 1414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// Turn a vector type in a sequence of legal component vector types. 1434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// 1444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// The caller may assume that the sum of the data sizes of the resulting 1454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// types will equal the data size of the vector type. 1464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid legalizeVectorType(CodeGenModule &CGM, CharUnits vectorSize, 1474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::VectorType *vectorTy, 1484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::SmallVectorImpl<llvm::Type*> &types); 1494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// Should a C++ record type be passed and returned indirectly? 1514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool shouldPassCXXRecordIndirectly(CodeGenModule &CGM, 1524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const CXXRecordDecl *record); 1534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// Classify the rules for how to return a particular type. 1554967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarABIArgInfo classifyReturnType(CodeGenModule &CGM, CanQualType type); 1564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// Classify the rules for how to pass a particular type. 1584967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarABIArgInfo classifyArgumentType(CodeGenModule &CGM, CanQualType type); 1594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// Compute the ABI information of a swiftcall function. This is a 1614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// private interface for Clang. 1624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid computeABIInfo(CodeGenModule &CGM, CGFunctionInfo &FI); 1634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} // end namespace swiftcall 1654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} // end namespace CodeGen 1664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} // end namespace clang 1674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif 169