<p>Conservative garbage collection often does not require any special support
from either the language or the compiler: it can handle non-type-safe
programming languages (such as C/C++) and does not require any special
-information from the compiler. The [LINK] Boehm collector is an example of a
-state-of-the-art conservative collector.</p>
+information from the compiler. The
+<a href="http://www.hpl.hp.com/personal/Hans_Boehm/gc/">Boehm collector</a> is
+an example of a state-of-the-art conservative collector.</p>
<p>Accurate garbage collection requires the ability to identify all pointers in
the program at run-time (which requires that the source-language be type-safe in
<div class="doc_text">
<div class="doc_code"><tt>
- void %llvm.gcroot(<ty>** %ptrloc, <ty2>* %metadata)
+ void %llvm.gcroot(i8** %ptrloc, i8* %metadata)
</tt></div>
<p>
The <tt>llvm.gcroot</tt> intrinsic is used to inform LLVM of a pointer variable
on the stack. The first argument contains the address of the variable on the
stack, and the second contains a pointer to metadata that should be associated
-with the pointer (which <b>must</b> be a constant or global value address). At
-runtime, the <tt>llvm.gcroot</tt> intrinsic stores a null pointer into the
-specified location to initialize the pointer.</p>
+with the pointer (which <b>must</b> be a constant or global value address).</p>
<p>
Consider the following fragment of Java code:
%X = alloca %Object*
...
+ ;; Java null-initializes pointers.
+ store %Object* null, %Object** %X
+
;; "CodeBlock" is the block corresponding to the start
;; of the scope above.
CodeBlock:
;; Initialize the object, telling LLVM that it is now live.
;; Java has type-tags on objects, so it doesn't need any
;; metadata.
- call void %llvm.gcroot(%Object** %X, sbyte* null)
+ %tmp = bitcast %Object** %X to i8**
+ call void %llvm.gcroot(i8** %tmp, i8* null)
...
;; As the pointer goes out of scope, store a null value into
<div class="doc_text">
<div class="doc_code"><tt>
- sbyte *%llvm_gc_allocate(unsigned %Size)
+ void *llvm_gc_allocate(unsigned Size)
</tt></div>
<p>The <tt>llvm_gc_allocate</tt> function is a global function defined by the
<div class="doc_text">
<div class="doc_code"><tt>
- sbyte *%llvm.gcread(sbyte *, sbyte **)<br>
- void %llvm.gcwrite(sbyte*, sbyte*, sbyte**)
+ i8 *%llvm.gcread(i8 *, i8 **)<br>
+ void %llvm.gcwrite(i8*, i8*, i8**)
</tt></div>
<p>Several of the more interesting garbage collectors (e.g., generational