xref: /aosp_15_r20/development/vndk/tools/header-checker/tests/module.py (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
1#!/usr/bin/env python3
2
3import os
4import sys
5import tempfile
6
7import_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
8import_path = os.path.abspath(os.path.join(import_path, 'utils'))
9sys.path.insert(1, import_path)
10
11from utils import run_header_abi_dumper
12from utils import run_header_abi_linker
13from utils import SOURCE_ABI_DUMP_EXT
14
15
16SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
17ARCH_TARGET_CFLAGS = {
18    'arm': ('-target', 'arm-linux-androideabi'),
19    'arm64': ('-target', 'aarch64-linux-android'),
20    'x86': ('-target', 'i386-linux-androideabi'),
21    'x86_64': ('-target', 'x86_64-linux-android'),
22}
23TARGET_ARCHES = ['arm', 'arm64', 'x86', 'x86_64']
24
25
26def relative_to_abs_path(relative_path):
27    return os.path.join(SCRIPT_DIR, relative_path)
28
29
30def relative_to_abs_path_list(relative_path_list):
31    abs_paths = []
32    for relative_path in relative_path_list:
33        abs_paths.append(relative_to_abs_path(relative_path))
34    return abs_paths
35
36
37class Module(object):
38    def __init__(self, name, arch, cflags, export_include_dirs,
39                 has_reference_dump):
40        self.name = name
41        self.arch = arch
42        self.cflags = tuple(cflags)
43        self.arch_cflags = ARCH_TARGET_CFLAGS.get(self.arch, tuple())
44        self.export_include_dirs = relative_to_abs_path_list(
45            export_include_dirs)
46        self.has_reference_dump = has_reference_dump
47
48    def get_dump_name(self):
49        """Returns the module name followed by file extension."""
50        raise NotImplementedError()
51
52    def make_dump(self, output_path):
53        """Create a dump file."""
54        raise NotImplementedError()
55
56    def mutate_for_arch(self, target_arch):
57        """Returns a clone of this instance with arch=target_arch."""
58        raise NotImplementedError()
59
60    def mutate_for_all_arches(self):
61        if self.arch:
62            return [self]
63        modules = []
64        for target_arch in TARGET_ARCHES:
65            modules.append(self.mutate_for_arch(target_arch))
66        return modules
67
68    @staticmethod
69    def get_test_modules():
70        modules = []
71        for module in TEST_MODULES.values():
72            modules += module.mutate_for_all_arches()
73        return modules
74
75    @staticmethod
76    def get_test_modules_by_name(name):
77        return TEST_MODULES.get(name).mutate_for_all_arches()
78
79
80class SdumpModule(Module):
81    def __init__(self, name, src, export_include_dirs=tuple(),
82                 has_reference_dump=False, cflags=tuple(), arch='',
83                 dumper_flags=tuple()):
84        super().__init__(name, arch, cflags, export_include_dirs,
85                         has_reference_dump)
86        self.src = relative_to_abs_path(src)
87        self.dumper_flags = dumper_flags
88
89    def get_dump_name(self):
90        return self.name + '.sdump'
91
92    def make_dump(self, output_path):
93        return run_header_abi_dumper(
94            self.src, output_path, cflags=self.cflags,
95            export_include_dirs=self.export_include_dirs,
96            flags=self.dumper_flags)
97
98    def mutate_for_arch(self, target_arch):
99        return SdumpModule(self.name, self.src, self.export_include_dirs,
100                           self.has_reference_dump, self.cflags, target_arch,
101                           self.dumper_flags)
102
103
104class LsdumpModule(Module):
105    def __init__(self, name, srcs, version_script, export_include_dirs,
106                 has_reference_dump=False, cflags=tuple(), arch='',
107                 api='current', dumper_flags=tuple(), linker_flags=tuple()):
108        super().__init__(name, arch, cflags, export_include_dirs,
109                         has_reference_dump)
110        self.srcs = relative_to_abs_path_list(srcs)
111        self.version_script = relative_to_abs_path(version_script)
112        self.api = api
113        self.dumper_flags = dumper_flags
114        self.linker_flags = linker_flags
115
116    def get_dump_name(self):
117        return self.name + SOURCE_ABI_DUMP_EXT
118
119    def make_dump(self, output_path):
120        """For each source file, produce a .sdump file, and link them to form
121           an lsump file."""
122        dumps_to_link = []
123        with tempfile.TemporaryDirectory() as tmp:
124            for src in self.srcs:
125                sdump_path = os.path.join(tmp,
126                                          os.path.basename(src) + '.sdump')
127                dumps_to_link.append(sdump_path)
128                run_header_abi_dumper(
129                    src, sdump_path, self.cflags + self.arch_cflags,
130                    self.export_include_dirs, self.dumper_flags)
131
132            lsdump_path = os.path.join(tmp, self.get_dump_name())
133            run_header_abi_linker(dumps_to_link, lsdump_path,
134                                  self.version_script, self.api, self.arch,
135                                  self.linker_flags)
136            # Replace the absolute tmp paths in the type ID.
137            with open(lsdump_path, 'r') as lsdump_file:
138                content = lsdump_file.read().replace(tmp, '')
139
140        with open(output_path, 'w') as output_file:
141            output_file.write(content)
142
143    def mutate_for_arch(self, target_arch):
144        return LsdumpModule(self.name, self.srcs, self.version_script,
145                            self.export_include_dirs, self.has_reference_dump,
146                            self.cflags, target_arch, self.api,
147                            self.dumper_flags, self.linker_flags)
148
149
150TEST_MODULES = [
151    LsdumpModule(
152        name='libc_and_cpp',
153        srcs=[
154            'integration/c_and_cpp/source1.cpp',
155            'integration/c_and_cpp/source2.c',
156        ],
157        version_script='integration/c_and_cpp/map.txt',
158        export_include_dirs=['integration/c_and_cpp/include'],
159        has_reference_dump=True,
160    ),
161    LsdumpModule(
162        name='libc_and_cpp_with_opaque_ptr_a',
163        srcs=[
164            'integration/c_and_cpp/source1.cpp',
165            'integration/c_and_cpp/source2.c',
166        ],
167        version_script='integration/c_and_cpp/map.txt',
168        export_include_dirs=['integration/c_and_cpp/include'],
169        cflags=['-DOPAQUE_STRUCT_A=1'],
170    ),
171    LsdumpModule(
172        name='libc_and_cpp_with_opaque_ptr_b',
173        srcs=[
174            'integration/c_and_cpp/source1.cpp',
175            'integration/c_and_cpp/source2.c',
176        ],
177        version_script='integration/c_and_cpp/map.txt',
178        export_include_dirs=['integration/c_and_cpp/include'],
179        cflags=['-DOPAQUE_STRUCT_B=1'],
180    ),
181    LsdumpModule(
182        name='libc_and_cpp_with_unused_struct',
183        srcs=[
184            'integration/c_and_cpp/source1.cpp',
185            'integration/c_and_cpp/source2.c',
186        ],
187        version_script='integration/c_and_cpp/map.txt',
188        export_include_dirs=['integration/c_and_cpp/include'],
189        cflags=['-DINCLUDE_UNUSED_STRUCTS=1'],
190        has_reference_dump=True,
191    ),
192    LsdumpModule(
193        name='libc_and_cpp_with_unused_cstruct',
194        srcs=[
195            'integration/c_and_cpp/source1.cpp',
196            'integration/c_and_cpp/source2.c',
197        ],
198        version_script='integration/c_and_cpp/map.txt',
199        export_include_dirs=['integration/c_and_cpp/include'],
200        cflags=['-DINCLUDE_UNUSED_STRUCTS=1', '-DMAKE_UNUSED_STRUCT_C=1'],
201    ),
202    LsdumpModule(
203        name='libgolden_cpp',
204        srcs=[
205            'integration/cpp/gold/golden_1.cpp',
206            'integration/cpp/gold/high_volume_speaker.cpp',
207            'integration/cpp/gold/low_volume_speaker.cpp',
208        ],
209        version_script='integration/cpp/gold/map.txt',
210        export_include_dirs=['integration/cpp/gold/include'],
211        has_reference_dump=True,
212    ),
213    LsdumpModule(
214        name='libgolden_cpp_odr',
215        srcs=[
216            'integration/cpp/gold/golden_1.cpp',
217            'integration/cpp/gold/high_volume_speaker.cpp',
218            'integration/cpp/gold/low_volume_speaker.cpp',
219        ],
220        version_script='integration/cpp/gold/map.txt',
221        export_include_dirs=['integration/cpp/gold/include'],
222        cflags=['-DTEST_ODR'],
223    ),
224    LsdumpModule(
225        name='libgolden_cpp_add_function',
226        srcs=[
227            'integration/cpp/gold/golden_1.cpp',
228            'integration/cpp/gold/high_volume_speaker.cpp',
229            'integration/cpp/gold/low_volume_speaker.cpp',
230        ],
231        version_script='integration/cpp/gold/map_add_function.txt',
232        export_include_dirs=['integration/cpp/gold/include'],
233        cflags=['-DGOLDEN_ADD_FUNCTION=1'],
234        has_reference_dump=True,
235    ),
236    LsdumpModule(
237        name='libgolden_cpp_add_function_and_unexported_elf',
238        srcs=[
239            'integration/cpp/gold/golden_1.cpp',
240            'integration/cpp/gold/high_volume_speaker.cpp',
241            'integration/cpp/gold/low_volume_speaker.cpp',
242        ],
243        version_script='integration/cpp/gold/map_add_function_elf_symbol.txt',
244        export_include_dirs=['integration/cpp/gold/include'],
245        cflags=['-DGOLDEN_ADD_FUNCTION=1', '-DADD_UNEXPORTED_ELF_SYMBOL'],
246        arch='',
247        api='current',
248    ),
249    LsdumpModule(
250        name='libgolden_cpp_add_function_sybmol_only',
251        srcs=[
252            'integration/cpp/gold/golden_1.cpp',
253            'integration/cpp/gold/high_volume_speaker.cpp',
254            'integration/cpp/gold/low_volume_speaker.cpp',
255        ],
256        version_script='integration/cpp/gold/map_add_function.txt',
257        export_include_dirs=['integration/cpp/gold/include'],
258        has_reference_dump=True,
259    ),
260    LsdumpModule(
261        name='libgolden_cpp_change_function_access',
262        srcs=[
263            'integration/cpp/gold/golden_1.cpp',
264            'integration/cpp/gold/high_volume_speaker.cpp',
265            'integration/cpp/gold/low_volume_speaker.cpp',
266        ],
267        version_script='integration/cpp/gold/map.txt',
268        export_include_dirs=['integration/cpp/gold/include'],
269        cflags=['-DGOLDEN_CHANGE_FUNCTION_ACCESS=1'],
270    ),
271    LsdumpModule(
272        name='libgolden_cpp_add_global_variable',
273        srcs=[
274            'integration/cpp/gold/golden_1.cpp',
275            'integration/cpp/gold/high_volume_speaker.cpp',
276            'integration/cpp/gold/low_volume_speaker.cpp',
277        ],
278        version_script='integration/cpp/gold/map_added_globvar.txt',
279        export_include_dirs=['integration/cpp/gold/include'],
280        cflags=['-DGOLDEN_ADD_GLOBVAR=1'],
281        has_reference_dump=True,
282    ),
283    LsdumpModule(
284        name='libgolden_cpp_add_global_variable_private',
285        srcs=[
286            'integration/cpp/gold/golden_1.cpp',
287            'integration/cpp/gold/high_volume_speaker.cpp',
288            'integration/cpp/gold/low_volume_speaker.cpp',
289        ],
290        version_script='integration/cpp/gold/map_added_globvar.txt',
291        export_include_dirs=['integration/cpp/gold/include'],
292        cflags=['-DGOLDEN_ADD_GLOBVAR=1', '-DGOLDEN_ADD_GLOBVAR_PRIVATE'],
293    ),
294    LsdumpModule(
295        name='libgolden_cpp_return_type_diff',
296        srcs=[
297            'integration/cpp/gold/golden_1.cpp',
298            'integration/cpp/gold/high_volume_speaker.cpp',
299            'integration/cpp/gold/low_volume_speaker.cpp',
300        ],
301        version_script='integration/cpp/gold/map.txt',
302        export_include_dirs=['integration/cpp/gold/include'],
303        cflags=['-DGOLDEN_RETURN_TYPE_DIFF=1'],
304    ),
305    LsdumpModule(
306        name='libgolden_cpp_parameter_type_diff',
307        srcs=[
308            'integration/cpp/gold/golden_1.cpp',
309            'integration/cpp/gold/high_volume_speaker.cpp',
310            'integration/cpp/gold/low_volume_speaker.cpp',
311        ],
312        version_script='integration/cpp/gold/map_parameter_type_diff.txt',
313        export_include_dirs=['integration/cpp/gold/include'],
314        cflags=['-DGOLDEN_PARAMETER_TYPE_DIFF=1'],
315    ),
316    LsdumpModule(
317        name='libgolden_cpp_vtable_diff',
318        srcs=[
319            'integration/cpp/gold/golden_1.cpp',
320            'integration/cpp/gold/high_volume_speaker.cpp',
321            'integration/cpp/gold/low_volume_speaker.cpp',
322        ],
323        version_script='integration/cpp/gold/map.txt',
324        export_include_dirs=['integration/cpp/gold/include'],
325        cflags=['-DGOLDEN_VTABLE_DIFF=1'],
326    ),
327    LsdumpModule(
328        name='libgolden_cpp_member_diff',
329        srcs=[
330            'integration/cpp/gold/golden_1.cpp',
331            'integration/cpp/gold/high_volume_speaker.cpp',
332            'integration/cpp/gold/low_volume_speaker.cpp',
333        ],
334        version_script='integration/cpp/gold/map.txt',
335        export_include_dirs=['integration/cpp/gold/include'],
336        cflags=['-DGOLDEN_MEMBER_DIFF=1'],
337    ),
338    LsdumpModule(
339        name='libgolden_cpp_member_fake_diff',
340        srcs=[
341            'integration/cpp/gold/golden_1.cpp',
342            'integration/cpp/gold/high_volume_speaker.cpp',
343            'integration/cpp/gold/low_volume_speaker.cpp',
344        ],
345        version_script='integration/cpp/gold/map.txt',
346        export_include_dirs=['integration/cpp/gold/include'],
347        cflags=['-DGOLDEN_MEMBER_FAKE_DIFF=1'],
348    ),
349    LsdumpModule(
350        name='libgolden_cpp_member_cv_diff',
351        srcs=[
352            'integration/cpp/gold/golden_1.cpp',
353            'integration/cpp/gold/high_volume_speaker.cpp',
354            'integration/cpp/gold/low_volume_speaker.cpp',
355        ],
356        version_script='integration/cpp/gold/map.txt',
357        export_include_dirs=['integration/cpp/gold/include'],
358        cflags=['-DGOLDEN_MEMBER_CV_DIFF=1'],
359    ),
360    LsdumpModule(
361        name='libgolden_cpp_change_member_access',
362        srcs=[
363            'integration/cpp/gold/golden_1.cpp',
364            'integration/cpp/gold/high_volume_speaker.cpp',
365            'integration/cpp/gold/low_volume_speaker.cpp',
366        ],
367        version_script='integration/cpp/gold/map.txt',
368        export_include_dirs=['integration/cpp/gold/include'],
369        cflags=['-DGOLDEN_CHANGE_MEMBER_ACCESS=1'],
370    ),
371    LsdumpModule(
372        name='libgolden_cpp_member_integral_type_diff',
373        srcs=[
374            'integration/cpp/gold/golden_1.cpp',
375            'integration/cpp/gold/high_volume_speaker.cpp',
376            'integration/cpp/gold/low_volume_speaker.cpp',
377        ],
378        version_script='integration/cpp/gold/map.txt',
379        export_include_dirs=['integration/cpp/gold/include'],
380        cflags=['-DGOLDEN_MEMBER_INTEGRAL_TYPE_DIFF=1'],
381    ),
382    LsdumpModule(
383        name='libgolden_cpp_enum_diff',
384        srcs=[
385            'integration/cpp/gold/golden_1.cpp',
386            'integration/cpp/gold/high_volume_speaker.cpp',
387            'integration/cpp/gold/low_volume_speaker.cpp',
388        ],
389        version_script='integration/cpp/gold/map.txt',
390        export_include_dirs=['integration/cpp/gold/include'],
391        cflags=['-DGOLDEN_ENUM_DIFF=1'],
392    ),
393    LsdumpModule(
394        name='libgolden_cpp_enum_extended',
395        srcs=[
396            'integration/cpp/gold/golden_1.cpp',
397            'integration/cpp/gold/high_volume_speaker.cpp',
398            'integration/cpp/gold/low_volume_speaker.cpp',
399        ],
400        version_script='integration/cpp/gold/map.txt',
401        export_include_dirs=['integration/cpp/gold/include'],
402        cflags=['-DGOLDEN_ENUM_EXTENSION=1'],
403    ),
404    LsdumpModule(
405        name='libgolden_cpp_unreferenced_elf_symbol_removed',
406        srcs=[
407            'integration/cpp/gold/golden_1.cpp',
408            'integration/cpp/gold/high_volume_speaker.cpp',
409            'integration/cpp/gold/low_volume_speaker.cpp',
410        ],
411        version_script='integration/cpp/gold/map_elf_symbol_removed.txt',
412        export_include_dirs=['integration/cpp/gold/include'],
413    ),
414    LsdumpModule(
415        name='libreproducability',
416        srcs=['integration/c_and_cpp/reproducability.c'],
417        version_script='integration/c_and_cpp/repro_map.txt',
418        export_include_dirs=['integration/c_and_cpp/include'],
419        has_reference_dump=True,
420    ),
421    LsdumpModule(
422        name='libifunc',
423        srcs=['integration/ifunc/ifunc.c'],
424        version_script='integration/ifunc/map.txt',
425        export_include_dirs=[],
426        linker_flags=[
427            '-so', relative_to_abs_path(
428                'integration/ifunc/prebuilts/libifunc.so'
429            ),
430        ],
431        has_reference_dump=True,
432    ),
433    LsdumpModule(
434        name='libgolden_cpp_member_name_changed',
435        srcs=[
436            'integration/cpp/gold/golden_1.cpp',
437            'integration/cpp/gold/high_volume_speaker.cpp',
438            'integration/cpp/gold/low_volume_speaker.cpp',
439        ],
440        version_script='integration/cpp/gold/map.txt',
441        export_include_dirs=['integration/cpp/gold/include'],
442        cflags=['-DGOLDEN_CHANGE_MEMBER_NAME_SAME_OFFSET=1'],
443    ),
444    LsdumpModule(
445        name='libgolden_cpp_function_pointer',
446        srcs=[
447            'integration/cpp/gold/golden_1.cpp',
448            'integration/cpp/gold/high_volume_speaker.cpp',
449            'integration/cpp/gold/low_volume_speaker.cpp',
450        ],
451        version_script='integration/cpp/gold/map.txt',
452        export_include_dirs=['integration/cpp/gold/include'],
453        cflags=['-DGOLDEN_FUNCTION_POINTER=1'],
454    ),
455    LsdumpModule(
456        name='libgolden_cpp_function_pointer_parameter_added',
457        srcs=[
458            'integration/cpp/gold/golden_1.cpp',
459            'integration/cpp/gold/high_volume_speaker.cpp',
460            'integration/cpp/gold/low_volume_speaker.cpp',
461        ],
462        version_script='integration/cpp/gold/map.txt',
463        export_include_dirs=['integration/cpp/gold/include'],
464        cflags=['-DGOLDEN_FUNCTION_POINTER_ADD_PARAM=1',
465                '-DGOLDEN_FUNCTION_POINTER=1'],
466    ),
467    LsdumpModule(
468        name='libgolden_cpp_internal_public_struct',
469        srcs=[
470            'integration/cpp/gold/golden_1.cpp',
471            'integration/cpp/gold/high_volume_speaker.cpp',
472            'integration/cpp/gold/low_volume_speaker.cpp',
473        ],
474        version_script='integration/cpp/gold/map.txt',
475        export_include_dirs=['integration/cpp/gold/include'],
476        cflags=['-DGOLDEN_WITH_INTERNAL_STRUCT',
477                '-DGOLDEN_WITH_PUBLIC_INTERNAL_STRUCT'],
478    ),
479    LsdumpModule(
480        name='libgolden_cpp_internal_private_struct',
481        srcs=[
482            'integration/cpp/gold/golden_1.cpp',
483            'integration/cpp/gold/high_volume_speaker.cpp',
484            'integration/cpp/gold/low_volume_speaker.cpp',
485        ],
486        version_script='integration/cpp/gold/map.txt',
487        export_include_dirs=['integration/cpp/gold/include'],
488        cflags=['-DGOLDEN_WITH_INTERNAL_STRUCT'],
489    ),
490    LsdumpModule(
491        name='libgolden_cpp_inheritance_type_changed',
492        srcs=[
493            'integration/cpp/gold/golden_1.cpp',
494            'integration/cpp/gold/high_volume_speaker.cpp',
495            'integration/cpp/gold/low_volume_speaker.cpp',
496        ],
497        version_script='integration/cpp/gold/map.txt',
498        export_include_dirs=['integration/cpp/gold/include'],
499        cflags=['-DGOLDEN_CHANGE_INHERITANCE_TYPE'],
500    ),
501    LsdumpModule(
502        name='libpure_virtual_function',
503        srcs=['integration/cpp/pure_virtual/pure_virtual_function.cpp'],
504        export_include_dirs=['integration/cpp/pure_virtual/include'],
505        version_script='',
506        has_reference_dump=True,
507    ),
508    LsdumpModule(
509        name='libgolden_cpp_json',
510        srcs=[
511            'integration/cpp/gold/golden_1.cpp',
512            'integration/cpp/gold/high_volume_speaker.cpp',
513            'integration/cpp/gold/low_volume_speaker.cpp',
514        ],
515        version_script='integration/cpp/gold/map.txt',
516        export_include_dirs=['integration/cpp/gold/include'],
517        dumper_flags=['-output-format', 'Json'],
518        linker_flags=['-input-format', 'Json', '-output-format', 'Json'],
519        has_reference_dump=True,
520    ),
521    LsdumpModule(
522        name='libopaque_type',
523        arch='arm64',
524        srcs=['integration/opaque_type/include/opaque_type.h'],
525        version_script='integration/opaque_type/map.txt',
526        export_include_dirs=['integration/opaque_type/include'],
527        linker_flags=['-output-format', 'Json'],
528        has_reference_dump=True,
529    ),
530    LsdumpModule(
531        name='libversion_script_example',
532        arch='arm64',
533        srcs=[
534            'integration/version_script_example/example.cpp',
535        ],
536        version_script='integration/version_script_example/map.txt',
537        export_include_dirs=['integration/version_script_example'],
538        dumper_flags=['-output-format', 'Json'],
539        linker_flags=[
540            '-input-format', 'Json',
541            '-output-format', 'Json',
542            '-so', relative_to_abs_path(
543                'integration/version_script_example/prebuilts/' +
544                'libversion_script_example.so'
545            ),
546        ],
547        has_reference_dump=True,
548    ),
549    LsdumpModule(
550        name='libversion_script_example_no_private',
551        arch='arm64',
552        srcs=[
553            'integration/version_script_example/example.cpp',
554        ],
555        version_script='integration/version_script_example/map.txt',
556        export_include_dirs=['integration/version_script_example'],
557        dumper_flags=['-output-format', 'Json'],
558        linker_flags=[
559            '-input-format', 'Json',
560            '-output-format', 'Json',
561            '-so', relative_to_abs_path(
562                'integration/version_script_example/prebuilts/' +
563                'libversion_script_example.so'
564            ),
565            '--exclude-symbol-version', '*_PRIVATE',
566        ],
567        has_reference_dump=True,
568    ),
569    LsdumpModule(
570        name='libversion_script_example_no_mytag',
571        arch='arm64',
572        srcs=[
573            'integration/version_script_example/example.cpp',
574        ],
575        version_script='integration/version_script_example/map.txt',
576        export_include_dirs=['integration/version_script_example'],
577        dumper_flags=['-output-format', 'Json'],
578        linker_flags=[
579            '-input-format', 'Json',
580            '-output-format', 'Json',
581            '-so', relative_to_abs_path(
582                'integration/version_script_example/prebuilts/' +
583                'libversion_script_example.so'
584            ),
585            '--exclude-symbol-tag', 'mytag',
586        ],
587        has_reference_dump=True,
588    ),
589    LsdumpModule(
590        name='libversion_script_example_api_level',
591        arch='arm64',
592        srcs=[
593            'integration/version_script_example/example.cpp',
594        ],
595        version_script='integration/version_script_example/map.txt',
596        export_include_dirs=['integration/version_script_example'],
597        dumper_flags=['-output-format', 'Json'],
598        linker_flags=[
599            '-input-format', 'Json',
600            '-output-format', 'Json',
601            '-so', relative_to_abs_path(
602                'integration/version_script_example/prebuilts/' +
603                'libversion_script_example.so'
604            ),
605            '-api', '32',
606            '-api-map', relative_to_abs_path(
607                'integration/version_script_example/api_levels.json'
608            ),
609        ],
610        has_reference_dump=True,
611    ),
612    # Test data for test_allow_adding_removing_weak_symbols
613    LsdumpModule(
614        name='libweak_symbols_old',
615        arch='arm64',
616        srcs=[
617            'integration/weak_symbols/example.c',
618        ],
619        version_script='integration/weak_symbols/old_map.txt',
620        export_include_dirs=[],
621        dumper_flags=['-output-format', 'Json'],
622        linker_flags=[
623            '-input-format', 'Json',
624            '-output-format', 'Json',
625        ],
626        has_reference_dump=True,
627    ),
628    LsdumpModule(
629        name='libweak_symbols_new',
630        arch='arm64',
631        srcs=[
632            'integration/weak_symbols/example.c',
633        ],
634        version_script='integration/weak_symbols/new_map.txt',
635        export_include_dirs=[],
636        dumper_flags=['-output-format', 'Json'],
637        linker_flags=[
638            '-input-format', 'Json',
639            '-output-format', 'Json',
640        ],
641        cflags=['-DNEW=1'],
642        has_reference_dump=True,
643    ),
644    LsdumpModule(
645        name='libempty',
646        arch='arm64',
647        srcs=[],
648        version_script='integration/c_and_cpp/map.txt',
649        export_include_dirs=['integration/c_and_cpp/include'],
650        linker_flags=[
651            '-output-format', 'Json',
652        ],
653        has_reference_dump=True,
654    ),
655    LsdumpModule(
656        name='libgolden_anonymous_enum',
657        arch='arm64',
658        srcs=['integration/cpp/anonymous_enum/include/golden.h'],
659        version_script='',
660        export_include_dirs=['integration/cpp/anonymous_enum/include'],
661        linker_flags=['-output-format', 'Json'],
662        has_reference_dump=True,
663    ),
664    LsdumpModule(
665        name='libswap_anonymous_enum',
666        arch='arm64',
667        srcs=['integration/cpp/anonymous_enum/include/swap_enum.h'],
668        version_script='',
669        export_include_dirs=['integration/cpp/anonymous_enum/include'],
670        linker_flags=['-output-format', 'Json'],
671    ),
672    LsdumpModule(
673        name='libswap_anonymous_enum_field',
674        arch='arm64',
675        srcs=['integration/cpp/anonymous_enum/include/swap_enum_field.h'],
676        version_script='',
677        export_include_dirs=['integration/cpp/anonymous_enum/include'],
678        linker_flags=['-output-format', 'Json'],
679    ),
680    LsdumpModule(
681        name='libanonymous_enum_odr',
682        arch='arm64',
683        srcs=[
684            'integration/cpp/anonymous_enum/include/golden.h',
685            'integration/cpp/anonymous_enum/include/include_golden.h',
686        ],
687        version_script='',
688        export_include_dirs=['integration/cpp/anonymous_enum/include'],
689        linker_flags=['-output-format', 'Json'],
690        has_reference_dump=True,
691    ),
692    LsdumpModule(
693        name='libmerge_multi_definitions',
694        arch='arm64',
695        srcs=[
696            'integration/merge_multi_definitions/include/def1.h',
697            'integration/merge_multi_definitions/include/def2.h',
698        ],
699        version_script='integration/merge_multi_definitions/map.txt',
700        export_include_dirs=['integration/merge_multi_definitions/include'],
701        linker_flags=['-output-format', 'Json', '-sources-per-thread', '1'],
702        has_reference_dump=True,
703    ),
704    LsdumpModule(
705        name='libdiff_multi_definitions',
706        arch='arm64',
707        srcs=[
708            'integration/merge_multi_definitions/include/def1.h',
709            'integration/merge_multi_definitions/include/link_to_def2.h',
710        ],
711        version_script='integration/merge_multi_definitions/map.txt',
712        export_include_dirs=['integration/merge_multi_definitions/include'],
713        linker_flags=['-output-format', 'Json', '-sources-per-thread', '1'],
714        has_reference_dump=True,
715    ),
716    LsdumpModule(
717        name='libstruct_extensions',
718        arch='arm64',
719        srcs=['integration/struct_extensions/include/base.h'],
720        version_script='integration/struct_extensions/map.txt',
721        export_include_dirs=['integration/struct_extensions/include'],
722        linker_flags=['-output-format', 'Json'],
723        has_reference_dump=True,
724    ),
725    LsdumpModule(
726        name='liballowed_struct_extensions',
727        arch='arm64',
728        srcs=['integration/struct_extensions/include/extensions.h'],
729        version_script='integration/struct_extensions/map.txt',
730        export_include_dirs=['integration/struct_extensions/include'],
731        linker_flags=['-output-format', 'Json'],
732        has_reference_dump=True,
733    ),
734    LsdumpModule(
735        name='libpass_by_value',
736        arch='arm64',
737        srcs=['integration/pass_by_value/include/base.h'],
738        version_script='integration/pass_by_value/map.txt',
739        export_include_dirs=['integration/pass_by_value/include'],
740        linker_flags=['-output-format', 'Json'],
741        has_reference_dump=True,
742    ),
743    LsdumpModule(
744        name='libparam_size_diff',
745        arch='arm64',
746        srcs=['integration/pass_by_value/include/param_size_diff.h'],
747        version_script='integration/pass_by_value/map.txt',
748        export_include_dirs=['integration/pass_by_value/include'],
749        linker_flags=['-output-format', 'Json'],
750        has_reference_dump=True,
751    ),
752    LsdumpModule(
753        name='libreturn_size_diff',
754        arch='arm64',
755        srcs=['integration/pass_by_value/include/return_size_diff.h'],
756        version_script='integration/pass_by_value/map.txt',
757        export_include_dirs=['integration/pass_by_value/include'],
758        linker_flags=['-output-format', 'Json'],
759        has_reference_dump=True,
760    ),
761    LsdumpModule(
762        name='libfunction_extensions',
763        arch='arm64',
764        srcs=['integration/function_extensions/include/base.h'],
765        version_script='integration/function_extensions/map.txt',
766        export_include_dirs=['integration/function_extensions/include'],
767        linker_flags=['-output-format', 'Json'],
768        has_reference_dump=True,
769    ),
770    LsdumpModule(
771        name='liballowed_function_extensions',
772        arch='arm64',
773        srcs=['integration/function_extensions/include/extensions.h'],
774        version_script='integration/function_extensions/map.txt',
775        export_include_dirs=['integration/function_extensions/include'],
776        linker_flags=['-output-format', 'Json'],
777        has_reference_dump=True,
778    ),
779    LsdumpModule(
780        name='libarray',
781        arch='arm64',
782        srcs=['integration/array/include/base.h'],
783        version_script='integration/array/map.txt',
784        export_include_dirs=['integration/array/include'],
785        linker_flags=['-output-format', 'Json'],
786        has_reference_dump=True,
787    ),
788    LsdumpModule(
789        name='libarray_diff',
790        arch='arm64',
791        srcs=['integration/array/include/diff.h'],
792        version_script='integration/array/map.txt',
793        export_include_dirs=['integration/array/include'],
794        linker_flags=['-output-format', 'Json'],
795        has_reference_dump=True,
796    ),
797    LsdumpModule(
798        name='libunion',
799        arch='arm64',
800        srcs=['integration/union/include/base.h'],
801        version_script='integration/union/map.txt',
802        export_include_dirs=['integration/union/include'],
803        linker_flags=['-output-format', 'Json'],
804        has_reference_dump=True,
805    ),
806    LsdumpModule(
807        name='libunion_diff',
808        arch='arm64',
809        srcs=['integration/union/include/diff.h'],
810        version_script='integration/union/map.txt',
811        export_include_dirs=['integration/union/include'],
812        linker_flags=['-output-format', 'Json'],
813    ),
814    LsdumpModule(
815        name='libenum',
816        arch='arm64',
817        srcs=['integration/enum/include/base.h'],
818        version_script='integration/enum/map.txt',
819        export_include_dirs=['integration/enum/include'],
820        dumper_flags=['-output-format', 'Json'],
821        linker_flags=['-input-format', 'Json', '-output-format', 'Json'],
822        has_reference_dump=True,
823    ),
824    LsdumpModule(
825        name='libbit_field',
826        arch='arm64',
827        srcs=['integration/bit_field/include/base.h'],
828        version_script='integration/bit_field/map.txt',
829        export_include_dirs=['integration/bit_field/include'],
830        dumper_flags=['-output-format', 'Json'],
831        linker_flags=['-input-format', 'Json', '-output-format', 'Json'],
832        has_reference_dump=True,
833    ),
834    LsdumpModule(
835        name='libbit_field_diff',
836        arch='arm64',
837        srcs=['integration/bit_field/include/diff.h'],
838        version_script='integration/bit_field/map.txt',
839        export_include_dirs=['integration/bit_field/include'],
840        dumper_flags=['-output-format', 'Json'],
841        linker_flags=['-input-format', 'Json', '-output-format', 'Json'],
842    ),
843    LsdumpModule(
844        name='libavailability',
845        arch='arm64',
846        srcs=['integration/availability/include/base.h'],
847        version_script='integration/availability/map.txt',
848        export_include_dirs=['integration/availability/include'],
849        dumper_flags=['-output-format', 'Json'],
850        linker_flags=['-input-format', 'Json', '-output-format', 'Json'],
851        has_reference_dump=True,
852    ),
853    LsdumpModule(
854        name='libavailability_35',
855        arch='arm64',
856        srcs=['integration/availability/include/base.h'],
857        version_script='integration/availability/map.txt',
858        export_include_dirs=['integration/availability/include'],
859        dumper_flags=['-output-format', 'Json'],
860        linker_flags=['-input-format', 'Json', '-output-format', 'Json',
861                      '-availability', '35'],
862        has_reference_dump=True,
863    ),
864]
865
866TEST_MODULES = {m.name: m for m in TEST_MODULES}
867