diff options
Diffstat (limited to 'clang/lib/Basic')
-rw-r--r-- | clang/lib/Basic/CMakeLists.txt | 1 | ||||
-rw-r--r-- | clang/lib/Basic/Cuda.cpp | 165 | ||||
-rw-r--r-- | clang/lib/Basic/Targets.cpp | 68 |
3 files changed, 185 insertions, 49 deletions
diff --git a/clang/lib/Basic/CMakeLists.txt b/clang/lib/Basic/CMakeLists.txt index 7524b8cd121..ad460d49653 100644 --- a/clang/lib/Basic/CMakeLists.txt +++ b/clang/lib/Basic/CMakeLists.txt @@ -66,6 +66,7 @@ add_clang_library(clangBasic Attributes.cpp Builtins.cpp CharInfo.cpp + Cuda.cpp Diagnostic.cpp DiagnosticIDs.cpp DiagnosticOptions.cpp diff --git a/clang/lib/Basic/Cuda.cpp b/clang/lib/Basic/Cuda.cpp new file mode 100644 index 00000000000..b4a60eb31a6 --- /dev/null +++ b/clang/lib/Basic/Cuda.cpp @@ -0,0 +1,165 @@ +#include "clang/Basic/Cuda.h" + +#include "llvm/ADT/StringRef.h" +#include "llvm/ADT/StringSwitch.h" + +namespace clang { + +const char *CudaVersionToString(CudaVersion V) { + switch (V) { + case CudaVersion::UNKNOWN: + return "unknown"; + case CudaVersion::CUDA_70: + return "7.0"; + case CudaVersion::CUDA_75: + return "7.5"; + case CudaVersion::CUDA_80: + return "8.0"; + } +} + +const char *CudaArchToString(CudaArch A) { + switch (A) { + case CudaArch::UNKNOWN: + return "unknown"; + case CudaArch::SM_20: + return "sm_20"; + case CudaArch::SM_21: + return "sm_21"; + case CudaArch::SM_30: + return "sm_30"; + case CudaArch::SM_32: + return "sm_32"; + case CudaArch::SM_35: + return "sm_35"; + case CudaArch::SM_37: + return "sm_37"; + case CudaArch::SM_50: + return "sm_50"; + case CudaArch::SM_52: + return "sm_52"; + case CudaArch::SM_53: + return "sm_53"; + case CudaArch::SM_60: + return "sm_60"; + case CudaArch::SM_61: + return "sm_61"; + case CudaArch::SM_62: + return "sm_62"; + } +} + +CudaArch StringToCudaArch(llvm::StringRef S) { + return llvm::StringSwitch<CudaArch>(S) + .Case("sm_20", CudaArch::SM_20) + .Case("sm_21", CudaArch::SM_21) + .Case("sm_30", CudaArch::SM_30) + .Case("sm_32", CudaArch::SM_32) + .Case("sm_35", CudaArch::SM_35) + .Case("sm_37", CudaArch::SM_37) + .Case("sm_50", CudaArch::SM_50) + .Case("sm_52", CudaArch::SM_52) + .Case("sm_53", CudaArch::SM_53) + .Case("sm_60", CudaArch::SM_60) + .Case("sm_61", CudaArch::SM_61) + .Case("sm_62", CudaArch::SM_62) + .Default(CudaArch::UNKNOWN); +} + +const char *CudaVirtualArchToString(CudaVirtualArch A) { + switch (A) { + case CudaVirtualArch::UNKNOWN: + return "unknown"; + case CudaVirtualArch::COMPUTE_20: + return "compute_20"; + case CudaVirtualArch::COMPUTE_30: + return "compute_30"; + case CudaVirtualArch::COMPUTE_32: + return "compute_32"; + case CudaVirtualArch::COMPUTE_35: + return "compute_35"; + case CudaVirtualArch::COMPUTE_37: + return "compute_37"; + case CudaVirtualArch::COMPUTE_50: + return "compute_50"; + case CudaVirtualArch::COMPUTE_52: + return "compute_52"; + case CudaVirtualArch::COMPUTE_53: + return "compute_53"; + case CudaVirtualArch::COMPUTE_60: + return "compute_60"; + case CudaVirtualArch::COMPUTE_61: + return "compute_61"; + case CudaVirtualArch::COMPUTE_62: + return "compute_62"; + } +} + +CudaVirtualArch StringToCudaVirtualArch(llvm::StringRef S) { + return llvm::StringSwitch<CudaVirtualArch>(S) + .Case("compute_20", CudaVirtualArch::COMPUTE_20) + .Case("compute_30", CudaVirtualArch::COMPUTE_30) + .Case("compute_32", CudaVirtualArch::COMPUTE_32) + .Case("compute_35", CudaVirtualArch::COMPUTE_35) + .Case("compute_37", CudaVirtualArch::COMPUTE_37) + .Case("compute_50", CudaVirtualArch::COMPUTE_50) + .Case("compute_52", CudaVirtualArch::COMPUTE_52) + .Case("compute_53", CudaVirtualArch::COMPUTE_53) + .Case("compute_60", CudaVirtualArch::COMPUTE_60) + .Case("compute_61", CudaVirtualArch::COMPUTE_61) + .Case("compute_62", CudaVirtualArch::COMPUTE_62) + .Default(CudaVirtualArch::UNKNOWN); +} + +CudaVirtualArch VirtualArchForCudaArch(CudaArch A) { + switch (A) { + case CudaArch::UNKNOWN: + return CudaVirtualArch::UNKNOWN; + case CudaArch::SM_20: + case CudaArch::SM_21: + return CudaVirtualArch::COMPUTE_20; + case CudaArch::SM_30: + return CudaVirtualArch::COMPUTE_30; + case CudaArch::SM_32: + return CudaVirtualArch::COMPUTE_32; + case CudaArch::SM_35: + return CudaVirtualArch::COMPUTE_35; + case CudaArch::SM_37: + return CudaVirtualArch::COMPUTE_37; + case CudaArch::SM_50: + return CudaVirtualArch::COMPUTE_50; + case CudaArch::SM_52: + return CudaVirtualArch::COMPUTE_52; + case CudaArch::SM_53: + return CudaVirtualArch::COMPUTE_53; + case CudaArch::SM_60: + return CudaVirtualArch::COMPUTE_60; + case CudaArch::SM_61: + return CudaVirtualArch::COMPUTE_61; + case CudaArch::SM_62: + return CudaVirtualArch::COMPUTE_62; + } +} + +CudaVersion MinVersionForCudaArch(CudaArch A) { + switch (A) { + case CudaArch::UNKNOWN: + return CudaVersion::UNKNOWN; + case CudaArch::SM_20: + case CudaArch::SM_21: + case CudaArch::SM_30: + case CudaArch::SM_32: + case CudaArch::SM_35: + case CudaArch::SM_37: + case CudaArch::SM_50: + case CudaArch::SM_52: + case CudaArch::SM_53: + return CudaVersion::CUDA_70; + case CudaArch::SM_60: + case CudaArch::SM_61: + case CudaArch::SM_62: + return CudaVersion::CUDA_80; + } +} + +} // namespace clang diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 9e812ef80c1..38e77f0d1ac 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -12,12 +12,13 @@ // //===----------------------------------------------------------------------===// -#include "clang/Basic/TargetInfo.h" #include "clang/Basic/Builtins.h" +#include "clang/Basic/Cuda.h" #include "clang/Basic/Diagnostic.h" #include "clang/Basic/LangOptions.h" #include "clang/Basic/MacroBuilder.h" #include "clang/Basic/TargetBuiltins.h" +#include "clang/Basic/TargetInfo.h" #include "clang/Basic/TargetOptions.h" #include "clang/Basic/Version.h" #include "llvm/ADT/APFloat.h" @@ -1694,23 +1695,7 @@ static const unsigned NVPTXAddrSpaceMap[] = { class NVPTXTargetInfo : public TargetInfo { static const char *const GCCRegNames[]; static const Builtin::Info BuiltinInfo[]; - - // The GPU profiles supported by the NVPTX backend - enum GPUKind { - GK_NONE, - GK_SM20, - GK_SM21, - GK_SM30, - GK_SM32, - GK_SM35, - GK_SM37, - GK_SM50, - GK_SM52, - GK_SM53, - GK_SM60, - GK_SM61, - GK_SM62, - } GPU; + CudaArch GPU; public: NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) @@ -1723,8 +1708,7 @@ public: // Define available target features // These must be defined in sorted order! NoAsmVariants = true; - // Set the default GPU to sm20 - GPU = GK_SM20; + GPU = CudaArch::SM_20; // If possible, get a TargetInfo for our host triple, so we can match its // types. @@ -1793,32 +1777,32 @@ public: // Set __CUDA_ARCH__ for the GPU specified. std::string CUDAArchCode = [this] { switch (GPU) { - case GK_NONE: + case CudaArch::UNKNOWN: assert(false && "No GPU arch when compiling CUDA device code."); return ""; - case GK_SM20: + case CudaArch::SM_20: return "200"; - case GK_SM21: + case CudaArch::SM_21: return "210"; - case GK_SM30: + case CudaArch::SM_30: return "300"; - case GK_SM32: + case CudaArch::SM_32: return "320"; - case GK_SM35: + case CudaArch::SM_35: return "350"; - case GK_SM37: + case CudaArch::SM_37: return "370"; - case GK_SM50: + case CudaArch::SM_50: return "500"; - case GK_SM52: + case CudaArch::SM_52: return "520"; - case GK_SM53: + case CudaArch::SM_53: return "530"; - case GK_SM60: + case CudaArch::SM_60: return "600"; - case GK_SM61: + case CudaArch::SM_61: return "610"; - case GK_SM62: + case CudaArch::SM_62: return "620"; } }(); @@ -1862,22 +1846,8 @@ public: return TargetInfo::CharPtrBuiltinVaList; } bool setCPU(const std::string &Name) override { - GPU = llvm::StringSwitch<GPUKind>(Name) - .Case("sm_20", GK_SM20) - .Case("sm_21", GK_SM21) - .Case("sm_30", GK_SM30) - .Case("sm_32", GK_SM32) - .Case("sm_35", GK_SM35) - .Case("sm_37", GK_SM37) - .Case("sm_50", GK_SM50) - .Case("sm_52", GK_SM52) - .Case("sm_53", GK_SM53) - .Case("sm_60", GK_SM60) - .Case("sm_61", GK_SM61) - .Case("sm_62", GK_SM62) - .Default(GK_NONE); - - return GPU != GK_NONE; + GPU = StringToCudaArch(Name); + return GPU != CudaArch::UNKNOWN; } void setSupportedOpenCLOpts() override { auto &Opts = getSupportedOpenCLOpts(); |