Skip to content

Commit c1347b6

Browse files
committed
Add the debug info endpoint
1 parent 8c817b4 commit c1347b6

File tree

2 files changed

+63
-2
lines changed

2 files changed

+63
-2
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ llvm-sys-170 = { package = "llvm-sys", version = "170.2.0", optional = true }
162162
llvm-sys-181 = { package = "llvm-sys", version = "181.2.0", optional = true }
163163
llvm-sys-191 = { package = "llvm-sys", version = "191.0.0", optional = true }
164164
llvm-sys-201 = { package = "llvm-sys", version = "201.0.0", optional = true }
165-
llvm-sys-211 = { git = "https://github.com/NomicFoundation/llvm-sys.rs", package = "llvm-sys", branch = "main", optional = true }
165+
llvm-sys-211 = { git = "https://github.com/NomicFoundation/llvm-sys.rs", package = "llvm-sys", branch = "az-add-debug-info-endpoint", optional = true }
166166

167167
libc = "0.2"
168168
once_cell = "1.16"

src/targets.rs

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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..)]
1818
use 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

Comments
 (0)