Use FxIndexSet instead of FxHashSet for asm_target_features query.
This commit is contained in:
parent
b0202d9c2c
commit
ee8bc5b0b2
10 changed files with 39 additions and 37 deletions
|
@ -1,7 +1,7 @@
|
||||||
use rustc_ast::ast;
|
use rustc_ast::ast;
|
||||||
use rustc_attr::InstructionSetAttr;
|
use rustc_attr::InstructionSetAttr;
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxIndexSet;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
use rustc_hir::def::DefKind;
|
use rustc_hir::def::DefKind;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
|
@ -418,7 +418,7 @@ pub fn from_target_feature(
|
||||||
|
|
||||||
/// Computes the set of target features used in a function for the purposes of
|
/// Computes the set of target features used in a function for the purposes of
|
||||||
/// inline assembly.
|
/// inline assembly.
|
||||||
fn asm_target_features(tcx: TyCtxt<'_>, did: DefId) -> &FxHashSet<Symbol> {
|
fn asm_target_features(tcx: TyCtxt<'_>, did: DefId) -> &FxIndexSet<Symbol> {
|
||||||
let mut target_features = tcx.sess.unstable_target_features.clone();
|
let mut target_features = tcx.sess.unstable_target_features.clone();
|
||||||
if tcx.def_kind(did).has_codegen_attrs() {
|
if tcx.def_kind(did).has_codegen_attrs() {
|
||||||
let attrs = tcx.codegen_fn_attrs(did);
|
let attrs = tcx.codegen_fn_attrs(did);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use rustc_ast::InlineAsmTemplatePiece;
|
use rustc_ast::InlineAsmTemplatePiece;
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxIndexSet;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_middle::ty::{self, Article, FloatTy, IntTy, Ty, TyCtxt, TypeVisitableExt, UintTy};
|
use rustc_middle::ty::{self, Article, FloatTy, IntTy, Ty, TyCtxt, TypeVisitableExt, UintTy};
|
||||||
use rustc_session::lint;
|
use rustc_session::lint;
|
||||||
|
@ -51,7 +51,7 @@ impl<'a, 'tcx> InlineAsmCtxt<'a, 'tcx> {
|
||||||
template: &[InlineAsmTemplatePiece],
|
template: &[InlineAsmTemplatePiece],
|
||||||
is_input: bool,
|
is_input: bool,
|
||||||
tied_input: Option<(&'tcx hir::Expr<'tcx>, Option<InlineAsmType>)>,
|
tied_input: Option<(&'tcx hir::Expr<'tcx>, Option<InlineAsmType>)>,
|
||||||
target_features: &FxHashSet<Symbol>,
|
target_features: &FxIndexSet<Symbol>,
|
||||||
) -> Option<InlineAsmType> {
|
) -> Option<InlineAsmType> {
|
||||||
let ty = (self.get_operand_ty)(expr);
|
let ty = (self.get_operand_ty)(expr);
|
||||||
if ty.has_non_region_infer() {
|
if ty.has_non_region_infer() {
|
||||||
|
@ -201,7 +201,7 @@ impl<'a, 'tcx> InlineAsmCtxt<'a, 'tcx> {
|
||||||
// (!). In that case we still need the earlier check to verify that the
|
// (!). In that case we still need the earlier check to verify that the
|
||||||
// register class is usable at all.
|
// register class is usable at all.
|
||||||
if let Some(feature) = feature {
|
if let Some(feature) = feature {
|
||||||
if !target_features.contains(&feature) {
|
if !target_features.contains(feature) {
|
||||||
let msg = &format!("`{}` target feature is not enabled", feature);
|
let msg = &format!("`{}` target feature is not enabled", feature);
|
||||||
let mut err = self.tcx.sess.struct_span_err(expr.span, msg);
|
let mut err = self.tcx.sess.struct_span_err(expr.span, msg);
|
||||||
err.note(&format!(
|
err.note(&format!(
|
||||||
|
|
|
@ -94,7 +94,8 @@ macro_rules! arena_types {
|
||||||
[] object_safety_violations: rustc_middle::traits::ObjectSafetyViolation,
|
[] object_safety_violations: rustc_middle::traits::ObjectSafetyViolation,
|
||||||
[] codegen_unit: rustc_middle::mir::mono::CodegenUnit<'tcx>,
|
[] codegen_unit: rustc_middle::mir::mono::CodegenUnit<'tcx>,
|
||||||
[decode] attribute: rustc_ast::Attribute,
|
[decode] attribute: rustc_ast::Attribute,
|
||||||
[] name_set: rustc_data_structures::fx::FxHashSet<rustc_span::symbol::Symbol>,
|
[] name_set: rustc_data_structures::unord::UnordSet<rustc_span::symbol::Symbol>,
|
||||||
|
[] ordered_name_set: rustc_data_structures::fx::FxIndexSet<rustc_span::symbol::Symbol>,
|
||||||
[] hir_id_set: rustc_hir::HirIdSet,
|
[] hir_id_set: rustc_hir::HirIdSet,
|
||||||
|
|
||||||
// Interned types
|
// Interned types
|
||||||
|
|
|
@ -1212,7 +1212,7 @@ rustc_queries! {
|
||||||
separate_provide_extern
|
separate_provide_extern
|
||||||
}
|
}
|
||||||
|
|
||||||
query asm_target_features(def_id: DefId) -> &'tcx FxHashSet<Symbol> {
|
query asm_target_features(def_id: DefId) -> &'tcx FxIndexSet<Symbol> {
|
||||||
desc { |tcx| "computing target features for inline asm of `{}`", tcx.def_path_str(def_id) }
|
desc { |tcx| "computing target features for inline asm of `{}`", tcx.def_path_str(def_id) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ use crate::{filesearch, lint};
|
||||||
pub use rustc_ast::attr::MarkedAttrs;
|
pub use rustc_ast::attr::MarkedAttrs;
|
||||||
pub use rustc_ast::Attribute;
|
pub use rustc_ast::Attribute;
|
||||||
use rustc_data_structures::flock;
|
use rustc_data_structures::flock;
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxIndexSet};
|
||||||
use rustc_data_structures::jobserver::{self, Client};
|
use rustc_data_structures::jobserver::{self, Client};
|
||||||
use rustc_data_structures::profiling::{duration_to_secs_str, SelfProfiler, SelfProfilerRef};
|
use rustc_data_structures::profiling::{duration_to_secs_str, SelfProfiler, SelfProfilerRef};
|
||||||
use rustc_data_structures::sync::{
|
use rustc_data_structures::sync::{
|
||||||
|
@ -207,10 +207,10 @@ pub struct Session {
|
||||||
pub asm_arch: Option<InlineAsmArch>,
|
pub asm_arch: Option<InlineAsmArch>,
|
||||||
|
|
||||||
/// Set of enabled features for the current target.
|
/// Set of enabled features for the current target.
|
||||||
pub target_features: FxHashSet<Symbol>,
|
pub target_features: FxIndexSet<Symbol>,
|
||||||
|
|
||||||
/// Set of enabled features for the current target, including unstable ones.
|
/// Set of enabled features for the current target, including unstable ones.
|
||||||
pub unstable_target_features: FxHashSet<Symbol>,
|
pub unstable_target_features: FxIndexSet<Symbol>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct PerfStats {
|
pub struct PerfStats {
|
||||||
|
@ -1484,8 +1484,8 @@ pub fn build_session(
|
||||||
ctfe_backtrace,
|
ctfe_backtrace,
|
||||||
miri_unleashed_features: Lock::new(Default::default()),
|
miri_unleashed_features: Lock::new(Default::default()),
|
||||||
asm_arch,
|
asm_arch,
|
||||||
target_features: FxHashSet::default(),
|
target_features: Default::default(),
|
||||||
unstable_target_features: FxHashSet::default(),
|
unstable_target_features: Default::default(),
|
||||||
};
|
};
|
||||||
|
|
||||||
validate_commandline_args_with_session_available(&sess);
|
validate_commandline_args_with_session_available(&sess);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use super::{InlineAsmArch, InlineAsmType};
|
use super::{InlineAsmArch, InlineAsmType};
|
||||||
use crate::spec::{RelocModel, Target};
|
use crate::spec::{RelocModel, Target};
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxIndexSet;
|
||||||
use rustc_macros::HashStable_Generic;
|
use rustc_macros::HashStable_Generic;
|
||||||
use rustc_span::Symbol;
|
use rustc_span::Symbol;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
@ -80,7 +80,7 @@ pub fn target_reserves_x18(target: &Target) -> bool {
|
||||||
fn reserved_x18(
|
fn reserved_x18(
|
||||||
_arch: InlineAsmArch,
|
_arch: InlineAsmArch,
|
||||||
_reloc_model: RelocModel,
|
_reloc_model: RelocModel,
|
||||||
_target_features: &FxHashSet<Symbol>,
|
_target_features: &FxIndexSet<Symbol>,
|
||||||
target: &Target,
|
target: &Target,
|
||||||
_is_clobber: bool,
|
_is_clobber: bool,
|
||||||
) -> Result<(), &'static str> {
|
) -> Result<(), &'static str> {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use super::{InlineAsmArch, InlineAsmType};
|
use super::{InlineAsmArch, InlineAsmType};
|
||||||
use crate::spec::{RelocModel, Target};
|
use crate::spec::{RelocModel, Target};
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxIndexSet;
|
||||||
use rustc_macros::HashStable_Generic;
|
use rustc_macros::HashStable_Generic;
|
||||||
use rustc_span::{sym, Symbol};
|
use rustc_span::{sym, Symbol};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
@ -64,14 +64,14 @@ impl ArmInlineAsmRegClass {
|
||||||
}
|
}
|
||||||
|
|
||||||
// This uses the same logic as useR7AsFramePointer in LLVM
|
// This uses the same logic as useR7AsFramePointer in LLVM
|
||||||
fn frame_pointer_is_r7(target_features: &FxHashSet<Symbol>, target: &Target) -> bool {
|
fn frame_pointer_is_r7(target_features: &FxIndexSet<Symbol>, target: &Target) -> bool {
|
||||||
target.is_like_osx || (!target.is_like_windows && target_features.contains(&sym::thumb_mode))
|
target.is_like_osx || (!target.is_like_windows && target_features.contains(&sym::thumb_mode))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn frame_pointer_r11(
|
fn frame_pointer_r11(
|
||||||
arch: InlineAsmArch,
|
arch: InlineAsmArch,
|
||||||
reloc_model: RelocModel,
|
reloc_model: RelocModel,
|
||||||
target_features: &FxHashSet<Symbol>,
|
target_features: &FxIndexSet<Symbol>,
|
||||||
target: &Target,
|
target: &Target,
|
||||||
is_clobber: bool,
|
is_clobber: bool,
|
||||||
) -> Result<(), &'static str> {
|
) -> Result<(), &'static str> {
|
||||||
|
@ -87,7 +87,7 @@ fn frame_pointer_r11(
|
||||||
fn frame_pointer_r7(
|
fn frame_pointer_r7(
|
||||||
_arch: InlineAsmArch,
|
_arch: InlineAsmArch,
|
||||||
_reloc_model: RelocModel,
|
_reloc_model: RelocModel,
|
||||||
target_features: &FxHashSet<Symbol>,
|
target_features: &FxIndexSet<Symbol>,
|
||||||
target: &Target,
|
target: &Target,
|
||||||
_is_clobber: bool,
|
_is_clobber: bool,
|
||||||
) -> Result<(), &'static str> {
|
) -> Result<(), &'static str> {
|
||||||
|
@ -101,7 +101,7 @@ fn frame_pointer_r7(
|
||||||
fn not_thumb1(
|
fn not_thumb1(
|
||||||
_arch: InlineAsmArch,
|
_arch: InlineAsmArch,
|
||||||
_reloc_model: RelocModel,
|
_reloc_model: RelocModel,
|
||||||
target_features: &FxHashSet<Symbol>,
|
target_features: &FxIndexSet<Symbol>,
|
||||||
_target: &Target,
|
_target: &Target,
|
||||||
is_clobber: bool,
|
is_clobber: bool,
|
||||||
) -> Result<(), &'static str> {
|
) -> Result<(), &'static str> {
|
||||||
|
@ -118,7 +118,7 @@ fn not_thumb1(
|
||||||
fn reserved_r9(
|
fn reserved_r9(
|
||||||
arch: InlineAsmArch,
|
arch: InlineAsmArch,
|
||||||
reloc_model: RelocModel,
|
reloc_model: RelocModel,
|
||||||
target_features: &FxHashSet<Symbol>,
|
target_features: &FxIndexSet<Symbol>,
|
||||||
target: &Target,
|
target: &Target,
|
||||||
is_clobber: bool,
|
is_clobber: bool,
|
||||||
) -> Result<(), &'static str> {
|
) -> Result<(), &'static str> {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use crate::spec::Target;
|
use crate::spec::Target;
|
||||||
use crate::{abi::Size, spec::RelocModel};
|
use crate::{abi::Size, spec::RelocModel};
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxIndexSet};
|
||||||
use rustc_macros::HashStable_Generic;
|
use rustc_macros::HashStable_Generic;
|
||||||
use rustc_span::Symbol;
|
use rustc_span::Symbol;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
@ -37,13 +37,14 @@ macro_rules! def_reg_class {
|
||||||
|
|
||||||
pub(super) fn regclass_map() -> rustc_data_structures::fx::FxHashMap<
|
pub(super) fn regclass_map() -> rustc_data_structures::fx::FxHashMap<
|
||||||
super::InlineAsmRegClass,
|
super::InlineAsmRegClass,
|
||||||
rustc_data_structures::fx::FxHashSet<super::InlineAsmReg>,
|
rustc_data_structures::fx::FxIndexSet<super::InlineAsmReg>,
|
||||||
> {
|
> {
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
|
use rustc_data_structures::fx::FxIndexSet;
|
||||||
use super::InlineAsmRegClass;
|
use super::InlineAsmRegClass;
|
||||||
let mut map = FxHashMap::default();
|
let mut map = FxHashMap::default();
|
||||||
$(
|
$(
|
||||||
map.insert(InlineAsmRegClass::$arch($arch_regclass::$class), FxHashSet::default());
|
map.insert(InlineAsmRegClass::$arch($arch_regclass::$class), FxIndexSet::default());
|
||||||
)*
|
)*
|
||||||
map
|
map
|
||||||
}
|
}
|
||||||
|
@ -94,7 +95,7 @@ macro_rules! def_regs {
|
||||||
pub fn validate(self,
|
pub fn validate(self,
|
||||||
_arch: super::InlineAsmArch,
|
_arch: super::InlineAsmArch,
|
||||||
_reloc_model: crate::spec::RelocModel,
|
_reloc_model: crate::spec::RelocModel,
|
||||||
_target_features: &rustc_data_structures::fx::FxHashSet<Symbol>,
|
_target_features: &rustc_data_structures::fx::FxIndexSet<Symbol>,
|
||||||
_target: &crate::spec::Target,
|
_target: &crate::spec::Target,
|
||||||
_is_clobber: bool,
|
_is_clobber: bool,
|
||||||
) -> Result<(), &'static str> {
|
) -> Result<(), &'static str> {
|
||||||
|
@ -118,11 +119,11 @@ macro_rules! def_regs {
|
||||||
pub(super) fn fill_reg_map(
|
pub(super) fn fill_reg_map(
|
||||||
_arch: super::InlineAsmArch,
|
_arch: super::InlineAsmArch,
|
||||||
_reloc_model: crate::spec::RelocModel,
|
_reloc_model: crate::spec::RelocModel,
|
||||||
_target_features: &rustc_data_structures::fx::FxHashSet<Symbol>,
|
_target_features: &rustc_data_structures::fx::FxIndexSet<Symbol>,
|
||||||
_target: &crate::spec::Target,
|
_target: &crate::spec::Target,
|
||||||
_map: &mut rustc_data_structures::fx::FxHashMap<
|
_map: &mut rustc_data_structures::fx::FxHashMap<
|
||||||
super::InlineAsmRegClass,
|
super::InlineAsmRegClass,
|
||||||
rustc_data_structures::fx::FxHashSet<super::InlineAsmReg>,
|
rustc_data_structures::fx::FxIndexSet<super::InlineAsmReg>,
|
||||||
>,
|
>,
|
||||||
) {
|
) {
|
||||||
#[allow(unused_imports)]
|
#[allow(unused_imports)]
|
||||||
|
@ -334,7 +335,7 @@ impl InlineAsmReg {
|
||||||
self,
|
self,
|
||||||
arch: InlineAsmArch,
|
arch: InlineAsmArch,
|
||||||
reloc_model: RelocModel,
|
reloc_model: RelocModel,
|
||||||
target_features: &FxHashSet<Symbol>,
|
target_features: &FxIndexSet<Symbol>,
|
||||||
target: &Target,
|
target: &Target,
|
||||||
is_clobber: bool,
|
is_clobber: bool,
|
||||||
) -> Result<(), &'static str> {
|
) -> Result<(), &'static str> {
|
||||||
|
@ -701,9 +702,9 @@ impl fmt::Display for InlineAsmType {
|
||||||
pub fn allocatable_registers(
|
pub fn allocatable_registers(
|
||||||
arch: InlineAsmArch,
|
arch: InlineAsmArch,
|
||||||
reloc_model: RelocModel,
|
reloc_model: RelocModel,
|
||||||
target_features: &FxHashSet<Symbol>,
|
target_features: &FxIndexSet<Symbol>,
|
||||||
target: &crate::spec::Target,
|
target: &crate::spec::Target,
|
||||||
) -> FxHashMap<InlineAsmRegClass, FxHashSet<InlineAsmReg>> {
|
) -> FxHashMap<InlineAsmRegClass, FxIndexSet<InlineAsmReg>> {
|
||||||
match arch {
|
match arch {
|
||||||
InlineAsmArch::X86 | InlineAsmArch::X86_64 => {
|
InlineAsmArch::X86 | InlineAsmArch::X86_64 => {
|
||||||
let mut map = x86::regclass_map();
|
let mut map = x86::regclass_map();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use super::{InlineAsmArch, InlineAsmType};
|
use super::{InlineAsmArch, InlineAsmType};
|
||||||
use crate::spec::{RelocModel, Target};
|
use crate::spec::{RelocModel, Target};
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxIndexSet;
|
||||||
use rustc_macros::HashStable_Generic;
|
use rustc_macros::HashStable_Generic;
|
||||||
use rustc_span::{sym, Symbol};
|
use rustc_span::{sym, Symbol};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
@ -55,7 +55,7 @@ impl RiscVInlineAsmRegClass {
|
||||||
fn not_e(
|
fn not_e(
|
||||||
_arch: InlineAsmArch,
|
_arch: InlineAsmArch,
|
||||||
_reloc_model: RelocModel,
|
_reloc_model: RelocModel,
|
||||||
target_features: &FxHashSet<Symbol>,
|
target_features: &FxIndexSet<Symbol>,
|
||||||
_target: &Target,
|
_target: &Target,
|
||||||
_is_clobber: bool,
|
_is_clobber: bool,
|
||||||
) -> Result<(), &'static str> {
|
) -> Result<(), &'static str> {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use super::{InlineAsmArch, InlineAsmType};
|
use super::{InlineAsmArch, InlineAsmType};
|
||||||
use crate::spec::{RelocModel, Target};
|
use crate::spec::{RelocModel, Target};
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxIndexSet;
|
||||||
use rustc_macros::HashStable_Generic;
|
use rustc_macros::HashStable_Generic;
|
||||||
use rustc_span::Symbol;
|
use rustc_span::Symbol;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
@ -147,7 +147,7 @@ impl X86InlineAsmRegClass {
|
||||||
fn x86_64_only(
|
fn x86_64_only(
|
||||||
arch: InlineAsmArch,
|
arch: InlineAsmArch,
|
||||||
_reloc_model: RelocModel,
|
_reloc_model: RelocModel,
|
||||||
_target_features: &FxHashSet<Symbol>,
|
_target_features: &FxIndexSet<Symbol>,
|
||||||
_target: &Target,
|
_target: &Target,
|
||||||
_is_clobber: bool,
|
_is_clobber: bool,
|
||||||
) -> Result<(), &'static str> {
|
) -> Result<(), &'static str> {
|
||||||
|
@ -161,7 +161,7 @@ fn x86_64_only(
|
||||||
fn high_byte(
|
fn high_byte(
|
||||||
arch: InlineAsmArch,
|
arch: InlineAsmArch,
|
||||||
_reloc_model: RelocModel,
|
_reloc_model: RelocModel,
|
||||||
_target_features: &FxHashSet<Symbol>,
|
_target_features: &FxIndexSet<Symbol>,
|
||||||
_target: &Target,
|
_target: &Target,
|
||||||
_is_clobber: bool,
|
_is_clobber: bool,
|
||||||
) -> Result<(), &'static str> {
|
) -> Result<(), &'static str> {
|
||||||
|
@ -174,7 +174,7 @@ fn high_byte(
|
||||||
fn rbx_reserved(
|
fn rbx_reserved(
|
||||||
arch: InlineAsmArch,
|
arch: InlineAsmArch,
|
||||||
_reloc_model: RelocModel,
|
_reloc_model: RelocModel,
|
||||||
_target_features: &FxHashSet<Symbol>,
|
_target_features: &FxIndexSet<Symbol>,
|
||||||
_target: &Target,
|
_target: &Target,
|
||||||
_is_clobber: bool,
|
_is_clobber: bool,
|
||||||
) -> Result<(), &'static str> {
|
) -> Result<(), &'static str> {
|
||||||
|
@ -190,7 +190,7 @@ fn rbx_reserved(
|
||||||
fn esi_reserved(
|
fn esi_reserved(
|
||||||
arch: InlineAsmArch,
|
arch: InlineAsmArch,
|
||||||
_reloc_model: RelocModel,
|
_reloc_model: RelocModel,
|
||||||
_target_features: &FxHashSet<Symbol>,
|
_target_features: &FxIndexSet<Symbol>,
|
||||||
_target: &Target,
|
_target: &Target,
|
||||||
_is_clobber: bool,
|
_is_clobber: bool,
|
||||||
) -> Result<(), &'static str> {
|
) -> Result<(), &'static str> {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue