[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