1322: inkwell::Builder is a per-function notion, remove it from LLVMModuleCodeGenerator. r=nlewycky a=nlewycky

This also removes it from the API to generate trampolines, which makes sense because those produce new functions, so it can produce a new builder for the new function.


Co-authored-by: Nick Lewycky <nick@wasmer.io>
Co-authored-by: nlewycky <nick@wasmer.io>
This commit is contained in:
bors[bot] 2020-03-20 19:29:23 +00:00 committed by GitHub
commit c6dc793924
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 7 additions and 25 deletions

View File

@ -954,7 +954,6 @@ pub unsafe extern "C" fn callback_trampoline(
pub struct LLVMModuleCodeGenerator<'ctx> {
context: Option<&'ctx Context>,
builder: Option<Builder<'ctx>>,
intrinsics: Option<Intrinsics<'ctx>>,
functions: Vec<LLVMFunctionCodeGenerator<'ctx>>,
signatures: Map<SigIndex, FunctionType<'ctx>>,
@ -8619,7 +8618,6 @@ impl From<LoadError> for CodegenError {
impl Drop for LLVMModuleCodeGenerator<'_> {
fn drop(&mut self) {
// Ensure that all members of the context are dropped before we drop the context.
drop(self.builder.take());
drop(self.intrinsics.take());
self.functions.clear();
self.signatures.clear();
@ -8698,8 +8696,6 @@ impl<'ctx> ModuleCodeGenerator<LLVMFunctionCodeGenerator<'ctx>, LLVMBackend, Cod
module.set_target(&target);
module.set_data_layout(&target_machine.get_target_data().get_data_layout());
let builder = context.create_builder();
let intrinsics = Intrinsics::declare(&module, &context);
let personality_func = module.add_function(
@ -8710,7 +8706,6 @@ impl<'ctx> ModuleCodeGenerator<LLVMFunctionCodeGenerator<'ctx>, LLVMBackend, Cod
LLVMModuleCodeGenerator {
context: Some(context),
builder: Some(builder),
intrinsics: Some(intrinsics),
module: ManuallyDrop::new(Rc::new(RefCell::new(module))),
functions: vec![],
@ -8740,15 +8735,10 @@ impl<'ctx> ModuleCodeGenerator<LLVMFunctionCodeGenerator<'ctx>, LLVMBackend, Cod
_loc: WasmSpan,
) -> Result<&mut LLVMFunctionCodeGenerator<'ctx>, CodegenError> {
// Creates a new function and returns the function-scope code generator for it.
let (context, builder, intrinsics) = match self.functions.last_mut() {
Some(x) => (
x.context.take().unwrap(),
x.builder.take().unwrap(),
x.intrinsics.take().unwrap(),
),
let (context, intrinsics) = match self.functions.last_mut() {
Some(x) => (x.context.take().unwrap(), x.intrinsics.take().unwrap()),
None => (
self.context.take().unwrap(),
self.builder.take().unwrap(),
self.intrinsics.take().unwrap(),
),
};
@ -8766,6 +8756,7 @@ impl<'ctx> ModuleCodeGenerator<LLVMFunctionCodeGenerator<'ctx>, LLVMBackend, Cod
alloca_builder.position_at_end(entry_block);
let return_block = context.append_basic_block(*function, "return");
let builder = context.create_builder();
builder.position_at_end(return_block);
let phis: SmallVec<[PhiValue; 1]> = func_sig
@ -8851,20 +8842,14 @@ impl<'ctx> ModuleCodeGenerator<LLVMFunctionCodeGenerator<'ctx>, LLVMBackend, Cod
),
CodegenError,
> {
let (context, builder, intrinsics) = match self.functions.last_mut() {
Some(x) => (
x.context.take().unwrap(),
x.builder.take().unwrap(),
x.intrinsics.take().unwrap(),
),
let (context, intrinsics) = match self.functions.last_mut() {
Some(x) => (x.context.take().unwrap(), x.intrinsics.take().unwrap()),
None => (
self.context.take().unwrap(),
self.builder.take().unwrap(),
self.intrinsics.take().unwrap(),
),
};
self.context = Some(context);
self.builder = Some(builder);
self.intrinsics = Some(intrinsics);
generate_trampolines(
@ -8872,7 +8857,6 @@ impl<'ctx> ModuleCodeGenerator<LLVMFunctionCodeGenerator<'ctx>, LLVMBackend, Cod
&self.signatures,
&self.module.borrow_mut(),
self.context.as_ref().unwrap(),
self.builder.as_ref().unwrap(),
self.intrinsics.as_ref().unwrap(),
)
.map_err(|e| CodegenError {

View File

@ -1,6 +1,5 @@
use crate::intrinsics::Intrinsics;
use inkwell::{
builder::Builder,
context::Context,
module::{Linkage, Module},
types::{BasicType, FunctionType},
@ -18,7 +17,6 @@ pub fn generate_trampolines<'ctx>(
signatures: &SliceMap<SigIndex, FunctionType<'ctx>>,
module: &Module<'ctx>,
context: &'ctx Context,
builder: &Builder<'ctx>,
intrinsics: &Intrinsics<'ctx>,
) -> Result<(), String> {
for (sig_index, sig) in info.signatures.iter() {
@ -42,7 +40,7 @@ pub fn generate_trampolines<'ctx>(
Some(Linkage::External),
);
generate_trampoline(trampoline_func, sig, context, builder, intrinsics)?;
generate_trampoline(trampoline_func, sig, context, intrinsics)?;
}
Ok(())
}
@ -51,10 +49,10 @@ fn generate_trampoline<'ctx>(
trampoline_func: FunctionValue,
func_sig: &FuncSig,
context: &'ctx Context,
builder: &Builder<'ctx>,
intrinsics: &Intrinsics<'ctx>,
) -> Result<(), String> {
let entry_block = context.append_basic_block(trampoline_func, "entry");
let builder = context.create_builder();
builder.position_at_end(entry_block);
let (vmctx_ptr, func_ptr, args_ptr, returns_ptr) = match trampoline_func.get_params().as_slice()