Skip to content

Commit 9b14d4d

Browse files
authored
Merge pull request #38 from vjayathirtha-nv/release_70
Port flang driver changes from Release 60 to Release 70
2 parents 9f13b4e + 512079e commit 9b14d4d

File tree

11 files changed

+302
-118
lines changed

11 files changed

+302
-118
lines changed

CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,11 @@ endif()
397397

398398
add_definitions( -D_GNU_SOURCE )
399399

400+
option(FLANG_LLVM_EXTENSIONS "enable the Flang LLVM extensions" OFF)
401+
if(FLANG_LLVM_EXTENSIONS)
402+
add_definitions( -DFLANG_LLVM_EXTENSIONS )
403+
endif()
404+
400405
option(CLANG_BUILD_TOOLS
401406
"Build the Clang tools. If OFF, just generate build targets." ON)
402407

include/clang/Basic/DiagnosticDriverKinds.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,8 @@ def warn_drv_omp_offload_target_missingbcruntime : Warning<
219219
InGroup<OpenMPTarget>;
220220
def err_drv_bitcode_unsupported_on_toolchain : Error<
221221
"-fembed-bitcode is not supported on versions of iOS prior to 6.0">;
222+
def err_drv_clang_unsupported_minfo_arg : Error<
223+
"'%0' option does not support '%1' value">;
222224

223225
def warn_O4_is_O3 : Warning<"-O4 is equivalent to -O3">, InGroup<Deprecated>;
224226
def warn_drv_optimization_value : Warning<"optimization level '%0' is not supported; using '%1%2' instead">,

include/clang/Driver/Options.td

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1367,7 +1367,7 @@ def fno_experimental_new_pass_manager : Flag<["-"], "fno-experimental-new-pass-m
13671367
Group<f_clang_Group>, Flags<[CC1Option]>,
13681368
HelpText<"Disables an experimental new pass manager in LLVM.">;
13691369
def fveclib : Joined<["-"], "fveclib=">, Group<f_Group>, Flags<[CC1Option]>,
1370-
HelpText<"Use the given vector functions library">, Values<"Accelerate,SVML,none">;
1370+
HelpText<"Use the given vector functions library">, Values<"Accelerate,SVML,PGMATH,none">;
13711371
def fno_lax_vector_conversions : Flag<["-"], "fno-lax-vector-conversions">, Group<f_Group>,
13721372
HelpText<"Disallow implicit conversions between vectors with a different number of elements or different element types">, Flags<[CC1Option]>;
13731373
def fno_merge_all_constants : Flag<["-"], "fno-merge-all-constants">, Group<f_Group>,
@@ -3058,6 +3058,16 @@ def Mfreeform_off: Flag<["-"], "Mnofreeform">, Group<fortran_format_Group>,
30583058
HelpText<"Disable free-form format for Fortran">,
30593059
Flags<[HelpHidden]>;
30603060

3061+
def Minfo_EQ : CommaJoined<["-"], "Minfo=">,
3062+
HelpText<"Diagnostic information about successful optimizations">,
3063+
Values<"all,vect,inline">;
3064+
def Minfoall : Flag<["-"], "Minfo">,
3065+
HelpText<"Diagnostic information about all successful optimizations">;
3066+
def Mneginfo_EQ : CommaJoined<["-"], "Mneginfo=">,
3067+
HelpText<"Diagnostic information about missed optimizations">,
3068+
Values<"all,vect,inline">;
3069+
def Mneginfoall : Flag<["-"], "Mneginfo">,
3070+
HelpText<"Diagnostic information about all missed optimizations">;
30613071
def Mipa: Joined<["-"], "Mipa">, Group<pgi_fortran_Group>;
30623072
def Mstackarrays: Joined<["-"], "Mstack_arrays">, Group<pgi_fortran_Group>;
30633073
def pc: JoinedOrSeparate<["-"], "pc">, Group<pgi_fortran_Group>;
@@ -3131,6 +3141,8 @@ def no_fortran_main: Flag<["-"], "fno-fortran-main">, Group<gfortran_Group>,
31313141
HelpText<"Don't link in Fortran main">;
31323142
def Mnomain: Flag<["-"], "Mnomain">, Group<pgi_fortran_Group>,
31333143
HelpText<"Don't link in Fortran main">;
3144+
def frelaxed_math : Flag<["-"], "frelaxed-math">, Group<pgi_fortran_Group>,
3145+
HelpText<"Use relaxed Math intrinsic functions">;
31343146

31353147
// Flang internal debug options
31363148
def Mx_EQ : Joined<["-"], "Mx,">, Group<pgi_fortran_Group>;

