blob: 6683d08f9e0a69496c7f7e521f27ec71b121443e [file] [log] [blame]
# RUN: python %s
import unittest
import sys
import os
import tempfile
from lnt.testing.profile.perf import LinuxPerfProfile
class CPerfTest(unittest.TestCase):
def setUp(self):
self.inputs = os.path.join(os.path.dirname(os.path.abspath(__file__)),
'Inputs')
self.fake_nm = 'python %s/fake-nm.py' % self.inputs
self.expected_data = {
"fib-aarch64": {
u"counters": {u"cycles": 240949386},
u"functions": {
u"fib": {
u"counters": {u"cycles": 99.77243187496647},
u"data": [
[
{u"cycles": 22.476272172208624},
4196040,
u"\ta9be4ff4 \tstp\tx20, x19, [sp,#-32]!",
],
[
{u"cycles": 20.81533649797271},
4196044,
u"\ta9017bfd \tstp\tx29, x30, [sp,#16]",
],
[{}, 4196048, u"\t910043fd \tadd\tx29, sp, #0x10"],
[{}, 4196052, u"\t71000813 \tsubs\tw19, w0, #0x2"],
[{}, 4196056, u"\t540000eb \tb.lt\t4006f4 <fib+0x2c>"],
[
{u"cycles": 10.065491723992467},
4196060,
u"\t51000400 \tsub\tw0, w0, #0x1",
],
[{}, 4196064, u"\t97fffffa \tbl\t4006c8 <fib>"],
[
{u"cycles": 5.858831022967777},
4196068,
u"\t2a0003f4 \tmov\tw20, w0",
],
[{}, 4196072, u"\t2a1303e0 \tmov\tw0, w19"],
[{}, 4196076, u"\t97fffff7 \tbl\t4006c8 <fib>"],
[
{u"cycles": 7.57924022814841},
4196080,
u"\t0b140000 \tadd\tw0, w0, w20",
],
[
{u"cycles": 19.240308514111305},
4196084,
u"\ta9417bfd \tldp\tx29, x30, [sp,#16]",
],
[
{u"cycles": 13.964519840598708},
4196088,
u"\ta8c24ff4 \tldp\tx20, x19, [sp],#32",
],
[{}, 4196092, u"\td65f03c0 \tret"],
],
}
},
},
"fib2-aarch64": {
u"counters": {
u"branch-misses": 1820692,
u"cache-misses": 33054,
u"cycles": 243618286,
},
u"functions": {
u"fib": {
u"counters": {
u"branch-misses": 99.7405382129432,
u"cache-misses": 75.18000847098688,
u"cycles": 99.78902404723429,
},
u"data": [
[
{
u"branch-misses": 21.904846340904687,
u"cache-misses": 37.4486921529175,
u"cycles": 23.48637833693693,
},
4196040,
u"\ta9be4ff4 \tstp\tx20, x19, [sp,#-32]!",
],
[
{
u"branch-misses": 2.6443747907452115,
u"cache-misses": 17.08651911468813,
u"cycles": 20.34001001463117,
},
4196044,
u"\ta9017bfd \tstp\tx29, x30, [sp,#16]",
],
[{}, 4196048, u"\t910043fd \tadd\tx29, sp, #0x10"],
[{}, 4196052, u"\t71000813 \tsubs\tw19, w0, #0x2"],
[{}, 4196056, u"\t540000eb \tb.lt\t4006f4 <fib+0x2c>"],
[
{
u"branch-misses": 30.264575146698622,
u"cache-misses": 20.69215291750503,
u"cycles": 9.787981545863996,
},
4196060,
u"\t51000400 \tsub\tw0, w0, #0x1",
],
[{}, 4196064, u"\t97fffffa \tbl\t4006c8 <fib>"],
[
{
u"branch-misses": 0.11195131191739062,
u"cache-misses": 2.3621730382293764,
u"cycles": 7.702120542412432,
},
4196068,
u"\t2a0003f4 \tmov\tw20, w0",
],
[{}, 4196072, u"\t2a1303e0 \tmov\tw0, w19"],
[{}, 4196076, u"\t97fffff7 \tbl\t4006c8 <fib>"],
[
{
u"branch-misses": 19.03265916580028,
u"cache-misses": 3.8229376257545273,
u"cycles": 7.362266427937867,
},
4196080,
u"\t0b140000 \tadd\tw0, w0, w20",
],
[
{
u"branch-misses": 4.9891297644011345,
u"cache-misses": 7.553319919517103,
u"cycles": 18.387547715628735,
},
4196084,
u"\ta9417bfd \tldp\tx29, x30, [sp,#16]",
],
[
{
u"branch-misses": 21.05246347953268,
u"cache-misses": 11.03420523138833,
u"cycles": 12.93369541658887,
},
4196088,
u"\ta8c24ff4 \tldp\tx20, x19, [sp],#32",
],
[{}, 4196092, u"\td65f03c0 \tret"],
],
}
},
},
}
def _getNm(self, perf_data_fname, non_dynamic=False):
stub = perf_data_fname.rsplit('.perf_data', 1)[0]
s = 'python %s/fake-nm.py %s.nm.out' % (self.inputs, stub)
if non_dynamic:
s += ' --fake-nm-be-non-dynamic'
return s
def _getObjdump(self, perf_data_fname):
stub = perf_data_fname.rsplit('.perf_data', 1)[0]
return 'python %s/fake-objdump.py %s.objdump' % (self.inputs, stub)
def _getInput(self, fname):
return os.path.join(self.inputs, fname)
def _loadPerfDataInput(self, fname):
perf_data = self._getInput(fname)
fake_objdump = self._getObjdump(perf_data)
with open(perf_data, 'rb') as f:
return LinuxPerfProfile.deserialize(
f, objdump=fake_objdump, propagateExceptions=True)
def test_check_file(self):
self.assertTrue(LinuxPerfProfile.checkFile(self._getInput('fib-aarch64.perf_data')))
def test_aarch64_fib(self):
p = self._loadPerfDataInput('fib-aarch64.perf_data')
self.assertEqual(p.data, self.expected_data['fib-aarch64'])
def test_aarch64_fib2(self):
p = self._loadPerfDataInput('fib2-aarch64.perf_data')
self.assertEqual(p.data, self.expected_data['fib2-aarch64'])
def test_aarch64_fib2_nondynamic(self):
p = self._loadPerfDataInput('fib2-aarch64.perf_data')
self.assertEqual(p.data, self.expected_data['fib2-aarch64'])
def test_random_guff(self):
# Create complete rubbish and throw it at cPerf, expecting an
# AssertionError.
data = b'6492gbiajng295akgjowj210441'
with tempfile.NamedTemporaryFile() as fd:
fd.write(data)
fd.seek(0)
with self.assertRaises(AssertionError):
LinuxPerfProfile.deserialize(fd, propagateExceptions=True)
"""
This test causes a Bus Error (SIGBUS) which cannot be handled correctly.
def test_random_guff2(self):
# Create complete rubbish and throw it at cPerf, expecting an
# AssertionError. This version contains the correct magic number.
data = b'PERFILE28620k hshjsjhs&6362kkjh25090nnjh'
with tempfile.NamedTemporaryFile() as fd:
fd.write(data)
fd.seek(0)
with self.assertRaises(AssertionError):
LinuxPerfProfile.deserialize(fd, propagateExceptions=True)
"""
if __name__ == '__main__':
unittest.main(argv=[sys.argv[0], ])