From 53894589ffb09d7dad57c5d67c5fa52be15d0f2d Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Mon, 17 Jun 2024 14:31:25 -0500 Subject: [PATCH] Produce better pointer and slice debug info names --- bootstrap/backend/llvm_bindings.zig | 1 + bootstrap/compiler.zig | 11 ++++++++--- src/llvm/llvm.cpp | 8 ++++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/bootstrap/backend/llvm_bindings.zig b/bootstrap/backend/llvm_bindings.zig index c5643a7..ebe922c 100644 --- a/bootstrap/backend/llvm_bindings.zig +++ b/bootstrap/backend/llvm_bindings.zig @@ -40,6 +40,7 @@ pub extern fn NativityLLVMDebugInfoBuilderCreateReplaceableCompositeType(builder pub extern fn NativityLLVMDebugInfoBuilderCreateMemberType(builder: *LLVM.DebugInfo.Builder, scope: ?*LLVM.DebugInfo.Scope, name_ptr: [*]const u8, name_len: usize, file: ?*LLVM.DebugInfo.File, line_number: c_uint, bit_size: u64, alignment: u32, bit_offset: u64, flags: LLVM.DebugInfo.Node.Flags, type: *LLVM.DebugInfo.Type) *LLVM.DebugInfo.Type.Derived; pub extern fn NativityLLVMDebugInfoBuilderCreateBitfieldMemberType(builder: *LLVM.DebugInfo.Builder, scope: *LLVM.DebugInfo.Scope, name_pointer: [*]const u8, name_len: usize, file: *LLVM.DebugInfo.File, line_number: c_uint, bit_size: u64, bit_offset: u64, storage_bit_offset: u64, flags: LLVM.DebugInfo.Node.Flags, type: *LLVM.DebugInfo.Type) *LLVM.DebugInfo.Type.Derived; pub extern fn NativityLLVMDebugInfoBuilderCompositeTypeReplaceTypes(builder: *LLVM.DebugInfo.Builder, type: *LLVM.DebugInfo.Type.Composite, element_type_ptr: [*]const *LLVM.DebugInfo.Type, element_type_count: usize) void; +pub extern fn NativityLLLVMDITypeGetName(type: *LLVM.DebugInfo.Type, name_pointer: *[*]const u8, name_length: *usize) void; pub extern fn NativityLLLVMDITypeIsResolved(type: *LLVM.DebugInfo.Type) bool; pub extern fn NativityLLVMDebugInfoBuilderFinalizeSubprogram(builder: *LLVM.DebugInfo.Builder, subprogram: *LLVM.DebugInfo.Subprogram, function: *LLVM.Value.Constant.Function) void; pub extern fn NativityLLVMDebugInfoBuilderFinalize(builder: *LLVM.DebugInfo.Builder) void; diff --git a/bootstrap/compiler.zig b/bootstrap/compiler.zig index 39bf1e1..e40a06a 100644 --- a/bootstrap/compiler.zig +++ b/bootstrap/compiler.zig @@ -6592,8 +6592,10 @@ fn llvm_get_debug_type(thread: *Thread, builder: *LLVM.DebugInfo.Builder, ty: *T const element_type = llvm_get_debug_type(thread, builder, typed_pointer.descriptor.pointee); const alignment = 3; const pointer_width = @bitSizeOf(usize); - // TODO: - const pointer_type = builder.createPointerType(element_type, pointer_width, alignment, "ptr", "ptr".len); + var element_name: []const u8 = undefined; + element_type.getName(&element_name.ptr, &element_name.len); + const pointer_name = thread.arena.join(&.{"*", element_name}) catch unreachable; + const pointer_type = builder.createPointerType(element_type, pointer_width, alignment, pointer_name.ptr, pointer_name.len); break :block pointer_type.toType(); }, .@"struct" => block: { @@ -6773,7 +6775,9 @@ fn llvm_get_debug_type(thread: *Thread, builder: *LLVM.DebugInfo.Builder, ty: *T .all_calls_described = false, }; const file = file_struct.file; - const name = "[]"; + var element_name: []const u8 = undefined; + element_type.getName(&element_name.ptr, &element_name.len); + const name = thread.arena.join(&.{"[]", element_name}) catch unreachable; const line = 0; const bitsize = nat_slice_type.type.size * 8; @@ -10418,6 +10422,7 @@ pub const LLVM = struct { }; pub const Type = opaque { + const getName = bindings.NativityLLLVMDITypeGetName; const isResolved = bindings.NativityLLLVMDITypeIsResolved; fn toScope(this: *@This()) *LLVM.DebugInfo.Scope { return @ptrCast(this); diff --git a/src/llvm/llvm.cpp b/src/llvm/llvm.cpp index 2acf467..d09735f 100644 --- a/src/llvm/llvm.cpp +++ b/src/llvm/llvm.cpp @@ -174,6 +174,7 @@ extern "C" DIType* NativityLLVMDebugInfoBuilderCreateBasicType(DIBuilder& builde { auto name = StringRef(name_ptr, name_len); auto* type = builder.createBasicType(name, bit_count, dwarf_encoding, flags); + type->getName(); return type; } @@ -255,6 +256,13 @@ extern "C" bool NativityLLLVMDITypeIsResolved(DIType* type) return type->isResolved(); } +extern "C" void NativityLLLVMDITypeGetName(DIType& type, const char** name_pointer, size_t* name_length) +{ + auto name = type.getName(); + *name_pointer = name.data(); + *name_length = name.size(); +} + extern "C" DISubprogram* NativityLLVMDebugInfoScopeToSubprogram(DIScope* scope) { auto* subprogram = dyn_cast(scope);