# HG changeset patch # User Tomas Lindquist Olsen # Date 1236179596 -3600 # Node ID 9dca7182aa7590196e1d6aa43be09a24634aec5a # Parent 0477f98d357e6a80a4309f7b7b82ce587c1299bb Added some documentation for the IrFuncTyArg structure, which is key to writing ABI transformations. diff -r 0477f98d357e -r 9dca7182aa75 ir/irfunction.h --- a/ir/irfunction.h Tue Mar 03 21:20:20 2009 +0100 +++ b/ir/irfunction.h Wed Mar 04 16:13:16 2009 +0100 @@ -15,17 +15,37 @@ // both explicit and implicit as well as return values struct IrFuncTyArg : IrBase { + /** This is the original D type as the frontend knows it + * May NOT be rewritten!!! */ Type* type; + + /// This is the final LLVM Type used for the parameter/returnvalue type const llvm::Type* ltype; + + /** These are the final llvm attributes needed + * 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 */ bool byref; + /** Pointer to the ABIRewrite structure needed to rewrite llvm ValueS + * to match the final LLVM Type */ ABIRewrite* rewrite; + /// Helper to check is the 'inreg' attribute is set bool isInReg() const { return (attrs & llvm::Attribute::InReg) != 0; } + /// Helper to check is the 'sret' attribute is set bool isSRet() const { return (attrs & llvm::Attribute::StructRet) != 0; } + /// Helper to check is 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() + */ IrFuncTyArg(Type* t, bool byref, unsigned a = 0); };