Reduced line length to pass tidy

Generalized FunctionCx

Added ValueTrait and first change

Generalize CondegenCx

Generalized the Builder struct defined in librustc_codegen_llvm/builder.rs
This commit is contained in:
Denis Merigoux 2018-08-03 14:20:10 +02:00 committed by Eduard-Mihai Burtescu
parent c76fc3d804
commit 83b2152ce4
12 changed files with 44 additions and 38 deletions

View file

@ -172,7 +172,7 @@ pub trait ArgTypeExt<'ll, 'tcx> {
&self, &self,
bx: &Builder<'_, 'll, 'tcx>, bx: &Builder<'_, 'll, 'tcx>,
idx: &mut usize, idx: &mut usize,
dst: PlaceRef<'tcx, &'ll Value>, dst: PlaceRef<'tcx, &'ll Value>,
); );
} }

View file

@ -26,12 +26,12 @@ use std::ptr;
// All Builders must have an llfn associated with them // All Builders must have an llfn associated with them
#[must_use] #[must_use]
pub struct Builder<'a, 'll: 'a, 'tcx: 'll> { pub struct Builder<'a, 'll: 'a, 'tcx: 'll, V: 'll = &'ll Value> {
pub llbuilder: &'ll mut llvm::Builder<'ll>, pub llbuilder: &'ll mut llvm::Builder<'ll>,
pub cx: &'a CodegenCx<'ll, 'tcx>, pub cx: &'a CodegenCx<'ll, 'tcx, V>,
} }
impl Drop for Builder<'a, 'll, 'tcx> { impl<V> Drop for Builder<'_, '_, '_, V> {
fn drop(&mut self) { fn drop(&mut self) {
unsafe { unsafe {
llvm::LLVMDisposeBuilder(&mut *(self.llbuilder as *mut _)); llvm::LLVMDisposeBuilder(&mut *(self.llbuilder as *mut _));

View file

@ -45,7 +45,7 @@ use abi::Abi;
/// There is one `CodegenCx` per compilation unit. Each one has its own LLVM /// There is one `CodegenCx` per compilation unit. Each one has its own LLVM
/// `llvm::Context` so that several compilation units may be optimized in parallel. /// `llvm::Context` so that several compilation units may be optimized in parallel.
/// All other LLVM data structures in the `CodegenCx` are tied to that `llvm::Context`. /// All other LLVM data structures in the `CodegenCx` are tied to that `llvm::Context`.
pub struct CodegenCx<'a, 'tcx: 'a> { pub struct CodegenCx<'a, 'tcx: 'a, V = &'a Value> {
pub tcx: TyCtxt<'a, 'tcx, 'tcx>, pub tcx: TyCtxt<'a, 'tcx, 'tcx>,
pub check_overflow: bool, pub check_overflow: bool,
pub use_dll_storage_attrs: bool, pub use_dll_storage_attrs: bool,
@ -57,12 +57,11 @@ pub struct CodegenCx<'a, 'tcx: 'a> {
pub codegen_unit: Arc<CodegenUnit<'tcx>>, pub codegen_unit: Arc<CodegenUnit<'tcx>>,
/// Cache instances of monomorphic and polymorphic items /// Cache instances of monomorphic and polymorphic items
pub instances: RefCell<FxHashMap<Instance<'tcx>, &'a Value>>, pub instances: RefCell<FxHashMap<Instance<'tcx>, V>>,
/// Cache generated vtables /// Cache generated vtables
pub vtables: RefCell<FxHashMap<(Ty<'tcx>, ty::PolyExistentialTraitRef<'tcx>), pub vtables: RefCell<FxHashMap<(Ty<'tcx>, ty::PolyExistentialTraitRef<'tcx>), V>>,
&'a Value>>,
/// Cache of constant strings, /// Cache of constant strings,
pub const_cstr_cache: RefCell<FxHashMap<LocalInternedString, &'a Value>>, pub const_cstr_cache: RefCell<FxHashMap<LocalInternedString, V>>,
/// Reverse-direction for const ptrs cast from globals. /// Reverse-direction for const ptrs cast from globals.
/// Key is a Value holding a *T, /// Key is a Value holding a *T,
@ -72,20 +71,20 @@ pub struct CodegenCx<'a, 'tcx: 'a> {
/// when we ptrcast, and we have to ptrcast during codegen /// when we ptrcast, and we have to ptrcast during codegen
/// of a [T] const because we form a slice, a (*T,usize) pair, not /// of a [T] const because we form a slice, a (*T,usize) pair, not
/// a pointer to an LLVM array type. Similar for trait objects. /// a pointer to an LLVM array type. Similar for trait objects.
pub const_unsized: RefCell<FxHashMap<&'a Value, &'a Value>>, pub const_unsized: RefCell<FxHashMap<V, V>>,
/// Cache of emitted const globals (value -> global) /// Cache of emitted const globals (value -> global)
pub const_globals: RefCell<FxHashMap<&'a Value, &'a Value>>, pub const_globals: RefCell<FxHashMap<V, V>>,
/// List of globals for static variables which need to be passed to the /// List of globals for static variables which need to be passed to the
/// LLVM function ReplaceAllUsesWith (RAUW) when codegen is complete. /// LLVM function ReplaceAllUsesWith (RAUW) when codegen is complete.
/// (We have to make sure we don't invalidate any Values referring /// (We have to make sure we don't invalidate any Values referring
/// to constants.) /// to constants.)
pub statics_to_rauw: RefCell<Vec<(&'a Value, &'a Value)>>, pub statics_to_rauw: RefCell<Vec<(V, V)>>,
/// Statics that will be placed in the llvm.used variable /// Statics that will be placed in the llvm.used variable
/// See http://llvm.org/docs/LangRef.html#the-llvm-used-global-variable for details /// See http://llvm.org/docs/LangRef.html#the-llvm-used-global-variable for details
pub used_statics: RefCell<Vec<&'a Value>>, pub used_statics: RefCell<Vec<V>>,
pub lltypes: RefCell<FxHashMap<(Ty<'tcx>, Option<VariantIdx>), &'a Type>>, pub lltypes: RefCell<FxHashMap<(Ty<'tcx>, Option<VariantIdx>), &'a Type>>,
pub scalar_lltypes: RefCell<FxHashMap<Ty<'tcx>, &'a Type>>, pub scalar_lltypes: RefCell<FxHashMap<Ty<'tcx>, &'a Type>>,
@ -94,11 +93,11 @@ pub struct CodegenCx<'a, 'tcx: 'a> {
pub dbg_cx: Option<debuginfo::CrateDebugContext<'a, 'tcx>>, pub dbg_cx: Option<debuginfo::CrateDebugContext<'a, 'tcx>>,
eh_personality: Cell<Option<&'a Value>>, eh_personality: Cell<Option<V>>,
eh_unwind_resume: Cell<Option<&'a Value>>, eh_unwind_resume: Cell<Option<V>>,
pub rust_try_fn: Cell<Option<&'a Value>>, pub rust_try_fn: Cell<Option<V>>,
intrinsics: RefCell<FxHashMap<&'static str, &'a Value>>, intrinsics: RefCell<FxHashMap<&'static str, V>>,
/// A counter that is used for generating local symbol names /// A counter that is used for generating local symbol names
local_gen_sym_counter: Cell<usize>, local_gen_sym_counter: Cell<usize>,

View file

@ -21,8 +21,9 @@ use rustc::ty;
use rustc::ty::layout::LayoutOf; use rustc::ty::layout::LayoutOf;
use type_of::LayoutLlvmExt; use type_of::LayoutLlvmExt;
use super::FunctionCx; use super::FunctionCx;
use value::Value;
pub fn non_ssa_locals(fx: &FunctionCx<'a, 'll, 'tcx>) -> BitSet<mir::Local> { pub fn non_ssa_locals(fx: &FunctionCx<'a, 'll, 'tcx, &'ll Value>) -> BitSet<mir::Local> {
let mir = fx.mir; let mir = fx.mir;
let mut analyzer = LocalAnalyzer::new(fx); let mut analyzer = LocalAnalyzer::new(fx);
@ -51,8 +52,8 @@ pub fn non_ssa_locals(fx: &FunctionCx<'a, 'll, 'tcx>) -> BitSet<mir::Local> {
analyzer.non_ssa_locals analyzer.non_ssa_locals
} }
struct LocalAnalyzer<'mir, 'a: 'mir, 'll: 'a, 'tcx: 'll> { struct LocalAnalyzer<'mir, 'a: 'mir, 'll: 'a, 'tcx: 'll, V: 'll> {
fx: &'mir FunctionCx<'a, 'll, 'tcx>, fx: &'mir FunctionCx<'a, 'll, 'tcx, V>,
dominators: Dominators<mir::BasicBlock>, dominators: Dominators<mir::BasicBlock>,
non_ssa_locals: BitSet<mir::Local>, non_ssa_locals: BitSet<mir::Local>,
// The location of the first visited direct assignment to each // The location of the first visited direct assignment to each
@ -60,8 +61,8 @@ struct LocalAnalyzer<'mir, 'a: 'mir, 'll: 'a, 'tcx: 'll> {
first_assignment: IndexVec<mir::Local, Location> first_assignment: IndexVec<mir::Local, Location>
} }
impl LocalAnalyzer<'mir, 'a, 'll, 'tcx> { impl LocalAnalyzer<'mir, 'a, 'll, 'tcx, &'ll Value> {
fn new(fx: &'mir FunctionCx<'a, 'll, 'tcx>) -> Self { fn new(fx: &'mir FunctionCx<'a, 'll, 'tcx, &'ll Value>) -> Self {
let invalid_location = let invalid_location =
mir::BasicBlock::new(fx.mir.basic_blocks().len()).start_location(); mir::BasicBlock::new(fx.mir.basic_blocks().len()).start_location();
let mut analyzer = LocalAnalyzer { let mut analyzer = LocalAnalyzer {
@ -102,7 +103,7 @@ impl LocalAnalyzer<'mir, 'a, 'll, 'tcx> {
} }
} }
impl Visitor<'tcx> for LocalAnalyzer<'mir, 'a, 'll, 'tcx> { impl Visitor<'tcx> for LocalAnalyzer<'mir, 'a, 'll, 'tcx, &'ll Value> {
fn visit_assign(&mut self, fn visit_assign(&mut self,
block: mir::BasicBlock, block: mir::BasicBlock,
place: &mir::Place<'tcx>, place: &mir::Place<'tcx>,

View file

@ -34,7 +34,7 @@ use super::place::PlaceRef;
use super::operand::OperandRef; use super::operand::OperandRef;
use super::operand::OperandValue::{Pair, Ref, Immediate}; use super::operand::OperandValue::{Pair, Ref, Immediate};
impl FunctionCx<'a, 'll, 'tcx> { impl FunctionCx<'a, 'll, 'tcx, &'ll Value> {
pub fn codegen_block(&mut self, bb: mir::BasicBlock) { pub fn codegen_block(&mut self, bb: mir::BasicBlock) {
let mut bx = self.build_block(bb); let mut bx = self.build_block(bb);
let data = &self.mir[bb]; let data = &self.mir[bb];

View file

@ -139,7 +139,7 @@ pub fn codegen_static_initializer(
Ok((const_alloc_to_llvm(cx, alloc), alloc)) Ok((const_alloc_to_llvm(cx, alloc), alloc))
} }
impl FunctionCx<'a, 'll, 'tcx> { impl FunctionCx<'a, 'll, 'tcx, &'ll Value> {
fn fully_evaluate( fn fully_evaluate(
&mut self, &mut self,
bx: &Builder<'a, 'll, 'tcx>, bx: &Builder<'a, 'll, 'tcx>,

View file

@ -44,14 +44,14 @@ use rustc::mir::traversal;
use self::operand::{OperandRef, OperandValue}; use self::operand::{OperandRef, OperandValue};
/// Master context for codegenning from MIR. /// Master context for codegenning from MIR.
pub struct FunctionCx<'a, 'll: 'a, 'tcx: 'll> { pub struct FunctionCx<'a, 'll: 'a, 'tcx: 'll, V> {
instance: Instance<'tcx>, instance: Instance<'tcx>,
mir: &'a mir::Mir<'tcx>, mir: &'a mir::Mir<'tcx>,
debug_context: FunctionDebugContext<'ll>, debug_context: FunctionDebugContext<'ll>,
llfn: &'ll Value, llfn: V,
cx: &'a CodegenCx<'ll, 'tcx>, cx: &'a CodegenCx<'ll, 'tcx>,
@ -64,7 +64,7 @@ pub struct FunctionCx<'a, 'll: 'a, 'tcx: 'll> {
/// don't really care about it very much. Anyway, this value /// don't really care about it very much. Anyway, this value
/// contains an alloca into which the personality is stored and /// contains an alloca into which the personality is stored and
/// then later loaded when generating the DIVERGE_BLOCK. /// then later loaded when generating the DIVERGE_BLOCK.
personality_slot: Option<PlaceRef<'tcx, &'ll Value>>, personality_slot: Option<PlaceRef<'tcx, V>>,
/// A `Block` for each MIR `BasicBlock` /// A `Block` for each MIR `BasicBlock`
blocks: IndexVec<mir::BasicBlock, &'ll BasicBlock>, blocks: IndexVec<mir::BasicBlock, &'ll BasicBlock>,
@ -73,7 +73,8 @@ pub struct FunctionCx<'a, 'll: 'a, 'tcx: 'll> {
cleanup_kinds: IndexVec<mir::BasicBlock, analyze::CleanupKind>, cleanup_kinds: IndexVec<mir::BasicBlock, analyze::CleanupKind>,
/// When targeting MSVC, this stores the cleanup info for each funclet /// When targeting MSVC, this stores the cleanup info for each funclet
/// BB. This is initialized as we compute the funclets' head block in RPO. /// BB. Thisrustup component add rustfmt-preview is initialized as we compute the funclets'
/// head block in RPO.
funclets: &'a IndexVec<mir::BasicBlock, Option<Funclet<'ll>>>, funclets: &'a IndexVec<mir::BasicBlock, Option<Funclet<'ll>>>,
/// This stores the landing-pad block for a given BB, computed lazily on GNU /// This stores the landing-pad block for a given BB, computed lazily on GNU
@ -98,7 +99,7 @@ pub struct FunctionCx<'a, 'll: 'a, 'tcx: 'll> {
/// ///
/// Avoiding allocs can also be important for certain intrinsics, /// Avoiding allocs can also be important for certain intrinsics,
/// notably `expect`. /// notably `expect`.
locals: IndexVec<mir::Local, LocalRef<'tcx, &'ll Value>>, locals: IndexVec<mir::Local, LocalRef<'tcx, V>>,
/// Debug information for MIR scopes. /// Debug information for MIR scopes.
scopes: IndexVec<mir::SourceScope, debuginfo::MirDebugScope<'ll>>, scopes: IndexVec<mir::SourceScope, debuginfo::MirDebugScope<'ll>>,
@ -107,7 +108,7 @@ pub struct FunctionCx<'a, 'll: 'a, 'tcx: 'll> {
param_substs: &'tcx Substs<'tcx>, param_substs: &'tcx Substs<'tcx>,
} }
impl FunctionCx<'a, 'll, 'tcx> { impl FunctionCx<'a, 'll, 'tcx, &'ll Value> {
pub fn monomorphize<T>(&self, value: &T) -> T pub fn monomorphize<T>(&self, value: &T) -> T
where T: TypeFoldable<'tcx> where T: TypeFoldable<'tcx>
{ {
@ -437,7 +438,7 @@ fn create_funclets(
/// indirect. /// indirect.
fn arg_local_refs( fn arg_local_refs(
bx: &Builder<'a, 'll, 'tcx>, bx: &Builder<'a, 'll, 'tcx>,
fx: &FunctionCx<'a, 'll, 'tcx>, fx: &FunctionCx<'a, 'll, 'tcx, &'ll Value>,
scopes: &IndexVec<mir::SourceScope, debuginfo::MirDebugScope<'ll>>, scopes: &IndexVec<mir::SourceScope, debuginfo::MirDebugScope<'ll>>,
memory_locals: &BitSet<mir::Local>, memory_locals: &BitSet<mir::Local>,
) -> Vec<LocalRef<'tcx, &'ll Value>> { ) -> Vec<LocalRef<'tcx, &'ll Value>> {

View file

@ -16,7 +16,7 @@ use rustc::ty::layout::{self, Align, LayoutOf, TyLayout};
use base; use base;
use common::{CodegenCx, C_undef, C_usize}; use common::{CodegenCx, C_undef, C_usize};
use builder::{Builder, MemFlags}; use builder::{Builder, MemFlags};
use value::Value; use value::{Value, ValueTrait};
use type_of::LayoutLlvmExt; use type_of::LayoutLlvmExt;
use type_::Type; use type_::Type;
use glue; use glue;
@ -60,7 +60,7 @@ pub struct OperandRef<'tcx, V> {
pub layout: TyLayout<'tcx>, pub layout: TyLayout<'tcx>,
} }
impl fmt::Debug for OperandRef<'tcx, &'ll Value> { impl<Value: ?Sized> fmt::Debug for OperandRef<'tcx, &'ll Value> where Value: ValueTrait {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "OperandRef({:?} @ {:?})", self.val, self.layout) write!(f, "OperandRef({:?} @ {:?})", self.val, self.layout)
} }
@ -344,7 +344,7 @@ impl OperandValue<&'ll Value> {
} }
} }
impl FunctionCx<'a, 'll, 'tcx> { impl FunctionCx<'a, 'll, 'tcx, &'ll Value> {
fn maybe_codegen_consume_direct(&mut self, fn maybe_codegen_consume_direct(&mut self,
bx: &Builder<'a, 'll, 'tcx>, bx: &Builder<'a, 'll, 'tcx>,
place: &mir::Place<'tcx>) place: &mir::Place<'tcx>)

View file

@ -430,7 +430,7 @@ impl PlaceRef<'tcx, &'ll Value> {
} }
} }
impl FunctionCx<'a, 'll, 'tcx> { impl FunctionCx<'a, 'll, 'tcx, &'ll Value> {
pub fn codegen_place(&mut self, pub fn codegen_place(&mut self,
bx: &Builder<'a, 'll, 'tcx>, bx: &Builder<'a, 'll, 'tcx>,
place: &mir::Place<'tcx>) place: &mir::Place<'tcx>)

View file

@ -32,7 +32,7 @@ use super::{FunctionCx, LocalRef};
use super::operand::{OperandRef, OperandValue}; use super::operand::{OperandRef, OperandValue};
use super::place::PlaceRef; use super::place::PlaceRef;
impl FunctionCx<'a, 'll, 'tcx> { impl FunctionCx<'a, 'll, 'tcx, &'ll Value> {
pub fn codegen_rvalue(&mut self, pub fn codegen_rvalue(&mut self,
bx: Builder<'a, 'll, 'tcx>, bx: Builder<'a, 'll, 'tcx>,
dest: PlaceRef<'tcx, &'ll Value>, dest: PlaceRef<'tcx, &'ll Value>,

View file

@ -16,8 +16,9 @@ use builder::Builder;
use super::FunctionCx; use super::FunctionCx;
use super::LocalRef; use super::LocalRef;
use super::OperandValue; use super::OperandValue;
use value::Value;
impl FunctionCx<'a, 'll, 'tcx> { impl FunctionCx<'a, 'll, 'tcx, &'ll Value> {
pub fn codegen_statement(&mut self, pub fn codegen_statement(&mut self,
bx: Builder<'a, 'll, 'tcx>, bx: Builder<'a, 'll, 'tcx>,
statement: &mir::Statement<'tcx>) statement: &mir::Statement<'tcx>)

View file

@ -15,12 +15,16 @@ use llvm;
use std::fmt; use std::fmt;
use std::hash::{Hash, Hasher}; use std::hash::{Hash, Hasher};
pub trait ValueTrait: fmt::Debug {}
impl PartialEq for Value { impl PartialEq for Value {
fn eq(&self, other: &Self) -> bool { fn eq(&self, other: &Self) -> bool {
self as *const _ == other as *const _ self as *const _ == other as *const _
} }
} }
impl ValueTrait for Value {}
impl Eq for Value {} impl Eq for Value {}
impl Hash for Value { impl Hash for Value {