Re: [julia-users] Access stack frame address?

2016-03-30 Thread Yichao Yu
On Mar 30, 2016 6:21 PM, "Laurent Bartholdi" 
wrote:
>
> Hi,
> Is there a way to obtain the address of the current stack frame (the ebp
register on x86 processors)?
>
> In GCC, there's the bultin primitive __builtin_frame_address() that does
precisely that.

Why do you want this?

>
> Many thanks in advance, Laurent


Re: [julia-users] Access stack frame address?

2016-03-30 Thread Yichao Yu
On Mar 30, 2016 6:22 PM, "Yichao Yu"  wrote:
>
>
> On Mar 30, 2016 6:21 PM, "Laurent Bartholdi" 
wrote:
> >
> > Hi,
> > Is there a way to obtain the address of the current stack frame (the
ebp register on x86 processors)?
> >
> > In GCC, there's the bultin primitive __builtin_frame_address() that
does precisely that.
>
> Why do you want this?
>

It's possible but should not be done in general.

> >
> > Many thanks in advance, Laurent


Re: [julia-users] Access stack frame address?

2016-03-31 Thread Laurent Bartholdi
Thanks for the quick reply! Yes, that would be wonderful.

I want to interface to a library that has its own garbage collection; that 
library walks the stack to find potential objects that must be kept alive. 
Therefore, all calls to that library must be done in the form
  library_global_StackBottomBags = __builtin_frame_address(0);
  library_function(...)


On Thursday, 31 March 2016 00:25:13 UTC+2, Yichao Yu wrote:
>
>
> On Mar 30, 2016 6:22 PM, "Yichao Yu" > 
> wrote:
> >
> >
> > On Mar 30, 2016 6:21 PM, "Laurent Bartholdi"  > wrote:
> > >
> > > Hi,
> > > Is there a way to obtain the address of the current stack frame (the 
> ebp register on x86 processors)?
> > >
> > > In GCC, there's the bultin primitive __builtin_frame_address() that 
> does precisely that.
> >
> > Why do you want this?
> >
>
> It's possible but should not be done in general.
>
> > >
> > > Many thanks in advance, Laurent
>


Re: [julia-users] Access stack frame address?

2016-03-31 Thread Yichao Yu
On Thu, Mar 31, 2016 at 5:23 AM, Laurent Bartholdi
 wrote:
> Thanks for the quick reply! Yes, that would be wonderful.
>
> I want to interface to a library that has its own garbage collection; that
> library walks the stack to find potential objects that must be kept alive.
> Therefore, all calls to that library must be done in the form
>   library_global_StackBottomBags = __builtin_frame_address(0);
>   library_function(...)


OK, this is a reasonable use case if the library requires this
It's a weird API though.

You can use llvm intrinsics to do that. This is basically how
`__builtin_frame_address` is implemented in clang.

julia> function f()
   Base.llvmcall(("""
  declare i8 *@llvm.frameaddress(i32)
  """, """
  %1 = call i8 *@llvm.frameaddress(i32 0)
  ret i8 *%1
  """), Ptr{UInt8}, Tuple{})
   end
f (generic function with 1 method)

julia> f()
Ptr{UInt8} @0x7ffecb9a3130



>
>
> On Thursday, 31 March 2016 00:25:13 UTC+2, Yichao Yu wrote:
>>
>>
>> On Mar 30, 2016 6:22 PM, "Yichao Yu"  wrote:
>> >
>> >
>> > On Mar 30, 2016 6:21 PM, "Laurent Bartholdi" 
>> > wrote:
>> > >
>> > > Hi,
>> > > Is there a way to obtain the address of the current stack frame (the
>> > > ebp register on x86 processors)?
>> > >
>> > > In GCC, there's the bultin primitive __builtin_frame_address() that
>> > > does precisely that.
>> >
>> > Why do you want this?
>> >
>>
>> It's possible but should not be done in general.
>>
>> > >
>> > > Many thanks in advance, Laurent


Re: [julia-users] Access stack frame address?

2016-03-31 Thread Yichao Yu
On Thu, Mar 31, 2016 at 7:52 AM, Yichao Yu  wrote:
> On Thu, Mar 31, 2016 at 5:23 AM, Laurent Bartholdi
>  wrote:
>> Thanks for the quick reply! Yes, that would be wonderful.
>>
>> I want to interface to a library that has its own garbage collection; that
>> library walks the stack to find potential objects that must be kept alive.
>> Therefore, all calls to that library must be done in the form
>>   library_global_StackBottomBags = __builtin_frame_address(0);
>>   library_function(...)
>
>
> OK, this is a reasonable use case if the library requires this
> It's a weird API though.
>
> You can use llvm intrinsics to do that. This is basically how
> `__builtin_frame_address` is implemented in clang.
>
> julia> function f()
>Base.llvmcall(("""
>   declare i8 *@llvm.frameaddress(i32)
>   """, """
>   %1 = call i8 *@llvm.frameaddress(i32 0)
>   ret i8 *%1
>   """), Ptr{UInt8}, Tuple{})
>end
> f (generic function with 1 method)
>
> julia> f()
> Ptr{UInt8} @0x7ffecb9a3130
>

