[cfe-dev] Why clang needs to fork into itself?

Richard Smith metafoo at gmail.com
Wed Jan 29 12:40:38 PST 2014


On Wed Jan 29 2014 at 11:37:22 AM, Alp Toker <alp at nuanti.com> wrote:

>
> On 29/01/2014 18:15, Ted Kremenek wrote:
> > On Jan 29, 2014, at 9:55 AM, Richard Smith <metafoo at gmail.com
> > <mailto:metafoo at gmail.com>> wrote:
> >
> >> On Wed Jan 29 2014 at 12:35:23 AM, Ted Kremenek <kremenek at apple.com
> >> <mailto:kremenek at apple.com>> wrote:
> >>
> >>     On Jan 28, 2014, at 11:58 PM, Richard Smith
> >>     <richard at metafoo.co.uk <mailto:richard at metafoo.co.uk>> wrote:
> >>
> >>>     That said, most users of the compiler don't actually *want* a
> >>>     driver. They want just a .c* -> .o compiler, not a
> >>>     multi-source-file cross-language compiler + assembler + linker +
> >>>     kitchen sink, and it makes sense to me to optimize for the
> >>>     single-source, -c case.
> >>
> >>     I don't really know if it matters what most users "want." We
> >>     still need to support the kitchen sink model; it's never going to
> >>     go away.
> >>
> >>
> >> I think it does matter, because it helps us set our priorities. In
> >> particular, if we can make single-source -c builds measurably faster,
> >> that has benefits for a lot of users, even if we leave all other
> >> modes alone.
> >>
> >>     By "optimize", what specifically do you propose/suggest?
> >>
> >>
> >> Nothing concrete, merely that we shouldn't dismiss this out of hand.
> >> For instance, if we can tell people to run -c --disable-fork for a
> >> measurable speedup (with a corresponding degradation in crash
> >> recovery), that might be valuable to some.
> >
> > I agree that making single source builds faster is a case worth
> > optimizing.
>
> Hi Richard, Ted,
>
> I have a very simple solution to get started with:
>
> + bool TryInProcess = getArgs().hasArg(options::OPT_
> fno_crash_diagnostics);
> + if (TryInProcess && C.getExecutable() ==
> getDriver().getClangProgramPath()) {
> + const ArgStringList &Arguments = C.getArguments();
> ...
> + Res = main(Argv.size() - 1, Argv.data());
> + } else
>
> This passes all but one of the tests (which appears to be a genuine bug
> in the preprocessor that I'm looking to fix now).
>
> All -cc1, -cc1as, -E and a couple of other invocations get run
> in-process with no apparent regressions.
>
> This setup parallels the way we skip expensive checks in Parse and Sema
> when we know a diagnostic is ignored and it shouldn't have any
> observable effect to the user other than fewer PIDs and invocations.
>
> I'd like to move forward with this so we can start to experiment with
> in-process operation focusing on the single input case Richard mentioned.
>
> It's not particularly hi-tech, but that's what makes it kind of neat.
> What do you think?
>

I'd be surprised if it works as-is (I'd expect we have globals that
misbehave when treated this way). Also, invoking 'main' in this way is
ill-formed, so we'd need to extract a 'clang_recursive_main' or similar
(and mark it __attribute__((weak)) so we don't require tools to provide it).

This seems like a good way forward for extracting performance numbers, and
on the basis of those we can decide if this is worth pursuing. I don't
think it's worth upstreaming until you have such numbers (maybe you could
mail out a patch so interested parties can profile it?).


> Alp.
>
>
> >
> >>     Even the .c -> .o compiler benefits from process isolation for
> >>     the purpose of crash reporting. Perhaps there are alternate
> >>     solutions for reporting crashes, but they are a bit speculative
> >>     at this point.
> >>
> >>     I also haven't seen any numbers mentioned on this thread that
> >>     justify "optimizing" anything, at least from a performance
> >>     perspective. I'm not saying there isn't a possible performance
> >>     win here by eliminating the posix_spawn call, but that hasn't
> >>     been justified yet (or if it has, I apologize that I haven't seen
> >>     it). Or perhaps this discussion isn't about optimizing
> >>     performance, but refining the driver design. In that case, it's
> >>     not clear to me what specific problems are being tackled here
> >>     other than possibly making the compiler a little easier to debug
> >>     or profile.
> >>
> >>
> >> I think the changes proposed on this thread will make the driver
> >> design more complex. I'd also like to see some numbers.
> >
> > Agreed.
> >
> >
> > _______________________________________________
> > cfe-dev mailing list
> > cfe-dev at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
> --
> http://www.nuanti.com
> the browser experts
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20140129/c7a002b5/attachment.html>


More information about the cfe-dev mailing list