[llvm-commits] CVS: llvm/runtime/GC/SemiSpace/Makefile semispace.c
Chris Lattner
lattner at cs.uiuc.edu
Sun May 23 16:28:32 PDT 2004
Changes in directory llvm/runtime/GC/SemiSpace:
Makefile added (r1.1)
semispace.c added (r1.1)
---
Log message:
Check in an EARLY START on a simple copying collector
---
Diffs of the changes: (+117 -0)
Index: llvm/runtime/GC/SemiSpace/Makefile
diff -c /dev/null llvm/runtime/GC/SemiSpace/Makefile:1.1
*** /dev/null Sun May 23 16:26:26 2004
--- llvm/runtime/GC/SemiSpace/Makefile Sun May 23 16:25:45 2004
***************
*** 0 ****
--- 1,19 ----
+ ##===- runtime/GC/SemiSpace/Makefile -----------------------*- Makefile -*-===##
+ #
+ # The LLVM Compiler Infrastructure
+ #
+ # This file was developed by the LLVM research group and is distributed under
+ # the University of Illinois Open Source License. See LICENSE.TXT for details.
+ #
+ ##===----------------------------------------------------------------------===##
+
+ LEVEL = ../../..
+ BYTECODE_LIBRARY=1
+ #SHARED_LIBRARY=1
+ #DONT_BUILD_RELINKED=1
+ LIBRARYNAME=gcsemispace
+
+ EXPORTED_SYMBOL_FILE = $(SourceDir)/../gc_exported_symbols.lst
+
+ include $(LEVEL)/Makefile.common
+
Index: llvm/runtime/GC/SemiSpace/semispace.c
diff -c /dev/null llvm/runtime/GC/SemiSpace/semispace.c:1.1
*** /dev/null Sun May 23 16:26:26 2004
--- llvm/runtime/GC/SemiSpace/semispace.c Sun May 23 16:25:45 2004
***************
*** 0 ****
--- 1,98 ----
+ /*===-- semispace.c - Simple semi-space copying garbage collector ---------===*\
+ |*
+ |* The LLVM Compiler Infrastructure
+ |*
+ |* This file was developed by the LLVM research group and is distributed under
+ |* the University of Illinois Open Source License. See LICENSE.TXT for details.
+ |*
+ |*===----------------------------------------------------------------------===*|
+ |*
+ |* This garbage collector is an extremely simple copying collector. It splits
+ |* the managed region of memory into two pieces: the current space to allocate
+ |* from, and the copying space. When the portion being allocated from fills up,
+ |* a garbage collection cycle happens, which copies all live blocks to the other
+ |* half of the managed space.
+ |*
+ \*===----------------------------------------------------------------------===*/
+
+ #include "../GCInterface.h"
+ #include <stdio.h>
+ #include <stdlib.h>
+
+ /* FIXME: This should be in a code-generator specific library!
+ */
+ typedef struct GCRoot {
+ void **RootPtr;
+ void *Meta;
+ } GCRoot;
+
+ typedef struct GCRoots {
+ struct GCRoots *Next;
+ unsigned NumRoots;
+ GCRoot RootRecords[];
+ } GCRoots;
+ GCRoots *llvm_gc_root_chain;
+
+ static void llvm_cg_walk_gcroots(void (*FP)(void **Root, void *Meta)) {
+ GCRoots *R = llvm_gc_root_chain;
+ for (; R; R = R->Next) {
+ unsigned i, e;
+ for (i = 0, e = R->NumRoots; i != e; ++i)
+ FP(R->RootRecords[i].RootPtr, R->RootRecords[i].Meta);
+ }
+ }
+ /* END FIXME! */
+
+
+
+ /* We use no read/write barriers */
+ void *llvm_gc_read(void **P) { return *P; }
+ void llvm_gc_write(void *V, void **P) { *P = V; }
+
+
+ /* AllocPtr - This points to the next byte that is available for allocation.
+ */
+ static char *AllocPtr;
+
+ /* AllocEnd - This points to the first byte not available for allocation. When
+ * AllocPtr passes this, we have run out of space.
+ */
+ static char *AllocEnd;
+
+ void llvm_gc_initialize() {
+ AllocPtr = calloc(1, 1000);
+ AllocEnd = AllocPtr + 1000;
+ }
+
+ /* We always want to inline the fast path, but never want to inline the slow
+ * path.
+ */
+ void *llvm_gc_allocate(unsigned Size) __attribute__((always_inline));
+ static void* llvm_gc_alloc_slow(unsigned Size) __attribute__((noinline));
+
+ void *llvm_gc_allocate(unsigned Size) {
+ char *OldAP = AllocPtr;
+ char *NewEnd = OldAP+Size;
+ if (NewEnd > AllocEnd)
+ return llvm_gc_alloc_slow(Size);
+ AllocPtr = NewEnd;
+ return OldAP;
+ }
+
+ static void* llvm_gc_alloc_slow(unsigned Size) {
+ llvm_gc_collect();
+ return llvm_gc_allocate(Size);
+ }
+
+
+ static void process_root(void **Root, void *Meta) {
+ printf("process_root[0x%X] = 0x%X\n", Root, *Root);
+ }
+
+ void llvm_gc_collect() {
+ printf("Garbage collecting!!\n");
+ llvm_cg_walk_gcroots(process_root);
+ abort();
+
+ /* TODO: Iterate through roots. */
+ }
More information about the llvm-commits
mailing list