On Nov 13, 2007, at 3:02 PM, Duncan Sands wrote:

> How about this?

Doesn't an empty array or struct have size 0?

Personally I don't think this is an improvement, but I have no  
particular objection to it,
assuming the above is not really a problem.  I'm ready to move on.

> Index: llvm/lib/Target/TargetCallingConv.td
> ===================================================================
> --- llvm.orig/lib/Target/TargetCallingConv.td 2007-11-13  
> 20:06:06.000000000 +0100
> +++ llvm/lib/Target/TargetCallingConv.td      2007-11-13  
> 20:08:24.000000000 +0100
> @@ -60,19 +60,14 @@
>  }
>
>  /// CCAssignToStack - This action always matches: it assigns the  
> value to a
> -/// stack slot of the specified size and alignment on the stack.
> +/// stack slot of the specified size and alignment on the stack.   
> If size is
> +/// zero then the ABI size is used; if align is zero then the ABI  
> alignment
> +/// is used - these may depend on the target or subtarget.
>  class CCAssignToStack<int size, int align> : CCAction {
>    int Size = size;
>    int Align = align;
>  }
>
> -/// CCAssignToStackABISizeAlign - This action always matches: it  
> assigns
> -/// the value to a stack slot of the ABISize and ABIAlignment for  
> the type,
> -/// which may depend on the target or subtarget.
> -/// "ignored" is here because an empty arg list does not work.
> -class CCAssignToStackABISizeAlign<int ignored> : CCAction {
> -}
> -
>  /// CCStructAssign - This action always matches: it will use the C  
> ABI and
>  /// the register availability to decided whether to assign to a  
> set of
>  /// registers or to a stack slot.
> Index: llvm/lib/Target/X86/X86CallingConv.td
> ===================================================================
> --- llvm.orig/lib/Target/X86/X86CallingConv.td        2007-11-13  
> 20:08:33.000000000 +0100
> +++ llvm/lib/Target/X86/X86CallingConv.td     2007-11-13  
> 20:30:04.000000000 +0100
> @@ -120,7 +120,7 @@
>
>    // Long doubles get stack slots whose size and alignment depends  
> on the
>    // subtarget.
> -  CCIfType<[f80], CCAssignToStackABISizeAlign<0>>,
> +  CCIfType<[f80], CCAssignToStack<0, 0>>,
>
>    // Vectors get 16-byte stack slots that are 16-byte aligned.
>    CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],  
> CCAssignToStack<16, 16>>,
> @@ -181,7 +181,7 @@
>
>    // Long doubles get slots whose size and alignment depends on the
>    // subtarget.
> -  CCIfType<[f80], CCAssignToStackABISizeAlign<0>>,
> +  CCIfType<[f80], CCAssignToStack<0, 0>>,
>
>    // The first 4 vector arguments are passed in XMM registers.
>    CCIfType<[v16i8, v8i16, v4i32, v2i64, v4f32, v2f64],
> Index: llvm/utils/TableGen/CallingConvEmitter.cpp
> ===================================================================
> --- llvm.orig/utils/TableGen/CallingConvEmitter.cpp   2007-11-13  
> 20:09:26.000000000 +0100
> +++ llvm/utils/TableGen/CallingConvEmitter.cpp        2007-11-13  
> 20:26:27.000000000 +0100
> @@ -114,19 +114,21 @@
>      } else if (Action->isSubClassOf("CCAssignToStack")) {
>        int Size = Action->getValueAsInt("Size");
>        int Align = Action->getValueAsInt("Align");
> -
> +
>        O << IndentStr << "unsigned Offset" << ++Counter
> -        << " = State.AllocateStack(" << Size << ", " << Align <<  
> ");\n";
> -      O << IndentStr << "State.addLoc(CCValAssign::getMem(ValNo,  
> ValVT, Offset"
> -        << Counter << ", LocVT, LocInfo));\n";
> -      O << IndentStr << "return false;\n";
> -    } else if (Action->isSubClassOf("CCAssignToStackABISizeAlign")) {
> -      O << IndentStr << "unsigned Offset" << ++Counter
> -        << " = State.AllocateStack(State.getTarget().getTargetData()"
> -           "->getABITypeSize(MVT::getTypeForValueType(LocVT)),\n";
> -      O << IndentStr << "       State.getTarget().getTargetData()"
> -           "->getABITypeAlignment(MVT::getTypeForValueType 
> (LocVT)));\n";
> -      O << IndentStr << "State.addLoc(CCValAssign::getMem(ValNo,  
> ValVT, Offset"
> +        << " = State.AllocateStack(";
> +      if (Size)
> +        O << Size << ", ";
> +      else
> +        O << "\n" << IndentStr << "  State.getTarget 
> ().getTargetData()"
> +          "->getABITypeSize(MVT::getTypeForValueType(LocVT)), ";
> +      if (Align)
> +        O << Align;
> +      else
> +        O << "\n" << IndentStr << "  State.getTarget 
> ().getTargetData()"
> +          "->getABITypeAlignment(MVT::getTypeForValueType(LocVT))";
> +      O << ");\n" << IndentStr
> +        << "State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset"
>          << Counter << ", LocVT, LocInfo));\n";
>        O << IndentStr << "return false;\n";
>      } else if (Action->isSubClassOf("CCPromoteToType")) {

_______________________________________________
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

Reply via email to