| #include "clang/Basic/Cuda.h" | 
 |  | 
 | #include "llvm/ADT/StringRef.h" | 
 | #include "llvm/ADT/StringSwitch.h" | 
 | #include "llvm/Support/ErrorHandling.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"; | 
 |   case CudaVersion::CUDA_90: | 
 |     return "9.0"; | 
 |   } | 
 |   llvm_unreachable("invalid enum"); | 
 | } | 
 |  | 
 | 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"; | 
 |   case CudaArch::SM_70: | 
 |     return "sm_70"; | 
 |   } | 
 |   llvm_unreachable("invalid enum"); | 
 | } | 
 |  | 
 | 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) | 
 |       .Case("sm_70", CudaArch::SM_70) | 
 |       .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"; | 
 |   case CudaVirtualArch::COMPUTE_70: | 
 |     return "compute_70"; | 
 |   } | 
 |   llvm_unreachable("invalid enum"); | 
 | } | 
 |  | 
 | 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) | 
 |       .Case("compute_70", CudaVirtualArch::COMPUTE_70) | 
 |       .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; | 
 |   case CudaArch::SM_70: | 
 |     return CudaVirtualArch::COMPUTE_70; | 
 |   } | 
 |   llvm_unreachable("invalid enum"); | 
 | } | 
 |  | 
 | 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; | 
 |   case CudaArch::SM_70: | 
 |     return CudaVersion::CUDA_90; | 
 |   } | 
 |   llvm_unreachable("invalid enum"); | 
 | } | 
 |  | 
 | CudaVersion MaxVersionForCudaArch(CudaArch A) { | 
 |   switch (A) { | 
 |   case CudaArch::UNKNOWN: | 
 |     return CudaVersion::UNKNOWN; | 
 |   case CudaArch::SM_20: | 
 |   case CudaArch::SM_21: | 
 |     return CudaVersion::CUDA_80; | 
 |   default: | 
 |     return CudaVersion::LATEST; | 
 |   } | 
 | } | 
 |  | 
 | } // namespace clang |