Skip to content

Commit 27cfd8c

Browse files
committed
Filter __NSConstantString(_tag) for llvm 3.9 (#32)
1 parent 33ee55f commit 27cfd8c

File tree

2 files changed

+38
-8
lines changed

2 files changed

+38
-8
lines changed

pygccxml/parser/scanner.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -204,12 +204,17 @@ def startElement(self, name, attrs):
204204

205205
# With CastXML and clang some __va_list_tag declarations are
206206
# present in the tree: we do not want to have these in the tree.
207-
# This option is set to True by default
208-
remove_va_list_tag = "f1" not in self.config.flags
207+
# With llvm 3.9 there is a __NSConstantString(_tag) in the tree
208+
# We hide these declarations by default
209+
rm1 = "f1" not in self.config.flags
210+
names = [
211+
"__va_list_tag",
212+
"__NSConstantString_tag",
213+
"__NSConstantString"]
209214

210215
if isinstance(obj, declarations.declaration_t):
211216

212-
if remove_va_list_tag and "__va_list_tag" in str(obj.name):
217+
if rm1 and str(obj.name) in names:
213218
return
214219

215220
# XML generator. Kept for retrocompatibily
@@ -236,9 +241,6 @@ def startElement(self, name, attrs):
236241

237242
elif utils.is_str(obj):
238243

239-
if remove_va_list_tag and "__va_list_tag" in obj:
240-
return
241-
242244
self.__files[element_id] = obj
243245

244246
else:

unittests/test_va_list_tag_removal.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ class tester_t(parser_test_case.parser_test_case_t):
2525
def __init__(self, *args):
2626
parser_test_case.parser_test_case_t.__init__(self, *args)
2727
self.__code = os.linesep.join(['struct a{};'])
28+
self.known_typedefs = [
29+
"__int128_t", "__uint128_t", "__builtin_va_list"]
30+
self.known_typedefs_llvm39 = \
31+
self.known_typedefs + ["__builtin_ms_va_list"]
2832

2933
def test_keep_va_list_tag(self):
3034

@@ -50,8 +54,20 @@ def test_keep_va_list_tag(self):
5054
self.assertTrue("a" in [class_.name for class_ in classes])
5155
self.assertTrue(len(classes) == 2)
5256

53-
self.assertTrue(tag in [ty.name for ty in typedefs])
5457
self.assertTrue(len(typedefs) == 4)
58+
if tag not in [ty.name for ty in typedefs]:
59+
# This is for llvm 3.9. The class __va_list_tag struct is still
60+
# there but the typedef is gone
61+
for t in self.known_typedefs_llvm39:
62+
self.assertTrue(t in [ty.name for ty in typedefs])
63+
self.assertTrue(
64+
"__NSConstantString_tag" in
65+
[class_.name for class_ in classes])
66+
self.assertTrue(
67+
"__NSConstantString" in [ty.name for ty in typedefs])
68+
else:
69+
for t in self.known_typedefs:
70+
self.assertTrue(t in [ty.name for ty in typedefs])
5571

5672
self.assertTrue(
5773
tag in [var.decl_string.split("::")[1] for var in variables])
@@ -82,7 +98,19 @@ def test_remove_va_list_tag(self):
8298
self.assertTrue(len(classes) == 1)
8399

84100
self.assertFalse(tag in [ty.name for ty in typedefs])
85-
self.assertTrue(len(typedefs) == 3)
101+
self.assertTrue(len(typedefs) == 3 or len(typedefs) == 4)
102+
if len(typedefs) == 4:
103+
# This is for llvm 3.9
104+
for t in self.known_typedefs_llvm39:
105+
self.assertTrue(t in [ty.name for ty in typedefs])
106+
self.assertFalse(
107+
"__NSConstantString_tag"
108+
in [class_.name for class_ in classes])
109+
self.assertFalse(
110+
"__NSConstantString" in [ty.name for ty in typedefs])
111+
else:
112+
for t in self.known_typedefs:
113+
self.assertTrue(t in [ty.name for ty in typedefs])
86114

87115
self.assertFalse(
88116
tag in [var.decl_string.split("::")[1] for var in variables])

0 commit comments

Comments
 (0)