diff options
Diffstat (limited to 'gcc-4.8.1/libgo/runtime/go-trampoline.c')
-rw-r--r-- | gcc-4.8.1/libgo/runtime/go-trampoline.c | 113 |
1 files changed, 0 insertions, 113 deletions
diff --git a/gcc-4.8.1/libgo/runtime/go-trampoline.c b/gcc-4.8.1/libgo/runtime/go-trampoline.c deleted file mode 100644 index 17f73d4f5..000000000 --- a/gcc-4.8.1/libgo/runtime/go-trampoline.c +++ /dev/null @@ -1,113 +0,0 @@ -/* go-trampoline.c -- allocate a trampoline for a nested function. - - Copyright 2009 The Go Authors. All rights reserved. - Use of this source code is governed by a BSD-style - license that can be found in the LICENSE file. */ - -#include "config.h" - -#include <stddef.h> -#include <stdint.h> -#include <unistd.h> - -#ifdef HAVE_SYS_MMAN_H -#include <sys/mman.h> -#endif - -#include "runtime.h" -#include "arch.h" -#include "malloc.h" -#include "go-assert.h" - -/* Trampolines need to run in memory that is both writable and - executable. In order to implement them, we grab a page of memory - and mprotect it. We fill in the page with trampolines as they are - required. When we run out of space, we drop the pointer to the - page and allocate a new one. The page will be freed by the garbage - collector when there are no more variables of type func pointing to - it. */ - -/* A lock to control access to the page of closures. */ - -static Lock trampoline_lock; - -/* The page of closures. */ - -static unsigned char *trampoline_page; - -/* The size of trampoline_page. */ - -static uintptr_t trampoline_page_size; - -/* The number of bytes we have used on trampoline_page. */ - -static uintptr_t trampoline_page_used; - -/* Allocate a trampoline of SIZE bytes that will use the closure in - CLOSURE. */ - -void * -__go_allocate_trampoline (uintptr_t size, void *closure) -{ - uintptr_t ptr_size; - uintptr_t full_size; - unsigned char *ret; - - /* Because the garbage collector only looks at aligned addresses, we - need to store the closure at an aligned address to ensure that it - sees it. */ - ptr_size = sizeof (void *); - full_size = (((size + ptr_size - 1) / ptr_size) * ptr_size); - full_size += ptr_size; - - runtime_lock (&trampoline_lock); - - if (full_size < trampoline_page_size - trampoline_page_used) - trampoline_page = NULL; - - if (trampoline_page == NULL) - { - uintptr_t page_size; - unsigned char *page; - - page_size = getpagesize (); - __go_assert (page_size >= full_size); - page = (unsigned char *) runtime_mallocgc (2 * page_size - 1, 0, 0, 0); - page = (unsigned char *) (((uintptr_t) page + page_size - 1) - & ~ (page_size - 1)); - -#ifdef HAVE_SYS_MMAN_H - { - int i; - - i = mprotect (page, page_size, PROT_READ | PROT_WRITE | PROT_EXEC); - __go_assert (i == 0); - } -#endif - - trampoline_page = page; - trampoline_page_size = page_size; - trampoline_page_used = 0; - } - - ret = trampoline_page + trampoline_page_used; - trampoline_page_used += full_size; - - runtime_unlock (&trampoline_lock); - - __builtin_memcpy (ret + full_size - ptr_size, &closure, ptr_size); - - return (void *) ret; -} - -/* Scan the trampoline page when running the garbage collector. This - just makes sure that the garbage collector sees the pointer in - trampoline_page, so that the page itself is not freed if there are - no other references to it. */ - -void -runtime_trampoline_scan (void (*addroot) (Obj)) -{ - if (trampoline_page != NULL) - addroot ((Obj){(byte *) &trampoline_page, sizeof trampoline_page, 0}); -} |