mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-04-17 17:29:02 +02:00
Updated ABI handling to be more flexible with regard to reusing lvalues and allocating fewer temporaries.
This commit is contained in:
@@ -19,33 +19,34 @@ struct IrFuncTyArg : IrBase
|
||||
* May NOT be rewritten!!! */
|
||||
Type* type;
|
||||
|
||||
/// This is the final LLVM Type used for the parameter/returnvalue type
|
||||
/// This is the final LLVM Type used for the parameter/return value type
|
||||
const llvm::Type* ltype;
|
||||
|
||||
/** These are the final llvm attributes needed
|
||||
* must be valid for the LLVM Type and byref setting */
|
||||
/** These are the final LLVM attributes used for the function.
|
||||
* Must be valid for the LLVM Type and byref setting */
|
||||
unsigned attrs;
|
||||
|
||||
/** true if the argument final argument is a reference argument
|
||||
* must be true when the D Type is a value type, but the final
|
||||
* LLVM Type is a reference type */
|
||||
/** 'true' if the final LLVM argument is a LLVM reference type.
|
||||
* Must be true when the D Type is a value type, but the final
|
||||
* LLVM Type is a reference type! */
|
||||
bool byref;
|
||||
|
||||
/** Pointer to the ABIRewrite structure needed to rewrite llvm ValueS
|
||||
* to match the final LLVM Type */
|
||||
/** Pointer to the ABIRewrite structure needed to rewrite LLVM ValueS
|
||||
* to match the final LLVM Type when passing arguments and getting
|
||||
* return values */
|
||||
ABIRewrite* rewrite;
|
||||
|
||||
/// Helper to check is the 'inreg' attribute is set
|
||||
/// Helper to check if the 'inreg' attribute is set
|
||||
bool isInReg() const { return (attrs & llvm::Attribute::InReg) != 0; }
|
||||
/// Helper to check is the 'sret' attribute is set
|
||||
/// Helper to check if the 'sret' attribute is set
|
||||
bool isSRet() const { return (attrs & llvm::Attribute::StructRet) != 0; }
|
||||
/// Helper to check is the 'byval' attribute is set
|
||||
/// Helper to check if the 'byval' attribute is set
|
||||
bool isByVal() const { return (attrs & llvm::Attribute::ByVal) != 0; }
|
||||
|
||||
/** Constructor
|
||||
* @param t D type of argument/returnvalue as known by the frontend
|
||||
* @param byref Initial value for the 'byref' field. If true the initial LLVM Type will be of type->pointerTo()
|
||||
*/
|
||||
/** @param t D type of argument/return value as known by the frontend
|
||||
* @param byref Initial value for the 'byref' field. If true the initial
|
||||
* LLVM Type will be of DtoType(type->pointerTo()), instead
|
||||
* of just DtoType(type) */
|
||||
IrFuncTyArg(Type* t, bool byref, unsigned a = 0);
|
||||
};
|
||||
|
||||
@@ -82,11 +83,12 @@ struct IrFuncTy : IrBase
|
||||
reverseParams(false)
|
||||
{}
|
||||
|
||||
llvm::Value* putRet(Type* dty, llvm::Value* val);
|
||||
llvm::Value* getRet(Type* dty, llvm::Value* val);
|
||||
llvm::Value* putRet(Type* dty, DValue* dval);
|
||||
llvm::Value* getRet(Type* dty, DValue* dval);
|
||||
|
||||
llvm::Value* getParam(Type* dty, int idx, llvm::Value* val);
|
||||
llvm::Value* putParam(Type* dty, int idx, llvm::Value* val);
|
||||
llvm::Value* putParam(Type* dty, int idx, DValue* dval);
|
||||
llvm::Value* getParam(Type* dty, int idx, DValue* dval);
|
||||
void getParam(Type* dty, int idx, DValue* dval, llvm::Value* lval);
|
||||
};
|
||||
|
||||
// represents a function
|
||||
|
||||
Reference in New Issue
Block a user