[llvm-commits] [llvm] r37940 - in /llvm/trunk: include/llvm/CodeGen/SelectionDAGNodes.h include/llvm/ParameterAttributes.h lib/AsmParser/Lexer.l lib/AsmParser/llvmAsmParser.y lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp lib/Target/TargetCallingConv.td lib/Target/X86/X86CallingConv.td lib/VMCore/Function.cpp lib/VMCore/Verifier.cpp utils/TableGen/CallingConvEmitter.cpp

Reid Spencer rspencer at reidspencer.com
Fri Jul 6 23:58:53 PDT 2007


Hi Rafael,

A few comments for you ...

On Fri, 2007-07-06 at 10:57 +0000, Rafael Espindola wrote:
> Author: rafael
> Date: Fri Jul  6 05:57:03 2007
> New Revision: 37940
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=37940&view=rev
> Log:
> Add the byval attribute
> 
> Modified:
>     llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h
>     llvm/trunk/include/llvm/ParameterAttributes.h
>     llvm/trunk/lib/AsmParser/Lexer.l
>     llvm/trunk/lib/AsmParser/llvmAsmParser.y
>     llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
>     llvm/trunk/lib/Target/TargetCallingConv.td
>     llvm/trunk/lib/Target/X86/X86CallingConv.td
>     llvm/trunk/lib/VMCore/Function.cpp
>     llvm/trunk/lib/VMCore/Verifier.cpp
>     llvm/trunk/utils/TableGen/CallingConvEmitter.cpp
> 
> Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h?rev=37940&r1=37939&r2=37940&view=diff
> 
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h Fri Jul  6 05:57:03 2007
> @@ -63,6 +63,8 @@
>      InRegOffs         = 2,
>      StructReturn      = 1<<3,  ///< Hidden struct-return pointer
>      StructReturnOffs  = 3,
> +    ByVal             = 1<<4,  ///< Struct passed by value

I would prefer this be named StructByVal, to be clear

> +    ByValOffs         = 4,

-> StructByValOffs

>      OrigAlignment     = 0x1F<<27,
>      OrigAlignmentOffs = 27
>    };
> 
> Modified: llvm/trunk/include/llvm/ParameterAttributes.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ParameterAttributes.h?rev=37940&r1=37939&r2=37940&view=diff
> 
> ==============================================================================
> --- llvm/trunk/include/llvm/ParameterAttributes.h (original)
> +++ llvm/trunk/include/llvm/ParameterAttributes.h Fri Jul  6 05:57:03 2007
> @@ -36,7 +36,8 @@
>    InReg      = 1 << 3, ///< force argument to be passed in register
>    StructRet  = 1 << 4, ///< hidden pointer to structure to return
>    NoUnwind   = 1 << 5, ///< Function doesn't unwind stack
> -  NoAlias    = 1 << 6  ///< Considered to not alias after call.
> +  NoAlias    = 1 << 6, ///< Considered to not alias after call.
> +  ByVal      = 1 << 7  ///< Pass structure by value

-> StructByVal

>  };
>  
>  }
> 
> Modified: llvm/trunk/lib/AsmParser/Lexer.l
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/Lexer.l?rev=37940&r1=37939&r2=37940&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/AsmParser/Lexer.l (original)
> +++ llvm/trunk/lib/AsmParser/Lexer.l Fri Jul  6 05:57:03 2007
> @@ -230,6 +230,7 @@
>  nounwind        { return NOUNWIND; }
>  noreturn        { return NORETURN; }
>  noalias         { return NOALIAS; }
> +byval           { return BYVAL; }

I'm not sure if this keyword should be "structbyval" (seems longish) and
since the type will be right next to it, seems redundant at the language
level (but I still want StructByVal in the llvm code :) )