include/clang/Frontend/CodeGenOptions.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ class CodeGenOptions : public CodeGenOptionsBase {
5454
enum VectorLibrary {
5555
NoLibrary, // Don't use any vector library.
5656
Accelerate, // Use the Accelerate framework.
57+
#ifdef FLANG_LLVM_EXTENSIONS
58+
PGMATH, // PGI math library.
59+
#endif
5760
SVML // Intel short vector math library.
5861
};
5962

lib/CodeGen/BackendUtil.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,11 @@ static TargetLibraryInfoImpl *createTLII(llvm::Triple &TargetTriple,
333333
case CodeGenOptions::SVML:
334334
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::SVML);
335335
break;
336+
#ifdef FLANG_LLVM_EXTENSIONS
337+
case CodeGenOptions::PGMATH:
338+
TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::PGMATH);
339+
break;
340+
#endif
336341
default:
337342
break;
338343
}

lib/CodeGen/CodeGenAction.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,10 +1033,37 @@ void CodeGenAction::ExecuteAction() {
10331033
Ctx.setInlineAsmDiagnosticHandler(BitcodeInlineAsmDiagHandler,
10341034
&CI.getDiagnostics());
10351035

1036+
const CodeGenOptions &CodeGenOpts = CI.getCodeGenOpts();
1037+
DiagnosticsEngine &Diags = CI.getDiagnostics();
1038+
std::unique_ptr<llvm::ToolOutputFile> OptRecordFile;
1039+
1040+
if (!CodeGenOpts.OptRecordFile.empty()) {
1041+
std::error_code EC;
1042+
OptRecordFile =
1043+
llvm::make_unique<llvm::ToolOutputFile>(CodeGenOpts.OptRecordFile,
1044+
EC, sys::fs::F_None);
1045+
1046+
if (EC) {
1047+
Diags.Report(diag::err_cannot_open_file) <<
1048+
CodeGenOpts.OptRecordFile << EC.message();
1049+
return;
1050+
}
1051+
1052+
Ctx.setDiagnosticsOutputFile(
1053+
llvm::make_unique<yaml::Output>(OptRecordFile->os()));
1054+
1055+
if (CodeGenOpts.getProfileUse() != CodeGenOptions::ProfileNone)
1056+
Ctx.setDiagnosticsHotnessRequested(true);
1057+
}
1058+
10361059
EmitBackendOutput(CI.getDiagnostics(), CI.getHeaderSearchOpts(),
10371060
CI.getCodeGenOpts(), TargetOpts, CI.getLangOpts(),
10381061
CI.getTarget().getDataLayout(), TheModule.get(), BA,
10391062
std::move(OS));
1063+
1064+
if (OptRecordFile)
1065+
OptRecordFile->keep();
1066+
10401067
return;
10411068
}
10421069