Note that this is 0.5 only.

You can hack sth to work on 0.4

```
julia> f(p) = p
f (generic function with 1 method)

julia> g() = ccall(cfunction(f, Ptr{Void}, Tuple{Ptr{Void}}),
Ptr{Void}, (Ptr{Int},), &1)
g (generic function with 1 method)

julia> g()
Ptr{Void} @0x7ffe4ec24920
```

>
>
>>
>>
>> On Thursday, 31 March 2016 00:25:13 UTC+2, Yichao Yu wrote:
>>>
>>>
>>> On Mar 30, 2016 6:22 PM, "Yichao Yu"  wrote:
>>> >
>>> >
>>> > On Mar 30, 2016 6:21 PM, "Laurent Bartholdi" 
>>> > wrote:
>>> > >
>>> > > Hi,
>>> > > Is there a way to obtain the address of the current stack frame (the
>>> > > ebp register on x86 processors)?
>>> > >
>>> > > In GCC, there's the bultin primitive __builtin_frame_address() that
>>> > > does precisely that.
>>> >
>>> > Why do you want this?
>>> >
>>>
>>> It's possible but should not be done in general.
>>>
>>> > >
>>> > > Many thanks in advance, Laurent


Re: [julia-users] Access stack frame address?

2016-03-31 Thread Laurent Bartholdi
Thanks a lot! That works perfectly!

Closed.

On Thu, Mar 31, 2016, 14:08 Yichao Yu  wrote:

> On Thu, Mar 31, 2016 at 7:52 AM, Yichao Yu  wrote:
> > On Thu, Mar 31, 2016 at 5:23 AM, Laurent Bartholdi
> >  wrote:
> >> Thanks for the quick reply! Yes, that would be wonderful.
> >>
> >> I want to interface to a library that has its own garbage collection;
> that
> >> library walks the stack to find potential objects that must be kept
> alive.
> >> Therefore, all calls to that library must be done in the form
> >>   library_global_StackBottomBags = __builtin_frame_address(0);
> >>   library_function(...)
> >
> >
> > OK, this is a reasonable use case if the library requires this
> > It's a weird API though.
> >
> > You can use llvm intrinsics to do that. This is basically how
> > `__builtin_frame_address` is implemented in clang.
> >
> > julia> function f()
> >Base.llvmcall(("""
> >   declare i8 *@llvm.frameaddress(i32)
> >   """, """
> >   %1 = call i8 *@llvm.frameaddress(i32 0)
> >   ret i8 *%1
> >   """), Ptr{UInt8}, Tuple{})
> >end
> > f (generic function with 1 method)
> >
> > julia> f()
> > Ptr{UInt8} @0x7ffecb9a3130
> >
>
> Note that this is 0.5 only.
>
> You can hack sth to work on 0.4
>
> ```
> julia> f(p) = p
> f (generic function with 1 method)
>
> julia> g() = ccall(cfunction(f, Ptr{Void}, Tuple{Ptr{Void}}),
> Ptr{Void}, (Ptr{Int},), &1)
> g (generic function with 1 method)
>
> julia> g()
> Ptr{Void} @0x7ffe4ec24920
> ```
>
> >
> >
> >>
> >>
> >> On Thursday, 31 March 2016 00:25:13 UTC+2, Yichao Yu wrote:
> >>>
> >>>
> >>> On Mar 30, 2016 6:22 PM, "Yichao Yu"  wrote:
> >>> >
> >>> >
> >>> > On Mar 30, 2016 6:21 PM, "Laurent Bartholdi" 
> >>> > wrote:
> >>> > >
> >>> > > Hi,
> >>> > > Is there a way to obtain the address of the current stack frame
> (the
> >>> > > ebp register on x86 processors)?
> >>> > >
> >>> > > In GCC, there's the bultin primitive __builtin_frame_address() that
> >>> > > does precisely that.
> >>> >
> >>> > Why do you want this?
> >>> >
> >>>
> >>> It's possible but should not be done in general.
> >>>
> >>> > >
> >>> > > Many thanks in advance, Laurent
>
-- 
Laurent Bartholdi
DMA, École Normale Supérieure, 45 rue d'Ulm, 75005 Paris. +33 14432 2060
Mathematisches Institut, Universität Göttingen, Bunsenstrasse 3-5, D-37073
Göttingen. +49 551 39 7826