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