<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1"
 http-equiv="Content-Type">
  <title></title>
</head>
<body text="#000000" bgcolor="#ffffff">
On 04/29/10 21:27, Talin wrote:
<blockquote
 cite="mid:i2md1b71f831004291227j2beb9736v1135a6c905273726@mail.gmail.com"
 type="cite">On Wed, Apr 28, 2010 at 12:16 PM, Paul Melis <span
 dir="ltr"><<a moz-do-not-send="true"
 href="mailto:llvm@assumetheposition.nl">llvm@assumetheposition.nl</a>></span>
wrote:<br>
  <div class="gmail_quote">
  <blockquote class="gmail_quote"
 style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
    <div text="#000000" bgcolor="#ffffff">
    <div>
    <div class="h5">On 04/27/10 00:20, Talin wrote:
    <blockquote type="cite">On Mon, Apr 26, 2010 at 12:44 AM, Paul
Melis <span dir="ltr"><<a moz-do-not-send="true"
 href="mailto:llvm@assumetheposition.nl" target="_blank">llvm@assumetheposition.nl</a>></span>
wrote:<br>
      <div class="gmail_quote">
      <blockquote class="gmail_quote"
 style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
        <div>
        <div>Hi,<br>
        <br>
Talin wrote:<br>
> I'm a little confused as to the rules for the arguments to
llvm.gcroot,<br>
> which says it must be a pointer alloca. I'm not sure whether that
means it<br>
> must be an alloca (which is always a pointer by definition) or an
alloca<br>
> *of* a pointer.<br>
        <br>
I'm pretty sure it should be "alloca of a pointer", as the first
argument<br>
of llvm.gcroot has type i8**.<br>
        <br>
However, <a moz-do-not-send="true"
 href="http://llvm.org/docs/GarbageCollection.html#gcroot"
 target="_blank">http://llvm.org/docs/GarbageCollection.html#gcroot</a>,
isn't<br>
completely clear on this:<br>
        <br>
"The first argument must be a value referring to an alloca instruction
or<br>
a bitcast of an alloca."<br>
        <br>
This last sentence seems to rule out passing GEPs on alloca's to
llvm.gcroot.<br>
        <br>
> What I am trying to figure out is how to declare roots contained
in value<br>
> types. Suppose for example I have a small struct which contains
several<br>
> garbage-collectable references. This struct is a local variable,
so it's<br>
> contained in a block of memory which has been allocated via
alloca. Now, I<br>
> don't want to add the struct itself as a root, since it isn't
allocated on<br>
> the heap. But I want to declare the fields within the struct -
which are<br>
> GEPs from the alloca pointer - as roots, since they are references
to<br>
> objects on the heap.<br>
        <br>
As reasonable as the above sounds, I don't think you can mark roots<br>
contained in structs. But if I'm wrong I'd love to know ;-)  Perhaps you<br>
can ask the LDC devs how/if they handle this case, as it seems you can<br>
allocate a class instance on the stack in D.<br>
        <br>
        </div>
        </div>
      </blockquote>
      <div>Ugh. If all roots have to be singleton pointers, not
embedded
within a larger structure, then I'm not sure that what I want to do is
even possible.</div>
      </div>
    </blockquote>
    </div>
    </div>
In principle you could probably mark the alloca's of your value structs
as gcroots. Then during collection you would have to make sure you
recognize the value types so you don't move/deallocate/... them during
a collection. That would still give you the option to trace all live
objects by simply traversing the fields of a value struct. You would
only have to do this for value structs (indirectly) containing
references. Does that make sense?<br>
    </div>
  </blockquote>
  <div><br>
  </div>
  <div>Unfortunately, when I try to do this, the function verifier
reports the function as broken. It requires that the argument to
llvm.gcroot be a pointer to an alloca of a pointer. I can't fool it
with casts.<br>
  </div>
  </div>
</blockquote>
Oops, I wasn't specific enough. Marking an alloca of a value type
indeed won't work, as you noticed. Put differently, the idea is that
value types and heap types are treated the same w.r.t. marking them
with gcroot, while the former is allocated using alloca and the latter
with your GC allocation routine. It's only during collection that you
have to make sure not to collect value types.<br>
<br>
  // Some value type<br>
  %struct.V = type { i32, float, i8* }<br>
<br>
  // Allocate space for a pointer to a V instance, which we mark as GC
root<br>
  %v = alloca %struct.V*, align 8                 ; <%struct.V**>
[#uses=2]<br>
  %0 = bitcast %struct.V** %v to i8**             ; <i8**>
[#uses=1]<br>
  call void @llvm.gcroot(i8** %0, i8* null)<br>
<br>
  // Allocate the V instance on the stack and store it's address in the
root<br>
  %1 = alloca %struct.V, align 4                  ; <%struct.V*>
[#uses=3]<br>
  store %struct.V* %1, %struct.V** %v, align 8<br>
<br>
<br>
Paul<br>
</body>
</html>