//! Conversions from backend-independent data types to/from LLVM FFI types. use rustc_codegen_ssa::common::{AtomicRmwBinOp, IntPredicate, RealPredicate}; use rustc_middle::ty::AtomicOrdering; use rustc_session::config::DebugInfo; use rustc_target::spec::SymbolVisibility; use crate::llvm; /// Helper trait for converting backend-independent types to LLVM-specific /// types, for FFI purposes. pub(crate) trait FromGeneric { fn from_generic(other: T) -> Self; } impl FromGeneric for llvm::Visibility { fn from_generic(visibility: SymbolVisibility) -> Self { match visibility { SymbolVisibility::Hidden => Self::Hidden, SymbolVisibility::Protected => Self::Protected, SymbolVisibility::Interposable => Self::Default, } } } impl FromGeneric for llvm::IntPredicate { fn from_generic(int_pred: IntPredicate) -> Self { match int_pred { IntPredicate::IntEQ => Self::IntEQ, IntPredicate::IntNE => Self::IntNE, IntPredicate::IntUGT => Self::IntUGT, IntPredicate::IntUGE => Self::IntUGE, IntPredicate::IntULT => Self::IntULT, IntPredicate::IntULE => Self::IntULE, IntPredicate::IntSGT => Self::IntSGT, IntPredicate::IntSGE => Self::IntSGE, IntPredicate::IntSLT => Self::IntSLT, IntPredicate::IntSLE => Self::IntSLE, } } } impl FromGeneric for llvm::RealPredicate { fn from_generic(real_pred: RealPredicate) -> Self { match real_pred { RealPredicate::RealPredicateFalse => Self::RealPredicateFalse, RealPredicate::RealOEQ => Self::RealOEQ, RealPredicate::RealOGT => Self::RealOGT, RealPredicate::RealOGE => Self::RealOGE, RealPredicate::RealOLT => Self::RealOLT, RealPredicate::RealOLE => Self::RealOLE, RealPredicate::RealONE => Self::RealONE, RealPredicate::RealORD => Self::RealORD, RealPredicate::RealUNO => Self::RealUNO, RealPredicate::RealUEQ => Self::RealUEQ, RealPredicate::RealUGT => Self::RealUGT, RealPredicate::RealUGE => Self::RealUGE, RealPredicate::RealULT => Self::RealULT, RealPredicate::RealULE => Self::RealULE, RealPredicate::RealUNE => Self::RealUNE, RealPredicate::RealPredicateTrue => Self::RealPredicateTrue, } } } impl FromGeneric for llvm::AtomicRmwBinOp { fn from_generic(op: AtomicRmwBinOp) -> Self { match op { AtomicRmwBinOp::AtomicXchg => Self::AtomicXchg, AtomicRmwBinOp::AtomicAdd => Self::AtomicAdd, AtomicRmwBinOp::AtomicSub => Self::AtomicSub, AtomicRmwBinOp::AtomicAnd => Self::AtomicAnd, AtomicRmwBinOp::AtomicNand => Self::AtomicNand, AtomicRmwBinOp::AtomicOr => Self::AtomicOr, AtomicRmwBinOp::AtomicXor => Self::AtomicXor, AtomicRmwBinOp::AtomicMax => Self::AtomicMax, AtomicRmwBinOp::AtomicMin => Self::AtomicMin, AtomicRmwBinOp::AtomicUMax => Self::AtomicUMax, AtomicRmwBinOp::AtomicUMin => Self::AtomicUMin, } } } impl FromGeneric for llvm::AtomicOrdering { fn from_generic(ordering: AtomicOrdering) -> Self { match ordering { AtomicOrdering::Relaxed => Self::Monotonic, AtomicOrdering::Acquire => Self::Acquire, AtomicOrdering::Release => Self::Release, AtomicOrdering::AcqRel => Self::AcquireRelease, AtomicOrdering::SeqCst => Self::SequentiallyConsistent, } } } impl FromGeneric for llvm::debuginfo::DebugEmissionKind { fn from_generic(kind: DebugInfo) -> Self { // We should be setting LLVM's emission kind to `LineTablesOnly` if // we are compiling with "limited" debuginfo. However, some of the // existing tools relied on slightly more debuginfo being generated than // would be the case with `LineTablesOnly`, and we did not want to break // these tools in a "drive-by fix", without a good idea or plan about // what limited debuginfo should exactly look like. So for now we are // instead adding a new debuginfo option "line-tables-only" so as to // not break anything and to allow users to have 'limited' debug info. // // See https://github.com/rust-lang/rust/issues/60020 for details. match kind { DebugInfo::None => Self::NoDebug, DebugInfo::LineDirectivesOnly => Self::DebugDirectivesOnly, DebugInfo::LineTablesOnly => Self::LineTablesOnly, DebugInfo::Limited | DebugInfo::Full => Self::FullDebug, } } }