@@ -197,42 +197,46 @@ static void validateArgs(DiagnosticEngine &diags, const ArgList &Args) {
197
197
}
198
198
}
199
199
200
- // / Creates an appropriate ToolChain for a given driver and target triple.
201
- // /
202
- // / This uses a std::unique_ptr instead of returning a toolchain by value
203
- // / because ToolChain has virtual methods.
204
- static std::unique_ptr<const ToolChain>
205
- makeToolChain (Driver &driver, const llvm::Triple &target) {
200
+ std::unique_ptr<ToolChain>
201
+ Driver::buildToolChain (const llvm::opt::InputArgList &ArgList) {
202
+
203
+ if (const Arg *A = ArgList.getLastArg (options::OPT_target))
204
+ DefaultTargetTriple = llvm::Triple::normalize (A->getValue ());
205
+
206
+ const llvm::Triple target (DefaultTargetTriple);
207
+
206
208
switch (target.getOS ()) {
207
209
case llvm::Triple::Darwin:
208
210
case llvm::Triple::MacOSX:
209
211
case llvm::Triple::IOS:
210
212
case llvm::Triple::TvOS:
211
213
case llvm::Triple::WatchOS:
212
- return llvm::make_unique<toolchains::Darwin>(driver , target);
214
+ return llvm::make_unique<toolchains::Darwin>(* this , target);
213
215
break ;
214
216
case llvm::Triple::Linux:
215
217
if (target.isAndroid ()) {
216
- return llvm::make_unique<toolchains::Android>(driver , target);
218
+ return llvm::make_unique<toolchains::Android>(* this , target);
217
219
} else {
218
- return llvm::make_unique<toolchains::GenericUnix>(driver , target);
220
+ return llvm::make_unique<toolchains::GenericUnix>(* this , target);
219
221
}
220
222
break ;
221
223
case llvm::Triple::FreeBSD:
222
- return llvm::make_unique<toolchains::GenericUnix>(driver , target);
224
+ return llvm::make_unique<toolchains::GenericUnix>(* this , target);
223
225
break ;
224
226
case llvm::Triple::Win32:
225
- return llvm::make_unique<toolchains::Cygwin>(driver , target);
227
+ return llvm::make_unique<toolchains::Cygwin>(* this , target);
226
228
break ;
227
229
case llvm::Triple::Haiku:
228
- return llvm::make_unique<toolchains::GenericUnix>(driver , target);
230
+ return llvm::make_unique<toolchains::GenericUnix>(* this , target);
229
231
break ;
230
232
default :
231
- return nullptr ;
233
+ Diags.diagnose (SourceLoc (), diag::error_unknown_target,
234
+ ArgList.getLastArg (options::OPT_target)->getValue ());
235
+ break ;
232
236
}
237
+ return nullptr ;
233
238
}
234
239
235
-
236
240
static void computeArgsHash (SmallString<32 > &out, const DerivedArgList &args) {
237
241
SmallVector<const Arg *, 32 > interestingArgs;
238
242
interestingArgs.reserve (args.size ());
@@ -501,16 +505,13 @@ static void validateEmbedBitcode(DerivedArgList &Args, OutputInfo &OI,
501
505
}
502
506
}
503
507
504
- std::unique_ptr<Compilation> Driver::buildCompilation (
505
- ArrayRef<const char *> Args) {
508
+ std::unique_ptr<Compilation>
509
+ Driver::buildCompilation (const ToolChain &TC,
510
+ std::unique_ptr<llvm::opt::InputArgList> ArgList) {
506
511
llvm::PrettyStackTraceString CrashInfo (" Compilation construction" );
507
512
508
513
llvm::sys::TimePoint<> StartTime = std::chrono::system_clock::now ();
509
514
510
- std::unique_ptr<InputArgList> ArgList (parseArgStrings (Args.slice (1 )));
511
- if (Diags.hadAnyError ())
512
- return nullptr ;
513
-
514
515
// Claim --driver-mode here, since it's already been handled.
515
516
(void ) ArgList->hasArg (options::OPT_driver_mode);
516
517
@@ -552,36 +553,25 @@ std::unique_ptr<Compilation> Driver::buildCompilation(
552
553
std::unique_ptr<DerivedArgList> TranslatedArgList (
553
554
translateInputArgs (*ArgList));
554
555
555
- if (const Arg *A = ArgList->getLastArg (options::OPT_target))
556
- DefaultTargetTriple = llvm::Triple::normalize (A->getValue ());
557
-
558
556
validateArgs (Diags, *TranslatedArgList);
559
557
560
558
if (Diags.hadAnyError ())
561
559
return nullptr ;
562
-
563
- std::unique_ptr<const ToolChain> TC =
564
- makeToolChain (*this , llvm::Triple (DefaultTargetTriple));
565
- if (!TC) {
566
- Diags.diagnose (SourceLoc (), diag::error_unknown_target,
567
- ArgList->getLastArg (options::OPT_target)->getValue ());
568
- return nullptr ;
569
- }
570
560
571
- if (!handleImmediateArgs (*TranslatedArgList, * TC)) {
561
+ if (!handleImmediateArgs (*TranslatedArgList, TC)) {
572
562
return nullptr ;
573
563
}
574
564
575
565
// Construct the list of inputs.
576
566
InputFileList Inputs;
577
- buildInputs (* TC, *TranslatedArgList, Inputs);
567
+ buildInputs (TC, *TranslatedArgList, Inputs);
578
568
579
569
if (Diags.hadAnyError ())
580
570
return nullptr ;
581
571
582
572
// Determine the OutputInfo for the driver.
583
573
OutputInfo OI;
584
- buildOutputInfo (* TC, *TranslatedArgList, Inputs, OI);
574
+ buildOutputInfo (TC, *TranslatedArgList, Inputs, OI);
585
575
586
576
if (Diags.hadAnyError ())
587
577
return nullptr ;
@@ -686,7 +676,7 @@ std::unique_ptr<Compilation> Driver::buildCompilation(
686
676
llvm_unreachable (" Unknown OutputLevel argument!" );
687
677
}
688
678
689
- std::unique_ptr<Compilation> C (new Compilation (Diags, Level,
679
+ std::unique_ptr<Compilation> C (new Compilation (Diags, TC, Level,
690
680
std::move (ArgList),
691
681
std::move (TranslatedArgList),
692
682
std::move (Inputs),
@@ -699,7 +689,7 @@ std::unique_ptr<Compilation> Driver::buildCompilation(
699
689
std::move (StatsReporter)));
700
690
// Construct the graph of Actions.
701
691
SmallVector<const Action *, 8 > TopLevelActions;
702
- buildActions (TopLevelActions, * TC, OI, OFM.get (),
692
+ buildActions (TopLevelActions, TC, OI, OFM.get (),
703
693
rebuildEverything ? nullptr : &outOfDateMap, *C);
704
694
705
695
if (Diags.hadAnyError ())
@@ -710,7 +700,7 @@ std::unique_ptr<Compilation> Driver::buildCompilation(
710
700
return nullptr ;
711
701
}
712
702
713
- buildJobs (TopLevelActions, OI, OFM.get (), * TC, *C);
703
+ buildJobs (TopLevelActions, OI, OFM.get (), TC, *C);
714
704
715
705
// For getting bulk fixits, or for when users explicitly request to continue
716
706
// building despite errors.
@@ -1524,6 +1514,9 @@ void Driver::buildActions(SmallVectorImpl<const Action *> &TopLevelActions,
1524
1514
AllLinkerInputs.push_back (CA);
1525
1515
break ;
1526
1516
}
1517
+ case OutputInfo::Mode::BatchModeCompile: {
1518
+ llvm_unreachable (" Batch mode should not be used to build actions" );
1519
+ }
1527
1520
case OutputInfo::Mode::Immediate: {
1528
1521
if (Inputs.empty ())
1529
1522
return ;
@@ -2075,7 +2068,7 @@ Job *Driver::buildJobsForAction(Compilation &C, const JobAction *JA,
2075
2068
2076
2069
if (C.getArgs ().hasArg (options::OPT_save_optimization_record,
2077
2070
options::OPT_save_optimization_record_path))
2078
- chooseSaveOptimizationPath (C, OI, Buf, Output.get ());
2071
+ chooseOptimizationRecordPath (C, OI, Buf, Output.get ());
2079
2072
2080
2073
if ((isa<MergeModuleJobAction>(JA) ||
2081
2074
(isa<CompileJobAction>(JA) &&
@@ -2396,9 +2389,9 @@ void Driver::chooseTBDPath(Compilation &C, const OutputInfo &OI,
2396
2389
}
2397
2390
}
2398
2391
2399
- void Driver::chooseSaveOptimizationPath (Compilation &C, const OutputInfo &OI,
2400
- llvm::SmallString<128 > &Buf,
2401
- CommandOutput *Output) const {
2392
+ void Driver::chooseOptimizationRecordPath (Compilation &C, const OutputInfo &OI,
2393
+ llvm::SmallString<128 > &Buf,
2394
+ CommandOutput *Output) const {
2402
2395
if (OI.CompilerMode == OutputInfo::Mode::SingleCompile) {
2403
2396
auto filename = *getOutputFilenameFromPathArgOrAsTopLevel (
2404
2397
OI, C.getArgs (), options::OPT_save_optimization_record_path,
0 commit comments