Better parsing of #[section_name] on Mach-O
This is required by the objc2 crate Fixes rust-lang/rustc_codegen_cranelift#1504
This commit is contained in:
parent
f35bd40d18
commit
253436c04c
@ -383,15 +383,43 @@ fn define_all_allocs(tcx: TyCtxt<'_>, module: &mut dyn Module, cx: &mut Constant
|
||||
|
||||
if let Some(section_name) = section_name {
|
||||
let (segment_name, section_name) = if tcx.sess.target.is_like_osx {
|
||||
let section_name = section_name.as_str();
|
||||
if let Some(names) = section_name.split_once(',') {
|
||||
names
|
||||
} else {
|
||||
// See https://github.com/llvm/llvm-project/blob/main/llvm/lib/MC/MCSectionMachO.cpp
|
||||
let mut parts = section_name.as_str().split(',');
|
||||
let Some(segment_name) = parts.next() else {
|
||||
tcx.dcx().fatal(format!(
|
||||
"#[link_section = \"{}\"] is not valid for macos target: must be segment and section separated by comma",
|
||||
section_name
|
||||
));
|
||||
};
|
||||
let Some(section_name) = parts.next() else {
|
||||
tcx.dcx().fatal(format!(
|
||||
"#[link_section = \"{}\"] is not valid for macos target: must be segment and section separated by comma",
|
||||
section_name
|
||||
));
|
||||
};
|
||||
if section_name.len() > 16 {
|
||||
tcx.dcx().fatal(format!(
|
||||
"#[link_section = \"{}\"] is not valid for macos target: section name bigger than 16 bytes",
|
||||
section_name
|
||||
));
|
||||
}
|
||||
let section_type = parts.next().unwrap_or("regular");
|
||||
if section_type != "regular" && section_type != "cstring_literals" {
|
||||
tcx.dcx().fatal(format!(
|
||||
"#[link_section = \"{}\"] is not supported: unsupported section type {}",
|
||||
section_name, section_type,
|
||||
));
|
||||
}
|
||||
let _attrs = parts.next();
|
||||
if parts.next().is_some() {
|
||||
tcx.dcx().fatal(format!(
|
||||
"#[link_section = \"{}\"] is not valid for macos target: too many components",
|
||||
section_name
|
||||
));
|
||||
}
|
||||
// FIXME(bytecodealliance/wasmtime#8901) set S_CSTRING_LITERALS section type when
|
||||
// cstring_literals is specified
|
||||
(segment_name, section_name)
|
||||
} else {
|
||||
("", section_name.as_str())
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user