forked from M-Labs/nac3
put alloca in init block
This commit is contained in:
parent
cc0692a34c
commit
4db871c244
|
@ -1,17 +1,16 @@
|
||||||
use std::convert::TryInto;
|
|
||||||
|
|
||||||
use crate::{top_level::CodeGenContext, typecheck::typedef::Type};
|
use crate::{top_level::CodeGenContext, typecheck::typedef::Type};
|
||||||
use inkwell::{
|
use inkwell::values::{BasicValueEnum, PointerValue};
|
||||||
types::BasicTypeEnum,
|
|
||||||
values::{BasicValueEnum, PointerValue},
|
|
||||||
};
|
|
||||||
use rustpython_parser::ast::{Expr, ExprKind, Stmt, StmtKind};
|
use rustpython_parser::ast::{Expr, ExprKind, Stmt, StmtKind};
|
||||||
|
|
||||||
impl<'ctx> CodeGenContext<'ctx> {
|
impl<'ctx> CodeGenContext<'ctx> {
|
||||||
fn gen_var(&mut self, ty: Type) -> PointerValue<'ctx> {
|
fn gen_var(&mut self, ty: Type) -> PointerValue<'ctx> {
|
||||||
// should we build the alloca in an initial block?
|
// put the alloca in init block
|
||||||
|
let current = self.builder.get_insert_block().unwrap();
|
||||||
|
self.builder.position_at_end(self.init_bb);
|
||||||
let ty = self.get_llvm_type(ty);
|
let ty = self.get_llvm_type(ty);
|
||||||
self.builder.build_alloca(ty, "tmp")
|
let ptr = self.builder.build_alloca(ty, "tmp");
|
||||||
|
self.builder.position_at_end(current);
|
||||||
|
ptr
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_pattern(&mut self, pattern: &Expr<Option<Type>>) -> PointerValue<'ctx> {
|
fn parse_pattern(&mut self, pattern: &Expr<Option<Type>>) -> PointerValue<'ctx> {
|
||||||
|
|
|
@ -68,6 +68,8 @@ pub struct CodeGenContext<'ctx> {
|
||||||
pub var_assignment: HashMap<String, PointerValue<'ctx>>,
|
pub var_assignment: HashMap<String, PointerValue<'ctx>>,
|
||||||
pub type_cache: HashMap<Type, BasicTypeEnum<'ctx>>,
|
pub type_cache: HashMap<Type, BasicTypeEnum<'ctx>>,
|
||||||
pub primitives: PrimitiveStore,
|
pub primitives: PrimitiveStore,
|
||||||
|
// stores the alloca for variables
|
||||||
|
pub init_bb: BasicBlock<'ctx>,
|
||||||
// where continue and break should go to respectively
|
// where continue and break should go to respectively
|
||||||
// the first one is the test_bb, and the second one is bb after the loop
|
// the first one is the test_bb, and the second one is bb after the loop
|
||||||
pub loop_bb: Option<(BasicBlock<'ctx>, BasicBlock<'ctx>)>,
|
pub loop_bb: Option<(BasicBlock<'ctx>, BasicBlock<'ctx>)>,
|
||||||
|
|
Loading…
Reference in New Issue