[llvm-commits] [llvm-gcc-4.0] r45987 - in /llvm-gcc-4.0/trunk/gcc: config/i386/llvm-i386-target.h llvm-abi.h llvm-convert.cpp llvm-types.cpp

Evan Cheng evan.cheng at apple.com
Mon Jan 14 15:28:31 PST 2008


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);
 





More information about the llvm-commits mailing list