LLVM unit tests: Include emit_llvm::Context in emit_llvm::Module

This commit is contained in:
Joëlle van Essen 2025-02-18 12:19:12 +01:00
commit 0aa8f5c142
No known key found for this signature in database
GPG key ID: 28D3B5CDD4B43882
2 changed files with 13 additions and 12 deletions

View file

@ -65,17 +65,21 @@ impl Drop for Context {
} }
} }
pub struct Module(LLVMModuleRef); pub struct Module(LLVMModuleRef, Context);
impl Module { impl Module {
fn new(ctx: &Context, name: &CStr) -> Self { fn new(ctx: Context, name: &CStr) -> Self {
Self(unsafe { LLVMModuleCreateWithNameInContext(name.as_ptr(), ctx.get()) }) Self(unsafe { LLVMModuleCreateWithNameInContext(name.as_ptr(), ctx.get()) }, ctx)
} }
fn get(&self) -> LLVMModuleRef { fn get(&self) -> LLVMModuleRef {
self.0 self.0
} }
fn context(&self) -> &Context {
&self.1
}
fn verify(&self) -> Result<(), Message> { fn verify(&self) -> Result<(), Message> {
let mut err = ptr::null_mut(); let mut err = ptr::null_mut();
let error = unsafe { let error = unsafe {
@ -180,10 +184,9 @@ impl Deref for MemoryBuffer {
pub(super) fn run<'input>( pub(super) fn run<'input>(
id_defs: GlobalStringIdentResolver2<'input>, id_defs: GlobalStringIdentResolver2<'input>,
directives: Vec<Directive2<'input, ast::Instruction<SpirvWord>, SpirvWord>>, directives: Vec<Directive2<'input, ast::Instruction<SpirvWord>, SpirvWord>>,
) -> Result<(Module, Context), TranslateError> { ) -> Result<Module, TranslateError> {
let context = Context::new(); let module = Module::new(Context::new(), LLVM_UNNAMED);
let module = Module::new(&context, LLVM_UNNAMED); let mut emit_ctx = ModuleEmitContext::new(&module, &id_defs);
let mut emit_ctx = ModuleEmitContext::new(&context, &module, &id_defs);
for directive in directives { for directive in directives {
match directive { match directive {
Directive2::Variable(linking, variable) => emit_ctx.emit_global(linking, variable)?, Directive2::Variable(linking, variable) => emit_ctx.emit_global(linking, variable)?,
@ -193,7 +196,7 @@ pub(super) fn run<'input>(
if let Err(err) = module.verify() { if let Err(err) = module.verify() {
panic!("{:?}", err); panic!("{:?}", err);
} }
Ok((module, context)) Ok(module)
} }
struct ModuleEmitContext<'a, 'input> { struct ModuleEmitContext<'a, 'input> {
@ -206,10 +209,10 @@ struct ModuleEmitContext<'a, 'input> {
impl<'a, 'input> ModuleEmitContext<'a, 'input> { impl<'a, 'input> ModuleEmitContext<'a, 'input> {
fn new( fn new(
context: &Context,
module: &Module, module: &Module,
id_defs: &'a GlobalStringIdentResolver2<'input>, id_defs: &'a GlobalStringIdentResolver2<'input>,
) -> Self { ) -> Self {
let context= module.context();
ModuleEmitContext { ModuleEmitContext {
context: context.get(), context: context.get(),
module: module.get(), module: module.get(),

View file

@ -53,17 +53,15 @@ pub fn to_llvm_module<'input>(ast: ast::Module<'input>) -> Result<Module, Transl
let directives = insert_implicit_conversions2::run(&mut flat_resolver, directives)?; let directives = insert_implicit_conversions2::run(&mut flat_resolver, directives)?;
let directives = replace_instructions_with_function_calls::run(&mut flat_resolver, directives)?; let directives = replace_instructions_with_function_calls::run(&mut flat_resolver, directives)?;
let directives = hoist_globals::run(directives)?; let directives = hoist_globals::run(directives)?;
let (llvm_ir, llvm_context) = emit_llvm::run(flat_resolver, directives)?; let llvm_ir = emit_llvm::run(flat_resolver, directives)?;
Ok(Module { Ok(Module {
llvm_ir, llvm_ir,
_llvm_context: llvm_context,
kernel_info: HashMap::new(), kernel_info: HashMap::new(),
}) })
} }
pub struct Module { pub struct Module {
pub llvm_ir: emit_llvm::Module, pub llvm_ir: emit_llvm::Module,
_llvm_context: emit_llvm::Context,
pub kernel_info: HashMap<String, KernelInfo>, pub kernel_info: HashMap<String, KernelInfo>,
} }