Merge commit 'dde58803fd6cbb270c7a437f36a8a3a29fbef679' into sync_cg_… · rust-lang/rust@41dcb52 (original) (raw)
`@@ -46,6 +46,13 @@ pub(crate) fn codegen_global_asm_item(tcx: TyCtxt<'_>, global_asm: &mut String,
`
46
46
` global_asm.push_str(&string);
`
47
47
`}
`
48
48
`InlineAsmOperand::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
+
49
56
`let ty = tcx.typeck_body(anon_const.body).node_type(anon_const.hir_id);
`
50
57
`let instance = match ty.kind() {
`
51
58
`&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,
`
57
64
` global_asm.push_str(symbol.name);
`
58
65
`}
`
59
66
`InlineAsmOperand::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
+
60
74
`let instance = Instance::mono(tcx, def_id).polymorphize(tcx);
`
61
75
`let symbol = tcx.symbol_name(instance);
`
62
76
` global_asm.push_str(symbol.name);
`
`@@ -81,22 +95,23 @@ pub(crate) fn codegen_global_asm_item(tcx: TyCtxt<'_>, global_asm: &mut String,
`
81
95
`}
`
82
96
`}
`
83
97
``
84
``
`-
pub(crate) fn asm_supported(tcx: TyCtxt<'_>) -> bool {
`
85
``
`-
cfg!(feature = "inline_asm") && !tcx.sess.target.is_like_windows
`
86
``
`-
}
`
87
``
-
88
98
`#[derive(Debug)]
`
89
99
`pub(crate) struct GlobalAsmConfig {
`
90
``
`-
asm_enabled: bool,
`
91
100
`assembler: PathBuf,
`
``
101
`+
target: String,
`
92
102
`pub(crate) output_filenames: Arc,
`
93
103
`}
`
94
104
``
95
105
`impl GlobalAsmConfig {
`
96
106
`pub(crate) fn new(tcx: TyCtxt<'_>) -> Self {
`
97
107
`GlobalAsmConfig {
`
98
``
`-
asm_enabled: asm_supported(tcx),
`
99
108
`assembler: 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
`+
},
`
100
115
`output_filenames: tcx.output_filenames(()).clone(),
`
101
116
`}
`
102
117
`}
`
`@@ -111,21 +126,6 @@ pub(crate) fn compile_global_asm(
`
111
126
`return Ok(None);
`
112
127
`}
`
113
128
``
114
``
`-
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
``
-
129
129
`// Remove all LLVM style comments
`
130
130
`let mut global_asm = global_asm
`
131
131
`.lines()
`
`@@ -134,20 +134,67 @@ pub(crate) fn compile_global_asm(
`
134
134
`.join("\n");
`
135
135
` global_asm.push('\n');
`
136
136
``
137
``
`-
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
`+
);
`
138
141
``
139
142
`` // 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
`+
}
`
151
198
`}
`
152
199
``
153
200
`Ok(Some(global_asm_object_file))
`