mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-24 02:35:41 +00:00
2e127016b5
There shouldn't be any noise in this number, either a patch adds or removes constructors or it doesn't. Choosing 0.25% is kind of arbitrary, but it should be good enough since it will make us alert for an increase of one constructor so long as we have less than 400 constructors, and currently we have 98.
65 lines
2.2 KiB
Python
65 lines
2.2 KiB
Python
|
|
#!/usr/bin/python
|
|
import json
|
|
import re
|
|
import subprocess
|
|
import sys
|
|
|
|
def count_ctors(filename):
|
|
proc = subprocess.Popen(
|
|
['readelf', '-W', '-S', filename], stdout=subprocess.PIPE)
|
|
|
|
# Some versions of ld produce both .init_array and .ctors. So we have
|
|
# to check for both.
|
|
n_init_array_ctors = 0
|
|
have_init_array = False
|
|
n_ctors_ctors = 0
|
|
have_ctors = False
|
|
|
|
for line in proc.stdout:
|
|
f = line.split()
|
|
if len(f) != 11:
|
|
continue
|
|
# Don't try to int()-parse the header line for the section summaries.
|
|
if not re.match("\\[\\d+\\]", f[0]):
|
|
continue
|
|
section_name, contents, size, align = f[1], f[2], int(f[5], 16), int(f[10])
|
|
if section_name == ".ctors" and contents == "PROGBITS":
|
|
have_ctors = True
|
|
# Subtract 2 for the uintptr_t(-1) header and the null terminator.
|
|
n_ctors_ctors = size / align - 2
|
|
if section_name == ".init_array" and contents == "INIT_ARRAY":
|
|
have_init_array = True
|
|
n_init_array_ctors = size / align
|
|
|
|
if have_init_array:
|
|
# Even if we have .ctors, we shouldn't have any constructors in .ctors.
|
|
# Complain if .ctors does not look how we expect it to.
|
|
if have_ctors and n_ctors_ctors != 0:
|
|
print >>sys.stderr, "Unexpected .ctors contents for", filename
|
|
sys.exit(1)
|
|
return n_init_array_ctors
|
|
if have_ctors:
|
|
return n_ctors_ctors
|
|
|
|
# We didn't find anything; somebody switched initialization mechanisms on
|
|
# us, or the binary is completely busted. Complain either way.
|
|
print >>sys.stderr, "Couldn't find .init_array or .ctors in", filename
|
|
sys.exit(1)
|
|
|
|
if __name__ == '__main__':
|
|
for f in sys.argv[1:]:
|
|
perfherder_data = {
|
|
"framework": {"name": "build_metrics"},
|
|
"suites": [{
|
|
"name": "compiler_metrics",
|
|
"subtests": [{
|
|
"name": "num_constructors",
|
|
"value": count_ctors(f),
|
|
"alertThreshold": 0.25
|
|
}]}
|
|
]
|
|
}
|
|
print "PERFHERDER_DATA: %s" % json.dumps(perfherder_data)
|
|
|