Author: baldrick Date: Tue Sep 11 09:10:23 2007 New Revision: 41841 URL: http://llvm.org/viewvc/llvm-project?rev=41841&view=rev Log: Fold the adjust_trampoline intrinsic into init_trampoline. There is now only one trampoline intrinsic.
Modified: llvm/trunk/docs/LangRef.html llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h llvm/trunk/include/llvm/Intrinsics.td llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp llvm/trunk/lib/Target/ARM/ARMISelLowering.h llvm/trunk/lib/Target/Alpha/AlphaISelLowering.cpp llvm/trunk/lib/Target/IA64/IA64ISelLowering.cpp llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp llvm/trunk/lib/Target/Sparc/SparcISelDAGToDAG.cpp llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Modified: llvm/trunk/docs/LangRef.html URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.html?rev=41841&r1=41840&r2=41841&view=diff ============================================================================== --- llvm/trunk/docs/LangRef.html (original) +++ llvm/trunk/docs/LangRef.html Tue Sep 11 09:10:23 2007 @@ -200,10 +200,9 @@ <li><a href="#int_memory_barrier">'<tt>llvm.memory.barrier</tt>' Intrinsic</a></li> </ol> </li> - <li><a href="#int_trampoline">Trampoline Intrinsics</a> + <li><a href="#int_trampoline">Trampoline Intrinsic</a> <ol> <li><a href="#int_it">'<tt>llvm.init.trampoline</tt>' Intrinsic</a></li> - <li><a href="#int_at">'<tt>llvm.adjust.trampoline</tt>' Intrinsic</a></li> </ol> </li> <li><a href="#int_general">General intrinsics</a> @@ -5149,12 +5148,12 @@ <!-- ======================================================================= --> <div class="doc_subsection"> - <a name="int_trampoline">Trampoline Intrinsics</a> + <a name="int_trampoline">Trampoline Intrinsic</a> </div> <div class="doc_text"> <p> - These intrinsics make it possible to excise one parameter, marked with + This intrinsic makes it possible to excise one parameter, marked with the <tt>nest</tt> attribute, from a function. The result is a callable function pointer lacking the nest parameter - the caller does not need to provide a value for it. Instead, the value to use is stored in @@ -5168,11 +5167,10 @@ <tt>i32 f(i8* nest %c, i32 %x, i32 %y)</tt> then the resulting function pointer has signature <tt>i32 (i32, i32)*</tt>. It can be created as follows: <pre> - %tramp1 = alloca [10 x i8], align 4 ; size and alignment only correct for X86 - %tramp = getelementptr [10 x i8]* %tramp1, i32 0, i32 0 - call void @llvm.init.trampoline( i8* %tramp, i8* bitcast (i32 (i8* nest , i32, i32)* @f to i8*), i8* %nval ) - %adj = call i8* @llvm.adjust.trampoline( i8* %tramp ) - %fp = bitcast i8* %adj to i32 (i32, i32)* + %tramp = alloca [10 x i8], align 4 ; size and alignment only correct for X86 + %tramp1 = getelementptr [10 x i8]* %tramp, i32 0, i32 0 + %p = call i8* @llvm.init.trampoline( i8* %tramp1, i8* bitcast (i32 (i8* nest , i32, i32)* @f to i8*), i8* %nval ) + %fp = bitcast i8* %p to i32 (i32, i32)* </pre> The call <tt>%val = call i32 %fp( i32 %x, i32 %y )</tt> is then equivalent to <tt>%val = call i32 %f( i8* %nval, i32 %x, i32 %y )</tt>. @@ -5186,11 +5184,12 @@ <div class="doc_text"> <h5>Syntax:</h5> <pre> -declare void @llvm.init.trampoline(i8* <tramp>, i8* <func>, i8* <nval>) +declare i8* @llvm.init.trampoline(i8* <tramp>, i8* <func>, i8* <nval>) </pre> <h5>Overview:</h5> <p> - This initializes the memory pointed to by <tt>tramp</tt> as a trampoline. + This fills the memory pointed to by <tt>tramp</tt> with code + and returns a function pointer suitable for executing it. </p> <h5>Arguments:</h5> <p> @@ -5205,42 +5204,18 @@ <h5>Semantics:</h5> <p> The block of memory pointed to by <tt>tramp</tt> is filled with target - dependent code, turning it into a function. - The new function's signature is the same as that of <tt>func</tt> with - any arguments marked with the <tt>nest</tt> attribute removed. At most - one such <tt>nest</tt> argument is allowed, and it must be of pointer - type. Calling the new function is equivalent to calling <tt>func</tt> - with the same argument list, but with <tt>nval</tt> used for the missing - <tt>nest</tt> argument. -</p> -</div> - -<!-- _______________________________________________________________________ --> -<div class="doc_subsubsection"> - <a name="int_at">'<tt>llvm.adjust.trampoline</tt>' Intrinsic</a> -</div> -<div class="doc_text"> -<h5>Syntax:</h5> -<pre> -declare i8* @llvm.adjust.trampoline(i8* <tramp>) -</pre> -<h5>Overview:</h5> -<p> - This intrinsic returns a function pointer suitable for executing - the trampoline code pointed to by <tt>tramp</tt>. -</p> -<h5>Arguments:</h5> -<p> - The <tt>llvm.adjust.trampoline</tt> takes one argument, a pointer to a - trampoline initialized by the - <a href="#int_it">'<tt>llvm.init.trampoline</tt>' intrinsic</a>. -</p> -<h5>Semantics:</h5> -<p> - A function pointer that can be used to execute the trampoline code in - <tt>tramp</tt> is returned. The returned value should be bitcast to an + dependent code, turning it into a function. A pointer to this function is + returned, but needs to be bitcast to an <a href="#int_trampoline">appropriate function pointer type</a> - before being called. + before being called. The new function's signature is the same as that of + <tt>func</tt> with any arguments marked with the <tt>nest</tt> attribute + removed. At most one such <tt>nest</tt> argument is allowed, and it must be + of pointer type. Calling the new function is equivalent to calling + <tt>func</tt> with the same argument list, but with <tt>nval</tt> used for the + missing <tt>nest</tt> argument. If, after calling + <tt>llvm.init.trampoline</tt>, the memory pointed to by <tt>tramp</tt> is + modified, then the effect of any later call to the returned function pointer is + undefined. </p> </div> Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h?rev=41841&r1=41840&r2=41841&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h (original) +++ llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h Tue Sep 11 09:10:23 2007 @@ -540,16 +540,13 @@ // produces a token chain as output. DEBUG_LOC, - // ADJUST_TRAMP - This corresponds to the adjust_trampoline intrinsic. - // It takes a value as input and returns a value as output. - ADJUST_TRAMP, - // TRAMPOLINE - This corresponds to the init_trampoline intrinsic. // It takes as input a token chain, the pointer to the trampoline, // the pointer to the nested function, the pointer to pass for the // 'nest' parameter, a SRCVALUE for the trampoline and another for // the nested function (allowing targets to access the original - // Function*). It produces a token chain as output. + // Function*). It produces the result of the intrinsic and a token + // chain as output. TRAMPOLINE, // BUILTIN_OP_END - This must be the last enum value in this list. Modified: llvm/trunk/include/llvm/Intrinsics.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Intrinsics.td?rev=41841&r1=41840&r2=41841&view=diff ============================================================================== --- llvm/trunk/include/llvm/Intrinsics.td (original) +++ llvm/trunk/include/llvm/Intrinsics.td Tue Sep 11 09:10:23 2007 @@ -243,11 +243,9 @@ //===------------------------ Trampoline Intrinsics -----------------------===// // -def int_init_trampoline : Intrinsic<[llvm_void_ty, llvm_ptr_ty, llvm_ptr_ty, - llvm_ptr_ty], []>, - GCCBuiltin<"__builtin_init_trampoline">; -def int_adjust_trampoline : Intrinsic<[llvm_ptr_ty, llvm_ptr_ty], [IntrNoMem]>, - GCCBuiltin<"__builtin_adjust_trampoline">; +def int_init_trampoline : Intrinsic<[llvm_ptr_ty, llvm_ptr_ty, llvm_ptr_ty, + llvm_ptr_ty], []>, + GCCBuiltin<"__builtin_init_trampoline">; //===----------------------------------------------------------------------===// // Target-specific intrinsics Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp?rev=41841&r1=41840&r2=41841&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Tue Sep 11 09:10:23 2007 @@ -3384,21 +3384,6 @@ } break; } - case ISD::ADJUST_TRAMP: { - Tmp1 = LegalizeOp(Node->getOperand(0)); - switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) { - default: assert(0 && "This action is not supported yet!"); - case TargetLowering::Custom: - Result = DAG.UpdateNodeOperands(Result, Tmp1); - Result = TLI.LowerOperation(Result, DAG); - if (Result.Val) break; - // FALL THROUGH - case TargetLowering::Expand: - Result = Tmp1; - break; - } - break; - } case ISD::TRAMPOLINE: { SDOperand Ops[6]; for (unsigned i = 0; i != 6; ++i) @@ -3407,7 +3392,14 @@ // The only option for this node is to custom lower it. Result = TLI.LowerOperation(Result, DAG); assert(Result.Val && "Should always custom lower!"); - break; + + // Since trampoline produces two values, make sure to remember that we + // legalized both of them. + Tmp1 = LegalizeOp(Result.getValue(1)); + Result = LegalizeOp(Result); + AddLegalizedOperand(SDOperand(Node, 0), Result); + AddLegalizedOperand(SDOperand(Node, 1), Tmp1); + return Op.ResNo ? Tmp1 : Result; } } Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=41841&r1=41840&r2=41841&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Tue Sep 11 09:10:23 2007 @@ -3643,8 +3643,7 @@ case ISD::DEBUG_LOC: return "debug_loc"; // Trampolines - case ISD::ADJUST_TRAMP: return "adjust_tramp"; - case ISD::TRAMPOLINE: return "trampoline"; + case ISD::TRAMPOLINE: return "trampoline"; case ISD::CONDCODE: switch (cast<CondCodeSDNode>(this)->get()) { Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=41841&r1=41840&r2=41841&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Sep 11 09:10:23 2007 @@ -2881,12 +2881,6 @@ // Discard annotate attributes return 0; - case Intrinsic::adjust_trampoline: { - SDOperand Arg = getValue(I.getOperand(1)); - setValue(&I, DAG.getNode(ISD::ADJUST_TRAMP, TLI.getPointerTy(), Arg)); - return 0; - } - case Intrinsic::init_trampoline: { const Function *F = cast<Function>(IntrinsicInst::StripPointerCasts(I.getOperand(2))); @@ -2899,7 +2893,13 @@ Ops[4] = DAG.getSrcValue(I.getOperand(1)); Ops[5] = DAG.getSrcValue(F); - DAG.setRoot(DAG.getNode(ISD::TRAMPOLINE, MVT::Other, Ops, 6)); + SDOperand Tmp = DAG.getNode(ISD::TRAMPOLINE, + DAG.getNodeValueTypes(TLI.getPointerTy(), + MVT::Other), 2, + Ops, 6); + + setValue(&I, Tmp); + DAG.setRoot(Tmp.getValue(1)); return 0; } } Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=41841&r1=41840&r2=41841&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Tue Sep 11 09:10:23 2007 @@ -191,11 +191,6 @@ setOperationAction(ISD::MEMCPY , MVT::Other, Custom); setOperationAction(ISD::MEMMOVE , MVT::Other, Expand); - if (Subtarget->isThumb()) - setOperationAction(ISD::ADJUST_TRAMP, MVT::i32, Custom); - else - setOperationAction(ISD::ADJUST_TRAMP, MVT::i32, Expand); - // Use the default implementation. setOperationAction(ISD::VASTART , MVT::Other, Expand); setOperationAction(ISD::VAARG , MVT::Other, Expand); @@ -1418,14 +1413,6 @@ return Chain; } -SDOperand ARMTargetLowering::LowerADJUST_TRAMP(SDOperand Op, - SelectionDAG &DAG) { - // Thumb trampolines should be entered in thumb mode, so set the bottom bit - // of the address. - return DAG.getNode(ISD::OR, MVT::i32, Op.getOperand(0), - DAG.getConstant(1, MVT::i32)); -} - SDOperand ARMTargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) { switch (Op.getOpcode()) { default: assert(0 && "Don't know how to custom lower this!"); abort(); @@ -1457,7 +1444,6 @@ case ISD::FRAMEADDR: break; case ISD::GLOBAL_OFFSET_TABLE: return LowerGLOBAL_OFFSET_TABLE(Op, DAG); case ISD::MEMCPY: return LowerMEMCPY(Op, DAG); - case ISD::ADJUST_TRAMP: return LowerADJUST_TRAMP(Op, DAG); } return SDOperand(); } Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.h?rev=41841&r1=41840&r2=41841&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMISelLowering.h (original) +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.h Tue Sep 11 09:10:23 2007 @@ -138,7 +138,6 @@ SDOperand LowerFORMAL_ARGUMENTS(SDOperand Op, SelectionDAG &DAG); SDOperand LowerBR_JT(SDOperand Op, SelectionDAG &DAG); SDOperand LowerMEMCPY(SDOperand Op, SelectionDAG &DAG); - SDOperand LowerADJUST_TRAMP(SDOperand Op, SelectionDAG &DAG); }; } Modified: llvm/trunk/lib/Target/Alpha/AlphaISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Alpha/AlphaISelLowering.cpp?rev=41841&r1=41840&r2=41841&view=diff ============================================================================== --- llvm/trunk/lib/Target/Alpha/AlphaISelLowering.cpp (original) +++ llvm/trunk/lib/Target/Alpha/AlphaISelLowering.cpp Tue Sep 11 09:10:23 2007 @@ -124,9 +124,6 @@ setOperationAction(ISD::ExternalSymbol, MVT::i64, Custom); setOperationAction(ISD::GlobalTLSAddress, MVT::i64, Custom); - setOperationAction(ISD::ADJUST_TRAMP, MVT::i32, Expand); - setOperationAction(ISD::ADJUST_TRAMP, MVT::i64, Expand); - setOperationAction(ISD::VASTART, MVT::Other, Custom); setOperationAction(ISD::VAEND, MVT::Other, Expand); setOperationAction(ISD::VACOPY, MVT::Other, Custom); Modified: llvm/trunk/lib/Target/IA64/IA64ISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/IA64/IA64ISelLowering.cpp?rev=41841&r1=41840&r2=41841&view=diff ============================================================================== --- llvm/trunk/lib/Target/IA64/IA64ISelLowering.cpp (original) +++ llvm/trunk/lib/Target/IA64/IA64ISelLowering.cpp Tue Sep 11 09:10:23 2007 @@ -97,8 +97,6 @@ setOperationAction(ISD::ROTR , MVT::i64 , Expand); setOperationAction(ISD::BSWAP, MVT::i64 , Expand); // mux @rev - setOperationAction(ISD::ADJUST_TRAMP, MVT::i64, Expand); - // VASTART needs to be custom lowered to use the VarArgsFrameIndex setOperationAction(ISD::VAARG , MVT::Other, Custom); setOperationAction(ISD::VASTART , MVT::Other, Custom); Modified: llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp?rev=41841&r1=41840&r2=41841&view=diff ============================================================================== --- llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp (original) +++ llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp Tue Sep 11 09:10:23 2007 @@ -105,8 +105,6 @@ setOperationAction(ISD::STACKSAVE, MVT::Other, Expand); setOperationAction(ISD::STACKRESTORE, MVT::Other, Expand); - setOperationAction(ISD::ADJUST_TRAMP, MVT::i32, Expand); - setStackPointerRegisterToSaveRestore(Mips::SP); computeRegisterProperties(); } Modified: llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp?rev=41841&r1=41840&r2=41841&view=diff ============================================================================== --- llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp (original) +++ llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp Tue Sep 11 09:10:23 2007 @@ -171,9 +171,6 @@ // RET must be custom lowered, to meet ABI requirements setOperationAction(ISD::RET , MVT::Other, Custom); - setOperationAction(ISD::ADJUST_TRAMP, MVT::i32, Expand); - setOperationAction(ISD::ADJUST_TRAMP, MVT::i64, Expand); - // VASTART needs to be custom lowered to use the VarArgsFrameIndex setOperationAction(ISD::VASTART , MVT::Other, Custom); Modified: llvm/trunk/lib/Target/Sparc/SparcISelDAGToDAG.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/SparcISelDAGToDAG.cpp?rev=41841&r1=41840&r2=41841&view=diff ============================================================================== --- llvm/trunk/lib/Target/Sparc/SparcISelDAGToDAG.cpp (original) +++ llvm/trunk/lib/Target/Sparc/SparcISelDAGToDAG.cpp Tue Sep 11 09:10:23 2007 @@ -216,8 +216,6 @@ // RET must be custom lowered, to meet ABI requirements setOperationAction(ISD::RET , MVT::Other, Custom); - setOperationAction(ISD::ADJUST_TRAMP, MVT::i32, Expand); - // VASTART needs to be custom lowered to use the VarArgsFrameIndex. setOperationAction(ISD::VASTART , MVT::Other, Custom); // VAARG needs to be lowered to not do unaligned accesses for doubles. Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=41841&r1=41840&r2=41841&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original) +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Tue Sep 11 09:10:23 2007 @@ -246,9 +246,7 @@ } setOperationAction(ISD::FRAME_TO_ARGS_OFFSET, MVT::i32, Custom); - setOperationAction(ISD::ADJUST_TRAMP, MVT::i32, Expand); - setOperationAction(ISD::ADJUST_TRAMP, MVT::i64, Expand); - setOperationAction(ISD::TRAMPOLINE, MVT::Other, Custom); + setOperationAction(ISD::TRAMPOLINE, MVT::Other, Custom); // VASTART needs to be custom lowered to use the VarArgsFrameIndex setOperationAction(ISD::VASTART , MVT::Other, Custom); @@ -4406,7 +4404,9 @@ OutChains[3] = DAG.getStore(Root, Disp, Addr, TrmpSV->getValue(), TrmpSV->getOffset() + 6, false, 1); - return DAG.getNode(ISD::TokenFactor, MVT::Other, OutChains, 4); + SDOperand Ops[] = + { Trmp, DAG.getNode(ISD::TokenFactor, MVT::Other, OutChains, 4) }; + return DAG.getNode(ISD::MERGE_VALUES, Op.Val->getVTList(), Ops, 2); } } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits