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