[clang] [libclang/python] Fix visitor callback return data type (PR #221024)
Milad Fa via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 4 06:11:00 PDT 2026
https://github.com/miladfarca updated https://github.com/llvm/llvm-project/pull/221024
>From bc744f202d21926363f8a97da748dac0f8f56037 Mon Sep 17 00:00:00 2001
From: Milad Fa <mfarazma at ibm.com>
Date: Thu, 3 Sep 2026 19:00:24 +0000
Subject: [PATCH 1/2] [libclang/python] Fix visitor callback return data type
---
clang/bindings/python/clang/cindex.py | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/clang/bindings/python/clang/cindex.py b/clang/bindings/python/clang/cindex.py
index bc00dd770ce3b..4423096085535 100644
--- a/clang/bindings/python/clang/cindex.py
+++ b/clang/bindings/python/clang/cindex.py
@@ -71,6 +71,7 @@
byref,
c_char_p,
c_int,
+ c_long,
c_longlong,
c_uint,
c_ulong,
@@ -4117,8 +4118,8 @@ def set_property(self, property, value):
translation_unit_includes_callback = CFUNCTYPE(
None, c_object_p, POINTER(SourceLocation), c_uint, py_object
)
-cursor_visit_callback = CFUNCTYPE(c_int, Cursor, Cursor, py_object)
-fields_visit_callback = CFUNCTYPE(c_int, Cursor, py_object)
+cursor_visit_callback = CFUNCTYPE(c_long, Cursor, Cursor, py_object)
+fields_visit_callback = CFUNCTYPE(c_long, Cursor, py_object)
# Functions strictly alphabetical order.
FUNCTION_LIST: list[LibFunc] = [
>From 21a86bbf64d359bc432ab4490298af1200ebf1c4 Mon Sep 17 00:00:00 2001
From: Milad Fa <mfarazma at ibm.com>
Date: Fri, 4 Sep 2026 13:10:37 +0000
Subject: [PATCH 2/2] Make it s390x specific
---
clang/bindings/python/clang/cindex.py | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/clang/bindings/python/clang/cindex.py b/clang/bindings/python/clang/cindex.py
index 4423096085535..5aaddb5e2a619 100644
--- a/clang/bindings/python/clang/cindex.py
+++ b/clang/bindings/python/clang/cindex.py
@@ -83,6 +83,7 @@
)
import os
+import platform
import sys
from enum import Enum
import warnings
@@ -4118,8 +4119,16 @@ def set_property(self, property, value):
translation_unit_includes_callback = CFUNCTYPE(
None, c_object_p, POINTER(SourceLocation), c_uint, py_object
)
-cursor_visit_callback = CFUNCTYPE(c_long, Cursor, Cursor, py_object)
-fields_visit_callback = CFUNCTYPE(c_long, Cursor, py_object)
+# On s390x the visitor callbacks must return a full register word (c_long)
+# rather than c_int. ctypes does not sign/zero-extend a narrow closure return
+# to the full 64-bit return register the s390x ELF ABI requires, leaving
+# garbage in the high bytes. libclang reads the full register and faults with
+# a SIGFPE.
+# TODO: Remove once the ctypes fix (https://github.com/python/cpython/issues/156933)
+# has propagated.
+_visitor_result = c_long if platform.machine() == "s390x" else c_int
+cursor_visit_callback = CFUNCTYPE(_visitor_result, Cursor, Cursor, py_object)
+fields_visit_callback = CFUNCTYPE(_visitor_result, Cursor, py_object)
# Functions strictly alphabetical order.
FUNCTION_LIST: list[LibFunc] = [
More information about the cfe-commits
mailing list