Skip to content

Commit ef39b97

Browse files
Prerak SinghPrerak Singh
authored andcommitted
bug fix
1 parent 296eb49 commit ef39b97

File tree

3 files changed

+50
-16
lines changed

3 files changed

+50
-16
lines changed

pydatastructs/graphs/_backend/cpp/AdjacencyListLLVM.hpp

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,26 +69,34 @@ static PyObject* initialize_llvm_backend(PyObject* self, PyObject* args) {
6969
return nullptr;
7070
}
7171

72-
llvm_graph_init = (GraphInitFunc)PyLong_AsVoidPtr(init_ptr);
73-
llvm_add_vertex = (AddVertexFunc)PyLong_AsVoidPtr(add_vertex_ptr);
74-
llvm_add_edge = (AddEdgeFunc)PyLong_AsVoidPtr(add_edge_ptr);
75-
llvm_is_adjacent = (IsAdjacentFunc)PyLong_AsVoidPtr(is_adjacent_ptr);
76-
llvm_remove_vertex = (RemoveVertexFunc)PyLong_AsVoidPtr(remove_vertex_ptr);
77-
llvm_remove_edge = (RemoveEdgeFunc)PyLong_AsVoidPtr(remove_edge_ptr);
78-
llvm_graph_cleanup = (GraphCleanupFunc)PyLong_AsVoidPtr(cleanup_ptr);
72+
void* raw_init = PyLong_AsVoidPtr(init_ptr);
73+
void* raw_add_vertex = PyLong_AsVoidPtr(add_vertex_ptr);
74+
void* raw_add_edge = PyLong_AsVoidPtr(add_edge_ptr);
75+
void* raw_is_adjacent = PyLong_AsVoidPtr(is_adjacent_ptr);
76+
void* raw_remove_vertex = PyLong_AsVoidPtr(remove_vertex_ptr);
77+
void* raw_remove_edge = PyLong_AsVoidPtr(remove_edge_ptr);
78+
void* raw_cleanup = PyLong_AsVoidPtr(cleanup_ptr);
7979

8080
if (PyErr_Occurred()) {
8181
PyErr_SetString(PyExc_ValueError, "Failed to convert function pointers");
8282
return nullptr;
8383
}
8484

85-
if (!llvm_graph_init || !llvm_add_vertex || !llvm_add_edge ||
86-
!llvm_is_adjacent || !llvm_remove_vertex || !llvm_remove_edge ||
87-
!llvm_graph_cleanup) {
85+
if (!raw_init || !raw_add_vertex || !raw_add_edge ||
86+
!raw_is_adjacent || !raw_remove_vertex || !raw_remove_edge ||
87+
!raw_cleanup) {
8888
PyErr_SetString(PyExc_ValueError, "One or more function pointers are null");
8989
return nullptr;
9090
}
9191

92+
llvm_graph_init = (GraphInitFunc)raw_init;
93+
llvm_add_vertex = (AddVertexFunc)raw_add_vertex;
94+
llvm_add_edge = (AddEdgeFunc)raw_add_edge;
95+
llvm_is_adjacent = (IsAdjacentFunc)raw_is_adjacent;
96+
llvm_remove_vertex = (RemoveVertexFunc)raw_remove_vertex;
97+
llvm_remove_edge = (RemoveEdgeFunc)raw_remove_edge;
98+
llvm_graph_cleanup = (GraphCleanupFunc)raw_cleanup;
99+
92100
llvm_backend_initialized = true;
93101

94102
Py_RETURN_NONE;

pydatastructs/graphs/_backend/cpp/llvm_adjacency_list.py

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,42 @@ def __init__(self):
2323
self.char_ptr = self.int8_type.as_pointer()
2424
self.void_ptr = self.int8_type.as_pointer()
2525

26+
triple = self._get_target_triple()
2627
target = llvm.Target.from_default_triple()
2728
self.target_machine = target.create_target_machine()
2829
self.target_data = self.target_machine.target_data
30+
self.module.triple = triple
31+
self.module.data_layout = str(self.target_data)
2932

3033
self._create_structures()
3134

3235
self._create_function_declarations()
3336

3437
self._create_graph_functions()
3538

39+
def _get_target_triple(self):
40+
import platform
41+
system = platform.system().lower()
42+
machine = platform.machine().lower()
43+
44+
if system == "darwin": # macOS
45+
if machine in ["arm64", "aarch64"]:
46+
return "arm64-apple-darwin"
47+
else: # x86_64
48+
return "x86_64-apple-darwin"
49+
elif system == "linux":
50+
if machine in ["arm64", "aarch64"]:
51+
return "aarch64-unknown-linux-gnu"
52+
else: # x86_64
53+
return "x86_64-unknown-linux-gnu"
54+
elif system == "windows":
55+
if machine in ["arm64", "aarch64"]:
56+
return "aarch64-pc-windows-msvc"
57+
else:
58+
return "x86_64-pc-windows-msvc"
59+
else:
60+
return llvm.get_default_triple()
61+
3662
def _create_structures(self):
3763

3864
self.node_type = ir.LiteralStructType([
@@ -42,20 +68,20 @@ def _create_structures(self):
4268
self.void_ptr,
4369
self.int_type,
4470
self.int_type
45-
], packed=True)
71+
])
4672

4773
self.edge_type = ir.LiteralStructType([
4874
self.node_type.as_pointer(),
4975
self.node_type.as_pointer(),
5076
self.double_type
51-
], packed=True)
77+
])
5278

5379
self.hash_entry_type = ir.LiteralStructType([
5480
self.char_ptr,
5581
self.int_type,
5682
self.void_ptr,
5783
self.void_ptr
58-
], packed=True)
84+
])
5985

6086
self.graph_type = ir.LiteralStructType([
6187
self.node_type.as_pointer().as_pointer(),
@@ -64,7 +90,7 @@ def _create_structures(self):
6490
self.void_ptr,
6591
self.void_ptr,
6692
self.int_type
67-
], packed=True)
93+
])
6894

6995
def _get_target_data(self):
7096
return self.target_machine.target_data

pydatastructs/utils/_extensions.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@
3636
Extension(
3737
nodes,
3838
sources=nodes_sources,
39-
extra_compile_args=["-std=c++17"],
39+
extra_compile_args=extra_compile_args,
4040
),
4141
Extension(
4242
graph_utils,
4343
sources=graph_utils_sources,
44-
extra_compile_args=["-std=c++17"],
44+
extra_compile_args=extra_compile_args,
4545
),
4646
]

0 commit comments

Comments
 (0)