summaryrefslogtreecommitdiff
path: root/tests/mangling/itanium.py
blob: 6bb49d3992d0f85aec70b7169a9886628c453033 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/usr/bin/python3-dbg
# -*- coding: utf-8 -*-


# Tests validant le décodage des types et des routines pour le format Itanium


from chrysacase import ChrysalideTestCase
from pychrysalide.mangling import ItaniumDemangler


class TestItaniumMangling(ChrysalideTestCase):
    """TestCase for pychrysalide.mangling.ItaniumDemangler."""

    def check_demangling(self, got, expected):
        """Check a given demangling result."""

        self.assertEqual(str(got), expected)


    def testItaniumTypeMangling(self):
        """Check Itanium type demangling with specifications samples."""

        # https://itanium-cxx-abi.github.io/cxx-abi/abi-examples.html#mangling

        demangler = ItaniumDemangler()

        demangled = demangler.decode_type('_ZN3FooIA4_iE3barE')
        self.check_demangling(demangled, 'Foo<int[4]>::bar')

        demangled = demangler.decode_type('_ZN1N1fE')
        self.check_demangling(demangled, 'N::f')

        demangled = demangler.decode_type('_ZN5Arena5levelE')
        self.check_demangling(demangled, 'Arena::level')

        demangled = demangler.decode_type('_ZN5StackIiiE5levelE')
        self.check_demangling(demangled, 'Stack<int, int>::level')


    def testItaniumRoutineMangling(self):
        """Check Itanium routine demangling with specifications samples."""

        # https://itanium-cxx-abi.github.io/cxx-abi/abi-examples.html#mangling

        demangler = ItaniumDemangler()

        demangled = demangler.decode_routine('_Z1fv')
        self.check_demangling(demangled, '??? f(void)')

        demangled = demangler.decode_routine('_Z1fi')
        self.check_demangling(demangled, '??? f(int)')

        demangled = demangler.decode_routine('_Z3foo3bar')
        self.check_demangling(demangled, '??? foo(bar)')

        demangled = demangler.decode_routine('_Zrm1XS_')
        self.check_demangling(demangled, '??? operator%(X, X)')

        demangled = demangler.decode_routine('_ZplR1XS0_')
        self.check_demangling(demangled, '??? operator+(X &, X &)')

        demangled = demangler.decode_routine('_ZlsRK1XS1_')
        self.check_demangling(demangled, '??? operator<<(const X &, const X &)')

        demangled = demangler.decode_routine('_Z1fIiEvi')
        self.check_demangling(demangled, 'void f<int>(int)')

        demangled = demangler.decode_routine('_Z5firstI3DuoEvS0_')
        self.check_demangling(demangled, 'void first<Duo>(Duo)')

        demangled = demangler.decode_routine('_Z5firstI3DuoEvT_')
        self.check_demangling(demangled, 'void first<Duo>(Duo)')

        demangled = demangler.decode_routine('_Z3fooIiPFidEiEvv')
        self.check_demangling(demangled, 'void foo<int, int (*) (double), int>(void)')

        demangled = demangler.decode_routine('_ZN6System5Sound4beepEv')
        self.check_demangling(demangled, '??? System::Sound::beep(void)')

        demangled = demangler.decode_routine('_Z1fI1XEvPVN1AIT_E1TE')
        self.check_demangling(demangled, 'void f<X>(volatile A<X>::T *)')

        demangled = demangler.decode_routine('_ZngILi42EEvN1AIXplT_Li2EEE1TE')
        self.check_demangling(demangled, 'void operator-<42>(A<42+2>::T)')

        demangled = demangler.decode_routine('_Z4makeI7FactoryiET_IT0_Ev')
        self.check_demangling(demangled, 'Factory<int> make<Factory, int>(void)')

        demangled = demangler.decode_routine('_Z3foo5Hello5WorldS0_S_')
        self.check_demangling(demangled, '??? foo(Hello, World, World, Hello)')

        demangled = demangler.decode_routine('_ZlsRSoRKSs')
        self.check_demangling(demangled, '??? operator<<(std::ostream &, const std::string &)')


    def testItaniumRoutineManglingInside(self):
        """Check Itanium routine demangling examples within the specifications."""

        # http://refspecs.linuxbase.org/cxxabi-1.83.html#linkage

        demangler = ItaniumDemangler()

        demangled = demangler.decode_routine('_Z1fM1AKFvvE')
        self.check_demangling(demangled, '??? f(const void (A::*) (void))')

        demangled = demangler.decode_routine('_Z1fPFvvEM1SFvvE')
        self.check_demangling(demangled, '??? f(void (*) (void), void (S::*) (void))')

        demangled = demangler.decode_routine('_ZN1N1TIiiE2mfES0_IddE')
        self.check_demangling(demangled, '??? N::T<int, int>::mf(N::T<double, double>)')