Cross-module inlining

Johannes Pfau via D.gnu d.gnu at puremagic.com
Mon Dec 1 10:21:00 PST 2014


Am Wed, 26 Nov 2014 17:19:25 +0000
schrieb "Iain Buclaw via D.gnu" <d.gnu at puremagic.com>:

> On 26 November 2014 at 15:40, Johannes Pfau via D.gnu
> <d.gnu at puremagic.com> wrote:
> > Has anybody had a closer look at cross-module inlining?
> > What exactly is necessary to get it working and how difficult would
> > it be to implement?
> >
> > AFAICS
> > * We'd need to do semantic3 on all imported modules
> > * We'd have to call (a modified) toObjfile on all functions from
> >   imported modules
> >
> > However, we of course can't emit the functions so could we mark them
> > as EXTERN? I've also tried to do that, but in non-toy examples
> > GDC always crashes somewhere. Do we also need to call toObjfile for
> > variables, classes, etc used in these functions (of course somehow
> > without emitting symbols)?
> >
> > All in all this seems to be a complicated task, correct?
> 
> As best as I can explain it:
> 
> - Inlining never occurs because there is no body (that has been
> converted to gcc).
> - The front-end knows the body, however semantic3 pass must be ran
> before attempting inline (in the front-end).
> - toObjFile performs the entire compilation in one swoop; generate
> body, add to cgraph/global decls and send to backend to compile.
> 
> I'm not sure of where you are getting the ICE/crash, but there is one
> or two scenarios:
> 
> 1) We only need the tree body to be available.
> 
> For inlining to occur, we only need part of what toObjFile already
> does for us.  Yes, generate the body, no do not add to the global
> decls/perform any finalisation for us.
> 
> We should not need to explicitly mark the function as EXTERN as it has
> been defined (it has a body).  But by not emitting the function to the
> backend, guarantees that the function won't appear in assembly.
> 
> 2) We need the body to be gimplified.
> 
> This is trickier.  Hopefully the gcc inline pass will do the
> gimplification for us.  But if that is not the case, then we are going
> to have to go about marking the function as EXTERN INLINE, send it to
> the backend for compilation - complicating our codegen routines in the
> process.

OK, we do have to call cgraph_node::finalize_function. And from tree.h:

 Note that this does not necessarily imply the entity represented by
 NODE has no program source-level definition in this translation unit.
 For example, for a FUNCTION_DECL, DECL_SAVED_TREE may be non-NULL and
 DECL_EXTERNAL may be true simultaneously; that can be the case for
 a C99 "extern inline" function.  */
#define DECL_EXTERNAL(NODE)



Here's a first try:
https://github.com/jpf91/GDC/commit/919efaa2246e2f56a021f57b0991476f82c8eee5

If you see some obvious problems, please comment ;-)
This is good enough for simple test cases, however, even importing
std.stdio crashes somewhere in the mangle code. Maybe I'll have to do
some of the checks in output_declaration_p for inlining as well.


More information about the D.gnu mailing list