From 05d670971e5de3b199b0bbdcd36c4062b8c0065e Mon Sep 17 00:00:00 2001
From: Chris Lattner
LLVM's intermediate representation provides garbage -collection intrinsics which offer support for a broad class of +collection intrinsics that offer support for a broad class of collector models. For instance, the intrinsics permit:
The SemiSpace runtime implements with the suggested -runtime interface and is compatible the ShadowStack backend.
+The SemiSpace runtime implements the suggested +runtime interface and is compatible with the ShadowStack backend.
SemiSpace is a very simple copying collector. When it starts up, it allocates two blocks of memory for the heap. It uses a simple bump-pointer @@ -321,7 +321,7 @@ may use load and store instead of llvm.gcread and
@@ -351,12 +351,12 @@ specified by the runtime.The gc function attribute is used to specify the desired collector -algorithm to the compiler. It is equivalent to specify the collector name +algorithm to the compiler. It is equivalent to specifying the collector name programmatically using the setCollector method of Function.
Specifying the collector on a per-function basis allows LLVM to link together -programs which use different garbage collection algorithms.
+programs that use different garbage collection algorithms.The llvm.gcroot intrinsic is used to inform LLVM of a pointer -variable on the stack. The first argument must be an alloca instruction +variable on the stack. The first argument must be a value referring to an alloca instruction or a bitcast of an alloca. The second contains a pointer to metadata that should be associated with the pointer, and must be a constant or global value address. If your target collector uses tags, use a null pointer for @@ -399,7 +399,7 @@ Entry: ;; Tell LLVM that the stack space is a stack root. ;; Java has type-tags on objects, so we pass null as metadata. %tmp = bitcast %Object** %X to i8** - call void %llvm.gcroot(%i8** %X, i8* null) + call void %llvm.gcroot(i8** %X, i8* null) ... ;; "CodeBlock" is the block corresponding to the start @@ -439,16 +439,16 @@ object). Accordingly, these intrinsics take both pointers as separate arguments for completeness. In this snippet, %object is the object pointer, and %derived is the derived pointer:
-;; An array type. ++ %derived = getelementptr %object, i32 0, i32 2, i32 %n+ ;; An array type. %class.Array = type { %class.Object, i32, [0 x %class.Object*] } -... + ... ;; Load the object pointer from a gcroot. %object = load %class.Array** %object_addr ;; Compute the derived pointer. - %derived = getelementptr %obj, i32 0, i32 2, i32 %n
The LLVM garbage collectors are capable of supporting all of these styles of language, including ones that mix various implementations. To do this, it allows the source-language to associate meta-data with the stack roots, and the heap tracing routines can propagate the +href="#gcroot">stack roots, and the heap tracing routines can propagate the information. In addition, LLVM allows the front-end to extract GC information in any form from a specific object pointer (this supports situations #1 and #3).
diff --git a/docs/LangRef.html b/docs/LangRef.html index 9679291..6591b27 100644 --- a/docs/LangRef.html +++ b/docs/LangRef.html @@ -3020,8 +3020,8 @@ provided depend on the type of the first pointer argument. The 'getelementptr' instruction is used to index down through the type levels of a structure or to a specific index in an array. When indexing into a structure, only i32 integer constants are allowed. When indexing -into an array or pointer, only integers of 32 or 64 bits are allowed, and will -be sign extended to 64-bit values. +into an array or pointer, only integers of 32 or 64 bits are allowed; 32-bit +values will be sign extended to 64-bits if required.For example, let's consider a C code fragment and how it gets compiled to LLVM:
@@ -3096,7 +3096,7 @@ the LLVM code for the given testcase is equivalent to:Note that it is undefined to access an array out of bounds: array and pointer indexes must always be within the defined bounds of the array type. -The one exception for this rules is zero length arrays. These arrays are +The one exception for this rule is zero length arrays. These arrays are defined to be accessible as variable length arrays, which requires access beyond the zero'th element.
@@ -4207,7 +4207,7 @@ value address) contains the meta-data to be associated with the root.At runtime, a call to this intrinsics stores a null pointer into the "ptrloc" +
At runtime, a call to this intrinsic stores a null pointer into the "ptrloc" location. At compile-time, the code generator generates information to allow the runtime to find the pointer at GC safe points. The 'llvm.gcroot' intrinsic may only be used in a function which specifies a GC -- cgit v1.1