]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_llvm/src/lib.rs
Auto merge of #96802 - gimbles:windows_slice, r=thomcc
[rust.git] / compiler / rustc_llvm / src / lib.rs
1 #![feature(nll)]
2 #![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
3
4 // NOTE: This crate only exists to allow linking on mingw targets.
5
6 use libc::{c_char, size_t};
7 use std::cell::RefCell;
8 use std::slice;
9
10 #[repr(C)]
11 pub struct RustString {
12     pub bytes: RefCell<Vec<u8>>,
13 }
14
15 impl RustString {
16     pub fn len(&self) -> usize {
17         self.bytes.borrow().len()
18     }
19
20     pub fn is_empty(&self) -> bool {
21         self.bytes.borrow().is_empty()
22     }
23 }
24
25 /// Appending to a Rust string -- used by RawRustStringOstream.
26 #[no_mangle]
27 pub unsafe extern "C" fn LLVMRustStringWriteImpl(
28     sr: &RustString,
29     ptr: *const c_char,
30     size: size_t,
31 ) {
32     let slice = slice::from_raw_parts(ptr as *const u8, size as usize);
33
34     sr.bytes.borrow_mut().extend_from_slice(slice);
35 }
36
37 /// Initialize targets enabled by the build script via `cfg(llvm_component = "...")`.
38 /// N.B., this function can't be moved to `rustc_codegen_llvm` because of the `cfg`s.
39 pub fn initialize_available_targets() {
40     macro_rules! init_target(
41         ($cfg:meta, $($method:ident),*) => { {
42             #[cfg($cfg)]
43             fn init() {
44                 extern "C" {
45                     $(fn $method();)*
46                 }
47                 unsafe {
48                     $($method();)*
49                 }
50             }
51             #[cfg(not($cfg))]
52             fn init() { }
53             init();
54         } }
55     );
56     init_target!(
57         llvm_component = "x86",
58         LLVMInitializeX86TargetInfo,
59         LLVMInitializeX86Target,
60         LLVMInitializeX86TargetMC,
61         LLVMInitializeX86AsmPrinter,
62         LLVMInitializeX86AsmParser
63     );
64     init_target!(
65         llvm_component = "arm",
66         LLVMInitializeARMTargetInfo,
67         LLVMInitializeARMTarget,
68         LLVMInitializeARMTargetMC,
69         LLVMInitializeARMAsmPrinter,
70         LLVMInitializeARMAsmParser
71     );
72     init_target!(
73         llvm_component = "aarch64",
74         LLVMInitializeAArch64TargetInfo,
75         LLVMInitializeAArch64Target,
76         LLVMInitializeAArch64TargetMC,
77         LLVMInitializeAArch64AsmPrinter,
78         LLVMInitializeAArch64AsmParser
79     );
80     init_target!(
81         llvm_component = "amdgpu",
82         LLVMInitializeAMDGPUTargetInfo,
83         LLVMInitializeAMDGPUTarget,
84         LLVMInitializeAMDGPUTargetMC,
85         LLVMInitializeAMDGPUAsmPrinter,
86         LLVMInitializeAMDGPUAsmParser
87     );
88     init_target!(
89         llvm_component = "avr",
90         LLVMInitializeAVRTargetInfo,
91         LLVMInitializeAVRTarget,
92         LLVMInitializeAVRTargetMC,
93         LLVMInitializeAVRAsmPrinter,
94         LLVMInitializeAVRAsmParser
95     );
96     init_target!(
97         llvm_component = "m68k",
98         LLVMInitializeM68kTargetInfo,
99         LLVMInitializeM68kTarget,
100         LLVMInitializeM68kTargetMC,
101         LLVMInitializeM68kAsmPrinter,
102         LLVMInitializeM68kAsmParser
103     );
104     init_target!(
105         llvm_component = "mips",
106         LLVMInitializeMipsTargetInfo,
107         LLVMInitializeMipsTarget,
108         LLVMInitializeMipsTargetMC,
109         LLVMInitializeMipsAsmPrinter,
110         LLVMInitializeMipsAsmParser
111     );
112     init_target!(
113         llvm_component = "powerpc",
114         LLVMInitializePowerPCTargetInfo,
115         LLVMInitializePowerPCTarget,
116         LLVMInitializePowerPCTargetMC,
117         LLVMInitializePowerPCAsmPrinter,
118         LLVMInitializePowerPCAsmParser
119     );
120     init_target!(
121         llvm_component = "systemz",
122         LLVMInitializeSystemZTargetInfo,
123         LLVMInitializeSystemZTarget,
124         LLVMInitializeSystemZTargetMC,
125         LLVMInitializeSystemZAsmPrinter,
126         LLVMInitializeSystemZAsmParser
127     );
128     init_target!(
129         llvm_component = "jsbackend",
130         LLVMInitializeJSBackendTargetInfo,
131         LLVMInitializeJSBackendTarget,
132         LLVMInitializeJSBackendTargetMC
133     );
134     init_target!(
135         llvm_component = "msp430",
136         LLVMInitializeMSP430TargetInfo,
137         LLVMInitializeMSP430Target,
138         LLVMInitializeMSP430TargetMC,
139         LLVMInitializeMSP430AsmPrinter,
140         LLVMInitializeMSP430AsmParser
141     );
142     init_target!(
143         llvm_component = "riscv",
144         LLVMInitializeRISCVTargetInfo,
145         LLVMInitializeRISCVTarget,
146         LLVMInitializeRISCVTargetMC,
147         LLVMInitializeRISCVAsmPrinter,
148         LLVMInitializeRISCVAsmParser
149     );
150     init_target!(
151         llvm_component = "sparc",
152         LLVMInitializeSparcTargetInfo,
153         LLVMInitializeSparcTarget,
154         LLVMInitializeSparcTargetMC,
155         LLVMInitializeSparcAsmPrinter,
156         LLVMInitializeSparcAsmParser
157     );
158     init_target!(
159         llvm_component = "nvptx",
160         LLVMInitializeNVPTXTargetInfo,
161         LLVMInitializeNVPTXTarget,
162         LLVMInitializeNVPTXTargetMC,
163         LLVMInitializeNVPTXAsmPrinter
164     );
165     init_target!(
166         llvm_component = "hexagon",
167         LLVMInitializeHexagonTargetInfo,
168         LLVMInitializeHexagonTarget,
169         LLVMInitializeHexagonTargetMC,
170         LLVMInitializeHexagonAsmPrinter,
171         LLVMInitializeHexagonAsmParser
172     );
173     init_target!(
174         llvm_component = "webassembly",
175         LLVMInitializeWebAssemblyTargetInfo,
176         LLVMInitializeWebAssemblyTarget,
177         LLVMInitializeWebAssemblyTargetMC,
178         LLVMInitializeWebAssemblyAsmPrinter,
179         LLVMInitializeWebAssemblyAsmParser
180     );
181     init_target!(
182         llvm_component = "bpf",
183         LLVMInitializeBPFTargetInfo,
184         LLVMInitializeBPFTarget,
185         LLVMInitializeBPFTargetMC,
186         LLVMInitializeBPFAsmPrinter,
187         LLVMInitializeBPFAsmParser
188     );
189 }