xref: /aosp_15_r20/external/harfbuzz_ng/src/check-static-inits.py (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1*2d1272b8SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*2d1272b8SAndroid Build Coastguard Worker
3*2d1272b8SAndroid Build Coastguard Workerimport sys, os, shutil, subprocess, glob, re
4*2d1272b8SAndroid Build Coastguard Worker
5*2d1272b8SAndroid Build Coastguard Workerbuilddir = os.getenv ('builddir', os.path.dirname (__file__))
6*2d1272b8SAndroid Build Coastguard Workerlibs = os.getenv ('libs', '.libs')
7*2d1272b8SAndroid Build Coastguard Worker
8*2d1272b8SAndroid Build Coastguard Workerobjdump = os.getenv ('OBJDUMP', shutil.which ('objdump'))
9*2d1272b8SAndroid Build Coastguard Workerif not objdump:
10*2d1272b8SAndroid Build Coastguard Worker	print ('check-static-inits.py: \'ldd\' not found; skipping test')
11*2d1272b8SAndroid Build Coastguard Worker	sys.exit (77)
12*2d1272b8SAndroid Build Coastguard Worker
13*2d1272b8SAndroid Build Coastguard Workerif sys.version_info < (3, 5):
14*2d1272b8SAndroid Build Coastguard Worker	print ('check-static-inits.py: needs python 3.5 for recursive support in glob')
15*2d1272b8SAndroid Build Coastguard Worker	sys.exit (77)
16*2d1272b8SAndroid Build Coastguard Worker
17*2d1272b8SAndroid Build Coastguard WorkerOBJS = glob.glob (os.path.join (builddir, libs, '**', '*hb*.o'), recursive=True)
18*2d1272b8SAndroid Build Coastguard Workerif not OBJS:
19*2d1272b8SAndroid Build Coastguard Worker	print ('check-static-inits.py: object files not found; skipping test')
20*2d1272b8SAndroid Build Coastguard Worker	sys.exit (77)
21*2d1272b8SAndroid Build Coastguard Worker
22*2d1272b8SAndroid Build Coastguard Workerstat = 0
23*2d1272b8SAndroid Build Coastguard Workertested = 0
24*2d1272b8SAndroid Build Coastguard Worker
25*2d1272b8SAndroid Build Coastguard Workerfor obj in OBJS:
26*2d1272b8SAndroid Build Coastguard Worker	result = subprocess.run(objdump.split () + ['-t', obj], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
27*2d1272b8SAndroid Build Coastguard Worker
28*2d1272b8SAndroid Build Coastguard Worker	if result.returncode:
29*2d1272b8SAndroid Build Coastguard Worker		if result.stderr.find (b'not recognized') != -1:
30*2d1272b8SAndroid Build Coastguard Worker			# https://github.com/harfbuzz/harfbuzz/issues/3019
31*2d1272b8SAndroid Build Coastguard Worker			print ('objdump %s returned "not recognized", skipping' % obj)
32*2d1272b8SAndroid Build Coastguard Worker			continue
33*2d1272b8SAndroid Build Coastguard Worker		print ('objdump %s returned error:\n%s' % (obj, result.stderr.decode ('utf-8')))
34*2d1272b8SAndroid Build Coastguard Worker		stat = 2
35*2d1272b8SAndroid Build Coastguard Worker
36*2d1272b8SAndroid Build Coastguard Worker	result = result.stdout.decode ('utf-8')
37*2d1272b8SAndroid Build Coastguard Worker
38*2d1272b8SAndroid Build Coastguard Worker	# Checking that no object file has static initializers
39*2d1272b8SAndroid Build Coastguard Worker	for l in re.findall (r'^.*\.[cd]tors.*$', result, re.MULTILINE):
40*2d1272b8SAndroid Build Coastguard Worker		if not re.match (r'.*\b0+\b', l):
41*2d1272b8SAndroid Build Coastguard Worker			print ('Ouch, %s has static initializers/finalizers' % obj)
42*2d1272b8SAndroid Build Coastguard Worker			stat = 1
43*2d1272b8SAndroid Build Coastguard Worker
44*2d1272b8SAndroid Build Coastguard Worker	# Checking that no object file has lazy static C++ constructors/destructors or other such stuff
45*2d1272b8SAndroid Build Coastguard Worker	if ('__cxa_' in result) and ('__ubsan_handle' not in result):
46*2d1272b8SAndroid Build Coastguard Worker		print ('Ouch, %s has lazy static C++ constructors/destructors or other such stuff' % obj)
47*2d1272b8SAndroid Build Coastguard Worker		stat = 1
48*2d1272b8SAndroid Build Coastguard Worker
49*2d1272b8SAndroid Build Coastguard Worker	tested += 1
50*2d1272b8SAndroid Build Coastguard Worker
51*2d1272b8SAndroid Build Coastguard Workersys.exit (stat if tested else 77)
52