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