On Wed, 24 Sep 2003, Leopold Toetsch wrote:
> Dan Sugalski <[EMAIL PROTECTED]> wrote:
>
> [ autorun of loaded byte code ]
>
> >>But how to pass arguments then? Init code might need some.
>
> > What arguments, though? This is just a chance to give the segment an
> > initialization run, nothing more.
>
> I don't. I don't know, what the autorun should initialize. Do you have
> examples, what is/will be accomplished in the init "sub".
The case that's triggering it for me is that I've got a library that I'm
loading up that does a lot of active initialization, but nothing else. (It
wraps the ncurses library) I want the thing to run when I load it so it
can install its symbols and then return back to the caller, having done
its thing.
> >> > Any objections, or shall I just make this happen?
> >>
> >>I think a more flexible way is a "magic label", or just "__init" which
> >>can be called explictely or even automatic - if such a label exists.
>
> > Ick. No magic labels like that. I'd rather set it so we start
> > executing at the beginning with some set parameters or something, and
> > for segments with no initialization they can just ret back out or
> > something. (I'm not sure full-on calling conventions are required
> > here, but then I'm not sure they aren't either)
>
> Why calling conventions if there are no parameter to pass in/out :-)
That's a good point -- okay, no parameters, you've convinced me! :-P
> Ok, the init code must return, so either "ret" or "invoke P1". But if
> there is nothing to be done for init, this is just wasting cycles and
> resources.
No, it isn't, not compared to the label check and dispatch. Either way
there's a cost, as we're either unconditionally dispatching then
returning, or we're scanning through the fixup sybol list for _init. (Or
we're burning cycles on each symbol as we resolve it at load time)
Given that we load each segment exactly once, I don't care that much about
the time any scheme takes, which means my dislike for magic labels takes
precedence. I'd be OK with a field in the segment header that marks the
offset of the init code, with a -1 meaning there is none. I think we can
live with the init code having to be in the first 2G of any code segment.
:)
> WRT magical symbols. It was already discussed (and I'm leaning to that),
> that the main entry to start execution is labeled "_main". (The register
> allocator should know, if a subroutine or main is called - at the very
> beginning all registers are clear and initialized. This allowes to emit
> unitialized warnings and better life analysis of registers.)
No, I don't think so. The languages we're targeting don't have a magic
function name that marks the start of execution--they just start at the
beginning and go.
Hrm. That does mean that we may want two entry points for a segment, the
init point and the run point. For perl, the two are the same, but for a
language like C they'd be different. I still dislike magic names, so I'd
prefer slots in the header. (Or, if we really, *really* must, attributes
on labels, but that seems like real overkill)
Dan