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_ARRAYRANGE
Index into the abbrevs table below.
const DW_ABRV_ARRAYTYPE
Index into the abbrevs table below.
const DW_ABRV_BARE_PTRTYPE
Index into the abbrevs table below.
const DW_ABRV_BASETYPE
Index into the abbrevs table below.
const DW_ABRV_CHANTYPE
Index into the abbrevs table below.
const DW_ABRV_COMPUNIT
Index into the abbrevs table below.
const DW_ABRV_COMPUNIT_TEXTLESS
Index into the abbrevs table below.
const DW_ABRV_DICT_INDEX
Index into the abbrevs table below.
const DW_ABRV_DOTDOTDOT
Index into the abbrevs table below.
const DW_ABRV_FUNCTION
Index into the abbrevs table below.
const DW_ABRV_FUNCTION_ABSTRACT
Index into the abbrevs table below.
const DW_ABRV_FUNCTION_CONCRETE
Index into the abbrevs table below.
const DW_ABRV_FUNCTYPE
Index into the abbrevs table below.
const DW_ABRV_FUNCTYPEOUTPARAM
Index into the abbrevs table below.
const DW_ABRV_FUNCTYPEPARAM
Index into the abbrevs table below.
const DW_ABRV_IFACETYPE
Index into the abbrevs table below.
const DW_ABRV_INLINED_SUBROUTINE
Index into the abbrevs table below.
const DW_ABRV_INLINED_SUBROUTINE_RANGES
Index into the abbrevs table below.
const DW_ABRV_INT_CONSTANT
Index into the abbrevs table below.
const DW_ABRV_LEXICAL_BLOCK_RANGES
Index into the abbrevs table below.
const DW_ABRV_LEXICAL_BLOCK_SIMPLE
Index into the abbrevs table below.
const DW_ABRV_MAPTYPE
Index into the abbrevs table below.
const DW_ABRV_NULL = iota
Index into the abbrevs table below.
const DW_ABRV_NULLTYPE
Index into the abbrevs table below.
const DW_ABRV_PTRTYPE
Index into the abbrevs table below.
const DW_ABRV_PUTVAR_START
Index into the abbrevs table below.
const DW_ABRV_SLICETYPE
Index into the abbrevs table below.
const DW_ABRV_STRINGTYPE
Index into the abbrevs table below.
const DW_ABRV_STRUCTFIELD
Index into the abbrevs table below.
const DW_ABRV_STRUCTTYPE
Index into the abbrevs table below.
const DW_ABRV_TYPEDECL
Index into the abbrevs table below.
const DW_ABRV_VARIABLE
Index into the abbrevs table below.
const DW_ABRV_WRAPPER
Index into the abbrevs table below.
const DW_ABRV_WRAPPER_CONCRETE
Table 28
const DW_ACCESS_private = 0x03
Table 28
const DW_ACCESS_protected = 0x02
Table 28
const DW_ACCESS_public = 0x01
Table 25
const DW_ATE_address = 0x01
Table 25
const DW_ATE_boolean = 0x02
Table 25
const DW_ATE_complex_float = 0x03
Table 25
const DW_ATE_decimal_float = 0x0f
Table 25
const DW_ATE_edited = 0x0c
Table 25
const DW_ATE_float = 0x04
Table 25
const DW_ATE_hi_user = 0xff
Table 25
const DW_ATE_imaginary_float = 0x09
Table 25
const DW_ATE_lo_user = 0x80
Table 25
const DW_ATE_numeric_string = 0x0b
Table 25
const DW_ATE_packed_decimal = 0x0a
Table 25
const DW_ATE_signed = 0x05
Table 25
const DW_ATE_signed_char = 0x06
Table 25
const DW_ATE_signed_fixed = 0x0d
Table 25
const DW_ATE_unsigned = 0x07
Table 25
const DW_ATE_unsigned_char = 0x08
Table 25
const DW_ATE_unsigned_fixed = 0x0e
Table 20
const DW_AT_abstract_origin = 0x31
Table 20
const DW_AT_accessibility = 0x32
Table 20
const DW_AT_address_class = 0x33
Dwarf3
const DW_AT_allocated = 0x4e
Table 20
const DW_AT_artificial = 0x34
Table 20
const DW_AT_associated = 0x4f
Table 20
const DW_AT_base_types = 0x35
Table 20
const DW_AT_binary_scale = 0x5b
Table 20
const DW_AT_bit_offset = 0x0c
Table 20
const DW_AT_bit_size = 0x0d
Table 20
const DW_AT_bit_stride = 0x2e
Table 20
const DW_AT_byte_size = 0x0b
Table 20
const DW_AT_byte_stride = 0x51
Table 20
const DW_AT_call_column = 0x57
Table 20
const DW_AT_call_file = 0x58
Table 20
const DW_AT_call_line = 0x59
Table 20
const DW_AT_calling_convention = 0x36
Table 20
const DW_AT_common_reference = 0x1a
Table 20
const DW_AT_comp_dir = 0x1b
Table 20
const DW_AT_const_value = 0x1c
Table 20
const DW_AT_containing_type = 0x1d
Table 20
const DW_AT_count = 0x37
Table 20
const DW_AT_data_location = 0x50
Table 20
const DW_AT_data_member_location = 0x38
Table 20
const DW_AT_decimal_scale = 0x5c
Table 20
const DW_AT_decimal_sign = 0x5e
Table 20
const DW_AT_decl_column = 0x39
Table 20
const DW_AT_decl_file = 0x3a
Table 20
const DW_AT_decl_line = 0x3b
Table 20
const DW_AT_declaration = 0x3c
Table 20
const DW_AT_default_value = 0x1e
Table 20
const DW_AT_description = 0x5a
Table 20
const DW_AT_digit_count = 0x5f
Table 20
const DW_AT_discr = 0x15
Table 20
const DW_AT_discr_list = 0x3d
Table 20
const DW_AT_discr_value = 0x16
Table 20
const DW_AT_elemental = 0x66
Table 20
const DW_AT_encoding = 0x3e
Table 20
const DW_AT_endianity = 0x65
Table 20
const DW_AT_entry_pc = 0x52
Table 20
const DW_AT_explicit = 0x63
Table 20
const DW_AT_extension = 0x54
Table 20
const DW_AT_external = 0x3f
Table 20
const DW_AT_frame_base = 0x40
Table 20
const DW_AT_friend = 0x41
Go-specific type attributes.
const DW_AT_go_closure_offset = 0x2907
Go-specific type attributes.
const DW_AT_go_dict_index = 0x2906
Go-specific type attributes.
const DW_AT_go_elem = 0x2902
Attribute for DW_TAG_member of a struct type. Nonzero value indicates the struct field is an embedded field.
const DW_AT_go_embedded_field = 0x2903
Go-specific type attributes.
const DW_AT_go_key = 0x2901
Go-specific type attributes.
const DW_AT_go_kind = 0x2900
Go-specific type attributes.
const DW_AT_go_package_name = 0x2905
Go-specific type attributes.
const DW_AT_go_runtime_type = 0x2904
Table 20
const DW_AT_hi_user = 0x3fff
Table 20
const DW_AT_high_pc = 0x12
Table 20
const DW_AT_identifier_case = 0x42
Table 20
const DW_AT_import = 0x18
Table 20
const DW_AT_inline = 0x20
Go-specific type attributes.
const DW_AT_internal_location = 253
Table 20
const DW_AT_is_optional = 0x21
Table 20
const DW_AT_language = 0x13
Table 20
const DW_AT_lo_user = 0x2000
Table 20
const DW_AT_location = 0x02
Table 20
const DW_AT_low_pc = 0x11
Table 20
const DW_AT_lower_bound = 0x22
Table 20
const DW_AT_macro_info = 0x43
Table 20
const DW_AT_mutable = 0x61
Table 20
const DW_AT_name = 0x03
Table 20
const DW_AT_namelist_item = 0x44
Table 20
const DW_AT_object_pointer = 0x64
Table 20
const DW_AT_ordering = 0x09
Table 20
const DW_AT_picture_string = 0x60
Table 20
const DW_AT_priority = 0x45
Table 20
const DW_AT_producer = 0x25
Table 20
const DW_AT_prototyped = 0x27
Table 20
const DW_AT_pure = 0x67
Table 20
const DW_AT_ranges = 0x55
Table 20
const DW_AT_recursive = 0x68
Table 20
const DW_AT_return_addr = 0x2a
Table 20
const DW_AT_segment = 0x46
Table 20
const DW_AT_sibling = 0x01
Table 20
const DW_AT_small = 0x5d
Table 20
const DW_AT_specification = 0x47
Table 20
const DW_AT_start_scope = 0x2c
Table 20
const DW_AT_static_link = 0x48
Table 20
const DW_AT_stmt_list = 0x10
Table 20
const DW_AT_string_length = 0x19
Table 20
const DW_AT_threads_scaled = 0x62
Table 20
const DW_AT_trampoline = 0x56
Table 20
const DW_AT_type = 0x49
Table 20
const DW_AT_upper_bound = 0x2f
Table 20
const DW_AT_use_UTF8 = 0x53
Table 20
const DW_AT_use_location = 0x4a
Table 20
const DW_AT_variable_parameter = 0x4b
Table 20
const DW_AT_virtuality = 0x4c
Table 20
const DW_AT_visibility = 0x17
Table 20
const DW_AT_vtable_elem_location = 0x4d
Table 33
const DW_CC_hi_user = 0xff
Table 33
const DW_CC_lo_user = 0x40
Table 33
const DW_CC_nocall = 0x03
Table 33
const DW_CC_normal = 0x01
Table 33
const DW_CC_program = 0x02
Opcodes that take an addend operand.
const DW_CFA_advance_loc = *ast.BinaryExpr
Table 40.
const DW_CFA_advance_loc1 = 0x02
Table 40.
const DW_CFA_advance_loc2 = 0x03
Table 40.
const DW_CFA_advance_loc4 = 0x04
Table 40.
const DW_CFA_def_cfa = 0x0c
Table 40.
const DW_CFA_def_cfa_expression = 0x0f
Table 40.
const DW_CFA_def_cfa_offset = 0x0e
Table 40.
const DW_CFA_def_cfa_offset_sf = 0x13
Table 40.
const DW_CFA_def_cfa_register = 0x0d
Table 40.
const DW_CFA_def_cfa_sf = 0x12
Table 40.
const DW_CFA_expression = 0x10
Table 40.
const DW_CFA_hi_user = 0x3f
Table 40.
const DW_CFA_lo_user = 0x1c
operand,...
const DW_CFA_nop = 0x00
Table 40.
const DW_CFA_offset = *ast.BinaryExpr
Table 40.
const DW_CFA_offset_extended = 0x05
Table 40.
const DW_CFA_offset_extended_sf = 0x11
Table 40.
const DW_CFA_register = 0x09
Table 40.
const DW_CFA_remember_state = 0x0a
Table 40.
const DW_CFA_restore = *ast.BinaryExpr
Table 40.
const DW_CFA_restore_extended = 0x06
Table 40.
const DW_CFA_restore_state = 0x0b
Table 40.
const DW_CFA_same_value = 0x08
Table 40.
const DW_CFA_set_loc = 0x01
Table 40.
const DW_CFA_undefined = 0x07
Table 40.
const DW_CFA_val_expression = 0x16
Table 40.
const DW_CFA_val_offset = 0x14
Table 40.
const DW_CFA_val_offset_sf = 0x15
Table 19
const DW_CHILDREN_no = 0x00
Table 19
const DW_CHILDREN_yes = 0x01
Not from the spec, but logically belongs here
const DW_CLS_ADDRESS = *ast.BinaryExpr
Not from the spec, but logically belongs here
const DW_CLS_ADDRLOC
Not from the spec, but logically belongs here
const DW_CLS_BLOCK
Not from the spec, but logically belongs here
const DW_CLS_CONSTANT
Not from the spec, but logically belongs here
const DW_CLS_FLAG
Go-specific internal hackery.
const DW_CLS_GO_TYPEREF
Not from the spec, but logically belongs here
const DW_CLS_PTR
Not from the spec, but logically belongs here
const DW_CLS_REFERENCE
Not from the spec, but logically belongs here
const DW_CLS_STRING
Table 36
const DW_DSC_label = 0x00
Table 36
const DW_DSC_range = 0x01
Table 26
const DW_DS_leading_overpunch = 0x02
Table 26
const DW_DS_leading_separate = 0x04
Table 26
const DW_DS_trailing_overpunch = 0x03
Table 26
const DW_DS_trailing_separate = 0x05
Table 26
const DW_DS_unsigned = 0x01
Table 27
const DW_END_big = 0x01
Table 27
const DW_END_default = 0x00
Table 27
const DW_END_hi_user = 0xff
Table 27
const DW_END_little = 0x02
Table 27
const DW_END_lo_user = 0x40
Table 21
const DW_FORM_addr = 0x01
Table 21
const DW_FORM_block = 0x09
Table 21
const DW_FORM_block1 = 0x0a
Table 21
const DW_FORM_block2 = 0x03
Table 21
const DW_FORM_block4 = 0x04
Table 21
const DW_FORM_data1 = 0x0b
Table 21
const DW_FORM_data2 = 0x05
Table 21
const DW_FORM_data4 = 0x06
Table 21
const DW_FORM_data8 = 0x07
Table 21
const DW_FORM_exprloc = 0x18
Table 21
const DW_FORM_flag = 0x0c
Table 21
const DW_FORM_flag_present = 0x19
Table 21
const DW_FORM_indirect = 0x16
Table 21
const DW_FORM_ref1 = 0x11
Table 21
const DW_FORM_ref2 = 0x12
Table 21
const DW_FORM_ref4 = 0x13
Table 21
const DW_FORM_ref8 = 0x14
Table 21
const DW_FORM_ref_addr = 0x10
Table 21
const DW_FORM_ref_sig8 = 0x20
Table 21
const DW_FORM_ref_udata = 0x15
Table 21
const DW_FORM_sdata = 0x0d
Dwarf4
const DW_FORM_sec_offset = 0x17
Table 21
const DW_FORM_string = 0x08
Table 21
const DW_FORM_strp = 0x0e
Table 21
const DW_FORM_udata = 0x0f
Pseudo-form: expanded to data4 on IOS, udata elsewhere.
const DW_FORM_udata_pseudo = 0x99
Table 32
const DW_ID_case_insensitive = 0x03
Table 32
const DW_ID_case_sensitive = 0x00
Table 32
const DW_ID_down_case = 0x02
Table 32
const DW_ID_up_case = 0x01
Table 34
const DW_INL_declared_inlined = 0x03
Table 34
const DW_INL_declared_not_inlined = 0x02
Table 34
const DW_INL_inlined = 0x01
Table 34
const DW_INL_not_inlined = 0x00
Table 31
const DW_LANG_Ada83 = 0x0003
Table 31
const DW_LANG_Ada95 = 0x000d
Table 31
const DW_LANG_C = 0x0002
Table 31
const DW_LANG_C89 = 0x0001
Table 31
const DW_LANG_C99 = 0x000c
Table 31
const DW_LANG_C_plus_plus = 0x0004
Table 31
const DW_LANG_Cobol74 = 0x0005
Table 31
const DW_LANG_Cobol85 = 0x0006
Table 31
const DW_LANG_D = 0x0013
Table 31
const DW_LANG_Fortran77 = 0x0007
Table 31
const DW_LANG_Fortran90 = 0x0008
Table 31
const DW_LANG_Fortran95 = 0x000e
Dwarf5
const DW_LANG_Go = 0x0016
Dwarf3
const DW_LANG_Java = 0x000b
Table 31
const DW_LANG_Modula2 = 0x000a
Table 31
const DW_LANG_ObjC = 0x0010
Table 31
const DW_LANG_ObjC_plus_plus = 0x0011
Table 31
const DW_LANG_PLI = 0x000f
Table 31
const DW_LANG_Pascal83 = 0x0009
Dwarf4
const DW_LANG_Python = 0x0014
Table 31
const DW_LANG_UPC = 0x0012
Table 31
const DW_LANG_hi_user = 0xffff
Table 31
const DW_LANG_lo_user = 0x8000
Table 38
const DW_LNE_define_file = 0x03
Table 38
const DW_LNE_end_sequence = 0x01
Table 38
const DW_LNE_hi_user = 0xff
Table 38
const DW_LNE_lo_user = 0x80
Table 38
const DW_LNE_set_address = 0x02
Table 37
const DW_LNS_advance_line = 0x03
Table 37
const DW_LNS_advance_pc = 0x02
Table 37
const DW_LNS_const_add_pc = 0x08
Table 37
const DW_LNS_copy = 0x01
Table 37
const DW_LNS_fixed_advance_pc = 0x09
Table 37
const DW_LNS_negate_stmt = 0x06
Table 37
const DW_LNS_set_basic_block = 0x07
Table 37
const DW_LNS_set_column = 0x05
Table 37
const DW_LNS_set_epilogue_begin = 0x0b
Table 37
const DW_LNS_set_file = 0x04
Table 37
const DW_LNS_set_isa = 0x0c
Dwarf3
const DW_LNS_set_prologue_end = 0x0a
Table 39
const DW_MACINFO_define = 0x01
Table 39
const DW_MACINFO_end_file = 0x04
Table 39
const DW_MACINFO_start_file = 0x03
Table 39
const DW_MACINFO_undef = 0x02
Table 39
const DW_MACINFO_vendor_ext = 0xff
Table 24 (#operands, notes)
const DW_OP_abs = 0x19
Table 24 (#operands, notes)
const DW_OP_addr = 0x03
Table 24 (#operands, notes)
const DW_OP_and = 0x1a
Table 24 (#operands, notes)
const DW_OP_bit_piece = 0x9d
Table 24 (#operands, notes)
const DW_OP_bra = 0x28
Table 24 (#operands, notes)
const DW_OP_breg0 = 0x70
Table 24 (#operands, notes)
const DW_OP_breg31 = 0x8f
Table 24 (#operands, notes)
const DW_OP_bregx = 0x92
Table 24 (#operands, notes)
const DW_OP_call2 = 0x98
Table 24 (#operands, notes)
const DW_OP_call4 = 0x99
Table 24 (#operands, notes)
const DW_OP_call_frame_cfa = 0x9c
Table 24 (#operands, notes)
const DW_OP_call_ref = 0x9a
Table 24 (#operands, notes)
const DW_OP_const1s = 0x09
Table 24 (#operands, notes)
const DW_OP_const1u = 0x08
Table 24 (#operands, notes)
const DW_OP_const2s = 0x0b
Table 24 (#operands, notes)
const DW_OP_const2u = 0x0a
Table 24 (#operands, notes)
const DW_OP_const4s = 0x0d
Table 24 (#operands, notes)
const DW_OP_const4u = 0x0c
Table 24 (#operands, notes)
const DW_OP_const8s = 0x0f
Table 24 (#operands, notes)
const DW_OP_const8u = 0x0e
Table 24 (#operands, notes)
const DW_OP_consts = 0x11
Table 24 (#operands, notes)
const DW_OP_constu = 0x10
Table 24 (#operands, notes)
const DW_OP_deref = 0x06
Table 24 (#operands, notes)
const DW_OP_deref_size = 0x94
Table 24 (#operands, notes)
const DW_OP_div = 0x1b
Table 24 (#operands, notes)
const DW_OP_drop = 0x13
Table 24 (#operands, notes)
const DW_OP_dup = 0x12
Table 24 (#operands, notes)
const DW_OP_eq = 0x29
Table 24 (#operands, notes)
const DW_OP_fbreg = 0x91
Table 24 (#operands, notes)
const DW_OP_form_tls_address = 0x9b
Table 24 (#operands, notes)
const DW_OP_ge = 0x2a
Table 24 (#operands, notes)
const DW_OP_gt = 0x2b
Table 24 (#operands, notes)
const DW_OP_hi_user = 0xff
Table 24 (#operands, notes)
const DW_OP_le = 0x2c
Table 24 (#operands, notes)
const DW_OP_lit0 = 0x30
Table 24 (#operands, notes)
const DW_OP_lit31 = 0x4f
Table 24 (#operands, notes)
const DW_OP_lo_user = 0xe0
Table 24 (#operands, notes)
const DW_OP_lt = 0x2d
Table 24 (#operands, notes)
const DW_OP_minus = 0x1c
Table 24 (#operands, notes)
const DW_OP_mod = 0x1d
Table 24 (#operands, notes)
const DW_OP_mul = 0x1e
Table 24 (#operands, notes)
const DW_OP_ne = 0x2e
Table 24 (#operands, notes)
const DW_OP_neg = 0x1f
Table 24 (#operands, notes)
const DW_OP_nop = 0x96
Table 24 (#operands, notes)
const DW_OP_not = 0x20
Table 24 (#operands, notes)
const DW_OP_or = 0x21
Table 24 (#operands, notes)
const DW_OP_over = 0x14
Table 24 (#operands, notes)
const DW_OP_pick = 0x15
Table 24 (#operands, notes)
const DW_OP_piece = 0x93
Table 24 (#operands, notes)
const DW_OP_plus = 0x22
Table 24 (#operands, notes)
const DW_OP_plus_uconst = 0x23
Table 24 (#operands, notes)
const DW_OP_push_object_address = 0x97
Table 24 (#operands, notes)
const DW_OP_reg0 = 0x50
Table 24 (#operands, notes)
const DW_OP_reg31 = 0x6f
Table 24 (#operands, notes)
const DW_OP_regx = 0x90
Table 24 (#operands, notes)
const DW_OP_rot = 0x17
Table 24 (#operands, notes)
const DW_OP_shl = 0x24
Table 24 (#operands, notes)
const DW_OP_shr = 0x25
Table 24 (#operands, notes)
const DW_OP_shra = 0x26
Table 24 (#operands, notes)
const DW_OP_skip = 0x2f
Table 24 (#operands, notes)
const DW_OP_swap = 0x16
Table 24 (#operands, notes)
const DW_OP_xderef = 0x18
Table 24 (#operands, notes)
const DW_OP_xderef_size = 0x95
Table 24 (#operands, notes)
const DW_OP_xor = 0x27
Table 35
const DW_ORD_col_major = 0x01
Table 35
const DW_ORD_row_major = 0x00
Table 18
const DW_TAG_access_declaration = 0x23
Table 18
const DW_TAG_array_type = 0x01
Table 18
const DW_TAG_base_type = 0x24
Table 18
const DW_TAG_catch_block = 0x25
Table 18
const DW_TAG_class_type = 0x02
Table 18
const DW_TAG_common_block = 0x1a
Table 18
const DW_TAG_common_inclusion = 0x1b
Table 18
const DW_TAG_compile_unit = 0x11
Table 18
const DW_TAG_condition = 0x3f
Table 18
const DW_TAG_const_type = 0x26
Table 18
const DW_TAG_constant = 0x27
Dwarf3
const DW_TAG_dwarf_procedure = 0x36
Table 18
const DW_TAG_entry_point = 0x03
Table 18
const DW_TAG_enumeration_type = 0x04
Table 18
const DW_TAG_enumerator = 0x28
Table 18
const DW_TAG_file_type = 0x29
Table 18
const DW_TAG_formal_parameter = 0x05
Table 18
const DW_TAG_friend = 0x2a
Table 18
const DW_TAG_hi_user = 0xffff
Table 18
const DW_TAG_imported_declaration = 0x08
Table 18
const DW_TAG_imported_module = 0x3a
Table 18
const DW_TAG_imported_unit = 0x3d
Table 18
const DW_TAG_inheritance = 0x1c
Table 18
const DW_TAG_inlined_subroutine = 0x1d
Table 18
const DW_TAG_interface_type = 0x38
Table 18
const DW_TAG_label = 0x0a
Table 18
const DW_TAG_lexical_block = 0x0b
User defined
const DW_TAG_lo_user = 0x4080
Table 18
const DW_TAG_member = 0x0d
Table 18
const DW_TAG_module = 0x1e
Table 18
const DW_TAG_namelist = 0x2b
Table 18
const DW_TAG_namelist_item = 0x2c
Table 18
const DW_TAG_namespace = 0x39
Table 18
const DW_TAG_packed_type = 0x2d
Table 18
const DW_TAG_partial_unit = 0x3c
Table 18
const DW_TAG_pointer_type = 0x0f
Table 18
const DW_TAG_ptr_to_member_type = 0x1f
Table 18
const DW_TAG_reference_type = 0x10
Table 18
const DW_TAG_restrict_type = 0x37
Table 18
const DW_TAG_rvalue_reference_type = 0x42
Table 18
const DW_TAG_set_type = 0x20
Table 18
const DW_TAG_shared_type = 0x40
Table 18
const DW_TAG_string_type = 0x12
Table 18
const DW_TAG_structure_type = 0x13
Table 18
const DW_TAG_subprogram = 0x2e
Table 18
const DW_TAG_subrange_type = 0x21
Table 18
const DW_TAG_subroutine_type = 0x15
Table 18
const DW_TAG_template_alias = 0x43
Table 18
const DW_TAG_template_type_parameter = 0x2f
Table 18
const DW_TAG_template_value_parameter = 0x30
Table 18
const DW_TAG_thrown_type = 0x31
Table 18
const DW_TAG_try_block = 0x32
Dwarf4
const DW_TAG_type_unit = 0x41
Table 18
const DW_TAG_typedef = 0x16
Table 18
const DW_TAG_union_type = 0x17
Table 18
const DW_TAG_unspecified_parameters = 0x18
Table 18
const DW_TAG_unspecified_type = 0x3b
Table 18
const DW_TAG_variable = 0x34
Table 18
const DW_TAG_variant = 0x19
Table 18
const DW_TAG_variant_part = 0x33
Table 18
const DW_TAG_volatile_type = 0x35
Table 18
const DW_TAG_with_stmt = 0x22
Table 30
const DW_VIRTUALITY_none = 0x00
Table 30
const DW_VIRTUALITY_pure_virtual = 0x02
Table 30
const DW_VIRTUALITY_virtual = 0x01
Table 29
const DW_VIS_exported = 0x02
Table 29
const DW_VIS_local = 0x01
Table 29
const DW_VIS_qualified = 0x03
InfoPrefix is the prefix for all the symbols containing DWARF info entries.
const InfoPrefix = "go:info."
var abbrevs = []dwAbbrev{...}
var abbrevsFinalized bool
Controls logging/debugging for selected aspects of DWARF subprogram generation (functions, scopes).
var logDwarf bool
var 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() []dwAbbrev
AppendRange 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) []byte
AppendUleb128 appends v to b using DWARF's unsigned LEB128 encoding.
func AppendUleb128(b []byte, v uint64) []byte
func EnableLogging(doit bool)
GetAbbrev returns the contents of the .debug_abbrev section.
func GetAbbrev() []byte
HasChildren reports whether 'die' uses an abbrev that supports children.
func HasChildren(die *DWDie) bool
IsDWARFEnabledOnAIXLd 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) []Range
Emit 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) error
PutAttrs 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) error
Emit 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) error
PutGlobal 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) int
func concreteVar(fnabbrev int, v *Var) bool
expandPseudoForm 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) uint8
Slot -1: return top-level inlines. Slot >= 0: return children of that slot.
func inlChildren(slot int, calls *InlCalls) []int
func inlinedVarTable(inlcalls *InlCalls) map[*Var]bool
Return 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) bool
Emit DWARF attributes for a variable belonging to an 'abstract' subprogram.
func putAbstractVar(ctxt Context, info Sym, v *Var)
func putAbstractVarAbbrev(v *Var) int
Emit 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) error
The 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) error
func putattr(ctxt Context, s Sym, abbrev int, form int, cls int, value int64, data interface{}) error
putparamtypes writes typedef DIEs for any parametric types that are used by this function.
func putparamtypes(ctxt Context, s *FnState, scopes []Scope, fnabbrev int) []int64
func putscope(ctxt Context, s *FnState, scopes []Scope, curscope int32, fnabbrev int, encbuf []byte) int32
func putvar(ctxt Context, s *FnState, v *Var, absfn Sym, fnabbrev int, inlIndex int, encbuf []byte)
func putvarAbbrev(v *Var, concrete bool, withLoclist bool) int
sevenBitS 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) []byte
sevenBitU 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) []byte
Generated with Arrow