//===--- GenFunc.h - Swift IR generation for functions ----------*- C++ -*-===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See http://swift.org/LICENSE.txt for license information // See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// // // This file provides the private interface to the function and // function-type emission code. // //===----------------------------------------------------------------------===// #ifndef SWIFT_IRGEN_GENFUNC_H #define SWIFT_IRGEN_GENFUNC_H #include "CallingConvention.h" namespace clang { template class CanQual; class Type; } namespace swift { class ApplyInst; class FuncDecl; enum class ResilienceExpansion : unsigned; class SILParameterInfo; class Substitution; class SILType; namespace irgen { class Address; class Alignment; class Explosion; class ForeignFunctionInfo; class IRGenFunction; class LoadableTypeInfo; class TypeInfo; /// Should the given self parameter be given the special treatment /// for self parameters? bool isSelfContextParameter(SILParameterInfo parameter); /// Emit a partial application thunk for a function pointer applied to a /// partial set of argument values. void emitFunctionPartialApplication(IRGenFunction &IGF, llvm::Value *fnPtr, llvm::Value *fnContext, Explosion &args, ArrayRef argTypes, ArrayRef subs, CanSILFunctionType origType, CanSILFunctionType substType, CanSILFunctionType outType, Explosion &out); /// Add function attributes to an attribute set for a byval argument. void addByvalArgumentAttributes(IRGenModule &IGM, llvm::AttributeSet &attrs, unsigned argIndex, Alignment align); /// Add signext or zeroext attribute set for an argument that needs /// extending. void addExtendAttribute(IRGenModule &IGM, llvm::AttributeSet &attrs, unsigned index, bool signExtend); /// Emit a call to a builtin function. void emitBuiltinCall(IRGenFunction &IGF, Identifier FnId, SILType resultType, Explosion &args, Explosion &result, ArrayRef substitutions); /// Project the capture address from on-stack block storage. Address projectBlockStorageCapture(IRGenFunction &IGF, Address storageAddr, CanSILBlockStorageType storageTy); /// Emit the block header into a block storage slot. void emitBlockHeader(IRGenFunction &IGF, Address storage, CanSILBlockStorageType blockTy, llvm::Function *invokeFunction, CanSILFunctionType invokeTy, ForeignFunctionInfo foreignInfo); /// Can a series of values be simply pairwise coerced to (or from) an /// explosion schema, or do they need to traffic through memory? bool canCoerceToSchema(IRGenModule &IGM, ArrayRef types, const ExplosionSchema &schema); void emitClangExpandedParameter(IRGenFunction &IGF, Explosion &in, Explosion &out, clang::CanQual clangType, SILType swiftType, const LoadableTypeInfo &swiftTI); /// Allocate a stack buffer of the appropriate size to bitwise-coerce a value /// between two LLVM types. std::pair allocateForCoercion(IRGenFunction &IGF, llvm::Type *fromTy, llvm::Type *toTy, const llvm::Twine &basename); } // end namespace irgen } // end namespace swift #endif