Author: baldrick Date: Fri Jul 27 08:06:37 2007 New Revision: 40550 URL: http://llvm.org/viewvc/llvm-project?rev=40550&view=rev Log: Trampoline support.
Modified: llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp llvm-gcc-4.0/trunk/gcc/llvm-internal.h llvm-gcc-4.0/trunk/gcc/llvm-types.cpp llvm-gcc-4.0/trunk/gcc/tree-nested.c 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=40550&r1=40549&r2=40550&view=diff ============================================================================== --- llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp (original) +++ llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp Fri Jul 27 08:06:37 2007 @@ -4211,6 +4211,10 @@ return EmitBuiltinExtractReturnAddr(exp, Result); case BUILT_IN_FROB_RETURN_ADDR: return EmitBuiltinFrobReturnAddr(exp, Result); + case BUILT_IN_INIT_TRAMPOLINE: + return EmitBuiltinInitTrampoline(exp); + case BUILT_IN_ADJUST_TRAMPOLINE: + return EmitBuiltinAdjustTrampoline(exp, Result); // Builtins used by the exception handling runtime. case BUILT_IN_DWARF_CFA: @@ -4857,6 +4861,45 @@ return true; } +bool TreeToLLVM::EmitBuiltinInitTrampoline(tree exp) { + tree arglist = TREE_OPERAND(exp, 1); + if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, POINTER_TYPE, + VOID_TYPE)) + return false; + + static const Type *VPTy = PointerType::get(Type::Int8Ty); + + Value *Tramp = Emit(TREE_VALUE(arglist), 0); + Tramp = CastToType(Instruction::BitCast, Tramp, VPTy); + + Value *Func = Emit(TREE_VALUE(TREE_CHAIN(arglist)), 0); + Func = CastToType(Instruction::BitCast, Func, VPTy); + + Value *Chain = Emit(TREE_VALUE(TREE_CHAIN(TREE_CHAIN(arglist))), 0); + Chain = CastToType(Instruction::BitCast, Chain, VPTy); + + Value *Ops[3] = { Tramp, Func, Chain }; + + Function *Intr = Intrinsic::getDeclaration(TheModule, + Intrinsic::init_trampoline); + Builder.CreateCall(Intr, Ops, 3); + return true; +} + +bool TreeToLLVM::EmitBuiltinAdjustTrampoline(tree exp, Value *&Result) { + tree arglist = TREE_OPERAND(exp, 1); + if (!validate_arglist(arglist, POINTER_TYPE, VOID_TYPE)) + return false; + + Value *Tramp = Emit(TREE_VALUE(arglist), 0); + Tramp = CastToType(Instruction::BitCast, Tramp, + PointerType::get(Type::Int8Ty)); + + Function *Intr = Intrinsic::getDeclaration(TheModule, + Intrinsic::adjust_trampoline); + Result = Builder.CreateCall(Intr, Tramp, "adj"); + return true; +} //===----------------------------------------------------------------------===// // ... Complex Math Expressions ... Modified: llvm-gcc-4.0/trunk/gcc/llvm-internal.h URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.0/trunk/gcc/llvm-internal.h?rev=40550&r1=40549&r2=40550&view=diff ============================================================================== --- llvm-gcc-4.0/trunk/gcc/llvm-internal.h (original) +++ llvm-gcc-4.0/trunk/gcc/llvm-internal.h Fri Jul 27 08:06:37 2007 @@ -580,6 +580,8 @@ bool EmitBuiltinEHReturn(tree_node *exp, Value *&Result); bool EmitBuiltinInitDwarfRegSizes(tree_node *exp, Value *&Result); bool EmitBuiltinUnwindInit(tree_node *exp, Value *&Result); + bool EmitBuiltinInitTrampoline(tree_node *exp); + bool EmitBuiltinAdjustTrampoline(tree_node *exp, Value *&Result); // Complex Math Expressions. void EmitLoadFromComplex(Value *&Real, Value *&Imag, Value *SrcComplex, 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=40550&r1=40549&r2=40550&view=diff ============================================================================== --- llvm-gcc-4.0/trunk/gcc/llvm-types.cpp (original) +++ llvm-gcc-4.0/trunk/gcc/llvm-types.cpp Fri Jul 27 08:06:37 2007 @@ -962,9 +962,13 @@ Attrs.push_back(ParamAttrsWithIndex::get(ArgTypes.size(), ParamAttr::StructRet)); - if (static_chain) + if (static_chain) { // Pass the static chain as the first parameter. ABIConverter.HandleArgument(TREE_TYPE(static_chain)); + // Mark it as the chain argument. + Attrs.push_back(ParamAttrsWithIndex::get(ArgTypes.size(), + ParamAttr::Nest)); + } // If the target has regparam parameters, allow it to inspect the function // type. Modified: llvm-gcc-4.0/trunk/gcc/tree-nested.c URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.0/trunk/gcc/tree-nested.c?rev=40550&r1=40549&r2=40550&view=diff ============================================================================== --- llvm-gcc-4.0/trunk/gcc/tree-nested.c (original) +++ llvm-gcc-4.0/trunk/gcc/tree-nested.c Fri Jul 27 08:06:37 2007 @@ -409,6 +409,8 @@ align = TRAMPOLINE_ALIGNMENT; size = TRAMPOLINE_SIZE; +/* APPLE LOCAL LLVM */ +#ifndef ENABLE_LLVM /* Rely on LLVM supporting large alignments. */ /* If we won't be able to guarantee alignment simply via TYPE_ALIGN, then allocate extra space so that we can do dynamic alignment. */ /* APPLE LOCAL STACK_BOUNDARY must be a signed expression on Darwin/x86 */ @@ -417,6 +419,8 @@ size += ((align/BITS_PER_UNIT) - 1) & -(STACK_BOUNDARY/BITS_PER_UNIT); align = STACK_BOUNDARY; } +/* APPLE LOCAL LLVM */ +#endif t = build_index_type (build_int_cst (NULL_TREE, size - 1)); t = build_array_type (char_type_node, t); _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits