0
|
1 module dmd.backend.elem;
|
|
2
|
|
3 import dmd.Port;
|
|
4 import dmd.Complex;
|
|
5
|
|
6 import dmd.backend.targ_types;
|
|
7 import dmd.backend.Symbol;
|
|
8 import dmd.backend.PARAM;
|
|
9 import dmd.backend.LIST;
|
|
10 import dmd.backend.Classsym;
|
|
11 import dmd.backend.TYPE;
|
|
12 import dmd.backend.Util;
|
|
13 import dmd.backend.Srcpos;
|
|
14
|
|
15 /*********************************
|
|
16 * Union of all data types. Storage allocated must be the right
|
|
17 * size of the data on the TARGET, not the host.
|
|
18 */
|
|
19
|
|
20 union eve
|
|
21 {
|
|
22 targ_char Vchar;
|
|
23 targ_schar Vschar;
|
|
24 targ_uchar Vuchar;
|
|
25 targ_short Vshort;
|
|
26 targ_ushort Vushort;
|
|
27 targ_int Vint; // also used for tmp numbers (FLtmp)
|
|
28 targ_uns Vuns;
|
|
29 targ_long Vlong;
|
|
30 targ_ulong Vulong;
|
|
31 targ_llong Vllong;
|
|
32 targ_ullong Vullong;
|
|
33 targ_float Vfloat;
|
|
34 targ_double Vdouble;
|
|
35 targ_ldouble Vldouble;
|
|
36 Complex!(float) Vcfloat;
|
|
37 Complex!(double)Vcdouble;
|
|
38 Complex!(real) Vcldouble;
|
|
39 targ_size_t Vpointer;
|
|
40 targ_ptrdiff_t Vptrdiff;
|
|
41 targ_uchar Vreg; // register number for OPreg elems
|
|
42
|
|
43 struct VFP // 48 bit 386 far pointer
|
|
44 { targ_long Voff;
|
|
45 targ_ushort Vseg;
|
|
46 } VFP Vfp;
|
|
47
|
|
48 struct SP
|
|
49 {
|
|
50 targ_size_t Voffset;// offset from symbol
|
|
51 Symbol* Vsym; // pointer to symbol table
|
|
52 union SPU
|
|
53 {
|
|
54 PARAM* Vtal; // template-argument-list for SCfunctempl,
|
|
55 // used only to transmit it to cpp_overload()
|
|
56 LIST* Erd; // OPvar: reaching definitions
|
|
57 } SPU spu;
|
|
58 } SP sp;
|
|
59
|
|
60 struct SM
|
|
61 {
|
|
62 targ_size_t Voffset;// member pointer offset
|
|
63 Classsym* Vsym; // struct tag
|
|
64 elem* ethis; // OPrelconst: 'this' for member pointer
|
|
65 } SM sm;
|
|
66
|
|
67 struct SS
|
|
68 {
|
|
69 targ_size_t Voffset;// offset from string
|
|
70 char* Vstring; // pointer to string (OPstring or OPasm)
|
|
71 targ_size_t Vstrlen;// length of string
|
|
72 } SS ss;
|
|
73
|
|
74 struct EOP
|
|
75 {
|
|
76 elem* Eleft; // left child for unary & binary nodes
|
|
77 elem* Eright; // right child for binary nodes
|
|
78 Symbol* Edtor; // OPctor: destructor
|
|
79 } EOP eop;
|
|
80 } // variants for each type of elem
|
|
81
|
|
82 /******************************************
|
|
83 * Elems:
|
|
84 * Elems are the basic tree element. They can be either
|
|
85 * terminal elems (leaves), unary elems (left subtree exists)
|
|
86 * or binary elems (left and right subtrees exist).
|
|
87 */
|
|
88 struct elem
|
|
89 {
|
|
90 debug {
|
|
91 ushort id;
|
|
92 }
|
|
93
|
|
94 ubyte Eoper; // operator (OPxxxx)
|
|
95 ubyte Ecount; // # of parents of this elem - 1,
|
|
96 // always 0 until CSE elimination is done
|
|
97 eve EV; // variants for each type of elem
|
|
98
|
|
99 ref elem* E1()
|
|
100 {
|
|
101 return EV.eop.Eleft; /* left child */
|
|
102 }
|
|
103
|
|
104 ref elem* E2()
|
|
105 {
|
|
106 return EV.eop.Eright; /* right child */
|
|
107 }
|
|
108
|
|
109 ref LIST* Erd()
|
|
110 {
|
|
111 return EV.sp.spu.Erd; // reaching definition
|
|
112 }
|
|
113
|
|
114 union
|
|
115 {
|
|
116 // PARSER
|
|
117 struct
|
|
118 {
|
|
119 TYPE* ET; // pointer to type of elem
|
|
120 ubyte PEFflags;
|
|
121 }
|
|
122
|
|
123 // OPTIMIZER
|
|
124 struct
|
|
125 {
|
|
126 tym_t Ety; // data type (TYxxxx)
|
|
127 uint Eexp; // index into expnod[]
|
|
128
|
|
129 // These flags are all temporary markers, used once and then
|
|
130 // thrown away.
|
|
131 ubyte Nflags; // NFLxxx
|
|
132 version (MARS) {
|
|
133 ubyte Ejty; // original Jupiter/Mars type
|
|
134 }
|
|
135 }
|
|
136
|
|
137 // CODGEN
|
|
138 struct
|
|
139 {
|
|
140 // Ety2: Must be in same position as Ety!
|
|
141 tym_t Ety2; // data type (TYxxxx)
|
|
142 ubyte Ecomsub; // number of remaining references to
|
|
143 // this common subexp (used to determine
|
|
144 // first, intermediate, and last references
|
|
145 // to a CSE)
|
|
146
|
|
147 version (TARGET_POWERPC) {
|
|
148 ubyte Gflags;
|
|
149 }
|
|
150 }
|
|
151 }
|
|
152
|
|
153 targ_size_t Enumbytes; // number of bytes for type if TYstruct | TYarray
|
|
154 // TARGET_structELEM // target specific additions
|
|
155 Srcpos Esrcpos; // source file position
|
|
156 } |