@@ -1030,10 +1030,6 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
1030
1030
return ;
1031
1031
}
1032
1032
1033
- llvm::StringMap<llvm::DenseSet<StringRef>> DerivedArchs;
1034
- llvm::StringMap<StringRef> FoundNormalizedTriples;
1035
- std::multiset<StringRef> OpenMPTriples;
1036
-
1037
1033
// If the user specified -fopenmp-targets= we create a toolchain for each
1038
1034
// valid triple. Otherwise, if only --offload-arch= was specified we instead
1039
1035
// attempt to derive the appropriate toolchains from the arguments.
@@ -1044,82 +1040,77 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
1044
1040
<< OpenMPTargets->getAsString (C.getInputArgs ());
1045
1041
return ;
1046
1042
}
1043
+
1044
+ // Make sure these show up in a deterministic order.
1045
+ std::multiset<StringRef> OpenMPTriples;
1047
1046
for (StringRef T : OpenMPTargets->getValues ())
1048
1047
OpenMPTriples.insert (T);
1048
+
1049
+ llvm::StringMap<StringRef> FoundNormalizedTriples;
1050
+ for (StringRef T : OpenMPTriples) {
1051
+ llvm::Triple TT (ToolChain::getOpenMPTriple (T));
1052
+ std::string NormalizedName = TT.normalize ();
1053
+
1054
+ // Make sure we don't have a duplicate triple.
1055
+ auto [TripleIt, Inserted] =
1056
+ FoundNormalizedTriples.try_emplace (NormalizedName, T);
1057
+ if (!Inserted) {
1058
+ Diag (clang::diag::warn_drv_omp_offload_target_duplicate)
1059
+ << T << TripleIt->second ;
1060
+ continue ;
1061
+ }
1062
+
1063
+ // If the specified target is invalid, emit a diagnostic.
1064
+ if (TT.getArch () == llvm::Triple::UnknownArch) {
1065
+ Diag (clang::diag::err_drv_invalid_omp_target) << T;
1066
+ continue ;
1067
+ }
1068
+
1069
+ auto &TC = getOffloadToolChain (C.getInputArgs (), Action::OFK_OpenMP, TT,
1070
+ C.getDefaultToolChain ().getTriple ());
1071
+ C.addOffloadDeviceToolChain (&TC, Action::OFK_OpenMP);
1072
+ }
1049
1073
} else if (C.getInputArgs ().hasArg (options::OPT_offload_arch_EQ) &&
1050
1074
((!IsHIP && !IsCuda) || UseLLVMOffload)) {
1051
- const ToolChain *HostTC = C.getSingleOffloadToolChain <Action::OFK_Host>();
1052
- auto AMDTriple = getHIPOffloadTargetTriple (*this , C.getInputArgs ());
1053
- auto NVPTXTriple = getNVIDIAOffloadTargetTriple (*this , C.getInputArgs (),
1054
- HostTC->getTriple ());
1075
+ llvm::Triple AMDTriple (" amdgcn-amd-amdhsa" );
1076
+ llvm::Triple NVPTXTriple (" nvptx64-nvidia-cuda" );
1055
1077
1056
1078
// Attempt to deduce the offloading triple from the set of architectures.
1057
1079
// We can only correctly deduce NVPTX / AMDGPU triples currently.
1058
- // We need to temporarily create these toolchains so that we can access
1059
- // tools for inferring architectures.
1060
- llvm::DenseSet<StringRef> Archs;
1061
- for (const std::optional<llvm::Triple> &TT : {NVPTXTriple, AMDTriple}) {
1062
- if (!TT)
1063
- continue ;
1064
-
1065
- auto &TC =
1066
- getOffloadToolChain (C.getInputArgs (), Action::OFK_OpenMP, *TT,
1067
- C.getDefaultToolChain ().getTriple ());
1068
- for (StringRef Arch :
1069
- getOffloadArchs (C, C.getArgs (), Action::OFK_OpenMP, &TC, true ))
1070
- Archs.insert (Arch);
1071
- }
1080
+ for (const llvm::Triple &TT : {AMDTriple, NVPTXTriple}) {
1081
+ auto &TC = getOffloadToolChain (C.getInputArgs (), Action::OFK_OpenMP, TT,
1082
+ C.getDefaultToolChain ().getTriple ());
1083
+
1084
+ llvm::DenseSet<StringRef> Archs =
1085
+ getOffloadArchs (C, C.getArgs (), Action::OFK_OpenMP, &TC, true );
1086
+ llvm::DenseSet<StringRef> ArchsForTarget;
1087
+ for (StringRef Arch : Archs) {
1088
+ bool IsNVPTX = IsNVIDIAOffloadArch (
1089
+ StringToOffloadArch (getProcessorFromTargetID (NVPTXTriple, Arch)));
1090
+ bool IsAMDGPU = IsAMDOffloadArch (
1091
+ StringToOffloadArch (getProcessorFromTargetID (AMDTriple, Arch)));
1092
+ if (!IsNVPTX && !IsAMDGPU && !Arch.equals_insensitive (" native" )) {
1093
+ Diag (clang::diag::err_drv_failed_to_deduce_target_from_arch)
1094
+ << Arch;
1095
+ return ;
1096
+ }
1072
1097
1073
- for (StringRef Arch : Archs) {
1074
- if (NVPTXTriple && IsNVIDIAOffloadArch (StringToOffloadArch (
1075
- getProcessorFromTargetID (*NVPTXTriple, Arch)))) {
1076
- DerivedArchs[NVPTXTriple->getTriple ()].insert (Arch);
1077
- } else if (AMDTriple &&
1078
- IsAMDOffloadArch (StringToOffloadArch (
1079
- getProcessorFromTargetID (*AMDTriple, Arch)))) {
1080
- DerivedArchs[AMDTriple->getTriple ()].insert (Arch);
1081
- } else {
1082
- Diag (clang::diag::err_drv_failed_to_deduce_target_from_arch) << Arch;
1083
- return ;
1098
+ if (TT.isNVPTX () && IsNVPTX)
1099
+ ArchsForTarget.insert (Arch);
1100
+ else if (TT.isAMDGPU () && IsAMDGPU)
1101
+ ArchsForTarget.insert (Arch);
1102
+ }
1103
+ if (!ArchsForTarget.empty ()) {
1104
+ C.addOffloadDeviceToolChain (&TC, Action::OFK_OpenMP);
1105
+ KnownArchs[&TC] = ArchsForTarget;
1084
1106
}
1085
1107
}
1086
1108
1087
1109
// If the set is empty then we failed to find a native architecture.
1088
- if (Archs.empty ()) {
1110
+ auto TCRange = C.getOffloadToolChains (Action::OFK_OpenMP);
1111
+ if (TCRange.first == TCRange.second )
1089
1112
Diag (clang::diag::err_drv_failed_to_deduce_target_from_arch)
1090
1113
<< " native" ;
1091
- return ;
1092
- }
1093
-
1094
- for (const auto &TripleAndArchs : DerivedArchs)
1095
- OpenMPTriples.insert (TripleAndArchs.first ());
1096
- }
1097
-
1098
- for (StringRef Val : OpenMPTriples) {
1099
- llvm::Triple TT (ToolChain::getOpenMPTriple (Val));
1100
- std::string NormalizedName = TT.normalize ();
1101
-
1102
- // Make sure we don't have a duplicate triple.
1103
- auto [TripleIt, Inserted] =
1104
- FoundNormalizedTriples.try_emplace (NormalizedName, Val);
1105
- if (!Inserted) {
1106
- Diag (clang::diag::warn_drv_omp_offload_target_duplicate)
1107
- << Val << TripleIt->second ;
1108
- continue ;
1109
- }
1110
-
1111
- // If the specified target is invalid, emit a diagnostic.
1112
- if (TT.getArch () == llvm::Triple::UnknownArch) {
1113
- Diag (clang::diag::err_drv_invalid_omp_target) << Val;
1114
- continue ;
1115
- }
1116
-
1117
- auto &TC = getOffloadToolChain (C.getInputArgs (), Action::OFK_OpenMP, TT,
1118
- C.getDefaultToolChain ().getTriple ());
1119
- C.addOffloadDeviceToolChain (&TC, Action::OFK_OpenMP);
1120
- auto It = DerivedArchs.find (TT.getTriple ());
1121
- if (It != DerivedArchs.end ())
1122
- KnownArchs[&TC] = It->second ;
1123
1114
}
1124
1115
} else if (C.getInputArgs ().hasArg (options::OPT_fopenmp_targets_EQ)) {
1125
1116
Diag (clang::diag::err_drv_expecting_fopenmp_with_fopenmp_targets);
0 commit comments