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