Re: Dynamically choosing the main function

2017-11-13 Thread Brandon Allbery
On Mon, Nov 13, 2017 at 2:46 AM, Harendra Kumar 
wrote:

> Also, the symbols are anyway exposed to the users, we just ask the users
> to not look at those.
>

Only if you built a dynamic executable, or built for debugging. Default
static executables are stripped.

-- 
brandon s allbery kf8nh   sine nomine associates
allber...@gmail.com  ballb...@sinenomine.net
unix, openafs, kerberos, infrastructure, xmonadhttp://sinenomine.net
___
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs


Re: Dynamically choosing the main function

2017-11-12 Thread Harendra Kumar
On 13 November 2017 at 03:47, Ben Gamari  wrote:

> Harendra Kumar  writes:
>
> > On 12 November 2017 at 23:18, Ben Gamari  wrote:
> >
> >> In general it's not easy to get a reference to a an arbitrary function
> >> in an object file by it's source name. Unless the symbol is exported the
> >> compiler is free to optimize the function or even drop it altogether.
> >>
> >
> > I understand that. I was also wondering if there is way (some sort of
> > annotation, pragma or any other workaround) to keep the symbols around
> > without actually exporting them.  Exporting either clobbers the module
> > interface from user point of view or the modules need a wrapper to avoid
> > exporting such symbols in user exposed modules. I would also expect an
> > option to remove the effect of any such annotation so that the production
> > build is not under optimized because of this. This is in fact one of the
> > problems that I have been facing in general. I do not know of a good way
> to
> > hide symbols from users but use them in tests and benchmarks during dev.
> > What is the GHC recommended way to achieve this?
> >
> The usual way of dealing with this is to expose the symbols from a
> `.Internal` module.
>

That's what I meant when I referred to a wrapper module above. However, it
requires you to create two modules even if one extra symbol is needed for
dev purposes, a lot of boilerplate for a simple thing. Also, the symbols
are anyway exposed to the users, we just ask the users to not look at
those. I am wondering if using a preprocessor (CPP) conditional around the
optional exports is a better way then, you will have to build differently
but you won't have to create another module and expose extra symbols?

-harendra
___
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs


Re: Dynamically choosing the main function

2017-11-12 Thread Ben Gamari
Harendra Kumar  writes:

> On 12 November 2017 at 23:18, Ben Gamari  wrote:
>
>> In general it's not easy to get a reference to a an arbitrary function
>> in an object file by it's source name. Unless the symbol is exported the
>> compiler is free to optimize the function or even drop it altogether.
>>
>
> I understand that. I was also wondering if there is way (some sort of
> annotation, pragma or any other workaround) to keep the symbols around
> without actually exporting them.  Exporting either clobbers the module
> interface from user point of view or the modules need a wrapper to avoid
> exporting such symbols in user exposed modules. I would also expect an
> option to remove the effect of any such annotation so that the production
> build is not under optimized because of this. This is in fact one of the
> problems that I have been facing in general. I do not know of a good way to
> hide symbols from users but use them in tests and benchmarks during dev.
> What is the GHC recommended way to achieve this?
>
The usual way of dealing with this is to expose the symbols from a
`.Internal` module.

>> If you can guarantee that the functions you are about are exported then
>> in principle you could probably do what you ask from a library. Just
>> `dlopen` the executable (which would need to be compiled as a position
>> independent exectuable), and dlsym the appropriately mangled name.
>>
>
> Yeah that is a good option for dynamically linked executables. In fact I
> have been using dlopen to implement Haskell plugins but did not think of
> using it for this use case. Thanks for reminding me. In a static
> executable, does it make sense to make the RTS choose an exported symbol as
> entry point using an RTS option?
>
I don't see much precedent for this in other compilers. Moreover, I am
generally not convinced that it should be the compiler's job to provide
such a feature when the same end could be reached with far less magic by
the user.

Cheers,

- Ben


signature.asc
Description: PGP signature
___
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs


Re: Dynamically choosing the main function

2017-11-12 Thread Harendra Kumar
On 13 November 2017 at 00:29, Saurabh Nanda  wrote:

> > In fact I have been using dlopen to implement Haskell plugins but did
> not think of using it for this use case.
>
> Absolutely OT. Is this technique different from what facebook/simonmar
> have recently open-sourced? Please blog about it.
>

 Take a look at this: http://hackage.haskell.org/package/plugins

-harendra
___
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs


Re: Dynamically choosing the main function

2017-11-12 Thread Saurabh Nanda
> In fact I have been using dlopen to implement Haskell plugins but did not
think of using it for this use case.

Absolutely OT. Is this technique different from what facebook/simonmar have
recently open-sourced? Please blog about it.

-- Saurabh.




-harendra


___
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
___
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs


Re: Dynamically choosing the main function

2017-11-12 Thread Harendra Kumar
On 12 November 2017 at 23:18, Ben Gamari  wrote:

> Harendra Kumar  writes:
>
> > Hi,
> >
> > GHC allows choosing a main function at link time using the "-main-is"
> > option. I was wondering if there is a possibility to choose the main
> > function at runtime. Or even better, if something equivalent to "ghc -e"
> > is somehow possible in a linked binary executable. If not, are there any
> > plans to achieve something like that in future? Are there any
> theoretical,
> > practical obstacles to that?
> >
> In general it's not easy to get a reference to a an arbitrary function
> in an object file by it's source name. Unless the symbol is exported the
> compiler is free to optimize the function or even drop it altogether.
>

