change globvar string to real global variable

This commit is contained in:
2025-10-20 21:36:46 +05:30
parent 3b323132f0
commit 56a2fbaf5b
2 changed files with 15 additions and 14 deletions

View File

@ -1,6 +1,7 @@
from enum import Enum, auto from enum import Enum, auto
from typing import Any, Dict, List, Optional, TypedDict from typing import Any, Dict, List, Optional, TypedDict
from dataclasses import dataclass from dataclasses import dataclass
import llvmlite.ir as ir
from pythonbpf.vmlinux_parser.dependency_node import Field from pythonbpf.vmlinux_parser.dependency_node import Field
@ -32,4 +33,4 @@ class AssignmentInfo(TypedDict):
# The key of the dict is the name of the field. # The key of the dict is the name of the field.
# Value is a tuple that contains the global variable representing that field # Value is a tuple that contains the global variable representing that field
# along with all the information about that field as a Field type. # along with all the information about that field as a Field type.
members: Optional[Dict[str, tuple[str, Field]]] # For structs. members: Optional[Dict[str, tuple[ir.GlobalVariable, Field]]] # For structs.

View File

@ -18,7 +18,7 @@ class IRGenerator:
self.generated: list[str] = [] self.generated: list[str] = []
self.generated_debug_info: list = [] self.generated_debug_info: list = []
# Use struct_name and field_name as key instead of Field object # Use struct_name and field_name as key instead of Field object
self.generated_field_names: dict[str, dict[str, str]] = {} self.generated_field_names: dict[str, dict[str, ir.GlobalVariable]] = {}
self.assignments: dict[str, AssignmentInfo] = assignments self.assignments: dict[str, AssignmentInfo] = assignments
if not handler.is_ready: if not handler.is_ready:
raise ImportError( raise ImportError(
@ -87,10 +87,10 @@ class IRGenerator:
struct.name in self.generated_field_names struct.name in self.generated_field_names
and field_name in self.generated_field_names[struct.name] and field_name in self.generated_field_names[struct.name]
): ):
field_co_re_name = self.generated_field_names[struct.name][ field_global_variable = self.generated_field_names[struct.name][
field_name field_name
] ]
members_dict[field_name] = (field_co_re_name, field) members_dict[field_name] = (field_global_variable, field)
else: else:
raise ValueError( raise ValueError(
f"llvm global name not found for struct field {field_name}" f"llvm global name not found for struct field {field_name}"
@ -140,28 +140,28 @@ class IRGenerator:
field_co_re_name = self._struct_name_generator( field_co_re_name = self._struct_name_generator(
struct, field, field_index, True, 0, containing_type_size struct, field, field_index, True, 0, containing_type_size
) )
self.generated_field_names[struct.name][field_name] = (
field_co_re_name
)
globvar = ir.GlobalVariable( globvar = ir.GlobalVariable(
self.llvm_module, ir.IntType(64), name=field_co_re_name self.llvm_module, ir.IntType(64), name=field_co_re_name
) )
globvar.linkage = "external" globvar.linkage = "external"
globvar.set_metadata("llvm.preserve.access.index", debug_info) globvar.set_metadata("llvm.preserve.access.index", debug_info)
self.generated_field_names[struct.name][field_name] = (
globvar
)
field_index += 1 field_index += 1
continue continue
for i in range(0, array_size): for i in range(0, array_size):
field_co_re_name = self._struct_name_generator( field_co_re_name = self._struct_name_generator(
struct, field, field_index, True, i, containing_type_size struct, field, field_index, True, i, containing_type_size
) )
self.generated_field_names[struct.name][field_name] = (
field_co_re_name
)
globvar = ir.GlobalVariable( globvar = ir.GlobalVariable(
self.llvm_module, ir.IntType(64), name=field_co_re_name self.llvm_module, ir.IntType(64), name=field_co_re_name
) )
globvar.linkage = "external" globvar.linkage = "external"
globvar.set_metadata("llvm.preserve.access.index", debug_info) globvar.set_metadata("llvm.preserve.access.index", debug_info)
self.generated_field_names[struct.name][field_name] = (
globvar
)
field_index += 1 field_index += 1
elif field.type_size is not None: elif field.type_size is not None:
array_size = field.type_size array_size = field.type_size
@ -174,26 +174,26 @@ class IRGenerator:
field_co_re_name = self._struct_name_generator( field_co_re_name = self._struct_name_generator(
struct, field, field_index, True, i, containing_type_size struct, field, field_index, True, i, containing_type_size
) )
self.generated_field_names[struct.name][field_name] = (
field_co_re_name
)
globvar = ir.GlobalVariable( globvar = ir.GlobalVariable(
self.llvm_module, ir.IntType(64), name=field_co_re_name self.llvm_module, ir.IntType(64), name=field_co_re_name
) )
globvar.linkage = "external" globvar.linkage = "external"
globvar.set_metadata("llvm.preserve.access.index", debug_info) globvar.set_metadata("llvm.preserve.access.index", debug_info)
self.generated_field_names[struct.name][field_name] = (
globvar
)
field_index += 1 field_index += 1
else: else:
field_co_re_name = self._struct_name_generator( field_co_re_name = self._struct_name_generator(
struct, field, field_index struct, field, field_index
) )
self.generated_field_names[struct.name][field_name] = field_co_re_name
field_index += 1 field_index += 1
globvar = ir.GlobalVariable( globvar = ir.GlobalVariable(
self.llvm_module, ir.IntType(64), name=field_co_re_name self.llvm_module, ir.IntType(64), name=field_co_re_name
) )
globvar.linkage = "external" globvar.linkage = "external"
globvar.set_metadata("llvm.preserve.access.index", debug_info) globvar.set_metadata("llvm.preserve.access.index", debug_info)
self.generated_field_names[struct.name][field_name] = globvar
return debug_info return debug_info
def _struct_name_generator( def _struct_name_generator(