Imports #
"bytes"
"cmd/internal/src"
"cmp"
"errors"
"fmt"
"internal/buildcfg"
"os/exec"
"slices"
"strconv"
"strings"
"bytes"
"cmd/internal/src"
"cmp"
"errors"
"fmt"
"internal/buildcfg"
"os/exec"
"slices"
"strconv"
"strings"
Used to form the symbol name assigned to the DWARF "abstract subprogram" info entry for a function
const AbstractFuncSuffix = "$abstract"CUInfoPrefix is the prefix for symbols containing information to populate the DWARF compilation unit info entries.
const CUInfoPrefix = "go:cuinfo."ConstInfoPrefix is the prefix for all symbols containing DWARF info entries that contain constants.
const ConstInfoPrefix = "go:constinfo."Index into the abbrevs table below.
const DW_ABRV_ARRAYRANGEIndex into the abbrevs table below.
const DW_ABRV_ARRAYTYPEIndex into the abbrevs table below.
const DW_ABRV_BARE_PTRTYPEIndex into the abbrevs table below.
const DW_ABRV_BASETYPEIndex into the abbrevs table below.
const DW_ABRV_CHANTYPEIndex into the abbrevs table below.
const DW_ABRV_COMPUNITIndex into the abbrevs table below.
const DW_ABRV_COMPUNIT_TEXTLESSIndex into the abbrevs table below.
const DW_ABRV_DICT_INDEXIndex into the abbrevs table below.
const DW_ABRV_DOTDOTDOTIndex into the abbrevs table below.
const DW_ABRV_FUNCTIONIndex into the abbrevs table below.
const DW_ABRV_FUNCTION_ABSTRACTIndex into the abbrevs table below.
const DW_ABRV_FUNCTION_CONCRETEIndex into the abbrevs table below.
const DW_ABRV_FUNCTYPEIndex into the abbrevs table below.
const DW_ABRV_FUNCTYPEOUTPARAMIndex into the abbrevs table below.
const DW_ABRV_FUNCTYPEPARAMIndex into the abbrevs table below.
const DW_ABRV_IFACETYPEIndex into the abbrevs table below.
const DW_ABRV_INLINED_SUBROUTINEIndex into the abbrevs table below.
const DW_ABRV_INLINED_SUBROUTINE_RANGESIndex into the abbrevs table below.
const DW_ABRV_INT_CONSTANTIndex into the abbrevs table below.
const DW_ABRV_LEXICAL_BLOCK_RANGESIndex into the abbrevs table below.
const DW_ABRV_LEXICAL_BLOCK_SIMPLEIndex into the abbrevs table below.
const DW_ABRV_MAPTYPEIndex into the abbrevs table below.
const DW_ABRV_NULL = iotaIndex into the abbrevs table below.
const DW_ABRV_NULLTYPEIndex into the abbrevs table below.
const DW_ABRV_PTRTYPEIndex into the abbrevs table below.
const DW_ABRV_PUTVAR_STARTIndex into the abbrevs table below.
const DW_ABRV_SLICETYPEIndex into the abbrevs table below.
const DW_ABRV_STRINGTYPEIndex into the abbrevs table below.
const DW_ABRV_STRUCTFIELDIndex into the abbrevs table below.
const DW_ABRV_STRUCTTYPEIndex into the abbrevs table below.
const DW_ABRV_TYPEDECLIndex into the abbrevs table below.
const DW_ABRV_VARIABLEIndex into the abbrevs table below.
const DW_ABRV_WRAPPERIndex into the abbrevs table below.
const DW_ABRV_WRAPPER_CONCRETETable 28
const DW_ACCESS_private = 0x03Table 28
const DW_ACCESS_protected = 0x02Table 28
const DW_ACCESS_public = 0x01Table 25
const DW_ATE_address = 0x01Table 25
const DW_ATE_boolean = 0x02Table 25
const DW_ATE_complex_float = 0x03Table 25
const DW_ATE_decimal_float = 0x0fTable 25
const DW_ATE_edited = 0x0cTable 25
const DW_ATE_float = 0x04Table 25
const DW_ATE_hi_user = 0xffTable 25
const DW_ATE_imaginary_float = 0x09Table 25
const DW_ATE_lo_user = 0x80Table 25
const DW_ATE_numeric_string = 0x0bTable 25
const DW_ATE_packed_decimal = 0x0aTable 25
const DW_ATE_signed = 0x05Table 25
const DW_ATE_signed_char = 0x06Table 25
const DW_ATE_signed_fixed = 0x0dTable 25
const DW_ATE_unsigned = 0x07Table 25
const DW_ATE_unsigned_char = 0x08Table 25
const DW_ATE_unsigned_fixed = 0x0eTable 20
const DW_AT_abstract_origin = 0x31Table 20
const DW_AT_accessibility = 0x32Table 20
const DW_AT_address_class = 0x33Dwarf3
const DW_AT_allocated = 0x4eTable 20
const DW_AT_artificial = 0x34Table 20
const DW_AT_associated = 0x4fTable 20
const DW_AT_base_types = 0x35Table 20
const DW_AT_binary_scale = 0x5bTable 20
const DW_AT_bit_offset = 0x0cTable 20
const DW_AT_bit_size = 0x0dTable 20
const DW_AT_bit_stride = 0x2eTable 20
const DW_AT_byte_size = 0x0bTable 20
const DW_AT_byte_stride = 0x51Table 20
const DW_AT_call_column = 0x57Table 20
const DW_AT_call_file = 0x58Table 20
const DW_AT_call_line = 0x59Table 20
const DW_AT_calling_convention = 0x36Table 20
const DW_AT_common_reference = 0x1aTable 20
const DW_AT_comp_dir = 0x1bTable 20
const DW_AT_const_value = 0x1cTable 20
const DW_AT_containing_type = 0x1dTable 20
const DW_AT_count = 0x37Table 20
const DW_AT_data_location = 0x50Table 20
const DW_AT_data_member_location = 0x38Table 20
const DW_AT_decimal_scale = 0x5cTable 20
const DW_AT_decimal_sign = 0x5eTable 20
const DW_AT_decl_column = 0x39Table 20
const DW_AT_decl_file = 0x3aTable 20
const DW_AT_decl_line = 0x3bTable 20
const DW_AT_declaration = 0x3cTable 20
const DW_AT_default_value = 0x1eTable 20
const DW_AT_description = 0x5aTable 20
const DW_AT_digit_count = 0x5fTable 20
const DW_AT_discr = 0x15Table 20
const DW_AT_discr_list = 0x3dTable 20
const DW_AT_discr_value = 0x16Table 20
const DW_AT_elemental = 0x66Table 20
const DW_AT_encoding = 0x3eTable 20
const DW_AT_endianity = 0x65Table 20
const DW_AT_entry_pc = 0x52Table 20
const DW_AT_explicit = 0x63Table 20
const DW_AT_extension = 0x54Table 20
const DW_AT_external = 0x3fTable 20
const DW_AT_frame_base = 0x40Table 20
const DW_AT_friend = 0x41Go-specific type attributes.
const DW_AT_go_closure_offset = 0x2907Go-specific type attributes.
const DW_AT_go_dict_index = 0x2906Go-specific type attributes.
const DW_AT_go_elem = 0x2902Attribute for DW_TAG_member of a struct type. Nonzero value indicates the struct field is an embedded field.
const DW_AT_go_embedded_field = 0x2903Go-specific type attributes.
const DW_AT_go_key = 0x2901Go-specific type attributes.
const DW_AT_go_kind = 0x2900Go-specific type attributes.
const DW_AT_go_package_name = 0x2905Go-specific type attributes.
const DW_AT_go_runtime_type = 0x2904Table 20
const DW_AT_hi_user = 0x3fffTable 20
const DW_AT_high_pc = 0x12Table 20
const DW_AT_identifier_case = 0x42Table 20
const DW_AT_import = 0x18Table 20
const DW_AT_inline = 0x20Go-specific type attributes.
const DW_AT_internal_location = 253Table 20
const DW_AT_is_optional = 0x21Table 20
const DW_AT_language = 0x13Table 20
const DW_AT_lo_user = 0x2000Table 20
const DW_AT_location = 0x02Table 20
const DW_AT_low_pc = 0x11Table 20
const DW_AT_lower_bound = 0x22Table 20
const DW_AT_macro_info = 0x43Table 20
const DW_AT_mutable = 0x61Table 20
const DW_AT_name = 0x03Table 20
const DW_AT_namelist_item = 0x44Table 20
const DW_AT_object_pointer = 0x64Table 20
const DW_AT_ordering = 0x09Table 20
const DW_AT_picture_string = 0x60Table 20
const DW_AT_priority = 0x45Table 20
const DW_AT_producer = 0x25Table 20
const DW_AT_prototyped = 0x27Table 20
const DW_AT_pure = 0x67Table 20
const DW_AT_ranges = 0x55Table 20
const DW_AT_recursive = 0x68Table 20
const DW_AT_return_addr = 0x2aTable 20
const DW_AT_segment = 0x46Table 20
const DW_AT_sibling = 0x01Table 20
const DW_AT_small = 0x5dTable 20
const DW_AT_specification = 0x47Table 20
const DW_AT_start_scope = 0x2cTable 20
const DW_AT_static_link = 0x48Table 20
const DW_AT_stmt_list = 0x10Table 20
const DW_AT_string_length = 0x19Table 20
const DW_AT_threads_scaled = 0x62Table 20
const DW_AT_trampoline = 0x56Table 20
const DW_AT_type = 0x49Table 20
const DW_AT_upper_bound = 0x2fTable 20
const DW_AT_use_UTF8 = 0x53Table 20
const DW_AT_use_location = 0x4aTable 20
const DW_AT_variable_parameter = 0x4bTable 20
const DW_AT_virtuality = 0x4cTable 20
const DW_AT_visibility = 0x17Table 20
const DW_AT_vtable_elem_location = 0x4dTable 33
const DW_CC_hi_user = 0xffTable 33
const DW_CC_lo_user = 0x40Table 33
const DW_CC_nocall = 0x03Table 33
const DW_CC_normal = 0x01Table 33
const DW_CC_program = 0x02Opcodes that take an addend operand.
const DW_CFA_advance_loc = *ast.BinaryExprTable 40.
const DW_CFA_advance_loc1 = 0x02Table 40.
const DW_CFA_advance_loc2 = 0x03Table 40.
const DW_CFA_advance_loc4 = 0x04Table 40.
const DW_CFA_def_cfa = 0x0cTable 40.
const DW_CFA_def_cfa_expression = 0x0fTable 40.
const DW_CFA_def_cfa_offset = 0x0eTable 40.
const DW_CFA_def_cfa_offset_sf = 0x13Table 40.
const DW_CFA_def_cfa_register = 0x0dTable 40.
const DW_CFA_def_cfa_sf = 0x12Table 40.
const DW_CFA_expression = 0x10Table 40.
const DW_CFA_hi_user = 0x3fTable 40.
const DW_CFA_lo_user = 0x1coperand,...
const DW_CFA_nop = 0x00Table 40.
const DW_CFA_offset = *ast.BinaryExprTable 40.
const DW_CFA_offset_extended = 0x05Table 40.
const DW_CFA_offset_extended_sf = 0x11Table 40.
const DW_CFA_register = 0x09Table 40.
const DW_CFA_remember_state = 0x0aTable 40.
const DW_CFA_restore = *ast.BinaryExprTable 40.
const DW_CFA_restore_extended = 0x06Table 40.
const DW_CFA_restore_state = 0x0bTable 40.
const DW_CFA_same_value = 0x08Table 40.
const DW_CFA_set_loc = 0x01Table 40.
const DW_CFA_undefined = 0x07Table 40.
const DW_CFA_val_expression = 0x16Table 40.
const DW_CFA_val_offset = 0x14Table 40.
const DW_CFA_val_offset_sf = 0x15Table 19
const DW_CHILDREN_no = 0x00Table 19
const DW_CHILDREN_yes = 0x01Not from the spec, but logically belongs here
const DW_CLS_ADDRESS = *ast.BinaryExprNot from the spec, but logically belongs here
const DW_CLS_ADDRLOCNot from the spec, but logically belongs here
const DW_CLS_BLOCKNot from the spec, but logically belongs here
const DW_CLS_CONSTANTNot from the spec, but logically belongs here
const DW_CLS_FLAGGo-specific internal hackery.
const DW_CLS_GO_TYPEREFNot from the spec, but logically belongs here
const DW_CLS_PTRNot from the spec, but logically belongs here
const DW_CLS_REFERENCENot from the spec, but logically belongs here
const DW_CLS_STRINGTable 36
const DW_DSC_label = 0x00Table 36
const DW_DSC_range = 0x01Table 26
const DW_DS_leading_overpunch = 0x02Table 26
const DW_DS_leading_separate = 0x04Table 26
const DW_DS_trailing_overpunch = 0x03Table 26
const DW_DS_trailing_separate = 0x05Table 26
const DW_DS_unsigned = 0x01Table 27
const DW_END_big = 0x01Table 27
const DW_END_default = 0x00Table 27
const DW_END_hi_user = 0xffTable 27
const DW_END_little = 0x02Table 27
const DW_END_lo_user = 0x40Table 21
const DW_FORM_addr = 0x01Table 21
const DW_FORM_block = 0x09Table 21
const DW_FORM_block1 = 0x0aTable 21
const DW_FORM_block2 = 0x03Table 21
const DW_FORM_block4 = 0x04Table 21
const DW_FORM_data1 = 0x0bTable 21
const DW_FORM_data2 = 0x05Table 21
const DW_FORM_data4 = 0x06Table 21
const DW_FORM_data8 = 0x07Table 21
const DW_FORM_exprloc = 0x18Table 21
const DW_FORM_flag = 0x0cTable 21
const DW_FORM_flag_present = 0x19Table 21
const DW_FORM_indirect = 0x16Table 21
const DW_FORM_ref1 = 0x11Table 21
const DW_FORM_ref2 = 0x12Table 21
const DW_FORM_ref4 = 0x13Table 21
const DW_FORM_ref8 = 0x14Table 21
const DW_FORM_ref_addr = 0x10Table 21
const DW_FORM_ref_sig8 = 0x20Table 21
const DW_FORM_ref_udata = 0x15Table 21
const DW_FORM_sdata = 0x0dDwarf4
const DW_FORM_sec_offset = 0x17Table 21
const DW_FORM_string = 0x08Table 21
const DW_FORM_strp = 0x0eTable 21
const DW_FORM_udata = 0x0fPseudo-form: expanded to data4 on IOS, udata elsewhere.
const DW_FORM_udata_pseudo = 0x99Table 32
const DW_ID_case_insensitive = 0x03Table 32
const DW_ID_case_sensitive = 0x00Table 32
const DW_ID_down_case = 0x02Table 32
const DW_ID_up_case = 0x01Table 34
const DW_INL_declared_inlined = 0x03Table 34
const DW_INL_declared_not_inlined = 0x02Table 34
const DW_INL_inlined = 0x01Table 34
const DW_INL_not_inlined = 0x00Table 31
const DW_LANG_Ada83 = 0x0003Table 31
const DW_LANG_Ada95 = 0x000dTable 31
const DW_LANG_C = 0x0002Table 31
const DW_LANG_C89 = 0x0001Table 31
const DW_LANG_C99 = 0x000cTable 31
const DW_LANG_C_plus_plus = 0x0004Table 31
const DW_LANG_Cobol74 = 0x0005Table 31
const DW_LANG_Cobol85 = 0x0006Table 31
const DW_LANG_D = 0x0013Table 31
const DW_LANG_Fortran77 = 0x0007Table 31
const DW_LANG_Fortran90 = 0x0008Table 31
const DW_LANG_Fortran95 = 0x000eDwarf5
const DW_LANG_Go = 0x0016Dwarf3
const DW_LANG_Java = 0x000bTable 31
const DW_LANG_Modula2 = 0x000aTable 31
const DW_LANG_ObjC = 0x0010Table 31
const DW_LANG_ObjC_plus_plus = 0x0011Table 31
const DW_LANG_PLI = 0x000fTable 31
const DW_LANG_Pascal83 = 0x0009Dwarf4
const DW_LANG_Python = 0x0014Table 31
const DW_LANG_UPC = 0x0012Table 31
const DW_LANG_hi_user = 0xffffTable 31
const DW_LANG_lo_user = 0x8000Table 38
const DW_LNE_define_file = 0x03Table 38
const DW_LNE_end_sequence = 0x01Table 38
const DW_LNE_hi_user = 0xffTable 38
const DW_LNE_lo_user = 0x80Table 38
const DW_LNE_set_address = 0x02Table 37
const DW_LNS_advance_line = 0x03Table 37
const DW_LNS_advance_pc = 0x02Table 37
const DW_LNS_const_add_pc = 0x08Table 37
const DW_LNS_copy = 0x01Table 37
const DW_LNS_fixed_advance_pc = 0x09Table 37
const DW_LNS_negate_stmt = 0x06Table 37
const DW_LNS_set_basic_block = 0x07Table 37
const DW_LNS_set_column = 0x05Table 37
const DW_LNS_set_epilogue_begin = 0x0bTable 37
const DW_LNS_set_file = 0x04Table 37
const DW_LNS_set_isa = 0x0cDwarf3
const DW_LNS_set_prologue_end = 0x0aTable 39
const DW_MACINFO_define = 0x01Table 39
const DW_MACINFO_end_file = 0x04Table 39
const DW_MACINFO_start_file = 0x03Table 39
const DW_MACINFO_undef = 0x02Table 39
const DW_MACINFO_vendor_ext = 0xffTable 24 (#operands, notes)
const DW_OP_abs = 0x19Table 24 (#operands, notes)
const DW_OP_addr = 0x03Table 24 (#operands, notes)
const DW_OP_and = 0x1aTable 24 (#operands, notes)
const DW_OP_bit_piece = 0x9dTable 24 (#operands, notes)
const DW_OP_bra = 0x28Table 24 (#operands, notes)
const DW_OP_breg0 = 0x70Table 24 (#operands, notes)
const DW_OP_breg31 = 0x8fTable 24 (#operands, notes)
const DW_OP_bregx = 0x92Table 24 (#operands, notes)
const DW_OP_call2 = 0x98Table 24 (#operands, notes)
const DW_OP_call4 = 0x99Table 24 (#operands, notes)
const DW_OP_call_frame_cfa = 0x9cTable 24 (#operands, notes)
const DW_OP_call_ref = 0x9aTable 24 (#operands, notes)
const DW_OP_const1s = 0x09Table 24 (#operands, notes)
const DW_OP_const1u = 0x08Table 24 (#operands, notes)
const DW_OP_const2s = 0x0bTable 24 (#operands, notes)
const DW_OP_const2u = 0x0aTable 24 (#operands, notes)
const DW_OP_const4s = 0x0dTable 24 (#operands, notes)
const DW_OP_const4u = 0x0cTable 24 (#operands, notes)
const DW_OP_const8s = 0x0fTable 24 (#operands, notes)
const DW_OP_const8u = 0x0eTable 24 (#operands, notes)
const DW_OP_consts = 0x11Table 24 (#operands, notes)
const DW_OP_constu = 0x10Table 24 (#operands, notes)
const DW_OP_deref = 0x06Table 24 (#operands, notes)
const DW_OP_deref_size = 0x94Table 24 (#operands, notes)
const DW_OP_div = 0x1bTable 24 (#operands, notes)
const DW_OP_drop = 0x13Table 24 (#operands, notes)
const DW_OP_dup = 0x12Table 24 (#operands, notes)
const DW_OP_eq = 0x29Table 24 (#operands, notes)
const DW_OP_fbreg = 0x91Table 24 (#operands, notes)
const DW_OP_form_tls_address = 0x9bTable 24 (#operands, notes)
const DW_OP_ge = 0x2aTable 24 (#operands, notes)
const DW_OP_gt = 0x2bTable 24 (#operands, notes)
const DW_OP_hi_user = 0xffTable 24 (#operands, notes)
const DW_OP_le = 0x2cTable 24 (#operands, notes)
const DW_OP_lit0 = 0x30Table 24 (#operands, notes)
const DW_OP_lit31 = 0x4fTable 24 (#operands, notes)
const DW_OP_lo_user = 0xe0Table 24 (#operands, notes)
const DW_OP_lt = 0x2dTable 24 (#operands, notes)
const DW_OP_minus = 0x1cTable 24 (#operands, notes)
const DW_OP_mod = 0x1dTable 24 (#operands, notes)
const DW_OP_mul = 0x1eTable 24 (#operands, notes)
const DW_OP_ne = 0x2eTable 24 (#operands, notes)
const DW_OP_neg = 0x1fTable 24 (#operands, notes)
const DW_OP_nop = 0x96Table 24 (#operands, notes)
const DW_OP_not = 0x20Table 24 (#operands, notes)
const DW_OP_or = 0x21Table 24 (#operands, notes)
const DW_OP_over = 0x14Table 24 (#operands, notes)
const DW_OP_pick = 0x15Table 24 (#operands, notes)
const DW_OP_piece = 0x93Table 24 (#operands, notes)
const DW_OP_plus = 0x22Table 24 (#operands, notes)
const DW_OP_plus_uconst = 0x23Table 24 (#operands, notes)
const DW_OP_push_object_address = 0x97Table 24 (#operands, notes)
const DW_OP_reg0 = 0x50Table 24 (#operands, notes)
const DW_OP_reg31 = 0x6fTable 24 (#operands, notes)
const DW_OP_regx = 0x90Table 24 (#operands, notes)
const DW_OP_rot = 0x17Table 24 (#operands, notes)
const DW_OP_shl = 0x24Table 24 (#operands, notes)
const DW_OP_shr = 0x25Table 24 (#operands, notes)
const DW_OP_shra = 0x26Table 24 (#operands, notes)
const DW_OP_skip = 0x2fTable 24 (#operands, notes)
const DW_OP_swap = 0x16Table 24 (#operands, notes)
const DW_OP_xderef = 0x18Table 24 (#operands, notes)
const DW_OP_xderef_size = 0x95Table 24 (#operands, notes)
const DW_OP_xor = 0x27Table 35
const DW_ORD_col_major = 0x01Table 35
const DW_ORD_row_major = 0x00Table 18
const DW_TAG_access_declaration = 0x23Table 18
const DW_TAG_array_type = 0x01Table 18
const DW_TAG_base_type = 0x24Table 18
const DW_TAG_catch_block = 0x25Table 18
const DW_TAG_class_type = 0x02Table 18
const DW_TAG_common_block = 0x1aTable 18
const DW_TAG_common_inclusion = 0x1bTable 18
const DW_TAG_compile_unit = 0x11Table 18
const DW_TAG_condition = 0x3fTable 18
const DW_TAG_const_type = 0x26Table 18
const DW_TAG_constant = 0x27Dwarf3
const DW_TAG_dwarf_procedure = 0x36Table 18
const DW_TAG_entry_point = 0x03Table 18
const DW_TAG_enumeration_type = 0x04Table 18
const DW_TAG_enumerator = 0x28Table 18
const DW_TAG_file_type = 0x29Table 18
const DW_TAG_formal_parameter = 0x05Table 18
const DW_TAG_friend = 0x2aTable 18
const DW_TAG_hi_user = 0xffffTable 18
const DW_TAG_imported_declaration = 0x08Table 18
const DW_TAG_imported_module = 0x3aTable 18
const DW_TAG_imported_unit = 0x3dTable 18
const DW_TAG_inheritance = 0x1cTable 18
const DW_TAG_inlined_subroutine = 0x1dTable 18
const DW_TAG_interface_type = 0x38Table 18
const DW_TAG_label = 0x0aTable 18
const DW_TAG_lexical_block = 0x0bUser defined
const DW_TAG_lo_user = 0x4080Table 18
const DW_TAG_member = 0x0dTable 18
const DW_TAG_module = 0x1eTable 18
const DW_TAG_namelist = 0x2bTable 18
const DW_TAG_namelist_item = 0x2cTable 18
const DW_TAG_namespace = 0x39Table 18
const DW_TAG_packed_type = 0x2dTable 18
const DW_TAG_partial_unit = 0x3cTable 18
const DW_TAG_pointer_type = 0x0fTable 18
const DW_TAG_ptr_to_member_type = 0x1fTable 18
const DW_TAG_reference_type = 0x10Table 18
const DW_TAG_restrict_type = 0x37Table 18
const DW_TAG_rvalue_reference_type = 0x42Table 18
const DW_TAG_set_type = 0x20Table 18
const DW_TAG_shared_type = 0x40Table 18
const DW_TAG_string_type = 0x12Table 18
const DW_TAG_structure_type = 0x13Table 18
const DW_TAG_subprogram = 0x2eTable 18
const DW_TAG_subrange_type = 0x21Table 18
const DW_TAG_subroutine_type = 0x15Table 18
const DW_TAG_template_alias = 0x43Table 18
const DW_TAG_template_type_parameter = 0x2fTable 18
const DW_TAG_template_value_parameter = 0x30Table 18
const DW_TAG_thrown_type = 0x31Table 18
const DW_TAG_try_block = 0x32Dwarf4
const DW_TAG_type_unit = 0x41Table 18
const DW_TAG_typedef = 0x16Table 18
const DW_TAG_union_type = 0x17Table 18
const DW_TAG_unspecified_parameters = 0x18Table 18
const DW_TAG_unspecified_type = 0x3bTable 18
const DW_TAG_variable = 0x34Table 18
const DW_TAG_variant = 0x19Table 18
const DW_TAG_variant_part = 0x33Table 18
const DW_TAG_volatile_type = 0x35Table 18
const DW_TAG_with_stmt = 0x22Table 30
const DW_VIRTUALITY_none = 0x00Table 30
const DW_VIRTUALITY_pure_virtual = 0x02Table 30
const DW_VIRTUALITY_virtual = 0x01Table 29
const DW_VIS_exported = 0x02Table 29
const DW_VIS_local = 0x01Table 29
const DW_VIS_qualified = 0x03InfoPrefix is the prefix for all the symbols containing DWARF info entries.
const InfoPrefix = "go:info."var abbrevs = []dwAbbrev{...}var abbrevsFinalized boolControls logging/debugging for selected aspects of DWARF subprogram generation (functions, scopes).
var logDwarf boolvar putvarAbbrevs = []dwAbbrev{...}sevenbits contains all unsigned seven bit numbers, indexed by their value.
var sevenbits = [...]byte{...}A Context specifies how to add data to a Sym.
type Context interface {
PtrSize() int
Size(s Sym) int64
AddInt(s Sym, size int, i int64)
AddBytes(s Sym, b []byte)
AddAddress(s Sym, t interface{}, ofs int64)
AddCURelativeAddress(s Sym, t interface{}, ofs int64)
AddSectionOffset(s Sym, size int, t interface{}, ofs int64)
AddDWARFAddrSectionOffset(s Sym, t interface{}, ofs int64)
CurrentOffset(s Sym) int64
RecordDclReference(from Sym, to Sym, dclIdx int, inlIndex int)
RecordChildDieOffsets(s Sym, vars []*Var, offsets []int32)
AddString(s Sym, v string)
Logf(format string, args ...interface{})
}Sym represents a symbol.
type Sym interface {
}DWAttr represents an attribute of a DWDie. For DW_CLS_string and _block, value should contain the length, and data the data, for _reference, value is 0 and data is a DWDie* to the referenced instance, for all others, value is the whole thing and data is null.
type DWAttr struct {
Link *DWAttr
Atr uint16
Cls uint8
Value int64
Data interface{}
}DWDie represents a DWARF debug info entry.
type DWDie struct {
Abbrev int
Link *DWDie
Child *DWDie
Attr *DWAttr
Sym Sym
}This container is used by the PutFunc* variants below when creating the DWARF subprogram DIE(s) for a function.
type FnState struct {
Name string
Info Sym
Loc Sym
Ranges Sym
Absfn Sym
StartPC Sym
StartPos src.Pos
Size int64
External bool
Scopes []Scope
InlCalls InlCalls
UseBASEntries bool
dictIndexToOffset []int64
}type InlCall struct {
InlIndex int
CallPos src.Pos
AbsFunSym Sym
Children []int
InlVars []*Var
Ranges []Range
Root bool
}type InlCalls struct {
Calls []InlCall
}A Range represents a half-open interval [Start, End).
type Range struct {
Start int64
End int64
}A Scope represents a lexical scope. All variables declared within a scope will only be visible to instructions covered by the scope. Lexical scopes are contiguous in source files but can end up being compiled to discontiguous blocks of instructions in the executable. The Ranges field lists all the blocks of instructions that belong in this scope.
type Scope struct {
Parent int32
Ranges []Range
Vars []*Var
}A Var represents a local variable or a function parameter.
type Var struct {
Name string
Tag int
WithLoclist bool
IsReturnValue bool
IsInlFormal bool
DictIndex uint16
StackOffset int32
PutLocationList func(listSym Sym, startPC Sym)
Scope int32
Type Sym
DeclFile string
DeclLine uint
DeclCol uint
InlIndex int32
ChildIndex int32
IsInAbstract bool
ClosureOffset int64
}type dwAbbrev struct {
tag uint8
children uint8
attr []dwAttrForm
}* Defining Abbrevs. This is hardcoded on a per-platform basis (that is, * each platform will see a fixed abbrev table for all objects); the number * of abbrev entries is fairly small (compared to C++ objects). The DWARF * spec places no restriction on the ordering of attributes in the * Abbrevs and DIEs, and we will always write them out in the order * of declaration in the abbrev.
type dwAttrForm struct {
attr uint16
form uint8
}Abbrevs returns the finalized abbrev array for the platform, expanding any DW_FORM pseudo-ops to real values.
func Abbrevs() []dwAbbrevAppendRange adds r to s, if r is non-empty. If possible, it extends the last Range in s.Ranges; if not, it creates a new one.
func (s *Scope) AppendRange(r Range)AppendSleb128 appends v to b using DWARF's signed LEB128 encoding.
func AppendSleb128(b []byte, v int64) []byteAppendUleb128 appends v to b using DWARF's unsigned LEB128 encoding.
func AppendUleb128(b []byte, v uint64) []bytefunc EnableLogging(doit bool)GetAbbrev returns the contents of the .debug_abbrev section.
func GetAbbrev() []byteHasChildren reports whether 'die' uses an abbrev that supports children.
func HasChildren(die *DWDie) boolIsDWARFEnabledOnAIXLd returns true if DWARF is possible on the current extld. AIX ld doesn't support DWARF with -bnoobjreorder with version prior to 7.2.2.
func IsDWARFEnabledOnAIXLd(extld []string) (bool, error)MergeRanges creates a new range list by merging the ranges from its two arguments, then returns the new list.
func MergeRanges(in1 []Range, in2 []Range) []RangeEmit DWARF attributes and child DIEs for an 'abstract' subprogram. The abstract subprogram DIE for a function contains its location-independent attributes (name, type, etc). Other instances of the function (any inlined copy of it, or the single out-of-line 'concrete' instance) will contain a pointer back to this abstract DIE (as a space-saving measure, so that name/type etc doesn't have to be repeated for each inlined copy).
func PutAbstractFunc(ctxt Context, s *FnState) errorPutAttrs writes the attributes for a DIE to symbol 's'. Note that we can (and do) add arbitrary attributes to a DIE, but only the ones actually listed in the Abbrev will be written out.
func PutAttrs(ctxt Context, s Sym, abbrev int, attr *DWAttr)PutBasedRanges writes a range table to sym. All addresses in ranges are relative to some base address, which must be arranged by the caller (e.g., with a DW_AT_low_pc attribute, or in a BASE-prefixed range).
func PutBasedRanges(ctxt Context, sym Sym, ranges []Range)Emit DWARF attributes and child DIEs for a 'concrete' subprogram, meaning the out-of-line copy of a function that was inlined at some point during the compilation of its containing package. The first attribute for a concrete DIE is a reference to the 'abstract' DIE for the function (which holds location-independent attributes such as name, type), then the remainder of the attributes are specific to this instance (location, frame base, etc).
func PutConcreteFunc(ctxt Context, s *FnState, isWrapper bool) errorEmit DWARF attributes and child DIEs for a subprogram. Here 'default' implies that the function in question was not inlined when its containing package was compiled (hence there is no need to emit an abstract version for it to use as a base for inlined routine records).
func PutDefaultFunc(ctxt Context, s *FnState, isWrapper bool) errorPutGlobal writes a DIE for a global variable.
func PutGlobal(ctxt Context, info Sym, typ Sym, gvar Sym, name string)PutIntConst writes a DIE for an integer constant
func PutIntConst(ctxt Context, info Sym, typ Sym, name string, val int64)PutRanges writes a range table to s.Ranges. All addresses in ranges are relative to s.base.
func (s *FnState) PutRanges(ctxt Context, ranges []Range)Sleb128put appends v to s using DWARF's signed LEB128 encoding.
func Sleb128put(ctxt Context, s Sym, v int64)Uleb128put appends v to s using DWARF's unsigned LEB128 encoding.
func Uleb128put(ctxt Context, s Sym, v int64)UnifyRanges merges the ranges from 'c' into the list of ranges for 's'.
func (s *Scope) UnifyRanges(c *Scope)byChildIndexCmp compares two *dwarf.Var by child index.
func byChildIndexCmp(a *Var, b *Var) intfunc concreteVar(fnabbrev int, v *Var) boolexpandPseudoForm takes an input DW_FORM_xxx value and translates it into a platform-appropriate concrete form. Existing concrete/real DW_FORM values are left untouched. For the moment the only pseudo-form is DW_FORM_udata_pseudo, which gets expanded to DW_FORM_data4 on Darwin and DW_FORM_udata everywhere else. See issue #31459 for more context.
func expandPseudoForm(form uint8) uint8Slot -1: return top-level inlines. Slot >= 0: return children of that slot.
func inlChildren(slot int, calls *InlCalls) []intfunc inlinedVarTable(inlcalls *InlCalls) map[*Var]boolReturn TRUE if the inlined call in the specified slot is empty, meaning it has a zero-length range (no instructions), and all of its children are empty.
func isEmptyInlinedCall(slot int, calls *InlCalls) boolEmit DWARF attributes for a variable belonging to an 'abstract' subprogram.
func putAbstractVar(ctxt Context, info Sym, v *Var)func putAbstractVarAbbrev(v *Var) intEmit DWARF attributes and child DIEs for an inlined subroutine. The first attribute of an inlined subroutine DIE is a reference back to its corresponding 'abstract' DIE (containing location-independent attributes such as name, type, etc). Inlined subroutine DIEs can have other inlined subroutine DIEs as children.
func putInlinedFunc(ctxt Context, s *FnState, callIdx int) errorThe s.Scopes slice contains variables were originally part of the function being emitted, as well as variables that were imported from various callee functions during the inlining process. This function prunes out any variables from the latter category (since they will be emitted as part of DWARF inlined_subroutine DIEs) and then generates scopes for vars in the former category.
func putPrunedScopes(ctxt Context, s *FnState, fnabbrev int) errorfunc putattr(ctxt Context, s Sym, abbrev int, form int, cls int, value int64, data interface{}) errorputparamtypes writes typedef DIEs for any parametric types that are used by this function.
func putparamtypes(ctxt Context, s *FnState, scopes []Scope, fnabbrev int) []int64func putscope(ctxt Context, s *FnState, scopes []Scope, curscope int32, fnabbrev int, encbuf []byte) int32func putvar(ctxt Context, s *FnState, v *Var, absfn Sym, fnabbrev int, inlIndex int, encbuf []byte)func putvarAbbrev(v *Var, concrete bool, withLoclist bool) intsevenBitS returns the signed LEB128 encoding of v if v is seven bits and nil otherwise. The contents of the returned slice must not be modified.
func sevenBitS(v int64) []bytesevenBitU returns the unsigned LEB128 encoding of v if v is seven bits and nil otherwise. The contents of the returned slice must not be modified.
func sevenBitU(v int64) []byteGenerated with Arrow