Skip to content

Commit e2fe2f8

Browse files
committed
Extract OpenMP argument parsing out of parseDialectArgs
1 parent 54e52e8 commit e2fe2f8

File tree

1 file changed

+126
-115
lines changed

1 file changed

+126
-115
lines changed

flang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 126 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -894,7 +894,6 @@ static bool parseDiagArgs(CompilerInvocation &res, llvm::opt::ArgList &args,
894894
/// options accordingly. Returns false if new errors are generated.
895895
static bool parseDialectArgs(CompilerInvocation &res, llvm::opt::ArgList &args,
896896
clang::DiagnosticsEngine &diags) {
897-
llvm::Triple t(res.getTargetOpts().triple);
898897
unsigned numErrorsBefore = diags.getNumErrors();
899898

900899
// -fdefault* family
@@ -930,124 +929,11 @@ static bool parseDialectArgs(CompilerInvocation &res, llvm::opt::ArgList &args,
930929
Fortran::common::LanguageFeature::CUDA);
931930
}
932931

933-
// -fopenmp and -fopenacc
932+
// -fopenacc
934933
if (args.hasArg(clang::driver::options::OPT_fopenacc)) {
935934
res.getFrontendOpts().features.Enable(
936935
Fortran::common::LanguageFeature::OpenACC);
937936
}
938-
if (args.hasArg(clang::driver::options::OPT_fopenmp)) {
939-
// By default OpenMP is set to 1.1 version
940-
res.getLangOpts().OpenMPVersion = 11;
941-
res.getFrontendOpts().features.Enable(
942-
Fortran::common::LanguageFeature::OpenMP);
943-
if (int Version = getLastArgIntValue(
944-
args, clang::driver::options::OPT_fopenmp_version_EQ,
945-
res.getLangOpts().OpenMPVersion, diags)) {
946-
res.getLangOpts().OpenMPVersion = Version;
947-
}
948-
if (args.hasArg(clang::driver::options::OPT_fopenmp_force_usm)) {
949-
res.getLangOpts().OpenMPForceUSM = 1;
950-
}
951-
if (args.hasArg(clang::driver::options::OPT_fopenmp_is_target_device)) {
952-
res.getLangOpts().OpenMPIsTargetDevice = 1;
953-
954-
// Get OpenMP host file path if any and report if a non existent file is
955-
// found
956-
if (auto *arg = args.getLastArg(
957-
clang::driver::options::OPT_fopenmp_host_ir_file_path)) {
958-
res.getLangOpts().OMPHostIRFile = arg->getValue();
959-
if (!llvm::sys::fs::exists(res.getLangOpts().OMPHostIRFile))
960-
diags.Report(clang::diag::err_drv_omp_host_ir_file_not_found)
961-
<< res.getLangOpts().OMPHostIRFile;
962-
}
963-
964-
if (args.hasFlag(
965-
clang::driver::options::OPT_fopenmp_assume_teams_oversubscription,
966-
clang::driver::options::
967-
OPT_fno_openmp_assume_teams_oversubscription,
968-
/*Default=*/false))
969-
res.getLangOpts().OpenMPTeamSubscription = true;
970-
971-
if (args.hasArg(
972-
clang::driver::options::OPT_fopenmp_assume_no_thread_state))
973-
res.getLangOpts().OpenMPNoThreadState = 1;
974-
975-
if (args.hasArg(
976-
clang::driver::options::OPT_fopenmp_assume_no_nested_parallelism))
977-
res.getLangOpts().OpenMPNoNestedParallelism = 1;
978-
979-
if (args.hasFlag(clang::driver::options::
980-
OPT_fopenmp_assume_threads_oversubscription,
981-
clang::driver::options::
982-
OPT_fno_openmp_assume_threads_oversubscription,
983-
/*Default=*/false))
984-
res.getLangOpts().OpenMPThreadSubscription = true;
985-
986-
if ((args.hasArg(clang::driver::options::OPT_fopenmp_target_debug) ||
987-
args.hasArg(clang::driver::options::OPT_fopenmp_target_debug_EQ))) {
988-
res.getLangOpts().OpenMPTargetDebug = getLastArgIntValue(
989-
args, clang::driver::options::OPT_fopenmp_target_debug_EQ,
990-
res.getLangOpts().OpenMPTargetDebug, diags);
991-
992-
if (!res.getLangOpts().OpenMPTargetDebug &&
993-
args.hasArg(clang::driver::options::OPT_fopenmp_target_debug))
994-
res.getLangOpts().OpenMPTargetDebug = 1;
995-
}
996-
if (args.hasArg(clang::driver::options::OPT_nogpulib))
997-
res.getLangOpts().NoGPULib = 1;
998-
}
999-
1000-
switch (llvm::Triple(res.getTargetOpts().triple).getArch()) {
1001-
case llvm::Triple::nvptx:
1002-
case llvm::Triple::nvptx64:
1003-
case llvm::Triple::amdgcn:
1004-
if (!res.getLangOpts().OpenMPIsTargetDevice) {
1005-
const unsigned diagID = diags.getCustomDiagID(
1006-
clang::DiagnosticsEngine::Error,
1007-
"OpenMP AMDGPU/NVPTX is only prepared to deal with device code.");
1008-
diags.Report(diagID);
1009-
}
1010-
res.getLangOpts().OpenMPIsGPU = 1;
1011-
break;
1012-
default:
1013-
res.getLangOpts().OpenMPIsGPU = 0;
1014-
break;
1015-
}
1016-
1017-
// Get the OpenMP target triples if any.
1018-
if (auto *arg =
1019-
args.getLastArg(clang::driver::options::OPT_fopenmp_targets_EQ)) {
1020-
enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit };
1021-
auto getArchPtrSize = [](const llvm::Triple &triple) {
1022-
if (triple.isArch16Bit())
1023-
return Arch16Bit;
1024-
if (triple.isArch32Bit())
1025-
return Arch32Bit;
1026-
assert(triple.isArch64Bit() && "Expected 64-bit architecture");
1027-
return Arch64Bit;
1028-
};
1029-
1030-
for (unsigned i = 0; i < arg->getNumValues(); ++i) {
1031-
llvm::Triple tt(arg->getValue(i));
1032-
1033-
if (tt.getArch() == llvm::Triple::UnknownArch ||
1034-
!(tt.getArch() == llvm::Triple::aarch64 || tt.isPPC() ||
1035-
tt.getArch() == llvm::Triple::systemz ||
1036-
tt.getArch() == llvm::Triple::nvptx ||
1037-
tt.getArch() == llvm::Triple::nvptx64 ||
1038-
tt.getArch() == llvm::Triple::amdgcn ||
1039-
tt.getArch() == llvm::Triple::x86 ||
1040-
tt.getArch() == llvm::Triple::x86_64))
1041-
diags.Report(clang::diag::err_drv_invalid_omp_target)
1042-
<< arg->getValue(i);
1043-
else if (getArchPtrSize(t) != getArchPtrSize(tt))
1044-
diags.Report(clang::diag::err_drv_incompatible_omp_arch)
1045-
<< arg->getValue(i) << t.str();
1046-
else
1047-
res.getLangOpts().OMPTargetTriples.push_back(tt);
1048-
}
1049-
}
1050-
}
1051937

