Update for review

This commit is contained in:
matt rice 2024-06-14 07:53:37 -07:00
parent a85700a1a8
commit 1de046fa24
1 changed files with 17 additions and 2 deletions

View File

@ -160,20 +160,35 @@ fn maybe_check_static_with_link_section(tcx: TyCtxt<'_>, id: LocalDefId) {
} }
// For the wasm32 target statics with `#[link_section]` other than `.init_array` // For the wasm32 target statics with `#[link_section]` other than `.init_array`
// are placed into custom sections of the final output file, but this isn't link // are placed into custom sections of the final output file, but this isn't like
// custom sections of other executable formats. Namely we can only embed a list // custom sections of other executable formats. Namely we can only embed a list
// of bytes, nothing with provenance (pointers to anything else). If any // of bytes, nothing with provenance (pointers to anything else). If any
// provenance show up, reject it here. // provenance show up, reject it here.
// `#[link_section]` may contain arbitrary, or even undefined bytes, but it is // `#[link_section]` may contain arbitrary, or even undefined bytes, but it is
// the consumer's responsibility to ensure all bytes that have been read // the consumer's responsibility to ensure all bytes that have been read
// have defined values. // have defined values.
//
// The `.init_array` section is left to go through the normal custom section code path.
// When dealing with `.init_array` wasm-ld currently has several limitations. This manifests
// in workarounds in user-code.
//
// * The linker fails to merge multiple items in a crate into the .init_array section.
// To work around this, a single array can be used placing multiple items in the array.
// #[link_section = ".init_array"]
// static FOO: [unsafe extern "C" fn(); 2] = [ctor, ctor];
// * Even symbols marked used get gc'd from dependant crates unless at least one symbol
// in the crate is marked with an `#[export_name]`
//
// Once `.init_array` support in wasm-ld is complete, the user code workarounds should
// continue to work, but would no longer be necessary.
if let Ok(alloc) = tcx.eval_static_initializer(id.to_def_id()) if let Ok(alloc) = tcx.eval_static_initializer(id.to_def_id())
&& alloc.inner().provenance().ptrs().len() != 0 && alloc.inner().provenance().ptrs().len() != 0
{ {
if attrs if attrs
.link_section .link_section
.map(|link_section| !link_section.as_str().starts_with(".init_array")) .map(|link_section| !link_section.as_str().starts_with(".init_array"))
.unwrap_or(true) .unwrap()
{ {
let msg = "statics with a custom `#[link_section]` must be a \ let msg = "statics with a custom `#[link_section]` must be a \
simple list of bytes on the wasm target with no \ simple list of bytes on the wasm target with no \