On Thu, 28 Aug 2014, Kito Cheng wrote:

> Hi Richard:
> 
> >> -fno-builtin is seem not only for the c family front-end, but also
> >> used in LTO now, so move it to common.opt and change it to `Common`.
> >
> > Please leave it in c-family and just add LTO to the set of supported
> > languages.  -fno-builtin isn't meaningful for other frontends
> > and we just happen to use the flag.
> > If then it makes more sense to move -fhosted and -ffreestanding
> > though I don't know how meaningful those are for other frontends.
> >
> > Or create a "proper" flag to communicate that the middle-end
> > should avoid creating new calls to builtins at all cost
> > (well, that's really what -ffreestanding is about).
> 
> -fno-builtin is meaningless for other front-end but middle-end,

Well, I wouldn't say that.

> However `-fno-builtin` is more explicit than -fhosted and  -ffreestanding,
> when people see the option `-fno-builtin`, they will know what this
> option mean "do not use builtin implicitly", and most important
>  -fno-builtin is more well known than -fhosted or -ffreestanding.

But builtins _are_ used implicitely regardless of -fno-builtin!
At least memcpy, memmove and memset are.

> and the flag_no_builtin is already used in gcc/lto/lto-lang.c:def_builtin_1,
> so my patch is not first user of this option in LTO front-end.

Yeah, but nothing sets that flag in LTO so it is always zero
(so the use is bogus).

It's also that setting that flag dependent on a "merged" -fno-builtin
will break TUs that use builtins.  So I fear it's not that easy.
Hmm.

I don't like all those tri-state options but I guess it would
make sense to have for -ftree-loop-distribute-patterns for this
case (to note it's disabled by -ffreestanding/-fno-builtin).

That said - the whole way we handle option merging in LTO is
somewhat broken and this is just an example where the current
hacky scheme breaks down.

So maybe instead finally fix LTO option merging?

There were two ideas floating around - first is to annotate
all functions with option and target attributes as coming
in from the individual TUs, second is to do LTRANs partitioning
based on options and thus have different "global" options for
different LTRANS units.

Note that for selected options we already annotate struct function
(like for -fnon-call-exceptions), eventually annotating struct
function is more sensible than optimize or target attributes.

The question remains what to do with the options explicitely
specified at link time - this probably means we need to continue
to distinguish flags we have to conservatively carry over from
compile-phase and those we can safely override.

Both above ideas mean that option processing would mostly move from
lto-wrapper to lto1 (WPA phase), maybe apart from computing a
default optimization level in case there was none specified at
link time.

Maybe you have time working towards this?  A first step would be
to move most of the option merging code from lto-wrapper to
lto1.

Richard.

Reply via email to