lib/Driver/Driver.cpp

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -248,22 +248,31 @@ phases::ID Driver::getFinalPhase(const DerivedArgList &DAL,
248248

249249
// -{E,EP,P,M,MM} only run the preprocessor.
250250
if (CCCIsCPP() || (PhaseArg = DAL.getLastArg(options::OPT_E)) ||
251+
(PhaseArg = DAL.getLastArg(options::OPT_fsyntax_only)) ||
251252
(PhaseArg = DAL.getLastArg(options::OPT__SLASH_EP)) ||
252253
(PhaseArg = DAL.getLastArg(options::OPT_M, options::OPT_MM)) ||
253254
(PhaseArg = DAL.getLastArg(options::OPT__SLASH_P))) {
254-
FinalPhase = phases::Preprocess;
255255

256-
// -fsyntax-only stops Fortran compilation after FortranFrontend
257-
} else if (IsFortranMode() && (PhaseArg = DAL.getLastArg(options::OPT_fsyntax_only))) {
258-
FinalPhase = phases::FortranFrontend;
256+
// -fsyntax-only or -E stops Fortran compilation after FortranFrontend
257+
if (IsFortranMode() && (DAL.getLastArg(options::OPT_E) ||
258+
DAL.getLastArg(options::OPT_fsyntax_only))) {
259+
FinalPhase = phases::FortranFrontend;
260+
261+
// if not Fortran, fsyntax_only implies 'Compile' is the FinalPhase
262+
} else if (DAL.getLastArg(options::OPT_fsyntax_only)) {
263+
FinalPhase = phases::Compile;
264+
265+
// everything else has 'Preprocess' as its FinalPhase
266+
} else {
267+
FinalPhase = phases::Preprocess;
268+
}
259269

260270
// --precompile only runs up to precompilation.
261271
} else if ((PhaseArg = DAL.getLastArg(options::OPT__precompile))) {
262272
FinalPhase = phases::Precompile;
263273

264-
// -{fsyntax-only,-analyze,emit-ast} only run up to the compiler.
265-
} else if ((PhaseArg = DAL.getLastArg(options::OPT_fsyntax_only)) ||
266-
(PhaseArg = DAL.getLastArg(options::OPT_module_file_info)) ||
274+
// -{analyze,emit-ast} only run up to the compiler.
275+
} else if ((PhaseArg = DAL.getLastArg(options::OPT_module_file_info)) ||
267276
(PhaseArg = DAL.getLastArg(options::OPT_verify_pch)) ||
268277
(PhaseArg = DAL.getLastArg(options::OPT_rewrite_objc)) ||
269278
(PhaseArg = DAL.getLastArg(options::OPT_rewrite_legacy_objc)) ||

lib/Driver/ToolChain.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -808,6 +808,7 @@ void ToolChain::AddFortranStdlibLibArgs(const ArgList &Args,
808808
}
809809
CmdArgs.push_back("-lflang");
810810
CmdArgs.push_back("-lflangrti");
811+
CmdArgs.push_back("-lpgmath");
811812
if( useOpenMP ) {
812813
CmdArgs.push_back("-lomp");
813814
}

lib/Driver/ToolChains/Clang.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3398,8 +3398,69 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
33983398
else
33993399
CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
34003400

3401+
#ifdef FLANG_LLVM_EXTENSIONS
3402+
if(Args.getLastArg(options::OPT_fveclib))
3403+
Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3404+
else
3405+
CmdArgs.push_back("-fveclib=PGMATH");
3406+
#else
34013407
Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3408+
#endif
34023409

3410+
std::string PassRemarkVal(""), PassRemarkOpt("");
3411+
if (Args.getLastArg(options::OPT_Minfoall)) {
3412+
PassRemarkVal = ".*";
3413+
Args.ClaimAllArgs(options::OPT_Minfoall);
3414+
} else if (Arg *A = Args.getLastArg(options::OPT_Minfo_EQ)) {
3415+
for (const StringRef &val : A->getValues()) {
3416+
if(val.equals("all")) {
3417+
PassRemarkVal = ".*";
3418+
break;
3419+
} else if(val.equals("inline") || val.equals("vect")) {
3420+
PassRemarkVal += PassRemarkVal.empty() ? "" : "|";
3421+
PassRemarkVal += val;
3422+
} else {
3423+
D.Diag(diag::err_drv_clang_unsupported_minfo_arg)
3424+
<< A->getOption().getName()
3425+
<< val.str();
3426+
break;
3427+
}
3428+
}
3429+
}
3430+
PassRemarkOpt = "-pass-remarks=" + PassRemarkVal;
3431+
CmdArgs.push_back("-mllvm");
3432+
CmdArgs.push_back(Args.MakeArgString(PassRemarkOpt));
3433+
Args.ClaimAllArgs(options::OPT_Minfo_EQ);
3434+
PassRemarkVal.clear();
3435+
PassRemarkOpt.clear();
3436+
3437+
if (Args.getLastArg(options::OPT_Mneginfoall)) {
3438+
PassRemarkVal = ".*";
3439+
Args.ClaimAllArgs(options::OPT_Mneginfoall);
3440+
} else if (Arg *A = Args.getLastArg(options::OPT_Mneginfo_EQ)) {
3441+
for (const StringRef &val : A->getValues()) {
3442+
if(val.equals("all")) {
3443+
PassRemarkVal = ".*";
3444+
break;
3445+
} else if(val.equals("inline") || val.equals("vect")) {
3446+
PassRemarkVal += PassRemarkVal.empty() ? "" : "|";
3447+
PassRemarkVal += val;
3448+
} else {
3449+
D.Diag(diag::err_drv_clang_unsupported_minfo_arg)
3450+
<< A->getOption().getName()
3451+
<< val.str();
3452+
break;
3453+
}
3454+
}
3455+
}
3456+
PassRemarkOpt = "-pass-remarks-missed=" + PassRemarkVal;
3457+
CmdArgs.push_back("-mllvm");
3458+
CmdArgs.push_back(Args.MakeArgString(PassRemarkOpt));
3459+
PassRemarkOpt = "-pass-remarks-analysis=" + PassRemarkVal;
3460+
CmdArgs.push_back("-mllvm");
3461+
CmdArgs.push_back(Args.MakeArgString(PassRemarkOpt));
3462+
Args.ClaimAllArgs(options::OPT_Mneginfo_EQ);
3463+
34033464
if (Args.hasFlag(options::OPT_fmerge_all_constants,
34043465
options::OPT_fno_merge_all_constants, false))
34053466
CmdArgs.push_back("-fmerge-all-constants");

0 commit comments

Comments
 (0)