trampoline_setup.c revision 215125
1/* ===----- trampoline_setup.c - Implement __trampoline_setup -------------=== 2 * 3 * The LLVM Compiler Infrastructure 4 * 5 * This file is distributed under the University of Illinois Open Source 6 * License. See LICENSE.TXT for details. 7 * 8 * ===----------------------------------------------------------------------=== 9 */ 10 11#include <stdint.h> 12#include <stdlib.h> 13 14#include "int_lib.h" 15 16extern void __clear_cache(void* start, void* end); 17 18/* 19 * The ppc compiler generates calls to __trampoline_setup() when creating 20 * trampoline functions on the stack for use with nested functions. 21 * This function creates a custom 40-byte trampoline function on the stack 22 * which loads r11 with a pointer to the outer function's locals 23 * and then jumps to the target nested function. 24 */ 25 26#if __ppc__ && !defined(__powerpc64__) 27void __trampoline_setup(uint32_t* trampOnStack, int trampSizeAllocated, 28 const void* realFunc, void* localsPtr) 29{ 30 /* should never happen, but if compiler did not allocate */ 31 /* enough space on stack for the trampoline, abort */ 32 if ( trampSizeAllocated < 40 ) 33 compilerrt_abort(); 34 35 /* create trampoline */ 36 trampOnStack[0] = 0x7c0802a6; /* mflr r0 */ 37 trampOnStack[1] = 0x4800000d; /* bl Lbase */ 38 trampOnStack[2] = (uint32_t)realFunc; 39 trampOnStack[3] = (uint32_t)localsPtr; 40 trampOnStack[4] = 0x7d6802a6; /* Lbase: mflr r11 */ 41 trampOnStack[5] = 0x818b0000; /* lwz r12,0(r11) */ 42 trampOnStack[6] = 0x7c0803a6; /* mtlr r0 */ 43 trampOnStack[7] = 0x7d8903a6; /* mtctr r12 */ 44 trampOnStack[8] = 0x816b0004; /* lwz r11,4(r11) */ 45 trampOnStack[9] = 0x4e800420; /* bctr */ 46 47 /* clear instruction cache */ 48 __clear_cache(trampOnStack, &trampOnStack[10]); 49} 50#endif /* __ppc__ */ 51