[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 18:48:48 PDT 2016


> On 2016-Jul-13, at 11:18, Vedant Kumar <vsk at apple.com> wrote:
> 
>> 
>> On Jul 13, 2016, at 10:30 AM, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
>> 
>> 
>>> 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?
> 
> SHAVE::Assembler is the only other tool which expects to deal with exactly one
> input with type TY_PP_Asm. However, not all implementations of ConstructJob()
> require or compute effective triples. In this case, the SHAVE assembler doesn't
> use effective triples, so the way we compute them in BuildJobsForActionNoCache()
> can't alter its behavior.
> 
> ISTM that the patch as-written doesn't change the effective triples seen by
> Tools which actually require effective triples. So, I think I spoke too soon
> when I said this is a behavior change!
> 
> To recap: We only pass InputInfos[0].getType() to ComputeEffectiveClangTriple()
> when there's a single InputInfo. This can only break implementations which (1)
> actually use effective triples and (2) have custom triple-creation code which
> *always* expects InputType to be TY_INVALID.
> 
> We don't have any implementations like that in tree.

Okay, this seems like a great cleanup then.  LGTM.

> 
> vedant
> 
>>> 
>>> 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