1*67e74705SXin Li //===----- ABIInfo.h - ABI information access & encapsulation ---*- C++ -*-===// 2*67e74705SXin Li // 3*67e74705SXin Li // The LLVM Compiler Infrastructure 4*67e74705SXin Li // 5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source 6*67e74705SXin Li // License. See LICENSE.TXT for details. 7*67e74705SXin Li // 8*67e74705SXin Li //===----------------------------------------------------------------------===// 9*67e74705SXin Li 10*67e74705SXin Li #ifndef LLVM_CLANG_LIB_CODEGEN_ABIINFO_H 11*67e74705SXin Li #define LLVM_CLANG_LIB_CODEGEN_ABIINFO_H 12*67e74705SXin Li 13*67e74705SXin Li #include "clang/AST/Type.h" 14*67e74705SXin Li #include "llvm/IR/CallingConv.h" 15*67e74705SXin Li #include "llvm/IR/Type.h" 16*67e74705SXin Li 17*67e74705SXin Li namespace llvm { 18*67e74705SXin Li class Value; 19*67e74705SXin Li class LLVMContext; 20*67e74705SXin Li class DataLayout; 21*67e74705SXin Li class Type; 22*67e74705SXin Li } 23*67e74705SXin Li 24*67e74705SXin Li namespace clang { 25*67e74705SXin Li class ASTContext; 26*67e74705SXin Li class TargetInfo; 27*67e74705SXin Li 28*67e74705SXin Li namespace CodeGen { 29*67e74705SXin Li class ABIArgInfo; 30*67e74705SXin Li class Address; 31*67e74705SXin Li class CGCXXABI; 32*67e74705SXin Li class CGFunctionInfo; 33*67e74705SXin Li class CodeGenFunction; 34*67e74705SXin Li class CodeGenTypes; 35*67e74705SXin Li class SwiftABIInfo; 36*67e74705SXin Li 37*67e74705SXin Li namespace swiftcall { 38*67e74705SXin Li class SwiftAggLowering; 39*67e74705SXin Li } 40*67e74705SXin Li 41*67e74705SXin Li // FIXME: All of this stuff should be part of the target interface 42*67e74705SXin Li // somehow. It is currently here because it is not clear how to factor 43*67e74705SXin Li // the targets to support this, since the Targets currently live in a 44*67e74705SXin Li // layer below types n'stuff. 45*67e74705SXin Li 46*67e74705SXin Li 47*67e74705SXin Li /// ABIInfo - Target specific hooks for defining how a type should be 48*67e74705SXin Li /// passed or returned from functions. 49*67e74705SXin Li class ABIInfo { 50*67e74705SXin Li public: 51*67e74705SXin Li CodeGen::CodeGenTypes &CGT; 52*67e74705SXin Li protected: 53*67e74705SXin Li llvm::CallingConv::ID RuntimeCC; 54*67e74705SXin Li llvm::CallingConv::ID BuiltinCC; 55*67e74705SXin Li public: ABIInfo(CodeGen::CodeGenTypes & cgt)56*67e74705SXin Li ABIInfo(CodeGen::CodeGenTypes &cgt) 57*67e74705SXin Li : CGT(cgt), 58*67e74705SXin Li RuntimeCC(llvm::CallingConv::C), 59*67e74705SXin Li BuiltinCC(llvm::CallingConv::C) {} 60*67e74705SXin Li 61*67e74705SXin Li virtual ~ABIInfo(); 62*67e74705SXin Li supportsSwift()63*67e74705SXin Li virtual bool supportsSwift() const { return false; } 64*67e74705SXin Li 65*67e74705SXin Li CodeGen::CGCXXABI &getCXXABI() const; 66*67e74705SXin Li ASTContext &getContext() const; 67*67e74705SXin Li llvm::LLVMContext &getVMContext() const; 68*67e74705SXin Li const llvm::DataLayout &getDataLayout() const; 69*67e74705SXin Li const TargetInfo &getTarget() const; 70*67e74705SXin Li 71*67e74705SXin Li /// Return the calling convention to use for system runtime 72*67e74705SXin Li /// functions. getRuntimeCC()73*67e74705SXin Li llvm::CallingConv::ID getRuntimeCC() const { 74*67e74705SXin Li return RuntimeCC; 75*67e74705SXin Li } 76*67e74705SXin Li 77*67e74705SXin Li /// Return the calling convention to use for compiler builtins getBuiltinCC()78*67e74705SXin Li llvm::CallingConv::ID getBuiltinCC() const { 79*67e74705SXin Li return BuiltinCC; 80*67e74705SXin Li } 81*67e74705SXin Li 82*67e74705SXin Li virtual void computeInfo(CodeGen::CGFunctionInfo &FI) const = 0; 83*67e74705SXin Li 84*67e74705SXin Li /// EmitVAArg - Emit the target dependent code to load a value of 85*67e74705SXin Li /// \arg Ty from the va_list pointed to by \arg VAListAddr. 86*67e74705SXin Li 87*67e74705SXin Li // FIXME: This is a gaping layering violation if we wanted to drop 88*67e74705SXin Li // the ABI information any lower than CodeGen. Of course, for 89*67e74705SXin Li // VAArg handling it has to be at this level; there is no way to 90*67e74705SXin Li // abstract this out. 91*67e74705SXin Li virtual CodeGen::Address EmitVAArg(CodeGen::CodeGenFunction &CGF, 92*67e74705SXin Li CodeGen::Address VAListAddr, 93*67e74705SXin Li QualType Ty) const = 0; 94*67e74705SXin Li 95*67e74705SXin Li bool isAndroid() const; 96*67e74705SXin Li 97*67e74705SXin Li /// Emit the target dependent code to load a value of 98*67e74705SXin Li /// \arg Ty from the \c __builtin_ms_va_list pointed to by \arg VAListAddr. 99*67e74705SXin Li virtual CodeGen::Address EmitMSVAArg(CodeGen::CodeGenFunction &CGF, 100*67e74705SXin Li CodeGen::Address VAListAddr, 101*67e74705SXin Li QualType Ty) const; 102*67e74705SXin Li 103*67e74705SXin Li virtual bool isHomogeneousAggregateBaseType(QualType Ty) const; 104*67e74705SXin Li 105*67e74705SXin Li virtual bool isHomogeneousAggregateSmallEnough(const Type *Base, 106*67e74705SXin Li uint64_t Members) const; 107*67e74705SXin Li 108*67e74705SXin Li virtual bool shouldSignExtUnsignedType(QualType Ty) const; 109*67e74705SXin Li 110*67e74705SXin Li bool isHomogeneousAggregate(QualType Ty, const Type *&Base, 111*67e74705SXin Li uint64_t &Members) const; 112*67e74705SXin Li 113*67e74705SXin Li /// A convenience method to return an indirect ABIArgInfo with an 114*67e74705SXin Li /// expected alignment equal to the ABI alignment of the given type. 115*67e74705SXin Li CodeGen::ABIArgInfo 116*67e74705SXin Li getNaturalAlignIndirect(QualType Ty, bool ByRef = true, 117*67e74705SXin Li bool Realign = false, 118*67e74705SXin Li llvm::Type *Padding = nullptr) const; 119*67e74705SXin Li 120*67e74705SXin Li CodeGen::ABIArgInfo 121*67e74705SXin Li getNaturalAlignIndirectInReg(QualType Ty, bool Realign = false) const; 122*67e74705SXin Li 123*67e74705SXin Li 124*67e74705SXin Li }; 125*67e74705SXin Li 126*67e74705SXin Li /// A refining implementation of ABIInfo for targets that support swiftcall. 127*67e74705SXin Li /// 128*67e74705SXin Li /// If we find ourselves wanting multiple such refinements, they'll probably 129*67e74705SXin Li /// be independent refinements, and we should probably find another way 130*67e74705SXin Li /// to do it than simple inheritance. 131*67e74705SXin Li class SwiftABIInfo : public ABIInfo { 132*67e74705SXin Li public: SwiftABIInfo(CodeGen::CodeGenTypes & cgt)133*67e74705SXin Li SwiftABIInfo(CodeGen::CodeGenTypes &cgt) : ABIInfo(cgt) {} 134*67e74705SXin Li supportsSwift()135*67e74705SXin Li bool supportsSwift() const final override { return true; } 136*67e74705SXin Li 137*67e74705SXin Li virtual bool shouldPassIndirectlyForSwift(CharUnits totalSize, 138*67e74705SXin Li ArrayRef<llvm::Type*> types, 139*67e74705SXin Li bool asReturnValue) const = 0; 140*67e74705SXin Li 141*67e74705SXin Li virtual bool isLegalVectorTypeForSwift(CharUnits totalSize, 142*67e74705SXin Li llvm::Type *eltTy, 143*67e74705SXin Li unsigned elts) const; 144*67e74705SXin Li classof(const ABIInfo * info)145*67e74705SXin Li static bool classof(const ABIInfo *info) { 146*67e74705SXin Li return info->supportsSwift(); 147*67e74705SXin Li } 148*67e74705SXin Li }; 149*67e74705SXin Li 150*67e74705SXin Li } // end namespace CodeGen 151*67e74705SXin Li } // end namespace clang 152*67e74705SXin Li 153*67e74705SXin Li #endif 154