@@ -929,90 +929,11 @@ static bool parseDialectArgs(CompilerInvocation &res, llvm::opt::ArgList &args,
929
929
Fortran::common::LanguageFeature::CUDA);
930
930
}
931
931
932
- // -fopenmp and - fopenacc
932
+ // -fopenacc
933
933
if (args.hasArg (clang::driver::options::OPT_fopenacc)) {
934
934
res.getFrontendOpts ().features .Enable (
935
935
Fortran::common::LanguageFeature::OpenACC);
936
936
}
937
- if (args.hasArg (clang::driver::options::OPT_fopenmp)) {
938
- // By default OpenMP is set to 1.1 version
939
- res.getLangOpts ().OpenMPVersion = 11 ;
940
- res.getFrontendOpts ().features .Enable (
941
- Fortran::common::LanguageFeature::OpenMP);
942
- if (int Version = getLastArgIntValue (
943
- args, clang::driver::options::OPT_fopenmp_version_EQ,
944
- res.getLangOpts ().OpenMPVersion , diags)) {
945
- res.getLangOpts ().OpenMPVersion = Version;
946
- }
947
- if (args.hasArg (clang::driver::options::OPT_fopenmp_force_usm)) {
948
- res.getLangOpts ().OpenMPForceUSM = 1 ;
949
- }
950
- if (args.hasArg (clang::driver::options::OPT_fopenmp_is_target_device)) {
951
- res.getLangOpts ().OpenMPIsTargetDevice = 1 ;
952
-
953
- // Get OpenMP host file path if any and report if a non existent file is
954
- // found
955
- if (auto *arg = args.getLastArg (
956
- clang::driver::options::OPT_fopenmp_host_ir_file_path)) {
957
- res.getLangOpts ().OMPHostIRFile = arg->getValue ();
958
- if (!llvm::sys::fs::exists (res.getLangOpts ().OMPHostIRFile ))
959
- diags.Report (clang::diag::err_drv_omp_host_ir_file_not_found)
960
- << res.getLangOpts ().OMPHostIRFile ;
961
- }
962
-
963
- if (args.hasFlag (
964
- clang::driver::options::OPT_fopenmp_assume_teams_oversubscription,
965
- clang::driver::options::
966
- OPT_fno_openmp_assume_teams_oversubscription,
967
- /* Default=*/ false ))
968
- res.getLangOpts ().OpenMPTeamSubscription = true ;
969
-
970
- if (args.hasArg (
971
- clang::driver::options::OPT_fopenmp_assume_no_thread_state))
972
- res.getLangOpts ().OpenMPNoThreadState = 1 ;
973
-
974
- if (args.hasArg (
975
- clang::driver::options::OPT_fopenmp_assume_no_nested_parallelism))
976
- res.getLangOpts ().OpenMPNoNestedParallelism = 1 ;
977
-
978
- if (args.hasFlag (clang::driver::options::
979
- OPT_fopenmp_assume_threads_oversubscription,
980
- clang::driver::options::
981
- OPT_fno_openmp_assume_threads_oversubscription,
982
- /* Default=*/ false ))
983
- res.getLangOpts ().OpenMPThreadSubscription = true ;
984
-
985
- if ((args.hasArg (clang::driver::options::OPT_fopenmp_target_debug) ||
986
- args.hasArg (clang::driver::options::OPT_fopenmp_target_debug_EQ))) {
987
- res.getLangOpts ().OpenMPTargetDebug = getLastArgIntValue (
988
- args, clang::driver::options::OPT_fopenmp_target_debug_EQ,
989
- res.getLangOpts ().OpenMPTargetDebug , diags);
990
-
991
- if (!res.getLangOpts ().OpenMPTargetDebug &&
992
- args.hasArg (clang::driver::options::OPT_fopenmp_target_debug))
993
- res.getLangOpts ().OpenMPTargetDebug = 1 ;
994
- }
995
- if (args.hasArg (clang::driver::options::OPT_nogpulib))
996
- res.getLangOpts ().NoGPULib = 1 ;
997
- }
998
-
999
- switch (llvm::Triple (res.getTargetOpts ().triple ).getArch ()) {
1000
- case llvm::Triple::nvptx:
1001
- case llvm::Triple::nvptx64:
1002
- case llvm::Triple::amdgcn:
1003
- if (!res.getLangOpts ().OpenMPIsTargetDevice ) {
1004
- const unsigned diagID = diags.getCustomDiagID (
1005
- clang::DiagnosticsEngine::Error,
1006
- " OpenMP AMDGPU/NVPTX is only prepared to deal with device code." );
1007
- diags.Report (diagID);
1008
- }
1009
- res.getLangOpts ().OpenMPIsGPU = 1 ;
1010
- break ;
1011
- default :
1012
- res.getLangOpts ().OpenMPIsGPU = 0 ;
1013
- break ;
1014
- }
1015
- }
1016
937
1017
938
// -pedantic
1018
939
if (args.hasArg (clang::driver::options::OPT_pedantic)) {
@@ -1042,6 +963,130 @@ static bool parseDialectArgs(CompilerInvocation &res, llvm::opt::ArgList &args,
1042
963
return diags.getNumErrors () == numErrorsBefore;
1043
964
}
1044
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
+
1045
1090
// / Parses all floating point related arguments and populates the
1046
1091
// / CompilerInvocation accordingly.
1047
1092
// / Returns false if new errors are generated.
@@ -1277,6 +1322,7 @@ bool CompilerInvocation::createFromArgs(
1277
1322
success &= parseVectorLibArg (invoc.getCodeGenOpts (), args, diags);
1278
1323
success &= parseSemaArgs (invoc, args, diags);
1279
1324
success &= parseDialectArgs (invoc, args, diags);
1325
+ success &= parseOpenMPArgs (invoc, args, diags);
1280
1326
success &= parseDiagArgs (invoc, args, diags);
1281
1327
1282
1328
// Collect LLVM (-mllvm) and MLIR (-mmlir) options.
0 commit comments