1 #include <stdio.h>
2 #include <cut-2/cut.h>
3 #include <string.h>
4 #include "linker/datatypes.h"
5 #include "linker/file.h"
6 #include "linker/module.h"
7 #include "TestModule.h"
8 #include "tables/instructions.h"
9
DBG(char * str)10 char* DBG(char* str)
11 {
12 printf("Debug(%s)\n",str);
13 return str;
14 }
15
DBGI(int i)16 int DBGI(int i)
17 {
18 printf("Debug(%d)\n",i);
19 return i;
20 }
21
TEST_CreateM1GKindTable(int fd)22 void TEST_CreateM1GKindTable(int fd)
23 {
24 LK_FILE_PUT2(fd,2);
25 LK_FILE_PUT1(fd,0x7c); LK_FILE_PutString(fd,"glob0");
26 LK_FILE_PUT1(fd,1); LK_FILE_PutString(fd,"glob1");
27 }
28
TEST_CreateM1LKindTable(int fd)29 void TEST_CreateM1LKindTable(int fd)
30 {
31 LK_FILE_PUT2(fd,2);
32 LK_FILE_PUT1(fd,1);
33 LK_FILE_PUT1(fd,0);
34 }
35
TEST_CreateM1KindTables(int fd)36 void TEST_CreateM1KindTables(int fd)
37 {
38 TEST_CreateM1GKindTable(fd);
39 TEST_CreateM1LKindTable(fd);
40 }
41
TEST_CheckM1GKindTable(int fd)42 void TEST_CheckM1GKindTable(int fd)
43 {
44 char* tmp=NULL;
45 ASSERT(LK_FILE_GET2(fd)==2,"M1 - Global kind count");
46 ASSERT(LK_FILE_GET1(fd)==0x7c,"M1 - GKind0 : Arity");
47 tmp=LK_FILE_GetString(fd); ASSERT(!strcmp(tmp,"glob0"),"M1 - GKind0 : name"); free(tmp);
48 ASSERT(LK_FILE_GET1(fd)==1,"M1 - GKind1 : Arity");
49 tmp=LK_FILE_GetString(fd); ASSERT(!strcmp(tmp,"glob1"),"M1 - GKind1 : name"); free(tmp);
50 }
51
TEST_CheckM1LKindTable(int fd)52 void TEST_CheckM1LKindTable(int fd)
53 {
54 ASSERT(LK_FILE_GET2(fd)==2,"M1 - Local kind count");
55 ASSERT(LK_FILE_GET1(fd)==1,"M1 - LKind0 : Arity");
56 ASSERT(LK_FILE_GET1(fd)==0,"M1 - LKind1 : Arity");
57 }
58
TEST_CheckM1KindTables(int fd)59 void TEST_CheckM1KindTables(int fd)
60 {
61 ASSERT(LK_FILE_GET2(fd)==4,"M1 - Total Kind count");
62 TEST_CheckM1GKindTable(fd);
63 TEST_CheckM1LKindTable(fd);
64 }
65
TEST_CreateM1TySkelTable(int fd)66 void TEST_CreateM1TySkelTable(int fd)
67 {
68 LK_FILE_PUT2(fd,2);
69 LK_FILE_PUT1(fd,ARROW);
70 LK_FILE_PUT1(fd,KIND);LK_FILE_PUT1(fd,GLOBAL);LK_FILE_PUT2(fd,1);
71 LK_FILE_PUT1(fd,VARIABLE);LK_FILE_PUT1(fd,1);
72 LK_FILE_PUT1(fd,VARIABLE);LK_FILE_PUT1(fd,1);
73 LK_FILE_PUT1(fd,VARIABLE);LK_FILE_PUT1(fd,1);
74 }
75
TEST_CheckM1TySkelTable(int fd)76 void TEST_CheckM1TySkelTable(int fd)
77 {
78 ASSERT(LK_FILE_GET2(fd)==2,"NumTySkels");
79 ASSERT(LK_FILE_GET1(fd)==ARROW,"->");
80 ASSERT(LK_FILE_GET1(fd)==KIND,"K");
81 ASSERT(LK_FILE_GET1(fd)==GLOBAL,"G");
82 ASSERT(LK_FILE_GET2(fd)==1,"1");
83 ASSERT(LK_FILE_GET1(fd)==VARIABLE,"V");
84 ASSERT(LK_FILE_GET1(fd)==1,"1");
85 ASSERT(LK_FILE_GET1(fd)==VARIABLE,"V");
86 ASSERT(LK_FILE_GET1(fd)==1,"1");
87
88 ASSERT(LK_FILE_GET1(fd)==VARIABLE,"V");
89 ASSERT(LK_FILE_GET1(fd)==1,"1");
90 }
91
TEST_CreateM1GConstTable(int fd)92 void TEST_CreateM1GConstTable(int fd)
93 {
94 LK_FILE_PUT2(fd,2);
95 LK_FILE_PUT1(fd,3);LK_FILE_PUT1(fd,3);LK_FILE_PUT1(fd,3);
96 LK_FILE_PutString(fd,"Glob0");LK_FILE_PUT2(fd,1);
97 LK_FILE_PUT1(fd,0);LK_FILE_PUT1(fd,3);LK_FILE_PUT1(fd,3);
98 LK_FILE_PutString(fd,"Glob1");LK_FILE_PUT2(fd,1);
99 }
100
TEST_CreateM1LConstTable(int fd)101 void TEST_CreateM1LConstTable(int fd)
102 {
103 LK_FILE_PUT2(fd,2);
104
105 LK_FILE_PUT1(fd,3);LK_FILE_PUT1(fd,3);LK_FILE_PUT1(fd,3);
106 LK_FILE_PUT2(fd,1);
107
108 LK_FILE_PUT1(fd,0);LK_FILE_PUT1(fd,3);LK_FILE_PUT1(fd,3);
109 LK_FILE_PUT2(fd,1);
110 }
111
TEST_CreateM1HConstTable(int fd)112 void TEST_CreateM1HConstTable(int fd)
113 {
114 LK_FILE_PUT2(fd,2);
115
116 LK_FILE_PUT2(fd,1);
117
118 LK_FILE_PUT2(fd,1);
119 }
120
TEST_CreateM1ConstTables(int fd)121 void TEST_CreateM1ConstTables(int fd)
122 {
123 TEST_CreateM1GConstTable(fd);
124 TEST_CreateM1LConstTable(fd);
125 TEST_CreateM1HConstTable(fd);
126 }
127
TEST_CheckM1GConstTable(int fd)128 void TEST_CheckM1GConstTable(int fd)
129 {
130 char* tmp=NULL;
131 ASSERT(LK_FILE_GET2(fd)==2,"M1 - Global constant count");
132 ASSERT(LK_FILE_GET1(fd)==3,"M1 - GConst0 : fixity");
133 ASSERT(LK_FILE_GET1(fd)==3,"M1 - GConst0 : precedence");
134 ASSERT(LK_FILE_GET1(fd)==3,"M1 - GConst0 : ty_env_size");
135 tmp=LK_FILE_GetString(fd);
136 ASSERT(!strcmp(tmp,"Glob0"),"M1 - GConst0 : name");
137 free(tmp);
138 ASSERT(LK_FILE_GET2(fd)==1,"M1 - GConst0 : ty_skel_index");
139 ASSERT(LK_FILE_GET1(fd)==0,"M1 - GConst1 : fixity");
140 ASSERT(LK_FILE_GET1(fd)==3,"M1 - GConst1 : precedence");
141 ASSERT(LK_FILE_GET1(fd)==3,"M1 - GConst1 : ty_env_size");
142 tmp=LK_FILE_GetString(fd);
143 ASSERT(!strcmp(tmp,"Glob1"),"M1 - GConst1 : name");
144 free(tmp);
145 ASSERT(LK_FILE_GET2(fd)==1,"M1 - GConst1 : ty_skel_index");
146 }
147
TEST_CheckM1LConstTable(int fd)148 void TEST_CheckM1LConstTable(int fd)
149 {
150 ASSERT(LK_FILE_GET2(fd)==2,"M1 - Local constant count");
151 ASSERT(LK_FILE_GET1(fd)==3,"M1 - LConst0 : fixity");
152 ASSERT(LK_FILE_GET1(fd)==3,"M1 - LConst0 : precedence");
153 ASSERT(LK_FILE_GET1(fd)==3,"M1 - LConst0 : ty_env_size");
154 ASSERT(LK_FILE_GET2(fd)==1,"M1 - LConst0 : ty_skel_index");
155 ASSERT(LK_FILE_GET1(fd)==0,"M1 - LConst1 : fixity");
156 ASSERT(LK_FILE_GET1(fd)==3,"M1 - LConst1 : precedence");
157 ASSERT(LK_FILE_GET1(fd)==3,"M1 - LConst1 : ty_env_size");
158 ASSERT(LK_FILE_GET2(fd)==1,"M1 - LConst1 : ty_skel_index");
159 }
160
TEST_CheckM1HConstTable(int fd)161 void TEST_CheckM1HConstTable(int fd)
162 {
163 ASSERT(LK_FILE_GET2(fd)==2,"M1 - Hidden constant count");
164 ASSERT(LK_FILE_GET2(fd)==1,"M1 - HConst0 : ty_skel_index");
165 ASSERT(LK_FILE_GET2(fd)==1,"M1 - HConst1 : ty_skel_index");
166 }
167
TEST_CheckM1ConstTables(int fd)168 void TEST_CheckM1ConstTables(int fd)
169 {
170 ASSERT(LK_FILE_GET2(fd)==6,"M1 - Total Const count");
171 TEST_CheckM1GConstTable(fd);
172 TEST_CheckM1LConstTable(fd);
173 TEST_CheckM1HConstTable(fd);
174 }
175
TEST_CreateM1StringTable(int fd)176 void TEST_CreateM1StringTable(int fd)
177 {
178 LK_FILE_PUT2(fd,4);
179 LK_FILE_PutString(fd,"A String");
180 LK_FILE_PutString(fd,"Another String");
181 LK_FILE_PutString(fd,"YAS");
182 LK_FILE_PutString(fd,"Yet Another String");
183 }
184
TEST_CheckM1StringTable(int fd)185 void TEST_CheckM1StringTable(int fd)
186 {
187 char* tmp=NULL;
188 ASSERT(LK_FILE_GET2(fd)==4,"M1 - Strings count");
189 tmp=LK_FILE_GetString(fd);
190 ASSERT(!strcmp(tmp,"A String"),"M1 - String0");
191 free(tmp);
192 tmp=LK_FILE_GetString(fd);
193 ASSERT(!strcmp(tmp,"Another String"),"M1 - String1");
194 free(tmp);
195 tmp=LK_FILE_GetString(fd);
196 ASSERT(!strcmp(tmp,"YAS"),"M1 - String2");
197 free(tmp);
198 tmp=LK_FILE_GetString(fd);
199 ASSERT(!strcmp(tmp,"Yet Another String"),"M1 - String3");
200 free(tmp);
201 }
202
203 const int M1CodeSize=0x200;
204
TEST_CreateM1CodeSize(int fd)205 void TEST_CreateM1CodeSize(int fd)
206 {
207 LK_FILE_PUTWord(fd,(Word)M1CodeSize);
208 }
209
TEST_CreateM1ImplGoalTable(int fd)210 void TEST_CreateM1ImplGoalTable(int fd)
211 {
212 LK_FILE_PUT2(fd,1);//count
213 LK_FILE_PUT2(fd,1);//nctsize
214 LK_FILE_PUT1(fd,LOCAL); LK_FILE_PUT2(fd,0);
215 LK_FILE_PUT1(fd,1);//fcf
216 LK_FILE_PUT2(fd,1);//nop
217 LK_FILE_PUT1(fd,LOCAL); LK_FILE_PUT2(fd,0);
218 LK_FILE_PUTWord(fd,(Word)0x100);
219 }
220
TEST_CheckM1ImplGoalTable(int fd)221 void TEST_CheckM1ImplGoalTable(int fd)
222 {
223 ASSERT(LK_FILE_GET2(fd)==1,"M1 - ImplGoal count");
224 ASSERT(LK_FILE_GET2(fd)==1,"M1 - ImplGoal1 - NCT Size");
225 ASSERT(LK_FILE_GET1(fd)==LOCAL,"M1 - ImplGoal1 - NCT - L0");
226 ASSERT(LK_FILE_GET2(fd)==0,"M1 - ImplGoal1 - NCT - L0");
227 ASSERT(LK_FILE_GET1(fd)==1,"M1 - ImplGoal1 - FCF");
228 ASSERT(LK_FILE_GET2(fd)==1,"M1 - ImplGoal1 - NOP");
229 ASSERT(LK_FILE_GET1(fd)==LOCAL,"M1 - ImplGoal1 - ST - L0");
230 ASSERT(LK_FILE_GET2(fd)==0,"M1 - ImplGoal1 - ST - L0");
231 ASSERT(LK_FILE_GETWord(fd)==(Word)0x100,"M1 - ImplGoal1 - ST - L0");
232 }
233
TEST_CreateM1HashTabs(int fd)234 void TEST_CreateM1HashTabs(int fd)
235 {
236 LK_FILE_PUT2(fd,1);
237 LK_FILE_PUT2(fd,1);//nop
238 LK_FILE_PUT1(fd,LOCAL); LK_FILE_PUT2(fd,0);
239 LK_FILE_PUTWord(fd,(Word)0x100);
240 }
241
TEST_CheckM1HashTabs(int fd)242 void TEST_CheckM1HashTabs(int fd)
243 {
244 ASSERT(LK_FILE_GET2(fd)==1,"M1 - HashTab count");
245 ASSERT(LK_FILE_GET2(fd)==1,"M1 - HashTab1 - NOP");
246 ASSERT(LK_FILE_GET1(fd)==LOCAL,"M1 - HashTab1 - L0");
247 ASSERT(LK_FILE_GET2(fd)==0,"M1 - HashTab1 - L0");
248 ASSERT(LK_FILE_GETWord(fd)==(Word)0x100,"M1 - HashTab1 - L0");
249 }
250
TEST_CreateM1BvrTabs(int fd)251 void TEST_CreateM1BvrTabs(int fd)
252 {
253 LK_FILE_PUT2(fd,1);
254 LK_FILE_PUT2(fd,1);//nop
255 LK_FILE_PUT1(fd,1);
256 LK_FILE_PUTWord(fd,(Word)0x100);
257 }
258
TEST_CheckM1BvrTabs(int fd)259 void TEST_CheckM1BvrTabs(int fd)
260 {
261 ASSERT(LK_FILE_GET2(fd)==1,"M1 - BvrTab count");
262 ASSERT(LK_FILE_GET2(fd)==1,"M1 - BvrTab1 - NOP");
263 ASSERT(LK_FILE_GET1(fd)==1,"M1 - BvrTab1 - Index1 id");
264 ASSERT(LK_FILE_GETWord(fd)==(Word)0x100,"M1 - HashTab1 - Index1 addr");
265 }
266
TEST_CreateM1ImportTable(int fd)267 void TEST_CreateM1ImportTable(int fd)
268 {
269 LK_FILE_PUT2(fd,0);//nctsize
270 LK_FILE_PUT2(fd,0);//nexportdefs
271 LK_FILE_PUT2(fd,1);//nlocalpreds
272 LK_FILE_PUT1(fd,LOCAL); LK_FILE_PUT2(fd,0);
273 LK_FILE_PUT1(fd,1);//fcf
274 LK_FILE_PUT2(fd,1);//nop
275 LK_FILE_PUT1(fd,LOCAL); LK_FILE_PUT2(fd,0);
276 LK_FILE_PUTWord(fd,(Word)0x100);
277 }
278
TEST_CheckM1ImportTable(int fd)279 void TEST_CheckM1ImportTable(int fd)
280 {
281 ASSERT(LK_FILE_GET2(fd)==1,"Import tab count");
282 ASSERT(LK_FILE_GET1(fd)==1,"M1 - IT - NumSegs");
283 ASSERT(LK_FILE_GET2(fd)==0,"M1 - IT - NCTSize");
284 ASSERT(LK_FILE_GET2(fd)==2,"M1 - IT - Local Consts");
285 ASSERT(LK_FILE_GET1(fd)==LOCAL,"M1 - IT - Local Consts - L0");
286 ASSERT(LK_FILE_GET2(fd)==0,"M1 - IT - Local Consts - L0");
287 ASSERT(LK_FILE_GET1(fd)==LOCAL,"M1 - IT - Local Consts - L1");
288 ASSERT(LK_FILE_GET2(fd)==1,"M1 - IT - Local Consts - L1");
289 ASSERT(LK_FILE_GET1(fd)==1,"M1 - IT - FCF");
290 ASSERT(LK_FILE_GET2(fd)==1,"M1 - IT - NOP");
291 ASSERT(LK_FILE_GET1(fd)==LOCAL,"M1 - IT - ST - L0");
292 ASSERT(LK_FILE_GET2(fd)==0,"M1 - IT - ST - L0");
293 ASSERT(LK_FILE_GETWord(fd)==(Word)0x100,"M1 - IT - ST - L0");
294 }
295
TEST_CreateM1Code(int fd)296 void TEST_CreateM1Code(int fd)
297 {
298 int i=0;
299 LK_FILE_PUT1(fd,execute);
300 LK_FILE_PUT1(fd,LOCAL);
301 LK_FILE_PUT2(fd,0);
302 i+=INSTR_instrSize(execute)*sizeof(Word);
303 while(i<M1CodeSize)
304 {
305 LK_FILE_PUT1(fd,fail);
306 i+=INSTR_instrSize(fail)*sizeof(Word);
307 }
308 }
309
TEST_CheckM1Code(int fd)310 void TEST_CheckM1Code(int fd)
311 {
312 int i=0;
313 ASSERT(execute==LK_FILE_GET1(fd),"M1 - Execute");
314 ASSERT(LK_FILE_GETWord(fd)==(Word)0x100,"M1 - Execute - L0");
315 i+=INSTR_instrSize(execute)*sizeof(Word);
316 while(i<M1CodeSize)
317 {
318 ASSERT(fail==LK_FILE_GET1(fd),"M1 - Instr");
319 i+=INSTR_instrSize(fail)*sizeof(Word);
320 }
321 }
322