Merge commit 'dde58803fd6cbb270c7a437f36a8a3a29fbef679' into sync_cg_… · rust-lang/rust@41dcb52
@@ -46,6 +46,13 @@ pub(crate) fn codegen_global_asm_item(tcx: TyCtxt<'_>, global_asm: &mut String,
4646 global_asm.push_str(&string);
4747}
4848InlineAsmOperand::SymFn { anon_const } => {
49+if cfg!(not(feature = "inline_asm_sym")) {
50+ tcx.sess.span_err(
51+ item.span,
52+"asm! and global_asm! sym operands are not yet supported",
53+);
54+}
55+4956let ty = tcx.typeck_body(anon_const.body).node_type(anon_const.hir_id);
5057let instance = match ty.kind() {
5158&ty::FnDef(def_id, args) => Instance::new(def_id, args),
@@ -57,6 +64,13 @@ pub(crate) fn codegen_global_asm_item(tcx: TyCtxt<'_>, global_asm: &mut String,
5764 global_asm.push_str(symbol.name);
5865}
5966InlineAsmOperand::SymStatic { path: _, def_id } => {
67+if cfg!(not(feature = "inline_asm_sym")) {
68+ tcx.sess.span_err(
69+ item.span,
70+"asm! and global_asm! sym operands are not yet supported",
71+);
72+}
73+6074let instance = Instance::mono(tcx, def_id).polymorphize(tcx);
6175let symbol = tcx.symbol_name(instance);
6276 global_asm.push_str(symbol.name);
@@ -81,22 +95,23 @@ pub(crate) fn codegen_global_asm_item(tcx: TyCtxt<'_>, global_asm: &mut String,
8195}
8296}
839784-pub(crate) fn asm_supported(tcx: TyCtxt<'_>) -> bool {
85-cfg!(feature = "inline_asm") && !tcx.sess.target.is_like_windows
86-}
87-8898#[derive(Debug)]
8999pub(crate) struct GlobalAsmConfig {
90-asm_enabled: bool,
91100assembler: PathBuf,
101+target: String,
92102pub(crate) output_filenames: Arc<OutputFilenames>,
93103}
9410495105impl GlobalAsmConfig {
96106pub(crate) fn new(tcx: TyCtxt<'_>) -> Self {
97107GlobalAsmConfig {
98-asm_enabled: asm_supported(tcx),
99108assembler: crate::toolchain::get_toolchain_binary(tcx.sess, "as"),
109+target: match &tcx.sess.opts.target_triple {
110+ rustc_target::spec::TargetTriple::TargetTriple(triple) => triple.clone(),
111+ rustc_target::spec::TargetTriple::TargetJson { path_for_rustdoc, .. } => {
112+ path_for_rustdoc.to_str().unwrap().to_owned()
113+}
114+},
100115output_filenames: tcx.output_filenames(()).clone(),
101116}
102117}
@@ -111,21 +126,6 @@ pub(crate) fn compile_global_asm(
111126return Ok(None);
112127}
113128114-if !config.asm_enabled {
115-if global_asm.contains("__rust_probestack") {
116-return Ok(None);
117-}
118-119-if cfg!(not(feature = "inline_asm")) {
120-return Err(
121-"asm! and global_asm! support is disabled while compiling rustc_codegen_cranelift"
122-.to_owned(),
123-);
124-} else {
125-return Err("asm! and global_asm! are not yet supported on Windows".to_owned());
126-}
127-}
128-129129// Remove all LLVM style comments
130130let mut global_asm = global_asm
131131.lines()
@@ -134,20 +134,67 @@ pub(crate) fn compile_global_asm(
134134.join("\n");
135135 global_asm.push('\n');
136136137-let output_object_file = config.output_filenames.temp_path(OutputType::Object, Some(cgu_name));
137+let global_asm_object_file = add_file_stem_postfix(
138+ config.output_filenames.temp_path(OutputType::Object, Some(cgu_name)),
139+".asm",
140+);
138141139142// Assemble `global_asm`
140-let global_asm_object_file = add_file_stem_postfix(output_object_file, ".asm");
141-let mut child = Command::new(&config.assembler)
142-.arg("-o")
143-.arg(&global_asm_object_file)
144-.stdin(Stdio::piped())
145-.spawn()
146-.expect("Failed to spawn `as`.");
147- child.stdin.take().unwrap().write_all(global_asm.as_bytes()).unwrap();
148-let status = child.wait().expect("Failed to wait for `as`.");
149-if !status.success() {
150-return Err(format!("Failed to assemble `{}`", global_asm));
143+if option_env!("CG_CLIF_FORCE_GNU_AS").is_some() {
144+let mut child = Command::new(&config.assembler)
145+.arg("-o")
146+.arg(&global_asm_object_file)
147+.stdin(Stdio::piped())
148+.spawn()
149+.expect("Failed to spawn `as`.");
150+ child.stdin.take().unwrap().write_all(global_asm.as_bytes()).unwrap();
151+let status = child.wait().expect("Failed to wait for `as`.");
152+if !status.success() {
153+return Err(format!("Failed to assemble `{}`", global_asm));
154+}
155+} else {
156+let mut child = Command::new(std::env::current_exe().unwrap())
157+.arg("--target")
158+.arg(&config.target)
159+.arg("--crate-type")
160+.arg("staticlib")
161+.arg("--emit")
162+.arg("obj")
163+.arg("-o")
164+.arg(&global_asm_object_file)
165+.arg("-")
166+.arg("-Abad_asm_style")
167+.arg("-Zcodegen-backend=llvm")
168+.stdin(Stdio::piped())
169+.spawn()
170+.expect("Failed to spawn `as`.");
171+let mut stdin = child.stdin.take().unwrap();
172+ stdin
173+.write_all(
174+br####"
175+ #![feature(decl_macro, no_core, rustc_attrs)]
176+ #![allow(internal_features)]
177+ #![no_core]
178+ #[rustc_builtin_macro]
179+ #[rustc_macro_transparency = "semitransparent"]
180+ macro global_asm() { /* compiler built-in */ }
181+ global_asm!(r###"
182+ "####,
183+)
184+.unwrap();
185+ stdin.write_all(global_asm.as_bytes()).unwrap();
186+ stdin
187+.write_all(
188+br####"
189+ "###);
190+ "####,
191+)
192+.unwrap();
193+ std::mem::drop(stdin);
194+let status = child.wait().expect("Failed to wait for `as`.");
195+if !status.success() {
196+return Err(format!("Failed to assemble `{}`", global_asm));
197+}
151198}
152199153200Ok(Some(global_asm_object_file))