Eigenstate: myrddin-dev mailing list

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Out-of-bounds error when printing out a function value


On Tue, 5 Dec 2017 14:58:22 +0800, nml <arumakanil@xxxxxxxxx> wrote:

> FWIW
> I tried to add the & operator beside the _start:
>    std.put("_start = {x}\n", &_start)
> 
> It no longer shows out-of-bounds error but the printed value is still
> confusing.
> 
> An equivalent C program prints exactly the value of the symbol shown by nm.
> Not sure if there is a difference between C and Myrddin regarding this
> example or I made some mistakes.

Myrddin is a different from C when it comes to passing functions. When
you have a function variable, the type is equivalent to the following C
type:

	struct fptr {
		void *env;
		void (*fn)();
	};

The environment is passed to the function in the case of %rax. Inside
the compiler, the global function symbols get promoted to a closure
when they get used:

	const fp = (struct fptr){.env=NULL, .fn=_start};

So, as with slices, to get the 'base', you cast to a pointer:

	std.put("p = {}\n", (_start : void#))

For an example of closure frobbing, take a look at lib/std/fndup.myr.

Also, you'll want to pull the most recent mc -- I just fixed a bug
that this code triggers, where it treats the local extern const as
a local variable instead of a global one.


> Hopefully, it's not too stupid.
> 
> On 5 December 2017 at 14:36, nml <arumakanil@xxxxxxxxx> wrote:
> 
> > The following program:
> >
> >    use std
> >    const main = {
> >            extern const _start : (->void)
> >            std.put("_start = {x}\n", _start)
> >    }
> >
> > Output:
> >    Building
> >     6m -I /lib/myr in.myr     ld -o a.out /lib/myr/_myrrt.o in.o -lstd
> > -L/lib/myr -lsys    0x000000000041150d: out of bounds access Internal
> > error: /a.out: exited with signal 31
> >
> > Looks like a bug. I expected that the value shown by nm is printed.
> >
> > --
> > mura
> >
> >
> >


-- 
    Ori Bernstein

References:
Out-of-bounds error when printing out a function valuenml <arumakanil@xxxxxxxxx>
Re: Out-of-bounds error when printing out a function valuenml <arumakanil@xxxxxxxxx>