//===-- ir/irfunction.h - Codegen state for D functions ---------*- C++ -*-===// // // LDC – the LLVM D compiler // // This file is distributed under the BSD-style LDC license. See the LICENSE // file for details. // //===----------------------------------------------------------------------===// // // Represents the state of a D function/method/... on its way through the // codegen process. // //===----------------------------------------------------------------------===// #ifndef LDC_IR_IRFUNCTION_H #define LDC_IR_IRFUNCTION_H #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DenseMapInfo.h" #include "gen/llvm.h" #include "ir/irfuncty.h" #include class FuncDeclaration; class TypeFunction; class VarDeclaration; // represents a function struct IrFunction { // constructor explicit IrFunction(FuncDeclaration *fd); // annotations void setNeverInline(); void setAlwaysInline(); void setLLVMFunc(llvm::Function *function); /// Returns the associated LLVM function. /// Use getLLVMCallee() for the LLVM function to be used for calls. llvm::Function *getLLVMFunc() const; llvm::CallingConv::ID getCallingConv() const; llvm::FunctionType *getLLVMFuncType() const; llvm::StringRef getLLVMFuncName() const; bool hasLLVMPersonalityFn() const; void setLLVMPersonalityFn(llvm::Constant *personality); /// Returns the associated LLVM function to be used for calls (potentially /// some sort of wrapper, e.g., a JIT wrapper). llvm::Function *getLLVMCallee() const; FuncDeclaration *decl = nullptr; TypeFunction *type = nullptr; llvm::Value *sretArg = nullptr; // sret pointer arg llvm::Value *thisArg = nullptr; // class/struct 'this' arg llvm::Value *nestArg = nullptr; // nested function 'this' arg llvm::StructType *frameType = nullptr; // type of nested context unsigned frameTypeAlignment = 0; // its alignment // number of enclosing functions with variables accessed by nested functions // (-1 if neither this function nor any enclosing ones access variables from // enclosing functions) int depth = -1; bool nestedContextCreated = false; // holds whether nested context is created // TODO: Move to FuncGenState? llvm::Value *_arguments = nullptr; llvm::Value *_argptr = nullptr; llvm::DISubprogram *diSubprogram = nullptr; std::stack diLexicalBlocks; using VariableMap = llvm::DenseMap; // Debug info for all variables VariableMap variableMap; IrFuncTy irFty; /// Stores the FastMath options for this functions. /// These are set e.g. by math related UDA's from ldc.attributes. llvm::FastMathFlags FMF; /// target CPU was overriden by attribute bool targetCpuOverridden = false; /// target features was overriden by attributes bool targetFeaturesOverridden = false; /// This functions was marked for dynamic compilation bool runtimeCompile = false; /// Dynamic compilation thunk, all attempts to call or take address of the /// original function will be redirected to it llvm::Function *rtCompileFunc = nullptr; private: llvm::Function *func = nullptr; }; IrFunction *getIrFunc(FuncDeclaration *decl, bool create = false); bool isIrFuncCreated(FuncDeclaration *decl); /// Returns the associated LLVM function. /// Use DtoCallee() for the LLVM function to be used for calls. llvm::Function *DtoFunction(FuncDeclaration *decl, bool create = false); /// Returns the associated LLVM function to be used for calls (potentially /// some sort of wrapper, e.g., a JIT wrapper). llvm::Function *DtoCallee(FuncDeclaration *decl, bool create = false); #endif