@@ -12,7 +12,7 @@ use llvm_sys::target_machine::{
1212 LLVMGetTargetFromTriple , LLVMGetTargetMachineCPU , LLVMGetTargetMachineFeatureString , LLVMGetTargetMachineTarget ,
1313 LLVMGetTargetMachineTriple , LLVMGetTargetName , LLVMRelocMode , LLVMSetTargetMachineAsmVerbosity ,
1414 LLVMTargetHasAsmBackend , LLVMTargetHasJIT , LLVMTargetHasTargetMachine , LLVMTargetMachineEmitToFile ,
15- LLVMTargetMachineEmitToMemoryBuffer , LLVMTargetMachineRef , LLVMTargetRef ,
15+ LLVMTargetMachineEmitToMemoryBuffer , LLVMTargetMachineEmitToMemoryBufferWithDbg , LLVMTargetMachineRef , LLVMTargetRef ,
1616} ;
1717#[ llvm_versions( 18 ..) ]
1818use llvm_sys:: target_machine:: {
@@ -1236,6 +1236,67 @@ impl TargetMachine {
12361236 unsafe { Ok ( MemoryBuffer :: new ( memory_buffer) ) }
12371237 }
12381238
1239+ /// Writes a `TargetMachine` and debug info to `MemoryBuffer`s.
1240+ ///
1241+ /// # Example
1242+ ///
1243+ /// ```no_run
1244+ /// use inkwell::OptimizationLevel;
1245+ /// use inkwell::context::Context;
1246+ /// use inkwell::targets::{CodeModel, RelocMode, FileType, Target, TargetMachine, TargetTriple, InitializationConfig};
1247+ ///
1248+ /// Target::initialize_x86(&InitializationConfig::default());
1249+ ///
1250+ /// let opt = OptimizationLevel::Default;
1251+ /// let reloc = RelocMode::Default;
1252+ /// let model = CodeModel::Default;
1253+ /// let target = Target::from_name("x86-64").unwrap();
1254+ /// let target_machine = target.create_target_machine(
1255+ /// &TargetTriple::create("x86_64-pc-linux-gnu"),
1256+ /// "x86-64",
1257+ /// "+avx2",
1258+ /// opt,
1259+ /// reloc,
1260+ /// model
1261+ /// )
1262+ /// .unwrap();
1263+ ///
1264+ /// let context = Context::create();
1265+ /// let module = context.create_module("my_module");
1266+ /// let void_type = context.void_type();
1267+ /// let fn_type = void_type.fn_type(&[], false);
1268+ ///
1269+ /// module.add_function("my_fn", fn_type, None);
1270+ ///
1271+ /// let (buffer, debug_buffer) = target_machine.write_to_memory_buffer_with_dbg(&module, FileType::Assembly).unwrap();
1272+ /// ```
1273+ pub fn write_to_memory_buffer_with_dbg ( & self , module : & Module , file_type : FileType ) -> Result < ( MemoryBuffer , MemoryBuffer ) , LLVMString > {
1274+ let mut memory_buffer = ptr:: null_mut ( ) ;
1275+ let mut debug_buffer = ptr:: null_mut ( ) ;
1276+ let mut err_string = MaybeUninit :: uninit ( ) ;
1277+ let return_code = unsafe {
1278+ let module_ptr = module. module . get ( ) ;
1279+ let file_type_ptr = file_type. as_llvm_file_type ( ) ;
1280+
1281+ LLVMTargetMachineEmitToMemoryBufferWithDbg (
1282+ self . target_machine ,
1283+ module_ptr,
1284+ file_type_ptr,
1285+ err_string. as_mut_ptr ( ) ,
1286+ & mut memory_buffer,
1287+ & mut debug_buffer,
1288+ )
1289+ } ;
1290+
1291+ if return_code == 1 {
1292+ unsafe {
1293+ return Err ( LLVMString :: new ( err_string. assume_init ( ) ) ) ;
1294+ }
1295+ }
1296+
1297+ unsafe { Ok ( ( MemoryBuffer :: new ( memory_buffer) , MemoryBuffer :: new ( debug_buffer) ) ) }
1298+ }
1299+
12391300 /// Saves a `TargetMachine` to a file.
12401301 ///
12411302 /// # Example
0 commit comments