Generalized some base.rs methods

This commit is contained in:
Denis Merigoux 2018-09-07 13:25:50 -07:00 committed by Eduard-Mihai Burtescu
parent c487b825b0
commit 0514c7b1b2
9 changed files with 99 additions and 50 deletions

View File

@ -30,7 +30,7 @@ use super::CachedModuleCodegen;
use abi; use abi;
use back::write::{self, OngoingCodegen}; use back::write::{self, OngoingCodegen};
use llvm::{self, TypeKind, get_param}; use llvm::{self, get_param};
use metadata; use metadata;
use rustc::dep_graph::cgu_reuse_tracker::CguReuse; use rustc::dep_graph::cgu_reuse_tracker::CguReuse;
use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE}; use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE};
@ -54,7 +54,7 @@ use attributes;
use builder::{Builder, MemFlags}; use builder::{Builder, MemFlags};
use callee; use callee;
use rustc_mir::monomorphize::item::DefPathBasedNames; use rustc_mir::monomorphize::item::DefPathBasedNames;
use common::{self, IntPredicate, RealPredicate}; use common::{self, IntPredicate, RealPredicate, TypeKind};
use consts; use consts;
use context::CodegenCx; use context::CodegenCx;
use debuginfo; use debuginfo;
@ -66,7 +66,6 @@ use monomorphize::partitioning::{CodegenUnit, CodegenUnitExt};
use rustc_codegen_utils::symbol_names_test; use rustc_codegen_utils::symbol_names_test;
use time_graph; use time_graph;
use mono_item::{MonoItem, MonoItemExt}; use mono_item::{MonoItem, MonoItemExt};
use type_::Type;
use type_of::LayoutLlvmExt; use type_of::LayoutLlvmExt;
use rustc::util::nodemap::FxHashMap; use rustc::util::nodemap::FxHashMap;
use CrateInfo; use CrateInfo;
@ -333,21 +332,31 @@ pub fn coerce_unsized_into(
} }
} }
pub fn cast_shift_expr_rhs( pub fn cast_shift_expr_rhs<'a, 'tcx: 'a, Builder: BuilderMethods<'a, 'tcx>>(
bx: &Builder<'_, 'll, '_>, op: hir::BinOpKind, lhs: &'ll Value, rhs: &'ll Value bx: &Builder,
) -> &'ll Value { op: hir::BinOpKind,
lhs: Builder::Value,
rhs: Builder::Value
) -> Builder::Value {
cast_shift_rhs(bx, op, lhs, rhs, |a, b| bx.trunc(a, b), |a, b| bx.zext(a, b)) cast_shift_rhs(bx, op, lhs, rhs, |a, b| bx.trunc(a, b), |a, b| bx.zext(a, b))
} }
fn cast_shift_rhs<'ll, F, G>(bx: &Builder<'_, 'll, '_>, fn cast_shift_rhs<'a, 'tcx: 'a, F, G, Builder: BuilderMethods<'a, 'tcx>>(
op: hir::BinOpKind, bx: &Builder,
lhs: &'ll Value, op: hir::BinOpKind,
rhs: &'ll Value, lhs: Builder::Value,
trunc: F, rhs: Builder::Value,
zext: G) trunc: F,
-> &'ll Value zext: G
where F: FnOnce(&'ll Value, &'ll Type) -> &'ll Value, ) -> Builder::Value
G: FnOnce(&'ll Value, &'ll Type) -> &'ll Value where F: FnOnce(
Builder::Value,
Builder::Type
) -> Builder::Value,
G: FnOnce(
Builder::Value,
Builder::Type
) -> Builder::Value
{ {
// Shifts may have any size int on the rhs // Shifts may have any size int on the rhs
if op.is_shift() { if op.is_shift() {
@ -389,10 +398,10 @@ pub fn call_assume(bx: &Builder<'_, 'll, '_>, val: &'ll Value) {
bx.call(assume_intrinsic, &[val], None); bx.call(assume_intrinsic, &[val], None);
} }
pub fn from_immediate<'a, 'll: 'a, 'tcx: 'll>( pub fn from_immediate<'a, 'tcx: 'a, Builder: BuilderMethods<'a, 'tcx>>(
bx: &Builder<'_ ,'ll, '_, &'ll Value>, bx: &Builder,
val: &'ll Value val: Builder::Value
) -> &'ll Value { ) -> Builder::Value {
if bx.cx().val_ty(val) == bx.cx().type_i1() { if bx.cx().val_ty(val) == bx.cx().type_i1() {
bx.zext(val, bx.cx().type_i8()) bx.zext(val, bx.cx().type_i8())
} else { } else {
@ -400,30 +409,30 @@ pub fn from_immediate<'a, 'll: 'a, 'tcx: 'll>(
} }
} }
pub fn to_immediate( pub fn to_immediate<'a, 'tcx: 'a, Builder: BuilderMethods<'a, 'tcx>>(
bx: &Builder<'_, 'll, '_>, bx: &Builder,
val: &'ll Value, val: Builder::Value,
layout: layout::TyLayout, layout: layout::TyLayout,
) -> &'ll Value { ) -> Builder::Value {
if let layout::Abi::Scalar(ref scalar) = layout.abi { if let layout::Abi::Scalar(ref scalar) = layout.abi {
return to_immediate_scalar(bx, val, scalar); return to_immediate_scalar(bx, val, scalar);
} }
val val
} }
pub fn to_immediate_scalar( pub fn to_immediate_scalar<'a, 'tcx: 'a, Builder: BuilderMethods<'a, 'tcx>>(
bx: &Builder<'_, 'll, '_>, bx: &Builder,
val: &'ll Value, val: Builder::Value,
scalar: &layout::Scalar, scalar: &layout::Scalar,
) -> &'ll Value { ) -> Builder::Value {
if scalar.is_bool() { if scalar.is_bool() {
return bx.trunc(val, bx.cx().type_i1()); return bx.trunc(val, bx.cx().type_i1());
} }
val val
} }
pub fn call_memcpy<'a, 'll: 'a, 'tcx: 'll>( pub fn call_memcpy(
bx: &Builder<'_ ,'ll, '_, &'ll Value>, bx: &Builder<'_, 'll, '_>,
dst: &'ll Value, dst: &'ll Value,
dst_align: Align, dst_align: Align,
src: &'ll Value, src: &'ll Value,
@ -446,8 +455,8 @@ pub fn call_memcpy<'a, 'll: 'a, 'tcx: 'll>(
bx.memcpy(dst_ptr, dst_align.abi(), src_ptr, src_align.abi(), size, volatile); bx.memcpy(dst_ptr, dst_align.abi(), src_ptr, src_align.abi(), size, volatile);
} }
pub fn memcpy_ty<'a, 'll: 'a, 'tcx: 'll>( pub fn memcpy_ty(
bx: &Builder<'_ ,'ll, '_, &'ll Value>, bx: &Builder<'_, 'll, '_>,
dst: &'ll Value, dst: &'ll Value,
dst_align: Align, dst_align: Align,
src: &'ll Value, src: &'ll Value,

