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