aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.8.1/libgo/runtime/go-trampoline.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.8.1/libgo/runtime/go-trampoline.c')
-rw-r--r--gcc-4.8.1/libgo/runtime/go-trampoline.c113
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});
-}