Author: evancheng Date: Mon Jan 14 17:28:30 2008 New Revision: 45987 URL: http://llvm.org/viewvc/llvm-project?rev=45987&view=rev Log: Merge -r45906:45908 llvm-gcc-4.2/trunk
Modified: llvm-gcc-4.0/trunk/gcc/config/i386/llvm-i386-target.h llvm-gcc-4.0/trunk/gcc/llvm-abi.h llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp llvm-gcc-4.0/trunk/gcc/llvm-types.cpp Modified: llvm-gcc-4.0/trunk/gcc/config/i386/llvm-i386-target.h URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.0/trunk/gcc/config/i386/llvm-i386-target.h?rev=45987&r1=45986&r2=45987&view=diff ============================================================================== --- llvm-gcc-4.0/trunk/gcc/config/i386/llvm-i386-target.h (original) +++ llvm-gcc-4.0/trunk/gcc/config/i386/llvm-i386-target.h Mon Jan 14 17:28:30 2008 @@ -60,5 +60,8 @@ } \ } +#define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X) \ + (!TARGET_64BIT) + /* APPLE LOCAL end LLVM (ENTIRE FILE!) */ Modified: llvm-gcc-4.0/trunk/gcc/llvm-abi.h URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.0/trunk/gcc/llvm-abi.h?rev=45987&r1=45986&r2=45987&view=diff ============================================================================== --- llvm-gcc-4.0/trunk/gcc/llvm-abi.h (original) +++ llvm-gcc-4.0/trunk/gcc/llvm-abi.h Mon Jan 14 17:28:30 2008 @@ -32,6 +32,7 @@ #include "llvm-internal.h" #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" +#include "llvm/ParameterAttributes.h" #include "llvm/Target/TargetData.h" namespace llvm { @@ -126,7 +127,15 @@ // would often be 64-bits). #ifndef LLVM_SHOULD_PASS_AGGREGATE_IN_INTEGER_REGS #define LLVM_SHOULD_PASS_AGGREGATE_IN_INTEGER_REGS(X) \ - !isSingleElementStructOrArray(type) + !isSingleElementStructOrArray(X) +#endif + +// LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR - Return true if this aggregate +// value should be passed by reference by passing its address with the byval +// attribute bit set. The default is false. +#ifndef LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X) +#define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X) \ + false #endif /// DefaultABI - This class implements the default LLVM ABI where structures are @@ -192,13 +201,17 @@ /// argument and invokes methods on the client that indicate how its pieces /// should be handled. This handles things like decimating structures into /// their fields. - void HandleArgument(tree type) { + void HandleArgument(tree type, uint16_t *Attributes = NULL) { const Type *Ty = ConvertType(type); if (isPassedByInvisibleReference(type)) { // variable size -> by-ref. C.HandleScalarArgument(PointerType::getUnqual(Ty), type); } else if (Ty->isFirstClassType()) { C.HandleScalarArgument(Ty, type); + } else if (LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(type)) { + C.HandleByValArgument(Ty, type); + if (Attributes) + *Attributes |= ParamAttr::ByVal; } else if (LLVM_SHOULD_PASS_AGGREGATE_IN_INTEGER_REGS(type)) { PassInIntegerRegisters(type, Ty); } else if (TREE_CODE(type) == RECORD_TYPE) { Modified: llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp?rev=45987&r1=45986&r2=45987&view=diff ============================================================================== --- llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp (original) +++ llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp Mon Jan 14 17:28:30 2008 @@ -467,6 +467,11 @@ ++AI; } + void HandleByValArgument(const llvm::Type *LLVMTy, tree type) { + // Should not get here. + abort(); + } + void EnterField(unsigned FieldNo, const llvm::Type *StructTy) { NameStack.push_back(NameStack.back()+"."+utostr(FieldNo)); @@ -637,9 +642,12 @@ const char *Name = "unnamed_arg"; if (DECL_NAME(Args)) Name = IDENTIFIER_POINTER(DECL_NAME(Args)); - if (isPassedByInvisibleReference(TREE_TYPE(Args))) { - // If the value is passed by 'invisible reference', the l-value for the - // argument IS the argument itself. + const Type *ArgTy = ConvertType(TREE_TYPE(Args)); + if (isPassedByInvisibleReference(TREE_TYPE(Args)) || + (!ArgTy->isFirstClassType() && + LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(TREE_TYPE(Args)))) { + // If the value is passed by 'invisible reference' or 'byval reference', + // the l-value for the argument IS the argument itself. SET_DECL_LLVM(Args, AI); AI->setName(Name); ++AI; @@ -647,7 +655,6 @@ // Otherwise, we create an alloca to hold the argument value and provide // an l-value. On entry to the function, we copy formal argument values // into the alloca. - const Type *ArgTy = ConvertType(TREE_TYPE(Args)); Value *Tmp = CreateTemporary(ArgTy); Tmp->setName(std::string(Name)+"_addr"); SET_DECL_LLVM(Args, Tmp); @@ -2841,6 +2848,16 @@ CallOperands.push_back(Builder.CreateLoad(Loc, "tmp")); } + /// HandleByValArgument - This callback is invoked if the aggregate function + /// argument is passed by value. It is lowered to a parameter passed by + /// reference with an additional parameter attribute "ByVal". + void HandleByValArgument(const llvm::Type *LLVMTy, tree type) { + assert(!LocStack.empty()); + Value *Loc = LocStack.back(); + assert(PointerType::getUnqual(LLVMTy) == Loc->getType()); + CallOperands.push_back(Loc); + } + void EnterField(unsigned FieldNo, const llvm::Type *StructTy) { Constant *Zero = Constant::getNullValue(Type::Int32Ty); Constant *FIdx = ConstantInt::get(Type::Int32Ty, FieldNo); @@ -2923,7 +2940,10 @@ LValue LV = EmitLV(TREE_VALUE(arg)); assert(!LV.isBitfield() && "Bitfields are first-class types!"); Client.setLocation(LV.Ptr); - ABIConverter.HandleArgument(TREE_TYPE(TREE_VALUE(arg))); + uint16_t Attributes = ParamAttr::None; + ABIConverter.HandleArgument(TREE_TYPE(TREE_VALUE(arg)), &Attributes); + if (Attributes != ParamAttr::None) + PAL= ParamAttrsList::includeAttrs(PAL, CallOperands.size(), Attributes); } } Modified: llvm-gcc-4.0/trunk/gcc/llvm-types.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.0/trunk/gcc/llvm-types.cpp?rev=45987&r1=45986&r2=45987&view=diff ============================================================================== --- llvm-gcc-4.0/trunk/gcc/llvm-types.cpp (original) +++ llvm-gcc-4.0/trunk/gcc/llvm-types.cpp Mon Jan 14 17:28:30 2008 @@ -926,6 +926,13 @@ } ArgTypes.push_back(LLVMTy); } + + /// HandleByValArgument - This callback is invoked if the aggregate function + /// argument is passed by value. It is lowered to a parameter passed by + /// reference with an additional parameter attribute "ByVal". + void HandleByValArgument(const llvm::Type *LLVMTy, tree type) { + HandleScalarArgument(PointerType::getUnqual(LLVMTy), type); + } }; } @@ -984,11 +991,12 @@ for (; Args && TREE_TYPE(Args) != void_type_node; Args = TREE_CHAIN(Args)) { tree ArgTy = TREE_TYPE(Args); - ABIConverter.HandleArgument(ArgTy); // Determine if there are any attributes for this param. uint16_t Attributes = ParamAttr::None; + ABIConverter.HandleArgument(ArgTy, &Attributes); + // Compute zext/sext attributes. Attributes |= HandleArgumentExtension(ArgTy); @@ -1094,11 +1102,11 @@ break; } - ABIConverter.HandleArgument(ArgTy); - // Determine if there are any attributes for this param. uint16_t Attributes = ParamAttr::None; + ABIConverter.HandleArgument(ArgTy, &Attributes); + // Compute zext/sext attributes. Attributes |= HandleArgumentExtension(ArgTy); _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits