@@ -60,6 +60,8 @@ class ClassicFlangMacroBuilder : public MacroBuilder {
6060void ClassicFlang::ConstructJob (Compilation &C, const JobAction &JA,
6161 const InputInfo &Output, const InputInfoList &Inputs,
6262 const ArgList &Args, const char *LinkingOutput) const {
63+ const Driver &D = getToolChain ().getDriver ();
64+ const llvm::Triple &Triple = getToolChain ().getEffectiveTriple ();
6365 ArgStringList CommonCmdArgs;
6466 ArgStringList UpperCmdArgs;
6567 ArgStringList LowerCmdArgs;
@@ -374,13 +376,13 @@ void ClassicFlang::ConstructJob(Compilation &C, const JobAction &JA,
374376
375377 // -Mipa has no effect
376378 if (Arg *A = Args.getLastArg (options::OPT_Mipa)) {
377- getToolChain (). getDriver () .Diag (diag::warn_drv_clang_unsupported)
379+ D .Diag (diag::warn_drv_clang_unsupported)
378380 << A->getAsString (Args);
379381 }
380382
381383 // -Minline has no effect
382384 if (Arg *A = Args.getLastArg (options::OPT_Minline_on)) {
383- getToolChain (). getDriver () .Diag (diag::warn_drv_clang_unsupported)
385+ D .Diag (diag::warn_drv_clang_unsupported)
384386 << A->getAsString (Args);
385387 }
386388
@@ -654,14 +656,14 @@ void ClassicFlang::ConstructJob(Compilation &C, const JobAction &JA,
654656 // Use clang's predefined macros
655657 DiagnosticsEngine DE (new DiagnosticIDs (), new DiagnosticOptions, new IgnoringDiagConsumer ());
656658 std::shared_ptr<clang::TargetOptions> TO = std::make_shared<clang::TargetOptions>();
657- TO->Triple = getToolChain (). getEffectiveTriple () .getTriple ();
659+ TO->Triple = Triple .getTriple ();
658660 std::shared_ptr<TargetInfo> TI (clang::TargetInfo::CreateTargetInfo (DE, TO));
659661 std::string PredefineBuffer;
660662 llvm::raw_string_ostream Predefines (PredefineBuffer);
661663 ClassicFlangMacroBuilder Builder (UpperCmdArgs, Args, Predefines);
662664
663665 LangOptions LO;
664- VersionTuple VT = getToolChain ().computeMSVCVersion (&getToolChain (). getDriver () , Args);
666+ VersionTuple VT = getToolChain ().computeMSVCVersion (&D , Args);
665667 if (!VT.empty ()) {
666668 // Set the MSCompatibility version. Subminor version has 5 decimal digits.
667669 // Minor and major versions have 2 decimal digits each.
@@ -694,7 +696,7 @@ void ClassicFlang::ConstructJob(Compilation &C, const JobAction &JA,
694696 DefineTypeSize (" __LONG_MAX__" , TargetInfo::SignedLong, *TI, Builder);
695697
696698 // Add additional predefined macros
697- switch (getToolChain (). getEffectiveTriple () .getArch ()) {
699+ switch (Triple .getArch ()) {
698700 case llvm::Triple::aarch64:
699701 UpperCmdArgs.push_back (" -def" ); UpperCmdArgs.push_back (" __ARM_ARCH__=8" );
700702 break ;
@@ -788,7 +790,7 @@ void ClassicFlang::ConstructJob(Compilation &C, const JobAction &JA,
788790 Arg->claim ();
789791 UpperCmdArgs.push_back (" -extend" );
790792 } else {
791- getToolChain (). getDriver () .Diag (diag::err_drv_unsupported_fixed_line_length)
793+ D .Diag (diag::err_drv_unsupported_fixed_line_length)
792794 << Arg->getAsString (Args);
793795 }
794796 }
@@ -832,7 +834,7 @@ void ClassicFlang::ConstructJob(Compilation &C, const JobAction &JA,
832834 } else if (Value == " 95" ) { // Enable Fortran 2003 semantics
833835 UpperCmdArgs.push_back (" -y" ); // Unset XBIT
834836 } else {
835- getToolChain (). getDriver () .Diag (diag::err_drv_invalid_allocatable_mode)
837+ D .Diag (diag::err_drv_invalid_allocatable_mode)
836838 << A->getAsString (Args);
837839 }
838840 } else { // No argument passed
@@ -982,6 +984,22 @@ void ClassicFlang::ConstructJob(Compilation &C, const JobAction &JA,
982984 // Remove "noinline" attriblute
983985 LowerCmdArgs.push_back (" -x" ); LowerCmdArgs.push_back (" 183" ); LowerCmdArgs.push_back (" 0x10" );
984986
987+ // Add target features
988+ std::vector<StringRef> Features;
989+ std::string FeatureList = " " ;
990+ getTargetFeatureList (D, Triple, Args, UpperCmdArgs, false , Features);
991+ if (!Features.empty ()) {
992+ for (unsigned I = 0 , N = Features.size (); I < N; ++I) {
993+ StringRef Name = Features[I];
994+ FeatureList += Name.str ();
995+ if (I < (N - 1 ))
996+ FeatureList += ' ,' ;
997+ }
998+
999+ LowerCmdArgs.push_back (" -target_features" );
1000+ LowerCmdArgs.push_back (Args.MakeArgString (FeatureList));
1001+ }
1002+
9851003 // Set a -x flag for second part of Fortran frontend
9861004 for (Arg *A : Args.filtered (options::OPT_Mx_EQ)) {
9871005 A->claim ();
0 commit comments