mirror of
https://github.com/odin-lang/Odin.git
synced 2026-06-08 19:44:20 +00:00
Merge pull request #6216 from odin-lang/bill/debug-info-fixes
Debug Info Fixes
This commit is contained in:
@@ -290,6 +290,7 @@ struct lbDefer {
|
||||
isize scope_index;
|
||||
isize context_stack_count;
|
||||
lbBlock * block;
|
||||
TokenPos pos;
|
||||
union {
|
||||
Ast *stmt;
|
||||
struct {
|
||||
|
||||
@@ -736,13 +736,14 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb
|
||||
}
|
||||
LLVMValueRef tag = LLVMConstInt(LLVMStructGetTypeAtIndex(llvm_type, 1), tag_value, false);
|
||||
LLVMValueRef padding = nullptr;
|
||||
LLVMValueRef values[3] = {cv.value, tag, padding};
|
||||
|
||||
isize value_count = 2;
|
||||
if (LLVMCountStructElementTypes(llvm_type) > 2) {
|
||||
value_count = 3;
|
||||
padding = LLVMConstNull(LLVMStructGetTypeAtIndex(llvm_type, 2));
|
||||
}
|
||||
|
||||
LLVMValueRef values[3] = {cv.value, tag, padding};
|
||||
res.value = llvm_const_named_struct_internal(m, llvm_type, values, value_count);
|
||||
res.type = original_type;
|
||||
return res;
|
||||
|
||||
@@ -729,22 +729,22 @@ gb_internal LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) {
|
||||
case Basic_i128be: return lb_debug_type_basic_type(m, str_lit("i128be"), 128, LLVMDWARFTypeEncoding_Signed, LLVMDIFlagBigEndian);
|
||||
case Basic_u128be: return lb_debug_type_basic_type(m, str_lit("u128be"), 128, LLVMDWARFTypeEncoding_Unsigned, LLVMDIFlagBigEndian);
|
||||
|
||||
case Basic_f16be: return lb_debug_type_basic_type(m, str_lit("f16be"), 16, LLVMDWARFTypeEncoding_Float, LLVMDIFlagLittleEndian);
|
||||
case Basic_f32be: return lb_debug_type_basic_type(m, str_lit("f32be"), 32, LLVMDWARFTypeEncoding_Float, LLVMDIFlagLittleEndian);
|
||||
case Basic_f64be: return lb_debug_type_basic_type(m, str_lit("f64be"), 64, LLVMDWARFTypeEncoding_Float, LLVMDIFlagLittleEndian);
|
||||
case Basic_f16be: return lb_debug_type_basic_type(m, str_lit("f16be"), 16, LLVMDWARFTypeEncoding_Float, LLVMDIFlagBigEndian);
|
||||
case Basic_f32be: return lb_debug_type_basic_type(m, str_lit("f32be"), 32, LLVMDWARFTypeEncoding_Float, LLVMDIFlagBigEndian);
|
||||
case Basic_f64be: return lb_debug_type_basic_type(m, str_lit("f64be"), 64, LLVMDWARFTypeEncoding_Float, LLVMDIFlagBigEndian);
|
||||
|
||||
case Basic_complex32:
|
||||
{
|
||||
LLVMMetadataRef elements[2] = {};
|
||||
elements[0] = lb_debug_struct_field(m, str_lit("real"), t_f16, 0*16);
|
||||
elements[1] = lb_debug_struct_field(m, str_lit("imag"), t_f16, 1*16);
|
||||
return lb_debug_basic_struct(m, str_lit("complex32"), 64, 32, elements, gb_count_of(elements));
|
||||
return lb_debug_basic_struct(m, str_lit("complex32"), 32, 16, elements, gb_count_of(elements));
|
||||
}
|
||||
case Basic_complex64:
|
||||
{
|
||||
LLVMMetadataRef elements[2] = {};
|
||||
elements[0] = lb_debug_struct_field(m, str_lit("real"), t_f32, 0*32);
|
||||
elements[1] = lb_debug_struct_field(m, str_lit("imag"), t_f32, 2*32);
|
||||
elements[1] = lb_debug_struct_field(m, str_lit("imag"), t_f32, 1*32);
|
||||
return lb_debug_basic_struct(m, str_lit("complex64"), 64, 32, elements, gb_count_of(elements));
|
||||
}
|
||||
case Basic_complex128:
|
||||
@@ -762,7 +762,7 @@ gb_internal LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) {
|
||||
elements[1] = lb_debug_struct_field(m, str_lit("jmag"), t_f16, 1*16);
|
||||
elements[2] = lb_debug_struct_field(m, str_lit("kmag"), t_f16, 2*16);
|
||||
elements[3] = lb_debug_struct_field(m, str_lit("real"), t_f16, 3*16);
|
||||
return lb_debug_basic_struct(m, str_lit("quaternion64"), 128, 32, elements, gb_count_of(elements));
|
||||
return lb_debug_basic_struct(m, str_lit("quaternion64"), 64, 16, elements, gb_count_of(elements));
|
||||
}
|
||||
case Basic_quaternion128:
|
||||
{
|
||||
@@ -780,7 +780,7 @@ gb_internal LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) {
|
||||
elements[1] = lb_debug_struct_field(m, str_lit("jmag"), t_f64, 1*64);
|
||||
elements[2] = lb_debug_struct_field(m, str_lit("kmag"), t_f64, 2*64);
|
||||
elements[3] = lb_debug_struct_field(m, str_lit("real"), t_f64, 3*64);
|
||||
return lb_debug_basic_struct(m, str_lit("quaternion256"), 256, 32, elements, gb_count_of(elements));
|
||||
return lb_debug_basic_struct(m, str_lit("quaternion256"), 256, 64, elements, gb_count_of(elements));
|
||||
}
|
||||
|
||||
|
||||
@@ -792,6 +792,8 @@ gb_internal LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) {
|
||||
}
|
||||
case Basic_string:
|
||||
{
|
||||
// NOTE(bill): size_of(^u8) <= size_of(int)
|
||||
|
||||
LLVMMetadataRef elements[2] = {};
|
||||
elements[0] = lb_debug_struct_field(m, str_lit("data"), t_u8_ptr, 0);
|
||||
elements[1] = lb_debug_struct_field(m, str_lit("len"), t_int, int_bits);
|
||||
@@ -805,6 +807,8 @@ gb_internal LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) {
|
||||
|
||||
case Basic_string16:
|
||||
{
|
||||
// NOTE(bill): size_of(^u16) <= size_of(int)
|
||||
|
||||
LLVMMetadataRef elements[2] = {};
|
||||
elements[0] = lb_debug_struct_field(m, str_lit("data"), t_u16_ptr, 0);
|
||||
elements[1] = lb_debug_struct_field(m, str_lit("len"), t_int, int_bits);
|
||||
@@ -820,7 +824,7 @@ gb_internal LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) {
|
||||
{
|
||||
LLVMMetadataRef elements[2] = {};
|
||||
elements[0] = lb_debug_struct_field(m, str_lit("data"), t_rawptr, 0);
|
||||
elements[1] = lb_debug_struct_field(m, str_lit("id"), t_typeid, 64);
|
||||
elements[1] = lb_debug_struct_field(m, str_lit("id"), t_typeid, 64); // typeid is always 64 bits in size and 64 bits in alignment
|
||||
return lb_debug_basic_struct(m, str_lit("any"), 128, 64, elements, gb_count_of(elements));
|
||||
}
|
||||
|
||||
@@ -843,6 +847,7 @@ gb_internal LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) {
|
||||
GB_PANIC("Type_Named should be handled in lb_debug_type separately");
|
||||
|
||||
case Type_SoaPointer:
|
||||
// TODO(bill): This is technically incorrect and needs fixing
|
||||
return LLVMDIBuilderCreatePointerType(m->debug_builder, lb_debug_type(m, type->SoaPointer.elem), int_bits, int_bits, 0, nullptr, 0);
|
||||
case Type_Pointer:
|
||||
return LLVMDIBuilderCreatePointerType(m->debug_builder, lb_debug_type(m, type->Pointer.elem), ptr_bits, ptr_bits, 0, nullptr, 0);
|
||||
|
||||
@@ -1377,6 +1377,8 @@ gb_internal LLVMValueRef lb_integer_modulo(lbProcedure *p, LLVMValueRef lhs, LLV
|
||||
if (LLVMIsConstant(rhs)) {
|
||||
if (LLVMIsNull(rhs)) {
|
||||
switch (behaviour) {
|
||||
case IntegerDivisionByZero_Trap:
|
||||
break;
|
||||
case IntegerDivisionByZero_Self:
|
||||
return zero;
|
||||
case IntegerDivisionByZero_Zero:
|
||||
|
||||
@@ -1290,7 +1290,7 @@ gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array<lbValue> c
|
||||
}
|
||||
}
|
||||
|
||||
lb_add_defer_proc(p, p->scope_index, deferred, result_as_args);
|
||||
lb_add_defer_proc(p, p->scope_index, deferred, result_as_args, e->token.pos);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -847,6 +847,10 @@ gb_internal void lb_build_range_interval(lbProcedure *p, AstBinaryExpr *node,
|
||||
lb_close_scope(p, lbDeferExit_Default, nullptr, node->left);
|
||||
lb_pop_target_list(p);
|
||||
|
||||
if (p->debug_info != nullptr) {
|
||||
LLVMSetCurrentDebugLocation2(p->builder, lb_debug_end_location_from_ast(p, rs->body));
|
||||
}
|
||||
|
||||
if (check != nullptr) {
|
||||
lb_emit_jump(p, check);
|
||||
lb_start_block(p, check);
|
||||
@@ -979,6 +983,9 @@ gb_internal void lb_build_range_tuple(lbProcedure *p, AstRangeStmt *rs, Scope *s
|
||||
|
||||
lb_close_scope(p, lbDeferExit_Default, nullptr, rs->body);
|
||||
lb_pop_target_list(p);
|
||||
if (p->debug_info != nullptr) {
|
||||
LLVMSetCurrentDebugLocation2(p->builder, lb_debug_end_location_from_ast(p, rs->body));
|
||||
}
|
||||
lb_emit_jump(p, loop);
|
||||
lb_start_block(p, done);
|
||||
}
|
||||
@@ -1108,6 +1115,9 @@ gb_internal void lb_build_range_stmt_struct_soa(lbProcedure *p, AstRangeStmt *rs
|
||||
|
||||
lb_close_scope(p, lbDeferExit_Default, nullptr, rs->body);
|
||||
lb_pop_target_list(p);
|
||||
if (p->debug_info != nullptr) {
|
||||
LLVMSetCurrentDebugLocation2(p->builder, lb_debug_end_location_from_ast(p, rs->body));
|
||||
}
|
||||
lb_emit_jump(p, loop);
|
||||
lb_start_block(p, done);
|
||||
|
||||
@@ -1330,6 +1340,9 @@ gb_internal void lb_build_range_stmt(lbProcedure *p, AstRangeStmt *rs, Scope *sc
|
||||
|
||||
lb_close_scope(p, lbDeferExit_Default, nullptr, rs->body);
|
||||
lb_pop_target_list(p);
|
||||
if (p->debug_info != nullptr) {
|
||||
LLVMSetCurrentDebugLocation2(p->builder, lb_debug_end_location_from_ast(p, rs->body));
|
||||
}
|
||||
lb_emit_jump(p, loop);
|
||||
lb_start_block(p, done);
|
||||
}
|
||||
@@ -1807,6 +1820,10 @@ gb_internal void lb_build_switch_stmt(lbProcedure *p, AstSwitchStmt *ss, Scope *
|
||||
}
|
||||
|
||||
lbBlock *next_cond = nullptr;
|
||||
if (p->debug_info != nullptr) {
|
||||
LLVMSetCurrentDebugLocation2(p->builder, lb_debug_end_location_from_ast(p, clause));
|
||||
}
|
||||
|
||||
for (Ast *expr : cc->list) {
|
||||
expr = unparen_expr(expr);
|
||||
|
||||
@@ -3164,6 +3181,9 @@ gb_internal void lb_build_defer_stmt(lbProcedure *p, lbDefer const &d) {
|
||||
if (d.kind == lbDefer_Node) {
|
||||
lb_build_stmt(p, d.stmt);
|
||||
} else if (d.kind == lbDefer_Proc) {
|
||||
if (p->debug_info != nullptr && d.pos.line > 0) {
|
||||
LLVMSetCurrentDebugLocation2(p->builder, lb_debug_location_from_token_pos(p, d.pos));
|
||||
}
|
||||
lb_emit_call(p, d.proc.deferred, d.proc.result_as_args);
|
||||
}
|
||||
}
|
||||
@@ -3240,10 +3260,11 @@ gb_internal void lb_add_defer_node(lbProcedure *p, isize scope_index, Ast *stmt)
|
||||
d->scope_index = scope_index;
|
||||
d->context_stack_count = p->context_stack.count;
|
||||
d->block = p->curr_block;
|
||||
d->stmt = stmt;
|
||||
d->pos = ast_token(stmt).pos;
|
||||
d->stmt = stmt;
|
||||
}
|
||||
|
||||
gb_internal void lb_add_defer_proc(lbProcedure *p, isize scope_index, lbValue deferred, Array<lbValue> const &result_as_args) {
|
||||
gb_internal void lb_add_defer_proc(lbProcedure *p, isize scope_index, lbValue deferred, Array<lbValue> const &result_as_args, TokenPos pos) {
|
||||
Type *pt = base_type(p->type);
|
||||
GB_ASSERT(pt->kind == Type_Proc);
|
||||
if (pt->Proc.calling_convention == ProcCC_Odin) {
|
||||
@@ -3254,6 +3275,7 @@ gb_internal void lb_add_defer_proc(lbProcedure *p, isize scope_index, lbValue de
|
||||
d->kind = lbDefer_Proc;
|
||||
d->scope_index = p->scope_index;
|
||||
d->block = p->curr_block;
|
||||
d->pos = pos;
|
||||
d->context_stack_count = p->context_stack.count;
|
||||
d->proc.deferred = deferred;
|
||||
d->proc.result_as_args = result_as_args;
|
||||
|
||||
Reference in New Issue
Block a user