>  
>  void            { RET_TY(Type::VoidTy,  VOID);  }
>  float           { RET_TY(Type::FloatTy, FLOAT); }
> 
> Modified: llvm/trunk/lib/AsmParser/llvmAsmParser.y
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/llvmAsmParser.y?rev=37940&r1=37939&r2=37940&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/AsmParser/llvmAsmParser.y (original)
> +++ llvm/trunk/lib/AsmParser/llvmAsmParser.y Fri Jul  6 05:57:03 2007
> @@ -1101,7 +1101,7 @@
>  %token <OtherOpVal> EXTRACTELEMENT INSERTELEMENT SHUFFLEVECTOR
>  
>  // Function Attributes
> -%token NORETURN INREG SRET NOUNWIND NOALIAS
> +%token NORETURN INREG SRET NOUNWIND NOALIAS BYVAL
>  
>  // Visibility Styles
>  %token DEFAULT HIDDEN PROTECTED
> @@ -1229,6 +1229,7 @@
>                | INREG   { $$ = ParamAttr::InReg;     }
>                | SRET    { $$ = ParamAttr::StructRet; }
>                | NOALIAS { $$ = ParamAttr::NoAlias;   }
> +              | BYVAL   { $$ = ParamAttr::ByVal;   }
>                ;
>  
>  OptParamAttrs : /* empty */  { $$ = ParamAttr::None; }
> 
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=37940&r1=37939&r2=37940&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri Jul  6 05:57:03 2007
> @@ -3789,6 +3789,8 @@
>        Flags |= ISD::ParamFlags::InReg;
>      if (Attrs && Attrs->paramHasAttr(j, ParamAttr::StructRet))
>        Flags |= ISD::ParamFlags::StructReturn;
> +    if (Attrs && Attrs->paramHasAttr(j, ParamAttr::ByVal))
> +      Flags |= ISD::ParamFlags::ByVal;
>      Flags |= (OriginalAlignment << ISD::ParamFlags::OrigAlignmentOffs);
>      
>      switch (getTypeAction(VT)) {
> 
> Modified: llvm/trunk/lib/Target/TargetCallingConv.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetCallingConv.td?rev=37940&r1=37939&r2=37940&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/TargetCallingConv.td (original)
> +++ llvm/trunk/lib/Target/TargetCallingConv.td Fri Jul  6 05:57:03 2007
> @@ -32,6 +32,11 @@
>    string Predicate = predicate;
>  }
>  
> +/// CCIfStruct - If the current argument is a struct, apply
> +/// Action A.
> +class CCIfStruct<CCAction A> : CCIf<"ArgFlags & ISD::ParamFlags::ByVal", A> {
> +}
> +
>  /// CCIfCC - Match of the current calling convention is 'CC'.
>  class CCIfCC<string CC, CCAction A>
>    : CCIf<!strconcat("State.getCallingConv() == ", CC), A> {}
> @@ -57,6 +62,12 @@
>    int Align = align;
>  }
>  
> +/// 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.
> +class CCStructAssign<list<Register> regList> : CCAction {
> +  list<Register> RegList = regList;
> +}
>  
>  /// CCPromoteToType - If applied, this promotes the specified current value to
>  /// the specified type.
> @@ -75,4 +86,3 @@
>  class CallingConv<list<CCAction> actions> {
>    list<CCAction> Actions = actions;
>  }
> -
> 
> Modified: llvm/trunk/lib/Target/X86/X86CallingConv.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86CallingConv.td?rev=37940&r1=37939&r2=37940&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86CallingConv.td (original)
> +++ llvm/trunk/lib/Target/X86/X86CallingConv.td Fri Jul  6 05:57:03 2007
> @@ -94,6 +94,8 @@
>    // Promote i8/i16 arguments to i32.
>    CCIfType<[i8, i16], CCPromoteToType<i32>>,
>    
> +  CCIfStruct<CCStructAssign<[RDI, RSI, RDX, RCX, R8, R9 ]>>,
> +
>    // The first 6 integer arguments are passed in integer registers.
>    CCIfType<[i32], CCAssignToReg<[EDI, ESI, EDX, ECX, R8D, R9D]>>,
>    CCIfType<[i64], CCAssignToReg<[RDI, RSI, RDX, RCX, R8 , R9 ]>>,
> @@ -168,5 +170,3 @@
>    // Otherwise, same as everything else.
>    CCDelegateTo<CC_X86_32_Common>
>  ]>;
> -
> -
> 
> Modified: llvm/trunk/lib/VMCore/Function.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Function.cpp?rev=37940&r1=37939&r2=37940&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/VMCore/Function.cpp (original)
> +++ llvm/trunk/lib/VMCore/Function.cpp Fri Jul  6 05:57:03 2007
> @@ -103,6 +103,8 @@
>      Result += "noalias ";
>    if (Attrs & ParamAttr::StructRet)
>      Result += "sret ";  
> +  if (Attrs & ParamAttr::ByVal)
> +    Result += "byval ";
>    return Result;
>  }
>  
> 
> Modified: llvm/trunk/lib/VMCore/Verifier.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Verifier.cpp?rev=37940&r1=37939&r2=37940&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/VMCore/Verifier.cpp (original)
> +++ llvm/trunk/lib/VMCore/Verifier.cpp Fri Jul  6 05:57:03 2007
> @@ -370,6 +370,9 @@
>        if (Attrs->paramHasAttr(Idx, ParamAttr::NoAlias))
>          Assert1(isa<PointerType>(FT->getParamType(Idx-1)),
>                  "Attribute NoAlias should only apply to Pointer type!", &F);
> +      if (Attrs->paramHasAttr(Idx, ParamAttr::ByVal))
> +        Assert1(isa<PointerType>(FT->getParamType(Idx-1)),
> +                "Attribute ByVal should only apply to Pointer type!", &F);

This is insufficient. ByVal (StructByVal) is not permitted on index 0
(i.e. it can't apply to the function as a whole, which is what index 0
is for (e.g. noraise).

Reid.

>      }
>    }
>  
> 
> Modified: llvm/trunk/utils/TableGen/CallingConvEmitter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CallingConvEmitter.cpp?rev=37940&r1=37939&r2=37940&view=diff
> 
> ==============================================================================
> --- llvm/trunk/utils/TableGen/CallingConvEmitter.cpp (original)
> +++ llvm/trunk/utils/TableGen/CallingConvEmitter.cpp Fri Jul  6 05:57:03 2007
> @@ -129,10 +129,11 @@
>          << IndentStr << IndentStr << "LocInfo = CCValAssign::ZExt;\n"
>          << IndentStr << "else\n"
>          << IndentStr << IndentStr << "LocInfo = CCValAssign::AExt;\n";
> +    } else if (Action->isSubClassOf("CCStructAssign")) {
> +      O << "assert(0 && \"Not Implemented\");\n";
>      } else {
>        Action->dump();
>        throw "Unknown CCAction!";
>      }
>    }
>  }
> -
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list