@@ -62,6 +62,14 @@ def _create_structures(self):
6262 self .int_type
6363 ])
6464
65+ self .target_machine = None
66+
67+ 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 ()
71+ return self .target_machine .target_data
72+
6573 def _create_function_declarations (self ):
6674
6775 malloc_type = ir .FunctionType (self .void_ptr , [self .int64_type ])
@@ -255,7 +263,7 @@ def _create_node_functions(self):
255263
256264 name_ptr , name_len , node_id = self .create_node .args
257265
258- node_size = ir .Constant (self .int64_type , self .node_type .get_abi_size (llvm . create_target_data ( "" )))
266+ node_size = ir .Constant (self .int64_type , self .node_type .get_abi_size (self . _get_target_data ( )))
259267 node_mem = self .builder .call (self .malloc_func , [node_size ])
260268 node_ptr = self .builder .bitcast (node_mem , self .node_type .as_pointer ())
261269
@@ -285,7 +293,7 @@ def _create_graph_init(self):
285293 block = self .graph_init .append_basic_block (name = "entry" )
286294 self .builder = ir .IRBuilder (block )
287295
288- graph_size = ir .Constant (self .int64_type , self .graph_type .get_abi_size (llvm . create_target_data ( "" )))
296+ graph_size = ir .Constant (self .int64_type , self .graph_type .get_abi_size (self . _get_target_data ( )))
289297 graph_mem = self .builder .call (self .malloc_func , [graph_size ])
290298 graph_ptr = self .builder .bitcast (graph_mem , self .graph_type .as_pointer ())
291299
@@ -491,7 +499,7 @@ def _create_add_edge(self):
491499
492500 self .builder .position_at_end (create_edge_block )
493501
494- edge_size = ir .Constant (self .int64_type , self .edge_type .get_abi_size (llvm . create_target_data ( "" )))
502+ edge_size = ir .Constant (self .int64_type , self .edge_type .get_abi_size (self . _get_target_data ( )))
495503 edge_mem = self .builder .call (self .malloc_func , [edge_size ])
496504 edge_ptr = self .builder .bitcast (edge_mem , self .edge_type .as_pointer ())
497505
@@ -533,8 +541,9 @@ def _add_to_adjacency_list(self, src_node_ptr, tgt_node_ptr):
533541 )
534542
535543 node_ptr_type = self .node_type .as_pointer ()
544+ ptr_size = ir .Constant (self .int64_type , node_ptr_type .get_abi_size (self ._get_target_data ()))
536545 new_size_elements = self .builder .zext (new_capacity , self .int64_type )
537- new_array_mem = self .builder .call (self .malloc_func , [self .builder .mul (new_size_elements , ir . Constant ( self . int64_type , node_ptr_type . get_abi_size ( llvm . create_target_data ( "" ))) )])
546+ new_array_mem = self .builder .call (self .malloc_func , [self .builder .mul (new_size_elements , ptr_size )])
538547 new_array = self .builder .bitcast (new_array_mem , node_ptr_type .as_pointer ())
539548
540549 copy_adj_block = self .builder .block .parent .append_basic_block (name = "copy_adj" )
@@ -546,7 +555,7 @@ def _add_to_adjacency_list(self, src_node_ptr, tgt_node_ptr):
546555 self .builder .position_at_end (copy_adj_block )
547556 old_adj_array_void = self .builder .load (adj_list_ptr )
548557 old_size_elements = self .builder .zext (current_count , self .int64_type )
549- old_size_bytes = self .builder .mul (old_size_elements , ir . Constant ( self . int64_type , node_ptr_type . get_abi_size ( llvm . create_target_data ( "" ))) )
558+ old_size_bytes = self .builder .mul (old_size_elements , ptr_size )
550559
551560 new_array_void = self .builder .bitcast (new_array , self .void_ptr )
552561 self .builder .call (self .memcpy_func , [new_array_void , old_adj_array_void , old_size_bytes ])
@@ -582,7 +591,7 @@ def _create_hash_insert(self):
582591
583592 table_ptr , key , key_len , value = self .hash_insert .args
584593
585- entry_size = ir .Constant (self .int64_type , self .hash_entry_type .get_abi_size (llvm . create_target_data ( "" )))
594+ entry_size = ir .Constant (self .int64_type , self .hash_entry_type .get_abi_size (self . _get_target_data ( )))
586595 entry_mem = self .builder .call (self .malloc_func , [entry_size ])
587596 entry_ptr = self .builder .bitcast (entry_mem , self .hash_entry_type .as_pointer ())
588597
@@ -1225,11 +1234,9 @@ def _remove_vertex_from_node_adjacency(self, node_ptr, vertex_name, vertex_name_
12251234 self .builder .cbranch (loop_condition , check_vertex_block , update_count_block )
12261235
12271236 self .builder .position_at_end (check_vertex_block )
1228- ptr_size = ir .Constant (self .int64_type , 8 )
1229- read_offset_64 = self .builder .mul (self .builder .zext (i_val , self .int64_type ), ptr_size )
1230- read_entry_ptr = self .builder .gep (adj_list , [read_offset_64 ])
1231- read_entry_typed = self .builder .bitcast (read_entry_ptr , self .node_type .as_pointer ().as_pointer ())
1232- adj_node = self .builder .load (read_entry_typed )
1237+ adj_list_typed = self .builder .bitcast (adj_list , self .node_type .as_pointer ().as_pointer ())
1238+ read_entry_ptr = self .builder .gep (adj_list_typed , [i_val ])
1239+ adj_node = self .builder .load (read_entry_ptr )
12331240
12341241 adj_node_name_ptr = self .builder .gep (adj_node , [ir .Constant (self .int_type , 0 ), ir .Constant (self .int_type , 1 )])
12351242 adj_node_name = self .builder .load (adj_node_name_ptr )
@@ -1258,10 +1265,8 @@ def _remove_vertex_from_node_adjacency(self, node_ptr, vertex_name, vertex_name_
12581265 self .builder .cbranch (indices_different , do_copy_block , advance_write_block )
12591266
12601267 self .builder .position_at_end (do_copy_block )
1261- write_offset_64 = self .builder .mul (self .builder .zext (write_idx_val , self .int64_type ), ptr_size )
1262- write_entry_ptr = self .builder .gep (adj_list , [write_offset_64 ])
1263- write_entry_typed = self .builder .bitcast (write_entry_ptr , self .node_type .as_pointer ().as_pointer ())
1264- self .builder .store (adj_node , write_entry_typed )
1268+ write_entry_ptr = self .builder .gep (adj_list_typed , [write_idx_val ])
1269+ self .builder .store (adj_node , write_entry_ptr )
12651270 self .builder .branch (advance_write_block )
12661271
12671272 self .builder .position_at_end (advance_write_block )
@@ -1386,6 +1391,7 @@ def compile_to_machine_code(self):
13861391
13871392 target = llvm .Target .from_default_triple ()
13881393 target_machine = target .create_target_machine ()
1394+ self .target_machine = target_machine
13891395
13901396 mod = llvm .parse_assembly (str (self .module ))
13911397 mod .verify ()
0 commit comments