[PATCH] D22290: [PATCH 2/2] [Driver] Compute effective target triples once per job (NFCI)
Duncan P. N. Exon Smith via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 13 10:30:12 PDT 2016
> On 2016-Jul-12, at 18:59, Vedant Kumar <vsk at apple.com> wrote:
>
>>
>> On Jul 12, 2016, at 6:23 PM, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
>>
>>
>>> On 2016-Jul-12, at 17:47, Vedant Kumar <vsk at apple.com> wrote:
>>>
>>>
>>>> On Jul 12, 2016, at 5:41 PM, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
>>>>
>>>>
>>>>> On 2016-Jul-12, at 16:53, Vedant Kumar <vsk at apple.com> wrote:
>>>>>
>>>>> vsk created this revision.
>>>>> vsk added a reviewer: dexonsmith.
>>>>> vsk added a subscriber: cfe-commits.
>>>>> Herald added subscribers: srhines, danalbert, tberghammer, aemerson.
>>>>>
>>>>> Compute an effective target triple exactly once in ConstructJob(), and
>>>>> then simply pass around const references to it. This eliminates wasteful
>>>>> re-computation of effective triples (e.g in getARMFloatABI()).
>>>>>
>>>>> http://reviews.llvm.org/D22290
>>>>>
>>>>> Files:
>>>>> include/clang/Driver/SanitizerArgs.h
>>>>> include/clang/Driver/Tool.h
>>>>> include/clang/Driver/ToolChain.h
>>>>> lib/Driver/Driver.cpp
>>>>> lib/Driver/SanitizerArgs.cpp
>>>>> lib/Driver/ToolChain.cpp
>>>>> lib/Driver/ToolChains.cpp
>>>>> lib/Driver/ToolChains.h
>>>>> lib/Driver/Tools.cpp
>>>>> lib/Driver/Tools.h
>>>>>
>>>>> <D22290.63757.patch>
>>>>
>>>>> Index: lib/Driver/Driver.cpp
>>>>> ===================================================================
>>>>> --- lib/Driver/Driver.cpp
>>>>> +++ lib/Driver/Driver.cpp
>>>>> @@ -2112,7 +2112,21 @@
>>>>> AtTopLevel, MultipleArchs),
>>>>> BaseInput);
>>>>>
>>>>> + llvm::Triple EffectiveTriple;
>>>>> + const ArgList &Args = C.getArgsForToolChain(TC, BoundArch);
>>>>> + if (InputInfos.size() != 1) {
>>>>> + EffectiveTriple = llvm::Triple(
>>>>> + T->getToolChain().ComputeEffectiveClangTriple(Args));
>>>>> + } else {
>>>>> + // Pass along the input type if it can be unambiguously determined.
>>>>> + EffectiveTriple =
>>>>> + llvm::Triple(T->getToolChain().ComputeEffectiveClangTriple(
>>>>> + Args, InputInfos[0].getType()));
>>
>> It looks to me like this could call InputInfos[0].getType() and pass it into ComputeEffectiveClangTriple in cases where previously the type-less overload (which defaults to types::TY_Invalid) would have been called.
>
> You're right that this is a behavior change!
>
> The site you identified below (in ComputeLLVMTriple()) looks like the only
> place where ComputeEffectiveClangTriple's output is affected by InputType.
>
>>
>> Previously, the type was only specified in ClangAs::ConstructJob. It only seems to make a difference for this logic in ToolChain::ComputeLLVMTriple:
>>
>> if ((InputType != types::TY_PP_Asm && Args.hasFlag(options::OPT_mthumb,
>> options::OPT_mno_thumb, ThumbDefault)) || IsMProfile) {
>> if (IsBigEndian)
>> ArchName = "thumbeb";
>> else
>> ArchName = "thumb";
>> }
>>
>> Is it possible that a single input file will be types::TY_PP_ASM for a caller other than ClangAs?
>> - If not, why not?
>> - If so, this looks like a behaviour change. Is that a bugfix, or a new bug?
>
> I'm not sure. I'll try and come up with a test that exposes a behavior change.
Okay, great.
>
>>
>>>>> + }
>>>>> +
>>>>> if (CCCPrintBindings && !CCGenDiagnostics) {
>>>>> + // FIXME: We should be able to use the effective triple here, but doing so
>>>>> + // breaks some multi-arch tests.
>>>>
>>>> This is interesting. Why does it break the tests?
>>>
>>> It breaks these two tests:
>>>
>>> test/Driver/darwin-dsymutil.c
>>> test/Driver/darwin-debug-version.c
>>>
>>> The tests expect "-ccc-print-bindings" to spit out a default triple, namely:
>>>
>>> x86_64-apple-darwin10
>>>
>>> Printing out the effective triple means we get this instead:
>>>
>>> x86_64-apple-macosx10.6.0
>>>
>>> There's some chance that the test is too strict. I'm planning on keeping this
>>> patch NFCI and following up with the test authors later.
>>
>> SGTM.
>>
>>>>
>>>>> llvm::errs() << "# \"" << T->getToolChain().getTripleString() << '"'
>>>>> << " - \"" << T->getName() << "\", inputs: [";
>>>>> for (unsigned i = 0, e = InputInfos.size(); i != e; ++i) {
>>>>> @@ -2122,7 +2136,7 @@
>>>>> }
>>>>> llvm::errs() << "], output: " << Result.getAsString() << "\n";
>>>>> } else {
>>>>> - T->ConstructJob(C, *JA, Result, InputInfos,
>>>>> + T->ConstructJob(C, *JA, Result, InputInfos, EffectiveTriple,
>>>>> C.getArgsForToolChain(TC, BoundArch), LinkingOutput);
>>>>
>>>> Why doesn't this have the same problem as above? I.e., what happens for
>>>> multi-arch cases?
>>>
>>> Methods which override ConstructJob used to call ComputeEffectiveClangTriple
>>> themselves, so they "expect" effective triples.
>>
>> Rather than adding the effective triple to all the argument lists, does it make sense to call T->setEffectiveTriple() or T->computeEffectiveTriple(DefaultTriple)?
>
> This gets a bit hairy because a Tool or ToolChain can outlive a single call to
> BuildJobsForActionNoCache(). That makes it hard to figure out exactly when a
> triple stored within one of these objects is invalidated.
>
> It doesn't help that BuildJobsForActionNoCache() and BuildJobsForAction() are
> mutually recursive...
>
> AFAICT effective triples should be passed around as arguments for the same
> reason the ArgList references are: they tend to change.
That makes sense. Thanks for explaining.
More information about the cfe-commits
mailing list