1052938
// -pedantic
1053939
if (args.hasArg(clang::driver::options::OPT_pedantic)) {
@@ -1077,6 +963,130 @@ static bool parseDialectArgs(CompilerInvocation &res, llvm::opt::ArgList &args,
1077963
return diags.getNumErrors() == numErrorsBefore;
1078964
}
1079965

966+
/// Parses all OpenMP related arguments if the -fopenmp option is present,
967+
/// populating the \c res object accordingly. Returns false if new errors are
968+
/// generated.
969+
static bool parseOpenMPArgs(CompilerInvocation &res, llvm::opt::ArgList &args,
970+
clang::DiagnosticsEngine &diags) {
971+
if (!args.hasArg(clang::driver::options::OPT_fopenmp))
972+
return true;
973+
974+
unsigned numErrorsBefore = diags.getNumErrors();
975+
llvm::Triple t(res.getTargetOpts().triple);
976+
977+
// By default OpenMP is set to 1.1 version
978+
res.getLangOpts().OpenMPVersion = 11;
979+
res.getFrontendOpts().features.Enable(
980+
Fortran::common::LanguageFeature::OpenMP);
981+
if (int Version = getLastArgIntValue(
982+
args, clang::driver::options::OPT_fopenmp_version_EQ,
983+
res.getLangOpts().OpenMPVersion, diags)) {
984+
res.getLangOpts().OpenMPVersion = Version;
985+
}
986+
if (args.hasArg(clang::driver::options::OPT_fopenmp_force_usm)) {
987+
res.getLangOpts().OpenMPForceUSM = 1;
988+
}
989+
if (args.hasArg(clang::driver::options::OPT_fopenmp_is_target_device)) {
990+
res.getLangOpts().OpenMPIsTargetDevice = 1;
991+
992+
// Get OpenMP host file path if any and report if a non existent file is
993+
// found
994+
if (auto *arg = args.getLastArg(
995+
clang::driver::options::OPT_fopenmp_host_ir_file_path)) {
996+
res.getLangOpts().OMPHostIRFile = arg->getValue();
997+
if (!llvm::sys::fs::exists(res.getLangOpts().OMPHostIRFile))
998+
diags.Report(clang::diag::err_drv_omp_host_ir_file_not_found)
999+
<< res.getLangOpts().OMPHostIRFile;
1000+
}
1001+
1002+
if (args.hasFlag(
1003+
clang::driver::options::OPT_fopenmp_assume_teams_oversubscription,
1004+
clang::driver::options::
1005+
OPT_fno_openmp_assume_teams_oversubscription,
1006+
/*Default=*/false))
1007+
res.getLangOpts().OpenMPTeamSubscription = true;
1008+
1009+
if (args.hasArg(clang::driver::options::OPT_fopenmp_assume_no_thread_state))
1010+
res.getLangOpts().OpenMPNoThreadState = 1;
1011+
1012+
if (args.hasArg(
1013+
clang::driver::options::OPT_fopenmp_assume_no_nested_parallelism))
1014+
res.getLangOpts().OpenMPNoNestedParallelism = 1;
1015+
1016+
if (args.hasFlag(
1017+
clang::driver::options::OPT_fopenmp_assume_threads_oversubscription,
1018+
clang::driver::options::
1019+
OPT_fno_openmp_assume_threads_oversubscription,
1020+
/*Default=*/false))
1021+
res.getLangOpts().OpenMPThreadSubscription = true;
1022+
1023+
if ((args.hasArg(clang::driver::options::OPT_fopenmp_target_debug) ||
1024+
args.hasArg(clang::driver::options::OPT_fopenmp_target_debug_EQ))) {
1025+
res.getLangOpts().OpenMPTargetDebug = getLastArgIntValue(
1026+
args, clang::driver::options::OPT_fopenmp_target_debug_EQ,
1027+
res.getLangOpts().OpenMPTargetDebug, diags);
1028+
1029+
if (!res.getLangOpts().OpenMPTargetDebug &&
1030+
args.hasArg(clang::driver::options::OPT_fopenmp_target_debug))
1031+
res.getLangOpts().OpenMPTargetDebug = 1;
1032+
}
1033+
if (args.hasArg(clang::driver::options::OPT_nogpulib))
1034+
res.getLangOpts().NoGPULib = 1;
1035+
}
1036+
1037+
switch (llvm::Triple(res.getTargetOpts().triple).getArch()) {
1038+
case llvm::Triple::nvptx:
1039+
case llvm::Triple::nvptx64:
1040+
case llvm::Triple::amdgcn:
1041+
if (!res.getLangOpts().OpenMPIsTargetDevice) {
1042+
const unsigned diagID = diags.getCustomDiagID(
1043+
clang::DiagnosticsEngine::Error,
1044+
"OpenMP AMDGPU/NVPTX is only prepared to deal with device code.");
1045+
diags.Report(diagID);
1046+
}
1047+
res.getLangOpts().OpenMPIsGPU = 1;
1048+
break;
1049+
default:
1050+
res.getLangOpts().OpenMPIsGPU = 0;
1051+
break;
1052+
}
1053+
1054+
// Get the OpenMP target triples if any.
1055+
if (auto *arg =
1056+
args.getLastArg(clang::driver::options::OPT_fopenmp_targets_EQ)) {
1057+
enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit };
1058+
auto getArchPtrSize = [](const llvm::Triple &triple) {
1059+
if (triple.isArch16Bit())
1060+
return Arch16Bit;
1061+
if (triple.isArch32Bit())
1062+
return Arch32Bit;
1063+
assert(triple.isArch64Bit() && "Expected 64-bit architecture");
1064+
return Arch64Bit;
1065+
};
1066+
1067+
for (unsigned i = 0; i < arg->getNumValues(); ++i) {
1068+
llvm::Triple tt(arg->getValue(i));
1069+
1070+
if (tt.getArch() == llvm::Triple::UnknownArch ||
1071+
!(tt.getArch() == llvm::Triple::aarch64 || tt.isPPC() ||
1072+
tt.getArch() == llvm::Triple::systemz ||
1073+
tt.getArch() == llvm::Triple::nvptx ||
1074+
tt.getArch() == llvm::Triple::nvptx64 ||
1075+
tt.getArch() == llvm::Triple::amdgcn ||
1076+
tt.getArch() == llvm::Triple::x86 ||
1077+
tt.getArch() == llvm::Triple::x86_64))
1078+
diags.Report(clang::diag::err_drv_invalid_omp_target)
1079+
<< arg->getValue(i);
1080+
else if (getArchPtrSize(t) != getArchPtrSize(tt))
1081+
diags.Report(clang::diag::err_drv_incompatible_omp_arch)
1082+
<< arg->getValue(i) << t.str();
1083+
else
1084+
res.getLangOpts().OMPTargetTriples.push_back(tt);
1085+
}
1086+
}
1087+
return diags.getNumErrors() == numErrorsBefore;
1088+
}
1089+
10801090
/// Parses all floating point related arguments and populates the
10811091
/// CompilerInvocation accordingly.
10821092
/// Returns false if new errors are generated.
@@ -1312,6 +1322,7 @@ bool CompilerInvocation::createFromArgs(
13121322
success &= parseVectorLibArg(invoc.getCodeGenOpts(), args, diags);
13131323
success &= parseSemaArgs(invoc, args, diags);
13141324
success &= parseDialectArgs(invoc, args, diags);
1325+
success &= parseOpenMPArgs(invoc, args, diags);
13151326
success &= parseDiagArgs(invoc, args, diags);
13161327

13171328
// Collect LLVM (-mllvm) and MLIR (-mmlir) options.

0 commit comments

Comments
 (0)