Skip to content

Commit 07147f3

Browse files
committed
Fix inline asm on macOS
1 parent 8109344 commit 07147f3

File tree

1 file changed

+36
-6
lines changed

1 file changed

+36
-6
lines changed

src/inline_asm.rs

+36-6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use rustc_ast::ast::{InlineAsmOptions, InlineAsmTemplatePiece};
66
use rustc_middle::mir::InlineAsmOperand;
77
use rustc_span::sym;
88
use rustc_target::asm::*;
9+
use target_lexicon::BinaryFormat;
910

1011
use crate::prelude::*;
1112

@@ -589,11 +590,29 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
589590
}
590591

591592
fn generate_asm_wrapper(&self, asm_name: &str) -> String {
593+
let binary_format = crate::target_triple(self.tcx.sess).binary_format;
594+
592595
let mut generated_asm = String::new();
593-
writeln!(generated_asm, ".globl {}", asm_name).unwrap();
594-
writeln!(generated_asm, ".type {},@function", asm_name).unwrap();
595-
writeln!(generated_asm, ".section .text.{},\"ax\",@progbits", asm_name).unwrap();
596-
writeln!(generated_asm, "{}:", asm_name).unwrap();
596+
match binary_format {
597+
BinaryFormat::Elf => {
598+
writeln!(generated_asm, ".globl {}", asm_name).unwrap();
599+
writeln!(generated_asm, ".type {},@function", asm_name).unwrap();
600+
writeln!(generated_asm, ".section .text.{},\"ax\",@progbits", asm_name).unwrap();
601+
writeln!(generated_asm, "{}:", asm_name).unwrap();
602+
}
603+
BinaryFormat::Macho => {
604+
writeln!(generated_asm, ".globl _{}", asm_name).unwrap();
605+
writeln!(generated_asm, "_{}:", asm_name).unwrap();
606+
}
607+
BinaryFormat::Coff => {
608+
writeln!(generated_asm, ".globl {}", asm_name).unwrap();
609+
writeln!(generated_asm, "{}:", asm_name).unwrap();
610+
}
611+
_ => self
612+
.tcx
613+
.sess
614+
.fatal(format!("Unsupported binary format for inline asm: {binary_format:?}")),
615+
}
597616

598617
let is_x86 = matches!(self.arch, InlineAsmArch::X86 | InlineAsmArch::X86_64);
599618

@@ -690,8 +709,19 @@ impl<'tcx> InlineAssemblyGenerator<'_, 'tcx> {
690709
if is_x86 {
691710
generated_asm.push_str(".att_syntax\n");
692711
}
693-
writeln!(generated_asm, ".size {name}, .-{name}", name = asm_name).unwrap();
694-
generated_asm.push_str(".text\n");
712+
713+
match binary_format {
714+
BinaryFormat::Elf => {
715+
writeln!(generated_asm, ".size {name}, .-{name}", name = asm_name).unwrap();
716+
generated_asm.push_str(".text\n");
717+
}
718+
BinaryFormat::Macho | BinaryFormat::Coff => {}
719+
_ => self
720+
.tcx
721+
.sess
722+
.fatal(format!("Unsupported binary format for inline asm: {binary_format:?}")),
723+
}
724+
695725
generated_asm.push_str("\n\n");
696726

697727
generated_asm

0 commit comments

Comments
 (0)