@@ -23,6 +23,9 @@ def __init__(self):
2323 self .char_ptr = self .int8_type .as_pointer ()
2424 self .void_ptr = self .int8_type .as_pointer ()
2525
26+ target = llvm .Target .from_default_triple ()
27+ self .target_machine = target .create_target_machine ()
28+
2629 self ._create_structures ()
2730
2831 self ._create_function_declarations ()
@@ -62,14 +65,16 @@ def _create_structures(self):
6265 self .int_type
6366 ])
6467
65- self .target_machine = None
66-
6768 def _get_target_data (self ):
68- if self .target_machine is None :
69- target = llvm .Target .from_default_triple ()
70- self .target_machine = target .create_target_machine ()
7169 return self .target_machine .target_data
7270
71+ def _get_struct_size (self , struct_type ):
72+ return struct_type .get_abi_size (self ._get_target_data ())
73+
74+ def _get_pointer_size (self ):
75+ import struct
76+ return struct .calcsize ("P" )
77+
7378 def _create_function_declarations (self ):
7479
7580 malloc_type = ir .FunctionType (self .void_ptr , [self .int64_type ])
@@ -263,7 +268,7 @@ def _create_node_functions(self):
263268
264269 name_ptr , name_len , node_id = self .create_node .args
265270
266- node_size = ir .Constant (self .int64_type , self .node_type . get_abi_size (self ._get_target_data () ))
271+ node_size = ir .Constant (self .int64_type , self ._get_struct_size (self .node_type ))
267272 node_mem = self .builder .call (self .malloc_func , [node_size ])
268273 node_ptr = self .builder .bitcast (node_mem , self .node_type .as_pointer ())
269274
@@ -293,7 +298,7 @@ def _create_graph_init(self):
293298 block = self .graph_init .append_basic_block (name = "entry" )
294299 self .builder = ir .IRBuilder (block )
295300
296- graph_size = ir .Constant (self .int64_type , self .graph_type . get_abi_size (self ._get_target_data () ))
301+ graph_size = ir .Constant (self .int64_type , self ._get_struct_size (self .graph_type ))
297302 graph_mem = self .builder .call (self .malloc_func , [graph_size ])
298303 graph_ptr = self .builder .bitcast (graph_mem , self .graph_type .as_pointer ())
299304
@@ -379,7 +384,10 @@ def _create_add_vertex(self):
379384 self .builder .mul (current_capacity , ir .Constant (self .int_type , 2 ))
380385 )
381386
382- ptr_size = ir .Constant (self .int64_type , 8 )
387+ target_data = self ._get_target_data ()
388+ ptr_type = self .node_type .as_pointer ()
389+ ptr_size = ir .Constant (self .int64_type , self ._get_pointer_size ())
390+
383391 new_size_64 = self .builder .mul (self .builder .zext (new_capacity , self .int64_type ), ptr_size )
384392 new_array_mem = self .builder .call (self .malloc_func , [new_size_64 ])
385393 new_array = self .builder .bitcast (new_array_mem , self .node_type .as_pointer ().as_pointer ())
@@ -499,7 +507,7 @@ def _create_add_edge(self):
499507
500508 self .builder .position_at_end (create_edge_block )
501509
502- edge_size = ir .Constant (self .int64_type , self .edge_type . get_abi_size (self ._get_target_data () ))
510+ edge_size = ir .Constant (self .int64_type , self ._get_struct_size (self .edge_type ))
503511 edge_mem = self .builder .call (self .malloc_func , [edge_size ])
504512 edge_ptr = self .builder .bitcast (edge_mem , self .edge_type .as_pointer ())
505513
@@ -541,7 +549,10 @@ def _add_to_adjacency_list(self, src_node_ptr, tgt_node_ptr):
541549 self .builder .mul (current_capacity , ir .Constant (self .int_type , 2 ))
542550 )
543551
544- ptr_size = ir .Constant (self .int64_type , 8 )
552+ target_data = self ._get_target_data ()
553+ ptr_type = self .node_type .as_pointer ()
554+ ptr_size = ir .Constant (self .int64_type , self ._get_pointer_size ())
555+
545556 new_size_bytes = self .builder .mul (self .builder .zext (new_capacity , self .int64_type ), ptr_size )
546557 new_array_mem = self .builder .call (self .malloc_func , [new_size_bytes ])
547558
@@ -585,7 +596,7 @@ def _create_hash_insert(self):
585596
586597 table_ptr , key , key_len , value = self .hash_insert .args
587598
588- entry_size = ir .Constant (self .int64_type , self .hash_entry_type . get_abi_size (self ._get_target_data () ))
599+ entry_size = ir .Constant (self .int64_type , self ._get_struct_size (self .hash_entry_type ))
589600 entry_mem = self .builder .call (self .malloc_func , [entry_size ])
590601 entry_ptr = self .builder .bitcast (entry_mem , self .hash_entry_type .as_pointer ())
591602
@@ -1383,14 +1394,10 @@ def _create_graph_cleanup(self):
13831394
13841395 def compile_to_machine_code (self ):
13851396
1386- target = llvm .Target .from_default_triple ()
1387- target_machine = target .create_target_machine ()
1388- self .target_machine = target_machine
1389-
13901397 mod = llvm .parse_assembly (str (self .module ))
13911398 mod .verify ()
13921399
1393- ee = llvm .create_mcjit_compiler (mod , target_machine )
1400+ ee = llvm .create_mcjit_compiler (mod , self . target_machine )
13941401 ee .finalize_object ()
13951402
13961403 functions = {}
0 commit comments