about summary refs log tree commit diff stats
path: root/miasm2/arch/x86/ctype.py
blob: 5d1be0deb89df205f98eb191da49a58d8f83db1c (plain) (blame)
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
from miasm2.core.objc import CLeafTypes, ObjCDecl, PADDING_TYPE_NAME
from miasm2.core.ctypesmngr import CTypeId, CTypePtr


class CTypeAMD64_unk(CLeafTypes):
    """Define C types sizes/alignment for x86_64 architecture"""

    obj_pad = ObjCDecl(PADDING_TYPE_NAME, 1, 1) # __padding__ is size 1/align 1

    obj_char = ObjCDecl("char", 1, 1)
    obj_short = ObjCDecl("short", 2, 2)
    obj_int = ObjCDecl("int", 4, 4)
    obj_long = ObjCDecl("long", 8, 8)

    obj_uchar = ObjCDecl("uchar", 1, 1)
    obj_ushort = ObjCDecl("ushort", 2, 2)
    obj_uint = ObjCDecl("uint", 4, 4)
    obj_ulong = ObjCDecl("ulong", 8, 8)

    obj_void = ObjCDecl("void", 1, 1)

    obj_enum = ObjCDecl("enum", 4, 4)

    obj_float = ObjCDecl("float", 4, 4)
    obj_double = ObjCDecl("double", 8, 8)
    obj_ldouble = ObjCDecl("ldouble", 16, 16)

    def __init__(self):
        self.types = {
            CTypeId(PADDING_TYPE_NAME): self.obj_pad,

            CTypeId('char'): self.obj_char,
            CTypeId('short'): self.obj_short,
            CTypeId('int'): self.obj_int,
            CTypeId('void'): self.obj_void,
            CTypeId('long',): self.obj_long,
            CTypeId('float'): self.obj_float,
            CTypeId('double'): self.obj_double,

            CTypeId('signed', 'char'): self.obj_char,
            CTypeId('unsigned', 'char'): self.obj_uchar,

            CTypeId('short', 'int'): self.obj_short,
            CTypeId('signed', 'short'): self.obj_short,
            CTypeId('signed', 'short', 'int'): self.obj_short,
            CTypeId('unsigned', 'short'): self.obj_ushort,
            CTypeId('unsigned', 'short', 'int'): self.obj_ushort,

            CTypeId('unsigned', ): self.obj_uint,
            CTypeId('unsigned', 'int'): self.obj_uint,
            CTypeId('signed', 'int'): self.obj_int,

            CTypeId('long', 'int'): self.obj_long,
            CTypeId('long', 'long'): self.obj_long,
            CTypeId('long', 'long', 'int'): self.obj_long,
            CTypeId('signed', 'long', 'long'): self.obj_long,
            CTypeId('unsigned', 'long', 'long'): self.obj_ulong,
            CTypeId('signed', 'long', 'long', 'int'): self.obj_long,
            CTypeId('unsigned', 'long', 'long', 'int'): self.obj_ulong,

            CTypeId('signed', 'long'): self.obj_long,
            CTypeId('unsigned', 'long'): self.obj_ulong,
            CTypeId('signed', 'long', 'int'): self.obj_long,
            CTypeId('unsigned', 'long', 'int'): self.obj_ulong,

            CTypeId('long', 'double'): self.obj_ldouble,
            CTypePtr(CTypeId('void')): self.obj_ulong,
        }





class CTypeX86_unk(CLeafTypes):
    """Define C types sizes/alignment for x86_32 architecture"""

    obj_pad = ObjCDecl(PADDING_TYPE_NAME, 1, 1) # __padding__ is size 1/align 1

    obj_char = ObjCDecl("char", 1, 1)
    obj_short = ObjCDecl("short", 2, 2)
    obj_int = ObjCDecl("int", 4, 4)
    obj_long = ObjCDecl("long", 4, 4)

    obj_uchar = ObjCDecl("uchar", 1, 1)
    obj_ushort = ObjCDecl("ushort", 2, 2)
    obj_uint = ObjCDecl("uint", 4, 4)
    obj_ulong = ObjCDecl("ulong", 4, 4)

    obj_void = ObjCDecl("void", 1, 1)

    obj_enum = ObjCDecl("enum", 4, 4)

    obj_float = ObjCDecl("float", 4, 4)
    obj_double = ObjCDecl("double", 8, 8)
    obj_ldouble = ObjCDecl("ldouble", 16, 16)

    def __init__(self):
        self.types = {
            CTypeId(PADDING_TYPE_NAME): self.obj_pad,

            CTypeId('char'): self.obj_char,
            CTypeId('short'): self.obj_short,
            CTypeId('int'): self.obj_int,
            CTypeId('void'): self.obj_void,
            CTypeId('long',): self.obj_long,
            CTypeId('float'): self.obj_float,
            CTypeId('double'): self.obj_double,

            CTypeId('signed', 'char'): self.obj_char,
            CTypeId('unsigned', 'char'): self.obj_uchar,

            CTypeId('short', 'int'): self.obj_short,
            CTypeId('signed', 'short'): self.obj_short,
            CTypeId('signed', 'short', 'int'): self.obj_short,
            CTypeId('unsigned', 'short'): self.obj_ushort,
            CTypeId('unsigned', 'short', 'int'): self.obj_ushort,

            CTypeId('unsigned', ): self.obj_uint,
            CTypeId('unsigned', 'int'): self.obj_uint,
            CTypeId('signed', 'int'): self.obj_int,

            CTypeId('long', 'int'): self.obj_long,
            CTypeId('long', 'long'): self.obj_long,
            CTypeId('long', 'long', 'int'): self.obj_long,
            CTypeId('signed', 'long', 'long'): self.obj_long,
            CTypeId('unsigned', 'long', 'long'): self.obj_ulong,
            CTypeId('signed', 'long', 'long', 'int'): self.obj_long,
            CTypeId('unsigned', 'long', 'long', 'int'): self.obj_ulong,

            CTypeId('signed', 'long'): self.obj_long,
            CTypeId('unsigned', 'long'): self.obj_ulong,
            CTypeId('signed', 'long', 'int'): self.obj_long,
            CTypeId('unsigned', 'long', 'int'): self.obj_ulong,

            CTypeId('long', 'double'): self.obj_ldouble,
            CTypePtr(CTypeId('void')): self.obj_uint,
        }