diff --git a/src/compiler/clang.rs b/src/compiler/clang.rs index e5304d852..56e09d0a2 100644 --- a/src/compiler/clang.rs +++ b/src/compiler/clang.rs @@ -179,27 +179,7 @@ impl CCompilerImpl for Clang { } pub fn language_to_clang_arg(lang: Language) -> Option<&'static str> { - match lang { - // https://github.com/llvm/llvm-project/blob/main/clang/include/clang/Driver/Types.def - Language::C => Some("c"), - Language::CHeader => Some("c-header"), - Language::CPreprocessed => Some("cpp-output"), - Language::Cxx => Some("c++"), - Language::CxxHeader => Some("c++-header"), - Language::CxxPreprocessed => Some("c++-cpp-output"), - Language::ObjectiveC => Some("objective-c"), - Language::ObjectiveCPreprocessed => Some("objective-c-cpp-output"), - Language::ObjectiveCxx => Some("objective-c++"), - Language::ObjectiveCxxHeader => Some("objective-c++-header"), - Language::ObjectiveCxxPreprocessed => Some("objective-c++-cpp-output"), - Language::Cuda => Some("cuda"), - Language::CudaFE => None, - Language::Ptx => None, - Language::Cubin => None, - Language::Rust => None, // Let the compiler decide - Language::Hip => Some("hip"), - Language::GenericHeader => None, // Let the compiler decide - } + lang.to_clang_arg() } counted_array!(pub static ARGS: [ArgInfo; _] = [ diff --git a/src/compiler/compiler.rs b/src/compiler/compiler.rs index 49024993e..8a56b3822 100644 --- a/src/compiler/compiler.rs +++ b/src/compiler/compiler.rs @@ -296,6 +296,42 @@ impl Language { | Language::Rust ) } + + /// Common implementation for GCC and Clang language argument mapping + fn to_compiler_arg(self, cuda_arg: &'static str) -> Option<&'static str> { + match self { + Language::C => Some("c"), + Language::CHeader => Some("c-header"), + Language::CPreprocessed => Some("cpp-output"), + Language::Cxx => Some("c++"), + Language::CxxHeader => Some("c++-header"), + Language::CxxPreprocessed => Some("c++-cpp-output"), + Language::ObjectiveC => Some("objective-c"), + Language::ObjectiveCPreprocessed => Some("objective-c-cpp-output"), + Language::ObjectiveCxx => Some("objective-c++"), + Language::ObjectiveCxxHeader => Some("objective-c++-header"), + Language::ObjectiveCxxPreprocessed => Some("objective-c++-cpp-output"), + Language::Cuda => Some(cuda_arg), + Language::CudaFE => None, + Language::Ptx => None, + Language::Cubin => None, + Language::Rust => None, // Let the compiler decide + Language::Hip => Some("hip"), + Language::GenericHeader => None, // Let the compiler decide + } + } + + /// Returns the GCC-specific language argument for the `-x` flag + /// https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html + pub fn to_gcc_arg(self) -> Option<&'static str> { + self.to_compiler_arg("cu") + } + + /// Returns the Clang-specific language argument for the `-x` flag + /// https://github.com/llvm/llvm-project/blob/main/clang/include/clang/Driver/Types.def + pub fn to_clang_arg(self) -> Option<&'static str> { + self.to_compiler_arg("cuda") + } } impl CompilerKind { diff --git a/src/compiler/gcc.rs b/src/compiler/gcc.rs index 1a66a94d3..e43a979d9 100644 --- a/src/compiler/gcc.rs +++ b/src/compiler/gcc.rs @@ -700,27 +700,7 @@ where } pub fn language_to_gcc_arg(lang: Language) -> Option<&'static str> { - match lang { - // https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html - Language::C => Some("c"), - Language::CHeader => Some("c-header"), - Language::CPreprocessed => Some("cpp-output"), - Language::Cxx => Some("c++"), - Language::CxxHeader => Some("c++-header"), - Language::CxxPreprocessed => Some("c++-cpp-output"), - Language::ObjectiveC => Some("objective-c"), - Language::ObjectiveCPreprocessed => Some("objective-c-cpp-output"), - Language::ObjectiveCxx => Some("objective-c++"), - Language::ObjectiveCxxHeader => Some("objective-c++-header"), - Language::ObjectiveCxxPreprocessed => Some("objective-c++-cpp-output"), - Language::Cuda => Some("cu"), - Language::CudaFE => None, - Language::Ptx => None, - Language::Cubin => None, - Language::Rust => None, // Let the compiler decide - Language::Hip => Some("hip"), - Language::GenericHeader => None, // Let the compiler decide - } + lang.to_gcc_arg() } #[allow(clippy::too_many_arguments)]