From 896daddf0b586011505e6336c56f5c0be577bb6c Mon Sep 17 00:00:00 2001 From: varun-r-mallya Date: Tue, 9 Sep 2025 13:15:31 +0530 Subject: [PATCH 1/2] change debug_compile_unit addition location --- pythonbpf/codegen.py | 21 +++++++++++++++++++++ pythonbpf/maps_pass.py | 24 +----------------------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/pythonbpf/codegen.py b/pythonbpf/codegen.py index 93ebda7..df1b59d 100644 --- a/pythonbpf/codegen.py +++ b/pythonbpf/codegen.py @@ -4,6 +4,7 @@ from .functions_pass import func_proc from .maps_pass import maps_proc from .globals_pass import globals_processing +import os def find_bpf_chunks(tree): @@ -41,7 +42,27 @@ def compile_to_ir(filename: str, output: str): module.data_layout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128" module.triple = "bpf" + if not hasattr(module, '_debug_compile_unit'): + module._file_metadata = module.add_debug_info("DIFile", { # type: ignore + "filename": filename, + "directory": os.path.dirname(filename) + }) + + module._debug_compile_unit = module.add_debug_info("DICompileUnit", { # type: ignore + "language": 29, # DW_LANG_C11 + "file": module._file_metadata, # type: ignore + "producer": "PythonBPF DSL Compiler", + "isOptimized": True, + "runtimeVersion": 0, + "emissionKind": 1, + "splitDebugInlining": False, + "nameTableKind": 0 + }, is_distinct=True) + + module.add_named_metadata("llvm.dbg.cu", module._debug_compile_unit) # type: ignore + processor(source, filename, module) + wchar_size = module.add_metadata([ir.Constant(ir.IntType(32), 1), "wchar_size", ir.Constant(ir.IntType(32), 4)]) diff --git a/pythonbpf/maps_pass.py b/pythonbpf/maps_pass.py index 95c1a0f..196eeda 100644 --- a/pythonbpf/maps_pass.py +++ b/pythonbpf/maps_pass.py @@ -48,29 +48,7 @@ def create_bpf_map(module, map_name, map_params): def create_map_debug_info(module, map_global, map_name, map_params): """Generate debug information metadata for BPF map""" - file_metadata = module - # Get or create compile unit (you may already have this) - if not hasattr(module, '_debug_compile_unit'): - # Create file metadata - file_metadata = module.add_debug_info("DIFile", { - "filename": "generated.bpf.c", # Adjust as needed - "directory": "/generated", # Adjust as needed - }) - - # Create compile unit - module._debug_compile_unit = module.add_debug_info("DICompileUnit", { - "language": 12, # DW_LANG_C11 - "file": file_metadata, - "producer": "PythonBPF DSL Compiler", - "isOptimized": True, - "runtimeVersion": 0, - "emissionKind": 1, - "splitDebugInlining": False, - "nameTableKind": 0 - }, is_distinct=True) - - module.add_named_metadata("llvm.dbg.cu", module._debug_compile_unit) - + file_metadata = module._file_metadata compile_unit = module._debug_compile_unit # Create basic type for unsigned int (32-bit) From e0385759b229ab415f2f6d5586cfe523469ee0e0 Mon Sep 17 00:00:00 2001 From: varun-r-mallya Date: Tue, 9 Sep 2025 13:37:50 +0530 Subject: [PATCH 2/2] make dwarf constant handling easier --- examples/execve2.py | 1 - pythonbpf/dwarf_constants.py | 747 +++++++++++++++++++++++++++++++++++ pythonbpf/maps_pass.py | 25 +- 3 files changed, 760 insertions(+), 13 deletions(-) create mode 100644 pythonbpf/dwarf_constants.py diff --git a/examples/execve2.py b/examples/execve2.py index d93759f..4e9c1b9 100644 --- a/examples/execve2.py +++ b/examples/execve2.py @@ -9,7 +9,6 @@ def last() -> HashMap: return HashMap(key_type=c_uint64, value_type=c_uint64, max_entries=1) - @bpf @section("tracepoint/syscalls/sys_enter_execve") def hello(ctx: c_void_p) -> c_int32: diff --git a/pythonbpf/dwarf_constants.py b/pythonbpf/dwarf_constants.py new file mode 100644 index 0000000..65e769b --- /dev/null +++ b/pythonbpf/dwarf_constants.py @@ -0,0 +1,747 @@ +# generated constants from dwarf.h + +DW_UT_compile = 0x01 +DW_UT_type = 0x02 +DW_UT_partial = 0x03 +DW_UT_skeleton = 0x04 +DW_UT_split_compile = 0x05 +DW_UT_split_type = 0x06 +DW_UT_lo_user = 0x80 +DW_UT_hi_user = 0xff + +DW_TAG_array_type = 0x01 +DW_TAG_class_type = 0x02 +DW_TAG_entry_point = 0x03 +DW_TAG_enumeration_type = 0x04 +DW_TAG_formal_parameter = 0x05 +DW_TAG_imported_declaration = 0x08 +DW_TAG_label = 0x0a +DW_TAG_lexical_block = 0x0b +DW_TAG_member = 0x0d +DW_TAG_pointer_type = 0x0f +DW_TAG_reference_type = 0x10 +DW_TAG_compile_unit = 0x11 +DW_TAG_string_type = 0x12 +DW_TAG_structure_type = 0x13 +DW_TAG_subroutine_type = 0x15 +DW_TAG_typedef = 0x16 +DW_TAG_union_type = 0x17 +DW_TAG_unspecified_parameters = 0x18 +DW_TAG_variant = 0x19 +DW_TAG_common_block = 0x1a +DW_TAG_common_inclusion = 0x1b +DW_TAG_inheritance = 0x1c +DW_TAG_inlined_subroutine = 0x1d +DW_TAG_module = 0x1e +DW_TAG_ptr_to_member_type = 0x1f +DW_TAG_set_type = 0x20 +DW_TAG_subrange_type = 0x21 +DW_TAG_with_stmt = 0x22 +DW_TAG_access_declaration = 0x23 +DW_TAG_base_type = 0x24 +DW_TAG_catch_block = 0x25 +DW_TAG_const_type = 0x26 +DW_TAG_constant = 0x27 +DW_TAG_enumerator = 0x28 +DW_TAG_file_type = 0x29 +DW_TAG_friend = 0x2a +DW_TAG_namelist = 0x2b +DW_TAG_namelist_item = 0x2c +DW_TAG_packed_type = 0x2d +DW_TAG_subprogram = 0x2e +DW_TAG_template_type_parameter = 0x2f +DW_TAG_template_value_parameter = 0x30 +DW_TAG_thrown_type = 0x31 +DW_TAG_try_block = 0x32 +DW_TAG_variant_part = 0x33 +DW_TAG_variable = 0x34 +DW_TAG_volatile_type = 0x35 +DW_TAG_dwarf_procedure = 0x36 +DW_TAG_restrict_type = 0x37 +DW_TAG_interface_type = 0x38 +DW_TAG_namespace = 0x39 +DW_TAG_imported_module = 0x3a +DW_TAG_unspecified_type = 0x3b +DW_TAG_partial_unit = 0x3c +DW_TAG_imported_unit = 0x3d +DW_TAG_condition = 0x3f +DW_TAG_shared_type = 0x40 +DW_TAG_type_unit = 0x41 +DW_TAG_rvalue_reference_type = 0x42 +DW_TAG_template_alias = 0x43 +DW_TAG_coarray_type = 0x44 +DW_TAG_generic_subrange = 0x45 +DW_TAG_dynamic_type = 0x46 +DW_TAG_atomic_type = 0x47 +DW_TAG_call_site = 0x48 +DW_TAG_call_site_parameter = 0x49 +DW_TAG_skeleton_unit = 0x4a +DW_TAG_immutable_type = 0x4b +DW_TAG_lo_user = 0x4080 +DW_TAG_MIPS_loop = 0x4081 +DW_TAG_format_label = 0x4101 +DW_TAG_function_template = 0x4102 +DW_TAG_class_template = 0x4103 +DW_TAG_GNU_BINCL = 0x4104 +DW_TAG_GNU_EINCL = 0x4105 +DW_TAG_GNU_template_template_param = 0x4106 +DW_TAG_GNU_template_parameter_pack = 0x4107 +DW_TAG_GNU_formal_parameter_pack = 0x4108 +DW_TAG_GNU_call_site = 0x4109 +DW_TAG_GNU_call_site_parameter = 0x410a +DW_TAG_hi_user = 0xffff + +DW_CHILDREN_no = 0 +DW_CHILDREN_yes = 1 + +DW_AT_sibling = 0x01 +DW_AT_location = 0x02 +DW_AT_name = 0x03 +DW_AT_ordering = 0x09 +DW_AT_byte_size = 0x0b +DW_AT_bit_offset = 0x0c +DW_AT_bit_size = 0x0d +DW_AT_stmt_list = 0x10 +DW_AT_low_pc = 0x11 +DW_AT_high_pc = 0x12 +DW_AT_language = 0x13 +DW_AT_discr = 0x15 +DW_AT_discr_value = 0x16 +DW_AT_visibility = 0x17 +DW_AT_import = 0x18 +DW_AT_string_length = 0x19 +DW_AT_common_reference = 0x1a +DW_AT_comp_dir = 0x1b +DW_AT_const_value = 0x1c +DW_AT_containing_type = 0x1d +DW_AT_default_value = 0x1e +DW_AT_inline = 0x20 +DW_AT_is_optional = 0x21 +DW_AT_lower_bound = 0x22 +DW_AT_producer = 0x25 +DW_AT_prototyped = 0x27 +DW_AT_return_addr = 0x2a +DW_AT_start_scope = 0x2c +DW_AT_bit_stride = 0x2e +DW_AT_upper_bound = 0x2f +DW_AT_abstract_origin = 0x31 +DW_AT_accessibility = 0x32 +DW_AT_address_class = 0x33 +DW_AT_artificial = 0x34 +DW_AT_base_types = 0x35 +DW_AT_calling_convention = 0x36 +DW_AT_count = 0x37 +DW_AT_data_member_location = 0x38 +DW_AT_decl_column = 0x39 +DW_AT_decl_file = 0x3a +DW_AT_decl_line = 0x3b +DW_AT_declaration = 0x3c +DW_AT_discr_list = 0x3d +DW_AT_encoding = 0x3e +DW_AT_external = 0x3f +DW_AT_frame_base = 0x40 +DW_AT_friend = 0x41 +DW_AT_identifier_case = 0x42 +DW_AT_macro_info = 0x43 +DW_AT_namelist_item = 0x44 +DW_AT_priority = 0x45 +DW_AT_segment = 0x46 +DW_AT_specification = 0x47 +DW_AT_static_link = 0x48 +DW_AT_type = 0x49 +DW_AT_use_location = 0x4a +DW_AT_variable_parameter = 0x4b +DW_AT_virtuality = 0x4c +DW_AT_vtable_elem_location = 0x4d +DW_AT_allocated = 0x4e +DW_AT_associated = 0x4f +DW_AT_data_location = 0x50 +DW_AT_byte_stride = 0x51 +DW_AT_entry_pc = 0x52 +DW_AT_use_UTF8 = 0x53 +DW_AT_extension = 0x54 +DW_AT_ranges = 0x55 +DW_AT_trampoline = 0x56 +DW_AT_call_column = 0x57 +DW_AT_call_file = 0x58 +DW_AT_call_line = 0x59 +DW_AT_description = 0x5a +DW_AT_binary_scale = 0x5b +DW_AT_decimal_scale = 0x5c +DW_AT_small = 0x5d +DW_AT_decimal_sign = 0x5e +DW_AT_digit_count = 0x5f +DW_AT_picture_string = 0x60 +DW_AT_mutable = 0x61 +DW_AT_threads_scaled = 0x62 +DW_AT_explicit = 0x63 +DW_AT_object_pointer = 0x64 +DW_AT_endianity = 0x65 +DW_AT_elemental = 0x66 +DW_AT_pure = 0x67 +DW_AT_recursive = 0x68 +DW_AT_signature = 0x69 +DW_AT_main_subprogram = 0x6a +DW_AT_data_bit_offset = 0x6b +DW_AT_const_expr = 0x6c +DW_AT_enum_class = 0x6d +DW_AT_linkage_name = 0x6e +DW_AT_string_length_bit_size = 0x6f +DW_AT_string_length_byte_size = 0x70 +DW_AT_rank = 0x71 +DW_AT_str_offsets_base = 0x72 +DW_AT_addr_base = 0x73 +DW_AT_rnglists_base = 0x74 +DW_AT_dwo_name = 0x76 +DW_AT_reference = 0x77 +DW_AT_rvalue_reference = 0x78 +DW_AT_macros = 0x79 +DW_AT_call_all_calls = 0x7a +DW_AT_call_all_source_calls = 0x7b +DW_AT_call_all_tail_calls = 0x7c +DW_AT_call_return_pc = 0x7d +DW_AT_call_value = 0x7e +DW_AT_call_origin = 0x7f +DW_AT_call_parameter = 0x80 +DW_AT_call_pc = 0x81 +DW_AT_call_tail_call = 0x82 +DW_AT_call_target = 0x83 +DW_AT_call_target_clobbered = 0x84 +DW_AT_call_data_location = 0x85 +DW_AT_call_data_value = 0x86 +DW_AT_noreturn = 0x87 +DW_AT_alignment = 0x88 +DW_AT_export_symbols = 0x89 +DW_AT_deleted = 0x8a +DW_AT_defaulted = 0x8b +DW_AT_loclists_base = 0x8c +DW_AT_lo_user = 0x2000 +DW_AT_MIPS_fde = 0x2001 +DW_AT_MIPS_loop_begin = 0x2002 +DW_AT_MIPS_tail_loop_begin = 0x2003 +DW_AT_MIPS_epilog_begin = 0x2004 +DW_AT_MIPS_loop_unroll_factor = 0x2005 +DW_AT_MIPS_software_pipeline_depth = 0x2006 +DW_AT_MIPS_linkage_name = 0x2007 +DW_AT_MIPS_stride = 0x2008 +DW_AT_MIPS_abstract_name = 0x2009 +DW_AT_MIPS_clone_origin = 0x200a +DW_AT_MIPS_has_inlines = 0x200b +DW_AT_MIPS_stride_byte = 0x200c +DW_AT_MIPS_stride_elem = 0x200d +DW_AT_MIPS_ptr_dopetype = 0x200e +DW_AT_MIPS_allocatable_dopetype = 0x200f +DW_AT_MIPS_assumed_shape_dopetype = 0x2010 +DW_AT_MIPS_assumed_size = 0x2011 +DW_AT_sf_names = 0x2101 +DW_AT_src_info = 0x2102 +DW_AT_mac_info = 0x2103 +DW_AT_src_coords = 0x2104 +DW_AT_body_begin = 0x2105 +DW_AT_body_end = 0x2106 +DW_AT_GNU_vector = 0x2107 +DW_AT_GNU_guarded_by = 0x2108 +DW_AT_GNU_pt_guarded_by = 0x2109 +DW_AT_GNU_guarded = 0x210a +DW_AT_GNU_pt_guarded = 0x210b +DW_AT_GNU_locks_excluded = 0x210c +DW_AT_GNU_exclusive_locks_required = 0x210d +DW_AT_GNU_shared_locks_required = 0x210e +DW_AT_GNU_odr_signature = 0x210f +DW_AT_GNU_template_name = 0x2110 +DW_AT_GNU_call_site_value = 0x2111 +DW_AT_GNU_call_site_data_value = 0x2112 +DW_AT_GNU_call_site_target = 0x2113 +DW_AT_GNU_call_site_target_clobbered = 0x2114 +DW_AT_GNU_tail_call = 0x2115 +DW_AT_GNU_all_tail_call_sites = 0x2116 +DW_AT_GNU_all_call_sites = 0x2117 +DW_AT_GNU_all_source_call_sites = 0x2118 +DW_AT_GNU_locviews = 0x2137 +DW_AT_GNU_entry_view = 0x2138 +DW_AT_GNU_macros = 0x2119 +DW_AT_GNU_deleted = 0x211a +DW_AT_GNU_dwo_name = 0x2130 +DW_AT_GNU_dwo_id = 0x2131 +DW_AT_GNU_ranges_base = 0x2132 +DW_AT_GNU_addr_base = 0x2133 +DW_AT_GNU_pubnames = 0x2134 +DW_AT_GNU_pubtypes = 0x2135 +DW_AT_GNU_numerator = 0x2303 +DW_AT_GNU_denominator = 0x2304 +DW_AT_GNU_bias = 0x2305 +DW_AT_hi_user = 0x3fff + +DW_FORM_addr = 0x01 +DW_FORM_block2 = 0x03 +DW_FORM_block4 = 0x04 +DW_FORM_data2 = 0x05 +DW_FORM_data4 = 0x06 +DW_FORM_data8 = 0x07 +DW_FORM_string = 0x08 +DW_FORM_block = 0x09 +DW_FORM_block1 = 0x0a +DW_FORM_data1 = 0x0b +DW_FORM_flag = 0x0c +DW_FORM_sdata = 0x0d +DW_FORM_strp = 0x0e +DW_FORM_udata = 0x0f +DW_FORM_ref_addr = 0x10 +DW_FORM_ref1 = 0x11 +DW_FORM_ref2 = 0x12 +DW_FORM_ref4 = 0x13 +DW_FORM_ref8 = 0x14 +DW_FORM_ref_udata = 0x15 +DW_FORM_indirect = 0x16 +DW_FORM_sec_offset = 0x17 +DW_FORM_exprloc = 0x18 +DW_FORM_flag_present = 0x19 +DW_FORM_strx = 0x1a +DW_FORM_addrx = 0x1b +DW_FORM_ref_sup4 = 0x1c +DW_FORM_strp_sup = 0x1d +DW_FORM_data16 = 0x1e +DW_FORM_line_strp = 0x1f +DW_FORM_ref_sig8 = 0x20 +DW_FORM_implicit_const = 0x21 +DW_FORM_loclistx = 0x22 +DW_FORM_rnglistx = 0x23 +DW_FORM_ref_sup8 = 0x24 +DW_FORM_strx1 = 0x25 +DW_FORM_strx2 = 0x26 +DW_FORM_strx3 = 0x27 +DW_FORM_strx4 = 0x28 +DW_FORM_addrx1 = 0x29 +DW_FORM_addrx2 = 0x2a +DW_FORM_addrx3 = 0x2b +DW_FORM_addrx4 = 0x2c +DW_FORM_GNU_addr_index = 0x1f01 +DW_FORM_GNU_str_index = 0x1f02 +DW_FORM_GNU_ref_alt = 0x1f20 +DW_FORM_GNU_strp_alt = 0x1f21 + +DW_OP_addr = 0x03 +DW_OP_deref = 0x06 +DW_OP_const1u = 0x08 +DW_OP_const1s = 0x09 +DW_OP_const2u = 0x0a +DW_OP_const2s = 0x0b +DW_OP_const4u = 0x0c +DW_OP_const4s = 0x0d +DW_OP_const8u = 0x0e +DW_OP_const8s = 0x0f +DW_OP_constu = 0x10 +DW_OP_consts = 0x11 +DW_OP_dup = 0x12 +DW_OP_drop = 0x13 +DW_OP_over = 0x14 +DW_OP_pick = 0x15 +DW_OP_swap = 0x16 +DW_OP_rot = 0x17 +DW_OP_xderef = 0x18 +DW_OP_abs = 0x19 +DW_OP_and = 0x1a +DW_OP_div = 0x1b +DW_OP_minus = 0x1c +DW_OP_mod = 0x1d +DW_OP_mul = 0x1e +DW_OP_neg = 0x1f +DW_OP_not = 0x20 +DW_OP_or = 0x21 +DW_OP_plus = 0x22 +DW_OP_plus_uconst = 0x23 +DW_OP_shl = 0x24 +DW_OP_shr = 0x25 +DW_OP_shra = 0x26 +DW_OP_xor = 0x27 +DW_OP_bra = 0x28 +DW_OP_eq = 0x29 +DW_OP_ge = 0x2a +DW_OP_gt = 0x2b +DW_OP_le = 0x2c +DW_OP_lt = 0x2d +DW_OP_ne = 0x2e +DW_OP_skip = 0x2f +DW_OP_lit0 = 0x30 +DW_OP_lit1 = 0x31 +DW_OP_lit2 = 0x32 +DW_OP_lit3 = 0x33 +DW_OP_lit4 = 0x34 +DW_OP_lit5 = 0x35 +DW_OP_lit6 = 0x36 +DW_OP_lit7 = 0x37 +DW_OP_lit8 = 0x38 +DW_OP_lit9 = 0x39 +DW_OP_lit10 = 0x3a +DW_OP_lit11 = 0x3b +DW_OP_lit12 = 0x3c +DW_OP_lit13 = 0x3d +DW_OP_lit14 = 0x3e +DW_OP_lit15 = 0x3f +DW_OP_lit16 = 0x40 +DW_OP_lit17 = 0x41 +DW_OP_lit18 = 0x42 +DW_OP_lit19 = 0x43 +DW_OP_lit20 = 0x44 +DW_OP_lit21 = 0x45 +DW_OP_lit22 = 0x46 +DW_OP_lit23 = 0x47 +DW_OP_lit24 = 0x48 +DW_OP_lit25 = 0x49 +DW_OP_lit26 = 0x4a +DW_OP_lit27 = 0x4b +DW_OP_lit28 = 0x4c +DW_OP_lit29 = 0x4d +DW_OP_lit30 = 0x4e +DW_OP_lit31 = 0x4f +DW_OP_reg0 = 0x50 +DW_OP_reg1 = 0x51 +DW_OP_reg2 = 0x52 +DW_OP_reg3 = 0x53 +DW_OP_reg4 = 0x54 +DW_OP_reg5 = 0x55 +DW_OP_reg6 = 0x56 +DW_OP_reg7 = 0x57 +DW_OP_reg8 = 0x58 +DW_OP_reg9 = 0x59 +DW_OP_reg10 = 0x5a +DW_OP_reg11 = 0x5b +DW_OP_reg12 = 0x5c +DW_OP_reg13 = 0x5d +DW_OP_reg14 = 0x5e +DW_OP_reg15 = 0x5f +DW_OP_reg16 = 0x60 +DW_OP_reg17 = 0x61 +DW_OP_reg18 = 0x62 +DW_OP_reg19 = 0x63 +DW_OP_reg20 = 0x64 +DW_OP_reg21 = 0x65 +DW_OP_reg22 = 0x66 +DW_OP_reg23 = 0x67 +DW_OP_reg24 = 0x68 +DW_OP_reg25 = 0x69 +DW_OP_reg26 = 0x6a +DW_OP_reg27 = 0x6b +DW_OP_reg28 = 0x6c +DW_OP_reg29 = 0x6d +DW_OP_reg30 = 0x6e +DW_OP_reg31 = 0x6f +DW_OP_breg0 = 0x70 +DW_OP_breg1 = 0x71 +DW_OP_breg2 = 0x72 +DW_OP_breg3 = 0x73 +DW_OP_breg4 = 0x74 +DW_OP_breg5 = 0x75 +DW_OP_breg6 = 0x76 +DW_OP_breg7 = 0x77 +DW_OP_breg8 = 0x78 +DW_OP_breg9 = 0x79 +DW_OP_breg10 = 0x7a +DW_OP_breg11 = 0x7b +DW_OP_breg12 = 0x7c +DW_OP_breg13 = 0x7d +DW_OP_breg14 = 0x7e +DW_OP_breg15 = 0x7f +DW_OP_breg16 = 0x80 +DW_OP_breg17 = 0x81 +DW_OP_breg18 = 0x82 +DW_OP_breg19 = 0x83 +DW_OP_breg20 = 0x84 +DW_OP_breg21 = 0x85 +DW_OP_breg22 = 0x86 +DW_OP_breg23 = 0x87 +DW_OP_breg24 = 0x88 +DW_OP_breg25 = 0x89 +DW_OP_breg26 = 0x8a +DW_OP_breg27 = 0x8b +DW_OP_breg28 = 0x8c +DW_OP_breg29 = 0x8d +DW_OP_breg30 = 0x8e +DW_OP_breg31 = 0x8f +DW_OP_regx = 0x90 +DW_OP_fbreg = 0x91 +DW_OP_bregx = 0x92 +DW_OP_piece = 0x93 +DW_OP_deref_size = 0x94 +DW_OP_xderef_size = 0x95 +DW_OP_nop = 0x96 +DW_OP_push_object_address = 0x97 +DW_OP_call2 = 0x98 +DW_OP_call4 = 0x99 +DW_OP_call_ref = 0x9a +DW_OP_form_tls_address = 0x9b +DW_OP_call_frame_cfa = 0x9c +DW_OP_bit_piece = 0x9d +DW_OP_implicit_value = 0x9e +DW_OP_stack_value = 0x9f +DW_OP_implicit_pointer = 0xa0 +DW_OP_addrx = 0xa1 +DW_OP_constx = 0xa2 +DW_OP_entry_value = 0xa3 +DW_OP_const_type = 0xa4 +DW_OP_regval_type = 0xa5 +DW_OP_deref_type = 0xa6 +DW_OP_xderef_type = 0xa7 +DW_OP_convert = 0xa8 +DW_OP_reinterpret = 0xa9 +DW_OP_GNU_push_tls_address = 0xe0 +DW_OP_GNU_uninit = 0xf0 +DW_OP_GNU_encoded_addr = 0xf1 +DW_OP_GNU_implicit_pointer = 0xf2 +DW_OP_GNU_entry_value = 0xf3 +DW_OP_GNU_const_type = 0xf4 +DW_OP_GNU_regval_type = 0xf5 +DW_OP_GNU_deref_type = 0xf6 +DW_OP_GNU_convert = 0xf7 +DW_OP_GNU_reinterpret = 0xf9 +DW_OP_GNU_parameter_ref = 0xfa +DW_OP_GNU_addr_index = 0xfb +DW_OP_GNU_const_index = 0xfc +DW_OP_GNU_variable_value = 0xfd +DW_OP_lo_user = 0xe0 +DW_OP_hi_user = 0xff + +DW_ATE_void = 0x0 +DW_ATE_address = 0x1 +DW_ATE_boolean = 0x2 +DW_ATE_complex_float = 0x3 +DW_ATE_float = 0x4 +DW_ATE_signed = 0x5 +DW_ATE_signed_char = 0x6 +DW_ATE_unsigned = 0x7 +DW_ATE_unsigned_char = 0x8 +DW_ATE_imaginary_float = 0x9 +DW_ATE_packed_decimal = 0xa +DW_ATE_numeric_string = 0xb +DW_ATE_edited = 0xc +DW_ATE_signed_fixed = 0xd +DW_ATE_unsigned_fixed = 0xe +DW_ATE_decimal_float = 0xf +DW_ATE_UTF = 0x10 +DW_ATE_UCS = 0x11 +DW_ATE_ASCII = 0x12 +DW_ATE_lo_user = 0x80 +DW_ATE_hi_user = 0xff + +DW_DS_unsigned = 1 +DW_DS_leading_overpunch = 2 +DW_DS_trailing_overpunch = 3 +DW_DS_leading_separate = 4 +DW_DS_trailing_separate = 5 + +DW_END_default = 0 +DW_END_big = 1 +DW_END_little = 2 +DW_END_lo_user = 0x40 +DW_END_hi_user = 0xff + +DW_ACCESS_public = 1 +DW_ACCESS_protected = 2 +DW_ACCESS_private = 3 + +DW_VIS_local = 1 +DW_VIS_exported = 2 +DW_VIS_qualified = 3 + +DW_VIRTUALITY_none = 0 +DW_VIRTUALITY_virtual = 1 +DW_VIRTUALITY_pure_virtual = 2 + +DW_LANG_C89 = 0x0001 +DW_LANG_C = 0x0002 +DW_LANG_Ada83 = 0x0003 +DW_LANG_C_plus_plus = 0x0004 +DW_LANG_Cobol74 = 0x0005 +DW_LANG_Cobol85 = 0x0006 +DW_LANG_Fortran77 = 0x0007 +DW_LANG_Fortran90 = 0x0008 +DW_LANG_Pascal83 = 0x0009 +DW_LANG_Modula2 = 0x000a +DW_LANG_Java = 0x000b +DW_LANG_C99 = 0x000c +DW_LANG_Ada95 = 0x000d +DW_LANG_Fortran95 = 0x000e +DW_LANG_PLI = 0x000f +DW_LANG_ObjC = 0x0010 +DW_LANG_ObjC_plus_plus = 0x0011 +DW_LANG_UPC = 0x0012 +DW_LANG_D = 0x0013 +DW_LANG_Python = 0x0014 +DW_LANG_OpenCL = 0x0015 +DW_LANG_Go = 0x0016 +DW_LANG_Modula3 = 0x0017 +DW_LANG_Haskell = 0x0018 +DW_LANG_C_plus_plus_03 = 0x0019 +DW_LANG_C_plus_plus_11 = 0x001a +DW_LANG_OCaml = 0x001b +DW_LANG_Rust = 0x001c +DW_LANG_C11 = 0x001d +DW_LANG_Swift = 0x001e +DW_LANG_Julia = 0x001f +DW_LANG_Dylan = 0x0020 +DW_LANG_C_plus_plus_14 = 0x0021 +DW_LANG_Fortran03 = 0x0022 +DW_LANG_Fortran08 = 0x0023 +DW_LANG_RenderScript = 0x0024 +DW_LANG_BLISS = 0x0025 +DW_LANG_lo_user = 0x8000 +DW_LANG_Mips_Assembler = 0x8001 +DW_LANG_hi_user = 0xffff + +DW_ID_case_sensitive = 0 +DW_ID_up_case = 1 +DW_ID_down_case = 2 +DW_ID_case_insensitive = 3 + +DW_CC_normal = 0x1 +DW_CC_program = 0x2 +DW_CC_nocall = 0x3 +DW_CC_pass_by_reference = 0x4 +DW_CC_pass_by_value = 0x5 +DW_CC_lo_user = 0x40 +DW_CC_hi_user = 0xff + +DW_INL_not_inlined = 0 +DW_INL_inlined = 1 +DW_INL_declared_not_inlined = 2 +DW_INL_declared_inlined = 3 + +DW_ORD_row_major = 0 +DW_ORD_col_major = 1 + +DW_DSC_label = 0 +DW_DSC_range = 1 + +DW_DEFAULTED_no = 0 +DW_DEFAULTED_in_class = 1 +DW_DEFAULTED_out_of_class = 2 + +DW_LNCT_path = 0x1 +DW_LNCT_directory_index = 0x2 +DW_LNCT_timestamp = 0x3 +DW_LNCT_size = 0x4 +DW_LNCT_MD5 = 0x5 +DW_LNCT_lo_user = 0x2000 +DW_LNCT_hi_user = 0x3fff + +DW_LNS_copy = 1 +DW_LNS_advance_pc = 2 +DW_LNS_advance_line = 3 +DW_LNS_set_file = 4 +DW_LNS_set_column = 5 +DW_LNS_negate_stmt = 6 +DW_LNS_set_basic_block = 7 +DW_LNS_const_add_pc = 8 +DW_LNS_fixed_advance_pc = 9 +DW_LNS_set_prologue_end = 10 +DW_LNS_set_epilogue_begin = 11 +DW_LNS_set_isa = 12 + +DW_LNE_end_sequence = 1 +DW_LNE_set_address = 2 +DW_LNE_define_file = 3 +DW_LNE_set_discriminator = 4 +DW_LNE_lo_user = 128 +DW_LNE_hi_user = 255 + +DW_MACINFO_define = 1 +DW_MACINFO_undef = 2 +DW_MACINFO_start_file = 3 +DW_MACINFO_end_file = 4 +DW_MACINFO_vendor_ext = 255 + +DW_MACRO_define = 0x01 +DW_MACRO_undef = 0x02 +DW_MACRO_start_file = 0x03 +DW_MACRO_end_file = 0x04 +DW_MACRO_define_strp = 0x05 +DW_MACRO_undef_strp = 0x06 +DW_MACRO_import = 0x07 +DW_MACRO_define_sup = 0x08 +DW_MACRO_undef_sup = 0x09 +DW_MACRO_import_sup = 0x0a +DW_MACRO_define_strx = 0x0b +DW_MACRO_undef_strx = 0x0c +DW_MACRO_lo_user = 0xe0 +DW_MACRO_hi_user = 0xff + +DW_RLE_end_of_list = 0x0 +DW_RLE_base_addressx = 0x1 +DW_RLE_startx_endx = 0x2 +DW_RLE_startx_length = 0x3 +DW_RLE_offset_pair = 0x4 +DW_RLE_base_address = 0x5 +DW_RLE_start_end = 0x6 +DW_RLE_start_length = 0x7 + +DW_LLE_end_of_list = 0x0 +DW_LLE_base_addressx = 0x1 +DW_LLE_startx_endx = 0x2 +DW_LLE_startx_length = 0x3 +DW_LLE_offset_pair = 0x4 +DW_LLE_default_location = 0x5 +DW_LLE_base_address = 0x6 +DW_LLE_start_end = 0x7 +DW_LLE_start_length = 0x8 + +DW_LLE_GNU_end_of_list_entry = 0x0 +DW_LLE_GNU_base_address_selection_entry = 0x1 +DW_LLE_GNU_start_end_entry = 0x2 +DW_LLE_GNU_start_length_entry = 0x3 + +DW_CFA_advance_loc = 0x40 +DW_CFA_offset = 0x80 +DW_CFA_restore = 0xc0 +DW_CFA_extended = 0 +DW_CFA_nop = 0x00 +DW_CFA_set_loc = 0x01 +DW_CFA_advance_loc1 = 0x02 +DW_CFA_advance_loc2 = 0x03 +DW_CFA_advance_loc4 = 0x04 +DW_CFA_offset_extended = 0x05 +DW_CFA_restore_extended = 0x06 +DW_CFA_undefined = 0x07 +DW_CFA_same_value = 0x08 +DW_CFA_register = 0x09 +DW_CFA_remember_state = 0x0a +DW_CFA_restore_state = 0x0b +DW_CFA_def_cfa = 0x0c +DW_CFA_def_cfa_register = 0x0d +DW_CFA_def_cfa_offset = 0x0e +DW_CFA_def_cfa_expression = 0x0f +DW_CFA_expression = 0x10 +DW_CFA_offset_extended_sf = 0x11 +DW_CFA_def_cfa_sf = 0x12 +DW_CFA_def_cfa_offset_sf = 0x13 +DW_CFA_val_offset = 0x14 +DW_CFA_val_offset_sf = 0x15 +DW_CFA_val_expression = 0x16 +DW_CFA_low_user = 0x1c +DW_CFA_MIPS_advance_loc8 = 0x1d +DW_CFA_GNU_window_save = 0x2d +DW_CFA_GNU_args_size = 0x2e +DW_CFA_GNU_negative_offset_extended = 0x2f +DW_CFA_high_user = 0x3f + +DW_CIE_ID_32 = 0xffffffff +DW_CIE_ID_64 = 0xffffffffffffffff + +DW_EH_PE_absptr = 0x00 +DW_EH_PE_omit = 0xff +DW_EH_PE_uleb128 = 0x01 +DW_EH_PE_udata2 = 0x02 +DW_EH_PE_udata4 = 0x03 +DW_EH_PE_udata8 = 0x04 +DW_EH_PE_sleb128 = 0x09 +DW_EH_PE_sdata2 = 0x0a +DW_EH_PE_sdata4 = 0x0b +DW_EH_PE_sdata8 = 0x0c +DW_EH_PE_signed = 0x08 +DW_EH_PE_pcrel = 0x10 +DW_EH_PE_textrel = 0x20 +DW_EH_PE_datarel = 0x30 +DW_EH_PE_funcrel = 0x40 +DW_EH_PE_aligned = 0x50 +DW_EH_PE_indirect = 0x80 + +DW_ADDR_none = 0 diff --git a/pythonbpf/maps_pass.py b/pythonbpf/maps_pass.py index 196eeda..413a601 100644 --- a/pythonbpf/maps_pass.py +++ b/pythonbpf/maps_pass.py @@ -1,6 +1,7 @@ import ast from llvmlite import ir from .type_deducer import ctypes_to_ir +from . import dwarf_constants as dc map_sym_tab = {} @@ -55,20 +56,20 @@ def create_map_debug_info(module, map_global, map_name, map_params): uint_type = module.add_debug_info("DIBasicType", { "name": "unsigned int", "size": 32, - "encoding": 7 + "encoding": dc.DW_ATE_unsigned }) # Create basic type for unsigned long long (64-bit) ulong_type = module.add_debug_info("DIBasicType", { "name": "unsigned long long", "size": 64, - "encoding": 7 # "DW_ATE_unsigned" + "encoding": dc.DW_ATE_unsigned }) # Create array type for map type field (array of 1 unsigned int) array_subrange = module.add_debug_info("DISubrange", {"count": 1}) array_type = module.add_debug_info("DICompositeType", { - "tag": 1, # "DW_TAG_array_type" + "tag": dc.DW_TAG_array_type, "baseType": uint_type, "size": 32, "elements": [array_subrange] @@ -76,25 +77,25 @@ def create_map_debug_info(module, map_global, map_name, map_params): # Create pointer types type_ptr = module.add_debug_info("DIDerivedType", { - "tag": 15, # DW_TAG_pointer_type + "tag": dc.DW_TAG_pointer_type, "baseType": array_type, "size": 64 }) max_entries_ptr = module.add_debug_info("DIDerivedType", { - "tag": 15, # DW_TAG_pointer_type + "tag": dc.DW_TAG_pointer_type, "baseType": array_type, "size": 64 }) key_ptr = module.add_debug_info("DIDerivedType", { - "tag": 15, # DW_TAG_pointer_type + "tag": dc.DW_TAG_pointer_type, "baseType": uint_type, # Adjust based on actual key type "size": 64 }) value_ptr = module.add_debug_info("DIDerivedType", { - "tag": 15, # DW_TAG_pointer_type + "tag": dc.DW_TAG_pointer_type, "baseType": ulong_type, # Adjust based on actual value type "size": 64 }) @@ -102,7 +103,7 @@ def create_map_debug_info(module, map_global, map_name, map_params): # Create struct members # scope field does not appear for some reason type_member = module.add_debug_info("DIDerivedType", { - "tag": 13, # "DW_TAG_member" + "tag": dc.DW_TAG_member, "name": "type", "file": file_metadata, # Use the stored file metadata "baseType": type_ptr, @@ -111,7 +112,7 @@ def create_map_debug_info(module, map_global, map_name, map_params): }) max_entries_member = module.add_debug_info("DIDerivedType", { - "tag": 13, # DW_TAG_member + "tag": dc.DW_TAG_member, "name": "max_entries", "file": file_metadata, "baseType": max_entries_ptr, @@ -120,7 +121,7 @@ def create_map_debug_info(module, map_global, map_name, map_params): }) key_member = module.add_debug_info("DIDerivedType", { - "tag": 13, # DW_TAG_member + "tag": dc.DW_TAG_member, "name": "key", "file": file_metadata, "baseType": key_ptr, @@ -129,7 +130,7 @@ def create_map_debug_info(module, map_global, map_name, map_params): }) value_member = module.add_debug_info("DIDerivedType", { - "tag": 13, # DW_TAG_member + "tag": dc.DW_TAG_member, "name": "value", "file": file_metadata, "baseType": value_ptr, @@ -139,7 +140,7 @@ def create_map_debug_info(module, map_global, map_name, map_params): # Create the struct type struct_type = module.add_debug_info("DICompositeType", { - "tag": 19, # DW_TAG_structure_type + "tag": dc.DW_TAG_structure_type, "file": file_metadata, "size": 256, # 4 * 64-bit pointers "elements": [type_member, max_entries_member, key_member, value_member]