chandlerc added inline comments.
================
Comment at: lib/Driver/ToolChains/Clang.cpp:592-595
+ if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
+ options::OPT_fomit_frame_pointer))
+ return A->getOption().matches(options::OPT_fno_omit_frame_pointer) ||
+ mustUseFramePointerForTarget(Triple);
----------------
tabloid.adroit wrote:
> chandlerc wrote:
> > tabloid.adroit wrote:
> > > chandlerc wrote:
> > > > This doesn't correctly handle "last-flag-wins". Consider the case of
> > > > `-mno-omit-leaf-frame-pointer -fomit-frame-pointer`. That should omit
> > > > the leaf frame pointer, but if I read this correctly the logic here
> > > > will use a leaf frame pointer.
> > > Updated test with this case along with some other cases.
> > >
> > > // RUN: %clang -### -S -Os -mno-omit-leaf-frame-pointer
> > > -fomit-frame-pointer %s 2>&1 | \
> > > // RUN: FileCheck --check-prefix=OMIT-ALL5 %s
> > > // OMIT-ALL5-NOT: "-mdisable-fp-elim"
> > > // OMIT-ALL5-NOT: "-momit-leaf-frame-pointer"
> > >
> > > This falls into lib/CodeGen/CGCall.cpp:1733, which causes
> > > TargetOptions::DisableFramePointerElim returns false for all frames.
> > >
> > >
> > Then I don't understand what this change is doing.
> >
> > This function, when called with arguments `-mno-omit-leaf-frame-pointer
> > -fomit-frame-pointer` will not hit the code you've added here, and will
> > instead return `true`. That doesn't seem like a sensible result given the
> > desired change to these flags. If something *else* is causing us to still
> > not use leaf frame pointers, that doesn't make the code here correct, it
> > makes me question how this works at all (and how we are testing it).
> I see your point here. The logic is very confusing indeed.
>
> It looks better if
> s/shouldUseFramePointer/addFlagDisableFPElim
> s/shouldUseLeafFramePointer/addFlagOmitLeafFramePointer
>
> to show that here only decides compiler flag instead of the final code.
>
> I think the correct way to handle these is to replace `-mdisable-fp-elim` and
> `-momit-leaf-frame-pointer` compiler flags with one, say
> `frame-pointer-model` = {KeepAll, OmitAll, KeepNonLeaf}, and let the driver
> decide `frame-pointer-model` here. The downside is that it affects compiler
> user unless we bridge deprecating flags on to new flag with some rules.
>
Those flags are in the "CC1" interface -- the internal interface between the
driver and the compiler internals. That interface has no stability requirements
and isn't something we support users leveraging directly.
So I think we could actually change this to be sensible in much the way you are
suggesting. Specifically, I would have `-frame-pointers={all,non-leaf,none}`.
And then all of the compatibility and mapping logic in the driver will resolve
to a very simple end result.
In code, I think we should follow a similar simplification where we have a
single function to determine the total strategy here, rather than the logic
being separated into multiple different functions.
Repository:
rC Clang
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D55915/new/
https://reviews.llvm.org/D55915
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits