[LLVMdev] Suggestions for improvements to the GC docs.
Talin
viridia at gmail.com
Thu Mar 5 22:37:43 PST 2009
Thanks for the clarifications, they were helpful.
Gordon Henriksen wrote:
> Hi Talin,
>
> Thanks for the feedback. My comments inline.
>
> On 2009-03-05, at 16:01, Talin wrote:
>
>
>> I'm re-re-reading the "Accurate Garbage Collection with LLVM", and
>> I'm realizing that there are some parts of this document I find
>> confusing.
>>
>> 1) I think that the term 'stack map' should be defined more
>> precisely. For example, in one place it says "LVM automatically
>> computes a stack map", and elsewhere it says "The compiler plugin is
>> responsible for generating code which conforms to the binary
>> interface defined by library, most essentially the stack map". At
>> first glance, this seems contradictory - who is generating the stack
>> map, LLVM, or the compiler plugin? The problem is that the words
>> "stack map" are being used to refer to two different things, one
>> which is computed by LLVM, the other generated by the compiler plugin.
>>
>
> There is a conflation of terms there, yes. I've tried to clarify, but
> they are merely different representations of the same information.
>
>
>> Also, a definition of what a stack map is, and what it contains,
>> would be helpful.
>>
>
> I've added more detail to the 'Computing stack maps' section.
>
>
>> 2) It says LLVM does not address "discovery or registration of stack
>> frame descriptors." I'm not sure what is meant by a "stack frame
>> descriptor". Is this the same as a stack map?
>>
>
> It does. I've expunged the term "descriptor" from the document for
> consistency.
>
>
>> 3) The shadow-stack collector is presented as "an easy way to get
>> started". However, it doesn't give many hints as to what the next
>> logical evolutionary step would be - what method would you normally
>> use for crawling the various stack frames if you didn't want to pay
>> the performance penalty of maintaining the shadow stack? Something
>> like libunwind perhaps?
>>
>
> I've added some links to the plugin section at the conclusion here;
> hopefully that scratches the itch. I don't think LLVM should attempt
> to prescribe a GC growth path, nor should this document attempt to be
> a substitute for domain knowledge.
>
>
>> 4) A more general question: In the barrier intrinsics, is there any
>> constraint on the values that the object pointer and the derived
>> pointer can take?
>>
>
> There is no constraint on the relationship between the object and
> derived pointer parameters except as the plugin requires. I've made
> this explicit. There is currently no benefit to using gcread/gcwrite
> vs. coding in the barrier up front.
>
>
>> In particular, I am thinking about the case where you have an
>> object, such as an ArrayList, in which there are two separate non-
>> contiguous allocations: A fixed-length "header" part, and a variable-
>> length "tail" part. Assume that the header part uses type tags, but
>> the tail part is just a raw data buffer. From a GC perspective, it
>> may be simplest to treat these as a single object, such that only
>> the head part gets added to the work queue, and both are traced by
>> the same tracer function. This implies, however, that when calling
>> gcwrite(), the 'derived' pointer might be in a different memory
>> block than the 'object' pointer, and may even be located at a
>> negative offset from it.
>>
>
> Java and .NET treat the list header as an object which contains
> reference to a (fixed length) array object—i.e., 2 separate objects.
> On the principal of least surprise, I would recommend sticking to this
> model if you're creating building blocks.
>
> — Gordon
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
More information about the llvm-dev
mailing list