@@ -894,7 +894,6 @@ static bool parseDiagArgs(CompilerInvocation &res, llvm::opt::ArgList &args,
894
894
// / options accordingly. Returns false if new errors are generated.
895
895
static bool parseDialectArgs (CompilerInvocation &res, llvm::opt::ArgList &args,
896
896
clang::DiagnosticsEngine &diags) {
897
- llvm::Triple t (res.getTargetOpts ().triple );
898
897
unsigned numErrorsBefore = diags.getNumErrors ();
899
898
900
899
// -fdefault* family
@@ -930,124 +929,11 @@ static bool parseDialectArgs(CompilerInvocation &res, llvm::opt::ArgList &args,
930
929
Fortran::common::LanguageFeature::CUDA);
931
930
}
932
931
933
- // -fopenmp and - fopenacc
932
+ // -fopenacc
934
933
if (args.hasArg (clang::driver::options::OPT_fopenacc)) {
935
934
res.getFrontendOpts ().features .Enable (
936
935
Fortran::common::LanguageFeature::OpenACC);
937
936
}
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
- }
1051
937
1052
938
// -pedantic
1053
939
if (args.hasArg (clang::driver::options::OPT_pedantic)) {
@@ -1077,6 +963,130 @@ static bool parseDialectArgs(CompilerInvocation &res, llvm::opt::ArgList &args,
1077
963
return diags.getNumErrors () == numErrorsBefore;
1078
964
}
1079
965
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
+
1080
1090
// / Parses all floating point related arguments and populates the
1081
1091
// / CompilerInvocation accordingly.
1082
1092
// / Returns false if new errors are generated.
@@ -1312,6 +1322,7 @@ bool CompilerInvocation::createFromArgs(
1312
1322
success &= parseVectorLibArg (invoc.getCodeGenOpts (), args, diags);
1313
1323
success &= parseSemaArgs (invoc, args, diags);
1314
1324
success &= parseDialectArgs (invoc, args, diags);
1325
+ success &= parseOpenMPArgs (invoc, args, diags);
1315
1326
success &= parseDiagArgs (invoc, args, diags);
1316
1327
1317
1328
// Collect LLVM (-mllvm) and MLIR (-mmlir) options.
0 commit comments