[llvm-commits] [llvm-gcc-4.2] r40551 - in /llvm-gcc-4.2/trunk/gcc: llvm-convert.cpp llvm-internal.h llvm-types.cpp tree-nested.c
Duncan Sands
baldrick at free.fr
Fri Jul 27 06:20:29 PDT 2007
Author: baldrick
Date: Fri Jul 27 08:20:28 2007
New Revision: 40551
URL: http://llvm.org/viewvc/llvm-project?rev=40551&view=rev
Log:
Trampoline support.
Modified:
llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
llvm-gcc-4.2/trunk/gcc/llvm-internal.h
llvm-gcc-4.2/trunk/gcc/llvm-types.cpp
llvm-gcc-4.2/trunk/gcc/tree-nested.c
Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=40551&r1=40550&r2=40551&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Fri Jul 27 08:20:28 2007
@@ -4236,6 +4236,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:
@@ -4879,6 +4883,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.2/trunk/gcc/llvm-internal.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-internal.h?rev=40551&r1=40550&r2=40551&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-internal.h (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-internal.h Fri Jul 27 08:20:28 2007
@@ -601,6 +601,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.2/trunk/gcc/llvm-types.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-types.cpp?rev=40551&r1=40550&r2=40551&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-types.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-types.cpp Fri Jul 27 08:20:28 2007
@@ -983,9 +983,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.2/trunk/gcc/tree-nested.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/tree-nested.c?rev=40551&r1=40550&r2=40551&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/tree-nested.c (original)
+++ llvm-gcc-4.2/trunk/gcc/tree-nested.c Fri Jul 27 08:20:28 2007
@@ -439,6 +439,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 */
@@ -447,6 +449,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);
More information about the llvm-commits
mailing list