I understand that. I was also wondering if there is way (some sort of
annotation, pragma or any other workaround) to keep the symbols around
without actually exporting them.  Exporting either clobbers the module
interface from user point of view or the modules need a wrapper to avoid
exporting such symbols in user exposed modules. I would also expect an
option to remove the effect of any such annotation so that the production
build is not under optimized because of this. This is in fact one of the
problems that I have been facing in general. I do not know of a good way to
hide symbols from users but use them in tests and benchmarks during dev.
What is the GHC recommended way to achieve this?


> If you can guarantee that the functions you are about are exported then
> in principle you could probably do what you ask from a library. Just
> `dlopen` the executable (which would need to be compiled as a position
> independent exectuable), and dlsym the appropriately mangled name.
>

Yeah that is a good option for dynamically linked executables. In fact I
have been using dlopen to implement Haskell plugins but did not think of
using it for this use case. Thanks for reminding me. In a static
executable, does it make sense to make the RTS choose an exported symbol as
entry point using an RTS option?

-harendra
___
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs


Re: Dynamically choosing the main function

2017-11-12 Thread Brandon Allbery
On Sun, Nov 12, 2017 at 11:18 AM, Harendra Kumar 
wrote:

> GHC allows choosing a main function at link time using the "-main-is"
> option. I was wondering if there is a possibility to choose the main
> function at runtime. Or even better, if something equivalent to "ghc -e"
> is somehow possible in a linked binary executable. If not, are there any
> plans to achieve something like that in future? Are there any theoretical,
> practical obstacles to that?
>

-e is just running the compiler's bytecode backend on an expression from
the command line instead of a declaration from a file. It's not related to
this.

I might point out that this is not at all common from any language. A
limited (and Unix-specific) mechanism is to have main pick from a list of
fixed operating modes based on the program's basename, which can be set in
the filesystem by making a hard link to the executable with a different
basename.

-- 
brandon s allbery kf8nh   sine nomine associates
allber...@gmail.com  ballb...@sinenomine.net
unix, openafs, kerberos, infrastructure, xmonadhttp://sinenomine.net
___
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs


Re: Dynamically choosing the main function

2017-11-12 Thread Ben Gamari
Harendra Kumar  writes:

> Hi,
>
> GHC allows choosing a main function at link time using the "-main-is"
> option. I was wondering if there is a possibility to choose the main
> function at runtime. Or even better, if something equivalent to "ghc -e"
> is somehow possible in a linked binary executable. If not, are there any
> plans to achieve something like that in future? Are there any theoretical,
> practical obstacles to that?
>
In general it's not easy to get a reference to a an arbitrary function
in an object file by it's source name. Unless the symbol is exported the
compiler is free to optimize the function or even drop it altogether.

If you can guarantee that the functions you are about are exported then
in principle you could probably do what you ask from a library. Just
`dlopen` the executable (which would need to be compiled as a position
independent exectuable), and dlsym the appropriately mangled name.

Either way, I don't think think this request is in scope for the
compiler.

Cheers,

- Ben


signature.asc
Description: PGP signature
___
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs


Re: Dynamically choosing the main function

2017-11-12 Thread Harendra Kumar
For example, I can easily define entry points for arbitrary functions. At
run time I can choose which entry point to call and benchmark that entry
point using existing performance benchmarking tools like the very powerful
and comprehensive "perf" tool on linux. This provides a very powerful way
to analyze the performance for free and in a convenient manner with little
instrumentation. I do not want the main entry point to be clobbered for
such things. Ideally I would just use a simple annotation for any arbitrary
function to convert it into an entry point that can be chosen at runtime. I
am just giving a general idea here without going into specifics.

-harendra

On 12 November 2017 at 21:58, Shea Levy  wrote:

> What would you be able to achieve with this that you couldn't achieve
> with branching in a fixed custom main function?
>
> Thanks,
> Shea
>
> Harendra Kumar  writes:
>
> > Hi,
> >
> > GHC allows choosing a main function at link time using the "-main-is"
> > option. I was wondering if there is a possibility to choose the main
> > function at runtime. Or even better, if something equivalent to "ghc -e"
> > is somehow possible in a linked binary executable. If not, are there any
> > plans to achieve something like that in future? Are there any
> theoretical,
> > practical obstacles to that?
> >
> > Thanks,
> > Harendra
> > ___
> > ghc-devs mailing list
> > ghc-devs@haskell.org
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
>
___
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs


Re: Dynamically choosing the main function

2017-11-12 Thread Shea Levy
What would you be able to achieve with this that you couldn't achieve
with branching in a fixed custom main function?

Thanks,
Shea

Harendra Kumar  writes:

> Hi,
>
> GHC allows choosing a main function at link time using the "-main-is"
> option. I was wondering if there is a possibility to choose the main
> function at runtime. Or even better, if something equivalent to "ghc -e"
> is somehow possible in a linked binary executable. If not, are there any
> plans to achieve something like that in future? Are there any theoretical,
> practical obstacles to that?
>
> Thanks,
> Harendra
> ___
> ghc-devs mailing list
> ghc-devs@haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs


signature.asc
Description: PGP signature
___
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs


Dynamically choosing the main function

2017-11-12 Thread Harendra Kumar
Hi,

GHC allows choosing a main function at link time using the "-main-is"
option. I was wondering if there is a possibility to choose the main
function at runtime. Or even better, if something equivalent to "ghc -e"
is somehow possible in a linked binary executable. If not, are there any
plans to achieve something like that in future? Are there any theoretical,
practical obstacles to that?

Thanks,
Harendra
___
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs