11import logging
2- from pythonbpf .vmlinux_parser .dependency_handler import DependencyHandler
2+ from ..dependency_handler import DependencyHandler
3+ from .debug_info_gen import debug_info_generation
4+ from ..dependency_node import DependencyNode
5+ import llvmlite .ir as ir
36
47logger = logging .getLogger (__name__ )
58
69
710class IRGenerator :
8- def __init__ (self , module , handler : DependencyHandler ):
9- self .module = module
11+ # get the assignments dict and add this stuff to it.
12+ def __init__ (self , llvm_module , handler : DependencyHandler , assignment = None ):
13+ self .llvm_module = llvm_module
1014 self .handler : DependencyHandler = handler
1115 self .generated : list [str ] = []
1216 if not handler .is_ready :
@@ -15,22 +19,48 @@ def __init__(self, module, handler: DependencyHandler):
1519 )
1620 for struct in handler :
1721 self .struct_processor (struct )
18- print ()
1922
2023 def struct_processor (self , struct ):
2124 if struct .name not in self .generated :
2225 print (f"IR generating for { struct .name } " )
23- print (f"Struct is { struct } " )
2426 for dependency in struct .depends_on :
2527 if dependency not in self .generated :
2628 dep_node_from_dependency = self .handler [dependency ]
2729 self .struct_processor (dep_node_from_dependency )
2830 self .generated .append (dependency )
29- # write actual processor logic here after assuming all dependencies are resolved
31+ # actual processor logic here after assuming all dependencies are resolved
3032 # this part cannot yet resolve circular dependencies. Gets stuck on an infinite loop during that.
33+ self .gen_ir (struct )
3134 self .generated .append (struct .name )
3235
33- def struct_name_generator (
34- self ,
35- ) -> None :
36- pass
36+ def gen_ir (self , struct ):
37+ # currently we generate all possible field accesses for CO-RE and put into the assignment table
38+ debug_info = debug_info_generation (struct , self .llvm_module )
39+ field_index = 0
40+ for field_name , field in struct .fields .items ():
41+ # does not take arrays and similar types into consideration yet.
42+ field_co_re_name = self ._struct_name_generator (struct , field , field_index )
43+ field_index += 1
44+ globvar = ir .GlobalVariable (
45+ self .llvm_module , ir .IntType (64 ), name = field_co_re_name
46+ )
47+ globvar .linkage = "external"
48+ globvar .set_metadata ("llvm.preserve.access.index" , debug_info )
49+ print ()
50+
51+ def _struct_name_generator (
52+ self , struct : DependencyNode , field , field_index : int
53+ ) -> str :
54+ if struct .name .startswith ("struct_" ):
55+ name = (
56+ "llvm."
57+ + struct .name .removeprefix ("struct_" )
58+ + f":0:{ field .offset } "
59+ + "$"
60+ + f"0:{ field_index } "
61+ )
62+ return name
63+ else :
64+ raise TypeError (
65+ "Name generation cannot occur due to type name not starting with struct"
66+ )
0 commit comments