Future behaviour of -femit-templates
Iain Buclaw
ibuclaw at ubuntu.com
Fri Nov 15 11:15:16 PST 2013
In the past, -femit-templates was a bit of an obtuse
implementation.
You had quite a few options:
- none -> don't emit any templates
- all -> force emit all templates, even ones that were
discarded by the front-end / had problems instantiating but were
gagged.
- private -> same as 'all', but emit them privately rather than
weak for targets that didn't support.
- normal -> emit (subjective to whether or not the backend
infers that it is referenced) this symbol if the front-end tells
us to.
- auto -> either 'normal' or 'private' depending on if the
target supported weak.
This was a bit hairy to work with, as any bug fixes around
emission problems could have had a knock-on effect that breaks
the other switches. So for the sake of simplicity - I removed
'all' and 'auto' and kept just the three behaviours. The default
being 'normal' unless -femit-templates/-fno-emit-templates was
used, then the compiler either emitted everything privately, or
nothing at all. The fact that this was kept around at all was
because there were still some problems with the gcc backend
removing functions from the compilation it deemed unreferenced
and uneeded, but had their address taken nonetheless causing all
sorts of undefined linker errors in certain edge cases.
In gcc-4.9, we now have a way to override gcc's symbol
elimitation via cgraph(decl)->forced_by_abi. Along with the
front-end's new template emission behaviour and an -allinst
switch to turn on the pre-2.064 release behaviour, this has given
us another opportunity to change and clean-up -femit-templates.
This is the score:
- Default behaviour is the same as in D 2.064
- -femit-templates is mapped to -allinst, all special code
removed from the glue.
- -fno-emit-templates still means that no instantiated templates
will be emitted to object file.
With that, we no longer require any special-case analysis of the
front-end codegen [¹][²][³]
So, no more hacks in the front-end, the ability to switch between
pre-2.064 and 2.064 template instantiation behaviour, and having
a peace of mind that the compiler will emit what it's told to
emit. You'd think it's all looking good, wouldn't you... :o)
[1]: https://github.com/D-Programming-Language/dmd/pull/2723
[2]:
https://github.com/D-Programming-GDC/GDC/blob/master/gcc/d/dfrontend/template.c#L5142
[3]:
https://github.com/D-Programming-GDC/GDC/blob/master/gcc/d/dfrontend/template.c#L5171
More information about the D.gnu
mailing list