rust/compiler
Alex Crichton 7fed92b3a4 rustc: Allow safe #[target_feature] on wasm
This commit updates the compiler's handling of the `#[target_feature]`
attribute when applied to functions on WebAssembly-based targets. The
compiler in general requires that any functions with `#[target_feature]`
are marked as `unsafe` as well, but this commit relaxes the restriction
for WebAssembly targets where the attribute can be applied to safe
functions as well.

The reason this is done is that the motivation for this feature of the
compiler is not applicable for WebAssembly targets. In general the
`#[target_feature]` attribute is used to enhance target CPU features
enabled beyond the basic level for the rest of the compilation. If done
improperly this means that your program could execute an instruction
that the CPU you happen to be running on does not understand. This is
considered undefined behavior where it is unknown what will happen (e.g.
it's not a deterministic `SIGILL`).

For WebAssembly, however, the target is different. It is not possible
for a running WebAssembly program to execute an instruction that the
engine does not understand. If this were the case then the program would
not have validated in the first place and would not run at all. Even if
this were allowed in some hypothetical future where engines have some
form of runtime feature detection (which they do not right now) any
implementation of such a feature would generate a trap if a module
attempts to execute an instruction the module does not understand. This
deterministic trap behavior would still not fall into the category of
undefined behavior because the trap is deterministic.

For these reasons the `#[target_feature]` attribute is now allowed on
safe functions, but only for WebAssembly targets. This notably enables
the wasm-SIMD intrinsics proposed for stabilization in #74372 to be
marked as safe generally instead of today where they're all `unsafe` due
to the historical implementation of `#[target_feature]` in the compiler.
2021-05-28 12:57:35 -07:00
..
rustc
rustc_apfloat remove cfg(bootstrap) 2021-05-24 11:07:48 -04:00
rustc_arena
rustc_ast remove cfg(bootstrap) 2021-05-24 11:07:48 -04:00
rustc_ast_lowering remove cfg(bootstrap) 2021-05-24 11:07:48 -04:00
rustc_ast_passes Stabilize extended_key_value_attributes 2021-05-18 01:01:36 -04:00
rustc_ast_pretty remove cfg(bootstrap) 2021-05-24 11:07:48 -04:00
rustc_attr remove cfg(bootstrap) 2021-05-24 11:07:48 -04:00
rustc_builtin_macros remove cfg(bootstrap) 2021-05-24 11:07:48 -04:00
rustc_codegen_cranelift Merge commit '40dd3e2b7089b5e96714e064b731f6dbf17c61a9' into sync_cg_clif-2021-05-27 2021-05-27 13:08:14 +02:00
rustc_codegen_llvm Fix static relocation model for PowerPC64 2021-05-28 03:48:39 +02:00
rustc_codegen_ssa Rollup merge of #85649 - ChrisDenton:update-cc, r=matthewjasper 2021-05-27 03:02:09 +02:00
rustc_data_structures
rustc_driver Auto merge of #83842 - LeSeulArtichaut:thir-vec, r=nikomatsakis 2021-05-19 18:41:23 +00:00
rustc_error_codes
rustc_errors Stabilize extended_key_value_attributes 2021-05-18 01:01:36 -04:00
rustc_expand remove cfg(bootstrap) 2021-05-24 11:07:48 -04:00
rustc_feature stabilize member constraints 2021-05-26 06:01:53 -04:00
rustc_fs_util
rustc_graphviz
rustc_hir remove cfg(bootstrap) 2021-05-24 11:07:48 -04:00
rustc_hir_pretty remove cfg(bootstrap) 2021-05-24 11:07:48 -04:00
rustc_incremental Get rid of PreviousDepGraph. 2021-05-22 14:14:23 +02:00
rustc_index
rustc_infer remove cfg(bootstrap) 2021-05-24 11:07:48 -04:00
rustc_interface Make thir_check_unsafety itself responsible for checking gate 2021-05-24 15:09:33 +02:00
rustc_lexer
rustc_lint Lint against non-camelCase trait alias names 2021-05-26 19:55:27 -04:00
rustc_lint_defs
rustc_llvm Update cc 2021-05-24 23:34:12 +01:00
rustc_macros
rustc_metadata remove cfg(bootstrap) 2021-05-24 11:07:48 -04:00
rustc_middle Auto merge of #85546 - hyd-dev:unwind, r=RalfJung 2021-05-28 08:49:48 +00:00
rustc_mir rustc: Allow safe #[target_feature] on wasm 2021-05-28 12:57:35 -07:00
rustc_mir_build rustc: Allow safe #[target_feature] on wasm 2021-05-28 12:57:35 -07:00
rustc_parse remove cfg(bootstrap) 2021-05-24 11:07:48 -04:00
rustc_parse_format remove cfg(bootstrap) 2021-05-24 11:07:48 -04:00
rustc_passes remove cfg(bootstrap) 2021-05-24 11:07:48 -04:00
rustc_plugin_impl
rustc_privacy remove cfg(bootstrap) 2021-05-24 11:07:48 -04:00
rustc_query_impl
rustc_query_system Get rid of PreviousDepGraph. 2021-05-22 14:14:23 +02:00
rustc_resolve Rollup merge of #85478 - FabianWolff:issue-85348, r=petrochenkov 2021-05-26 13:32:05 +02:00
rustc_save_analysis remove cfg(bootstrap) 2021-05-24 11:07:48 -04:00
rustc_serialize
rustc_session Rollup merge of #85361 - bjorn3:rustdoc_target_json_path_canonicalize, r=jyn514 2021-05-25 13:05:09 +02:00
rustc_span Rollup merge of #85439 - mgacek8:add_diagnostic_item_to_CStr_type, r=davidtwco 2021-05-20 00:19:07 +02:00
rustc_symbol_mangling remove cfg(bootstrap) 2021-05-24 11:07:48 -04:00
rustc_target Remove linker_is_gnu: true cases as that is now the default. 2021-05-20 23:36:04 -07:00
rustc_trait_selection stabilize member constraints 2021-05-26 06:01:53 -04:00
rustc_traits
rustc_ty_utils
rustc_type_ir
rustc_typeck rustc: Allow safe #[target_feature] on wasm 2021-05-28 12:57:35 -07:00