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