View File

@ -60,7 +60,6 @@ impl Backend for Builder<'a, 'll, 'tcx> {
type Value = &'ll Value; type Value = &'ll Value;
type BasicBlock = &'ll BasicBlock; type BasicBlock = &'ll BasicBlock;
type Type = &'ll Type; type Type = &'ll Type;
type TypeKind = llvm::TypeKind;
type Context = &'ll llvm::Context; type Context = &'ll llvm::Context;
} }
@ -1146,7 +1145,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
let stored_ty = self.cx.val_ty(val); let stored_ty = self.cx.val_ty(val);
let stored_ptr_ty = self.cx.type_ptr_to(stored_ty); let stored_ptr_ty = self.cx.type_ptr_to(stored_ty);
assert_eq!(self.cx.type_kind(dest_ptr_ty), llvm::TypeKind::Pointer); assert_eq!(self.cx.type_kind(dest_ptr_ty), TypeKind::Pointer);
if dest_ptr_ty == stored_ptr_ty { if dest_ptr_ty == stored_ptr_ty {
ptr ptr
@ -1165,11 +1164,11 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
args: &'b [&'ll Value]) -> Cow<'b, [&'ll Value]> { args: &'b [&'ll Value]) -> Cow<'b, [&'ll Value]> {
let mut fn_ty = self.cx.val_ty(llfn); let mut fn_ty = self.cx.val_ty(llfn);
// Strip off pointers // Strip off pointers
while self.cx.type_kind(fn_ty) == llvm::TypeKind::Pointer { while self.cx.type_kind(fn_ty) == TypeKind::Pointer {
fn_ty = self.cx.element_type(fn_ty); fn_ty = self.cx.element_type(fn_ty);
} }
assert!(self.cx.type_kind(fn_ty) == llvm::TypeKind::Function, assert!(self.cx.type_kind(fn_ty) == TypeKind::Function,
"builder::{} not passed a function, but {:?}", typ, fn_ty); "builder::{} not passed a function, but {:?}", typ, fn_ty);
let param_tys = self.cx.func_params_types(fn_ty); let param_tys = self.cx.func_params_types(fn_ty);

View File

@ -12,8 +12,7 @@
//! Code that is useful in various codegen modules. //! Code that is useful in various codegen modules.
use llvm::{self, TypeKind}; use llvm::{self, True, False, Bool, BasicBlock};
use llvm::{True, False, Bool, BasicBlock};
use rustc::hir::def_id::DefId; use rustc::hir::def_id::DefId;
use rustc::middle::lang_items::LangItem; use rustc::middle::lang_items::LangItem;
use abi; use abi;
@ -131,6 +130,27 @@ pub enum SynchronizationScope {
CrossThread, CrossThread,
} }
#[derive(Copy, Clone, PartialEq, Debug)]
pub enum TypeKind {
Void,
Half,
Float,
Double,
X86_FP80,
FP128,
PPc_FP128,
Label,
Integer,
Function,
Struct,
Array,
Pointer,
Vector,
Metadata,
X86_MMX,
Token,
}
/* /*
* A note on nomenclature of linking: "extern", "foreign", and "upcall". * A note on nomenclature of linking: "extern", "foreign", and "upcall".
* *
@ -197,7 +217,6 @@ impl Backend for CodegenCx<'ll, 'tcx> {
type Value = &'ll Value; type Value = &'ll Value;
type BasicBlock = &'ll BasicBlock; type BasicBlock = &'ll BasicBlock;
type Type = &'ll Type; type Type = &'ll Type;
type TypeKind = llvm::TypeKind;
type Context = &'ll llvm::Context; type Context = &'ll llvm::Context;
} }

View File

@ -11,9 +11,8 @@
use std::fmt::Debug; use std::fmt::Debug;
pub trait Backend { pub trait Backend {
type Value: Debug + PartialEq; type Value: Debug + PartialEq + Copy;
type BasicBlock; type BasicBlock;
type Type: Debug + PartialEq; type Type: Debug + PartialEq + Copy;
type TypeKind;
type Context; type Context;
} }

View File

@ -23,13 +23,11 @@ use std::ops::Range;
use syntax::ast::AsmDialect; use syntax::ast::AsmDialect;
pub trait BuilderMethods<'a, 'tcx: 'a>: Backend { pub trait BuilderMethods<'a, 'tcx: 'a>: Backend {
type CodegenCx: TypeMethods + ConstMethods + Backend< type CodegenCx: 'a + TypeMethods + ConstMethods + Backend<
Value = Self::Value, Value = Self::Value,
BasicBlock = Self::BasicBlock, BasicBlock = Self::BasicBlock,
Type = Self::Type, Type = Self::Type,
TypeKind = Self::TypeKind,
Context = Self::Context, Context = Self::Context,
>; >;

View File

@ -9,6 +9,7 @@
// except according to those terms. // except according to those terms.
use super::backend::Backend; use super::backend::Backend;
use common::TypeKind;
pub trait TypeMethods: Backend { pub trait TypeMethods: Backend {
fn type_void(&self) -> Self::Type; fn type_void(&self) -> Self::Type;
@ -30,7 +31,7 @@ pub trait TypeMethods: Backend {
fn type_named_struct(&self, name: &str) -> Self::Type; fn type_named_struct(&self, name: &str) -> Self::Type;
fn type_array(&self, ty: Self::Type, len: u64) -> Self::Type; fn type_array(&self, ty: Self::Type, len: u64) -> Self::Type;
fn type_vector(&self, ty: Self::Type, len: u64) -> Self::Type; fn type_vector(&self, ty: Self::Type, len: u64) -> Self::Type;
fn type_kind(&self, ty: Self::Type) -> Self::TypeKind; fn type_kind(&self, ty: Self::Type) -> TypeKind;
fn set_struct_body(&self, ty: Self::Type, els: &[Self::Type], packed: bool); fn set_struct_body(&self, ty: Self::Type, els: &[Self::Type], packed: bool);
fn type_ptr_to(&self, ty: Self::Type) -> Self::Type; fn type_ptr_to(&self, ty: Self::Type) -> Self::Type;
fn element_type(&self, ty: Self::Type) -> Self::Type; fn element_type(&self, ty: Self::Type) -> Self::Type;

View File

@ -12,7 +12,7 @@
use attributes; use attributes;
use intrinsics::{self, Intrinsic}; use intrinsics::{self, Intrinsic};
use llvm::{self, TypeKind}; use llvm;
use llvm_util; use llvm_util;
use abi::{Abi, FnType, LlvmType, PassMode}; use abi::{Abi, FnType, LlvmType, PassMode};
use mir::place::PlaceRef; use mir::place::PlaceRef;

View File

@ -228,6 +228,30 @@ pub enum TypeKind {
Token = 16, Token = 16,
} }
impl TypeKind {
pub fn to_generic(self) -> common::TypeKind {
match self {
TypeKind::Void => common::TypeKind::Void,
TypeKind::Half => common::TypeKind::Half,
TypeKind::Float => common::TypeKind::Float,
TypeKind::Double => common::TypeKind::Double,
TypeKind::X86_FP80 => common::TypeKind::X86_FP80,
TypeKind::FP128 => common::TypeKind::FP128,
TypeKind::PPc_FP128 => common::TypeKind::PPc_FP128,
TypeKind::Label => common::TypeKind::Label,
TypeKind::Integer => common::TypeKind::Integer,
TypeKind::Function => common::TypeKind::Function,
TypeKind::Struct => common::TypeKind::Struct,
TypeKind::Array => common::TypeKind::Array,
TypeKind::Pointer => common::TypeKind::Pointer,
TypeKind::Vector => common::TypeKind::Vector,
TypeKind::Metadata => common::TypeKind::Metadata,
TypeKind::X86_MMX => common::TypeKind::X86_MMX,
TypeKind::Token => common::TypeKind::Token,
}
}
}
/// LLVMAtomicRmwBinOp /// LLVMAtomicRmwBinOp
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
#[repr(C)] #[repr(C)]

View File

@ -13,16 +13,16 @@
pub use llvm::Type; pub use llvm::Type;
use llvm; use llvm;
use llvm::{Bool, False, True, TypeKind}; use llvm::{Bool, False, True};
use context::CodegenCx; use context::CodegenCx;
use interfaces::TypeMethods; use interfaces::TypeMethods;
use value::Value; use value::Value;
use syntax::ast; use syntax::ast;
use rustc::ty::layout::{self, Align, Size}; use rustc::ty::layout::{self, Align, Size};
use rustc_data_structures::small_c_str::SmallCStr; use rustc_data_structures::small_c_str::SmallCStr;
use common; use common::{self, TypeKind};
use std::fmt; use std::fmt;
@ -175,7 +175,7 @@ impl TypeMethods for CodegenCx<'ll, 'tcx> {
fn type_kind(&self, ty: &'ll Type) -> TypeKind { fn type_kind(&self, ty: &'ll Type) -> TypeKind {
unsafe { unsafe {
llvm::LLVMRustGetTypeKind(ty) llvm::LLVMRustGetTypeKind(ty).to_generic()
} }
} }