Fix and test, improve compilation slightly

This commit is contained in:
Andrzej Janik 2024-09-25 17:49:15 +02:00
commit c4e1315194
2 changed files with 49 additions and 12 deletions

View file

@ -1,5 +1,5 @@
use amd_comgr_sys::*; use amd_comgr_sys::*;
use std::{ffi::CStr, mem, ptr}; use std::{ffi::CStr, iter, mem, ptr};
struct Data(amd_comgr_data_t); struct Data(amd_comgr_data_t);
@ -83,6 +83,20 @@ impl ActionInfo {
unsafe { amd_comgr_action_info_set_language(self.get(), language) } unsafe { amd_comgr_action_info_set_language(self.get(), language) }
} }
fn set_options<'a>(
&self,
options: impl Iterator<Item = &'a CStr>,
) -> Result<(), amd_comgr_status_s> {
let options = options.map(|x| x.as_ptr()).collect::<Vec<_>>();
unsafe {
amd_comgr_action_info_set_option_list(
self.get(),
options.as_ptr().cast_mut(),
options.len(),
)
}
}
fn get(&self) -> amd_comgr_action_info_t { fn get(&self) -> amd_comgr_action_info_t {
self.0 self.0
} }
@ -116,21 +130,27 @@ pub fn compile_bitcode(
let lang_action_info = ActionInfo::new()?; let lang_action_info = ActionInfo::new()?;
lang_action_info.set_isa_name(gcn_arch)?; lang_action_info.set_isa_name(gcn_arch)?;
lang_action_info.set_language(amd_comgr_language_t::AMD_COMGR_LANGUAGE_LLVM_IR)?; lang_action_info.set_language(amd_comgr_language_t::AMD_COMGR_LANGUAGE_LLVM_IR)?;
let linked_data_set = do_action( let with_device_libs = do_action(
&bitcode_data_set, &bitcode_data_set,
&lang_action_info, &lang_action_info,
amd_comgr_action_kind_t::AMD_COMGR_ACTION_COMPILE_SOURCE_WITH_DEVICE_LIBS_TO_BC, amd_comgr_action_kind_t::AMD_COMGR_ACTION_COMPILE_SOURCE_WITH_DEVICE_LIBS_TO_BC,
)?; )?;
let action_info = ActionInfo::new()?; let linked_data_set = do_action(
action_info.set_isa_name(gcn_arch)?; &with_device_libs,
&lang_action_info,
amd_comgr_action_kind_t::AMD_COMGR_ACTION_LINK_BC_TO_BC,
)?;
let compile_action_info = ActionInfo::new()?;
compile_action_info.set_isa_name(gcn_arch)?;
compile_action_info.set_options(iter::once(c"-O3"))?;
let reloc_data_set = do_action( let reloc_data_set = do_action(
&linked_data_set, &linked_data_set,
&action_info, &compile_action_info,
amd_comgr_action_kind_t::AMD_COMGR_ACTION_CODEGEN_BC_TO_RELOCATABLE, amd_comgr_action_kind_t::AMD_COMGR_ACTION_CODEGEN_BC_TO_RELOCATABLE,
)?; )?;
let exec_data_set = do_action( let exec_data_set = do_action(
&reloc_data_set, &reloc_data_set,
&action_info, &compile_action_info,
amd_comgr_action_kind_t::AMD_COMGR_ACTION_LINK_RELOCATABLE_TO_EXECUTABLE, amd_comgr_action_kind_t::AMD_COMGR_ACTION_LINK_RELOCATABLE_TO_EXECUTABLE,
)?; )?;
let executable = let executable =

View file

@ -338,7 +338,7 @@ impl<'a, 'input> MethodEmitContext<'a, 'input> {
Statement::Conversion(conversion) => self.emit_conversion(conversion)?, Statement::Conversion(conversion) => self.emit_conversion(conversion)?,
Statement::Constant(constant) => self.emit_constant(constant)?, Statement::Constant(constant) => self.emit_constant(constant)?,
Statement::RetValue(_, _) => todo!(), Statement::RetValue(_, _) => todo!(),
Statement::PtrAccess(_) => todo!(), Statement::PtrAccess(ptr_access) => self.emit_ptr_access(ptr_access)?,
Statement::RepackVector(_) => todo!(), Statement::RepackVector(_) => todo!(),
Statement::FunctionPointer(_) => todo!(), Statement::FunctionPointer(_) => todo!(),
Statement::VectorAccess(_) => todo!(), Statement::VectorAccess(_) => todo!(),
@ -400,7 +400,7 @@ impl<'a, 'input> MethodEmitContext<'a, 'input> {
ast::Instruction::SetpBool { data, arguments } => todo!(), ast::Instruction::SetpBool { data, arguments } => todo!(),
ast::Instruction::Not { data, arguments } => todo!(), ast::Instruction::Not { data, arguments } => todo!(),
ast::Instruction::Or { data, arguments } => todo!(), ast::Instruction::Or { data, arguments } => todo!(),
ast::Instruction::And { data, arguments } => todo!(), ast::Instruction::And { data, arguments } => self.emit_and(arguments),
ast::Instruction::Bra { arguments } => todo!(), ast::Instruction::Bra { arguments } => todo!(),
ast::Instruction::Call { data, arguments } => self.emit_call(data, arguments), ast::Instruction::Call { data, arguments } => self.emit_call(data, arguments),
ast::Instruction::Cvt { data, arguments } => todo!(), ast::Instruction::Cvt { data, arguments } => todo!(),
@ -448,9 +448,6 @@ impl<'a, 'input> MethodEmitContext<'a, 'input> {
data: ast::LdDetails, data: ast::LdDetails,
arguments: ast::LdArgs<SpirvWord>, arguments: ast::LdArgs<SpirvWord>,
) -> Result<(), TranslateError> { ) -> Result<(), TranslateError> {
if data.non_coherent {
todo!()
}
if data.qualifier != ast::LdStQualifier::Weak { if data.qualifier != ast::LdStQualifier::Weak {
todo!() todo!()
} }
@ -492,7 +489,7 @@ impl<'a, 'input> MethodEmitContext<'a, 'input> {
} else { } else {
todo!() todo!()
} }
}, }
ConversionKind::SignExtend => todo!(), ConversionKind::SignExtend => todo!(),
ConversionKind::BitToPtr => { ConversionKind::BitToPtr => {
let src = self.resolver.value(conversion.src)?; let src = self.resolver.value(conversion.src)?;
@ -618,6 +615,26 @@ impl<'a, 'input> MethodEmitContext<'a, 'input> {
.register(arguments.dst, self.resolver.value(arguments.src)?); .register(arguments.dst, self.resolver.value(arguments.src)?);
Ok(()) Ok(())
} }
fn emit_ptr_access(&mut self, ptr_access: PtrAccess<SpirvWord>) -> Result<(), TranslateError> {
let ptr_src = self.resolver.value(ptr_access.ptr_src)?;
let mut offset_src = self.resolver.value(ptr_access.offset_src)?;
let pointee_type = get_scalar_type(self.context, ast::ScalarType::B8);
self.resolver.with_result(ptr_access.dst, |dst| unsafe {
LLVMBuildInBoundsGEP2(self.builder, pointee_type, ptr_src, &mut offset_src, 1, dst)
});
Ok(())
}
fn emit_and(&mut self, arguments: ast::AndArgs<SpirvWord>) -> Result<(), TranslateError> {
let builder = self.builder;
let src1 = self.resolver.value(arguments.src1)?;
let src2 = self.resolver.value(arguments.src2)?;
self.resolver.with_result(arguments.dst, |dst| unsafe {
LLVMBuildAnd(builder, src1, src2, dst)
});
Ok(())
}
} }
fn get_pointer_type<'ctx>( fn get_pointer_type<'ctx>(