mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
naked functions: respect function_sections on linux/macos
This commit is contained in:
@@ -220,8 +220,6 @@ fn prefix_and_suffix<'tcx>(
|
||||
let mut end = String::new();
|
||||
match asm_binary_format {
|
||||
BinaryFormat::Elf => {
|
||||
let section = link_section.unwrap_or_else(|| format!(".text.{asm_name}"));
|
||||
|
||||
let progbits = match is_arm {
|
||||
true => "%progbits",
|
||||
false => "@progbits",
|
||||
@@ -232,7 +230,11 @@ fn prefix_and_suffix<'tcx>(
|
||||
false => "@function",
|
||||
};
|
||||
|
||||
writeln!(begin, ".pushsection {section},\"ax\", {progbits}").unwrap();
|
||||
if let Some(section) = &link_section {
|
||||
writeln!(begin, ".pushsection {section},\"ax\", {progbits}").unwrap();
|
||||
} else if function_sections {
|
||||
writeln!(begin, ".pushsection .text.{asm_name},\"ax\", {progbits}").unwrap();
|
||||
}
|
||||
writeln!(begin, ".balign {align_bytes}").unwrap();
|
||||
write_linkage(&mut begin).unwrap();
|
||||
match visibility {
|
||||
@@ -251,14 +253,18 @@ fn prefix_and_suffix<'tcx>(
|
||||
// pattern match on assembly generated by LLVM.
|
||||
writeln!(end, ".Lfunc_end_{asm_name}:").unwrap();
|
||||
writeln!(end, ".size {asm_name}, . - {asm_name}").unwrap();
|
||||
writeln!(end, ".popsection").unwrap();
|
||||
if link_section.is_some() || function_sections {
|
||||
writeln!(end, ".popsection").unwrap();
|
||||
}
|
||||
if !arch_suffix.is_empty() {
|
||||
writeln!(end, "{}", arch_suffix).unwrap();
|
||||
}
|
||||
}
|
||||
BinaryFormat::MachO => {
|
||||
let section = link_section.unwrap_or_else(|| "__TEXT,__text".to_string());
|
||||
writeln!(begin, ".pushsection {},regular,pure_instructions", section).unwrap();
|
||||
// NOTE: LLVM ignores `-Zfunction-sections` on macos.
|
||||
if let Some(section) = &link_section {
|
||||
writeln!(begin, ".pushsection {section},regular,pure_instructions").unwrap();
|
||||
}
|
||||
writeln!(begin, ".balign {align_bytes}").unwrap();
|
||||
write_linkage(&mut begin).unwrap();
|
||||
match visibility {
|
||||
@@ -269,7 +275,9 @@ fn prefix_and_suffix<'tcx>(
|
||||
|
||||
writeln!(end).unwrap();
|
||||
writeln!(end, ".Lfunc_end_{asm_name}:").unwrap();
|
||||
writeln!(end, ".popsection").unwrap();
|
||||
if link_section.is_some() {
|
||||
writeln!(end, ".popsection").unwrap();
|
||||
}
|
||||
if !arch_suffix.is_empty() {
|
||||
writeln!(end, "{}", arch_suffix).unwrap();
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
// linux,win_x86,win_i686: .intel_syntax
|
||||
//
|
||||
// linux: .pushsection .text.naked_empty,\22ax\22, @progbits
|
||||
// macos: .pushsection __TEXT,__text,regular,pure_instructions
|
||||
// macos-NOT: .pushsection
|
||||
//
|
||||
// win_x86_msvc: .pushsection .text$naked_empty,\22xr\22
|
||||
// win_x86_gnu-NOT: .pushsection
|
||||
@@ -89,7 +89,7 @@ pub extern "C" fn naked_empty() {
|
||||
// linux,win_x86,win_i686: .intel_syntax
|
||||
//
|
||||
// linux: .pushsection .text.naked_with_args_and_return,\22ax\22, @progbits
|
||||
// macos: .pushsection __TEXT,__text,regular,pure_instructions
|
||||
// macos-NOT: .pushsection
|
||||
//
|
||||
// win_x86_msvc: .pushsection .text$naked_with_args_and_return,\22xr\22
|
||||
// win_x86_gnu-NOT: .pushsection
|
||||
|
||||
Reference in New Issue
Block a user