2c24f81336569ff96bafb66a05422026f3593ebd
[kazan.git] / shader-compiler-llvm-7 / src / backend.rs
1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 // Copyright 2018 Jacob Lifshay
3 use llvm_sys;
4 use shader_compiler::backend::*;
5 use std::ffi::CString;
6 use std::os::raw::c_char;
7
8 #[repr(transparent)]
9 pub struct LLVM7Context(llvm_sys::prelude::LLVMContextRef);
10
11 impl Drop for LLVM7Context {
12 fn drop(&mut self) {
13 unsafe {
14 llvm_sys::core::LLVMContextDispose(self.0);
15 }
16 }
17 }
18
19 unsafe impl Send for LLVM7Context {}
20
21 impl<'a> Context<'a> for LLVM7Context {
22 type Module = LLVM7Module;
23 fn create_module(&self, name: &str) -> LLVM7Module {
24 let name = CString::new(name).unwrap();
25 unsafe {
26 LLVM7Module(llvm_sys::core::LLVMModuleCreateWithNameInContext(
27 name.as_ptr(),
28 self.0,
29 ))
30 }
31 }
32 }
33
34 #[repr(transparent)]
35 pub struct LLVM7Module(llvm_sys::prelude::LLVMModuleRef);
36
37 impl Drop for LLVM7Module {
38 fn drop(&mut self) {
39 unsafe {
40 llvm_sys::core::LLVMDisposeModule(self.0);
41 }
42 }
43 }
44
45 impl<'a> Module<'a> for LLVM7Module {
46 fn set_source_file_name(&mut self, source_file_name: &str) {
47 unsafe {
48 llvm_sys::core::LLVMSetSourceFileName(
49 self.0,
50 source_file_name.as_ptr() as *const c_char,
51 source_file_name.len(),
52 )
53 }
54 }
55 }
56
57 pub struct LLVM7ShaderCompiler;
58
59 impl ShaderCompiler for LLVM7ShaderCompiler {
60 fn name() -> &'static str {
61 "LLVM 7"
62 }
63 fn run_with_user<SCU: ShaderCompilerUser>(shader_compiler_user: SCU) -> SCU::ReturnType {
64 let context = unsafe { LLVM7Context(llvm_sys::core::LLVMContextCreate()) };
65 shader_compiler_user.run_with_context(&context)
66 }
67 }