Remove inherent methods from several LLVM FFI types
Using a helper trait allows the conversions to remain in `rustc_codegen_llvm`, even if the FFI types are moved to a different crate.
This commit is contained in:
115
compiler/rustc_codegen_llvm/src/llvm/conversions.rs
Normal file
115
compiler/rustc_codegen_llvm/src/llvm/conversions.rs
Normal file
@@ -0,0 +1,115 @@
|
||||
//! 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<T> {
|
||||
fn from_generic(other: T) -> Self;
|
||||
}
|
||||
|
||||
impl FromGeneric<SymbolVisibility> 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<IntPredicate> 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<RealPredicate> 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<AtomicRmwBinOp> 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<AtomicOrdering> 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<DebugInfo> 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,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -20,7 +20,6 @@ use std::ptr;
|
||||
use bitflags::bitflags;
|
||||
use libc::{c_char, c_int, c_uchar, c_uint, c_ulonglong, c_void, size_t};
|
||||
use rustc_macros::TryFromU32;
|
||||
use rustc_target::spec::SymbolVisibility;
|
||||
|
||||
use super::RustString;
|
||||
use super::debuginfo::{
|
||||
@@ -220,16 +219,6 @@ pub(crate) enum Visibility {
|
||||
Protected = 2,
|
||||
}
|
||||
|
||||
impl Visibility {
|
||||
pub(crate) fn from_generic(visibility: SymbolVisibility) -> Self {
|
||||
match visibility {
|
||||
SymbolVisibility::Hidden => Visibility::Hidden,
|
||||
SymbolVisibility::Protected => Visibility::Protected,
|
||||
SymbolVisibility::Interposable => Visibility::Default,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// LLVMUnnamedAddr
|
||||
#[repr(C)]
|
||||
pub(crate) enum UnnamedAddr {
|
||||
@@ -319,24 +308,6 @@ pub(crate) enum IntPredicate {
|
||||
IntSLE = 41,
|
||||
}
|
||||
|
||||
impl IntPredicate {
|
||||
pub(crate) fn from_generic(intpre: rustc_codegen_ssa::common::IntPredicate) -> Self {
|
||||
use rustc_codegen_ssa::common::IntPredicate as Common;
|
||||
match intpre {
|
||||
Common::IntEQ => Self::IntEQ,
|
||||
Common::IntNE => Self::IntNE,
|
||||
Common::IntUGT => Self::IntUGT,
|
||||
Common::IntUGE => Self::IntUGE,
|
||||
Common::IntULT => Self::IntULT,
|
||||
Common::IntULE => Self::IntULE,
|
||||
Common::IntSGT => Self::IntSGT,
|
||||
Common::IntSGE => Self::IntSGE,
|
||||
Common::IntSLT => Self::IntSLT,
|
||||
Common::IntSLE => Self::IntSLE,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// LLVMRealPredicate
|
||||
#[derive(Copy, Clone)]
|
||||
#[repr(C)]
|
||||
@@ -359,30 +330,6 @@ pub(crate) enum RealPredicate {
|
||||
RealPredicateTrue = 15,
|
||||
}
|
||||
|
||||
impl RealPredicate {
|
||||
pub(crate) fn from_generic(realp: rustc_codegen_ssa::common::RealPredicate) -> Self {
|
||||
use rustc_codegen_ssa::common::RealPredicate as Common;
|
||||
match realp {
|
||||
Common::RealPredicateFalse => Self::RealPredicateFalse,
|
||||
Common::RealOEQ => Self::RealOEQ,
|
||||
Common::RealOGT => Self::RealOGT,
|
||||
Common::RealOGE => Self::RealOGE,
|
||||
Common::RealOLT => Self::RealOLT,
|
||||
Common::RealOLE => Self::RealOLE,
|
||||
Common::RealONE => Self::RealONE,
|
||||
Common::RealORD => Self::RealORD,
|
||||
Common::RealUNO => Self::RealUNO,
|
||||
Common::RealUEQ => Self::RealUEQ,
|
||||
Common::RealUGT => Self::RealUGT,
|
||||
Common::RealUGE => Self::RealUGE,
|
||||
Common::RealULT => Self::RealULT,
|
||||
Common::RealULE => Self::RealULE,
|
||||
Common::RealUNE => Self::RealUNE,
|
||||
Common::RealPredicateTrue => Self::RealPredicateTrue,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Must match the layout of `LLVMTypeKind`.
|
||||
///
|
||||
/// Use [`RawEnum<TypeKind>`] for values of `LLVMTypeKind` returned from LLVM,
|
||||
@@ -458,25 +405,6 @@ pub(crate) enum AtomicRmwBinOp {
|
||||
AtomicUMin = 10,
|
||||
}
|
||||
|
||||
impl AtomicRmwBinOp {
|
||||
pub(crate) fn from_generic(op: rustc_codegen_ssa::common::AtomicRmwBinOp) -> Self {
|
||||
use rustc_codegen_ssa::common::AtomicRmwBinOp as Common;
|
||||
match op {
|
||||
Common::AtomicXchg => Self::AtomicXchg,
|
||||
Common::AtomicAdd => Self::AtomicAdd,
|
||||
Common::AtomicSub => Self::AtomicSub,
|
||||
Common::AtomicAnd => Self::AtomicAnd,
|
||||
Common::AtomicNand => Self::AtomicNand,
|
||||
Common::AtomicOr => Self::AtomicOr,
|
||||
Common::AtomicXor => Self::AtomicXor,
|
||||
Common::AtomicMax => Self::AtomicMax,
|
||||
Common::AtomicMin => Self::AtomicMin,
|
||||
Common::AtomicUMax => Self::AtomicUMax,
|
||||
Common::AtomicUMin => Self::AtomicUMin,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// LLVMAtomicOrdering
|
||||
#[derive(Copy, Clone)]
|
||||
#[repr(C)]
|
||||
@@ -493,19 +421,6 @@ pub(crate) enum AtomicOrdering {
|
||||
SequentiallyConsistent = 7,
|
||||
}
|
||||
|
||||
impl AtomicOrdering {
|
||||
pub(crate) fn from_generic(ao: rustc_middle::ty::AtomicOrdering) -> Self {
|
||||
use rustc_middle::ty::AtomicOrdering as Common;
|
||||
match ao {
|
||||
Common::Relaxed => Self::Monotonic,
|
||||
Common::Acquire => Self::Acquire,
|
||||
Common::Release => Self::Release,
|
||||
Common::AcqRel => Self::AcquireRelease,
|
||||
Common::SeqCst => Self::SequentiallyConsistent,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// LLVMRustFileType
|
||||
#[derive(Copy, Clone)]
|
||||
#[repr(C)]
|
||||
@@ -940,28 +855,6 @@ pub(crate) mod debuginfo {
|
||||
DebugDirectivesOnly,
|
||||
}
|
||||
|
||||
impl DebugEmissionKind {
|
||||
pub(crate) fn from_generic(kind: rustc_session::config::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.
|
||||
use rustc_session::config::DebugInfo;
|
||||
match kind {
|
||||
DebugInfo::None => DebugEmissionKind::NoDebug,
|
||||
DebugInfo::LineDirectivesOnly => DebugEmissionKind::DebugDirectivesOnly,
|
||||
DebugInfo::LineTablesOnly => DebugEmissionKind::LineTablesOnly,
|
||||
DebugInfo::Limited | DebugInfo::Full => DebugEmissionKind::FullDebug,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// LLVMRustDebugNameTableKind
|
||||
#[derive(Clone, Copy)]
|
||||
#[repr(C)]
|
||||
|
||||
@@ -11,10 +11,12 @@ use rustc_llvm::RustString;
|
||||
|
||||
pub(crate) use self::CallConv::*;
|
||||
pub(crate) use self::CodeGenOptSize::*;
|
||||
pub(crate) use self::conversions::*;
|
||||
pub(crate) use self::ffi::*;
|
||||
pub(crate) use self::metadata_kind::*;
|
||||
use crate::common::AsCCharPtr;
|
||||
|
||||
mod conversions;
|
||||
pub(crate) mod diagnostic;
|
||||
pub(crate) mod enzyme_ffi;
|
||||
mod ffi;
|
||||
|
||||
Reference in New Issue
Block a user