1 /*---------------------------------------------------------------------------*
2   Project:  NitroSDK - tools - makelcf
3   File:     makelcf.h
4 
5   Copyright 2003-2008 Nintendo. All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law. They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Log: makelcf.h,v $
14   Revision 1.28  2007/07/09 12:17:54  yasu
15   Support for TARGET_NAME.
16 
17   Revision 1.27  2007/04/10 14:13:20  yasu
18   Support for multiple uses of SEARCH_SYMBOL
19 
20   Revision 1.26  2007/02/20 00:28:10  kitase_hirotake
21   indent source
22 
23   Revision 1.25  2007/01/19 04:35:14  yosizaki
24   Updated copyright.
25 
26   Revision 1.24  2007/01/15 04:58:20  yosizaki
27   Increased DEFAULT_IRQSTACKSIZE to 0x800.
28 
29   Revision 1.23  2006/05/10 02:06:00  yasu
30   Added support for CodeWarrior 2.x
31 
32   Revision 1.22  2006/04/06 09:05:42  kitase_hirotake
33   Support for .itcm.bss .dtcm.bss .wram.bss
34 
35   Revision 1.21  2006/03/29 13:13:22  yasu
36   IF-ELSE-ENDIF support
37 
38   Revision 1.20  2006/01/18 02:11:19  kitase_hirotake
39   do-indent
40 
41   Revision 1.19  2005/09/01 04:30:52  yasu
42   Support for Overlay Group
43 
44   Revision 1.18  2005/08/26 11:23:11  yasu
45   Overlay support for ITCM/DTCM
46 
47   Revision 1.17  2005/06/20 12:21:48  yasu
48   Changed Surffix to Suffix
49 
50   Revision 1.16  2005/02/28 05:26:03  yosizaki
51   do-indent.
52 
53   Revision 1.15  2004/07/10 04:06:17  yasu
54   Added support for command 'Library'
55   Support for modifier ':x' in template
56   Fixed line continue '\' issue
57 
58   Revision 1.14  2004/07/08 02:58:53  yasu
59   Support section name for multi-objects as 'Objects' parameters
60 
61   Revision 1.13  2004/07/02 07:34:53  yasu
62   Added support for OBJECT( )
63 
64   Revision 1.12  2004/06/24 07:18:54  yasu
65   Support for keyword "Autoload"
66 
67   Revision 1.11  2004/06/14 11:28:45  yasu
68   Support for section filter "FOREACH.STATIC.OBJECTS=.sectionName"
69 
70   Revision 1.10  2004/03/26 05:07:11  yasu
71   Support for variables like as -DNAME=VALUE
72 
73   Revision 1.9  2004/02/20 03:38:03  yasu
74   Changed default IRQ stack size from 0xa0 to 0x400
75 
76   Revision 1.8  2004/02/13 07:13:03  yasu
77   Support for SDK_IRQ_STACKSIZE
78 
79   Revision 1.7  2004/02/05 07:09:03  yasu
80   Changed SDK prefix iris to nitro
81 
82   Revision 1.6  2004/01/15 10:49:47  yasu
83   Implementation of a static StackSize
84 
85   Revision 1.5  2004/01/15 06:52:55  yasu
86   Changed default suffix
87 
88   Revision 1.4  2004/01/14 12:38:08  yasu
89   Changed OverlayName to OverlayDefs
90 
91   Revision 1.3  2004/01/14 01:54:01  yasu
92   Changed default filenames of overlay table/namefile
93 
94   Revision 1.2  2004/01/07 13:10:17  yasu
95   Fixed all warnings at compile -Wall
96 
97   Revision 1.1  2004/01/05 02:32:59  yasu
98   Initial version
99 
100   $NoKeywords: $
101  *---------------------------------------------------------------------------*/
102 #ifndef	MAKELCF_H_
103 #define	MAKELCF_H_
104 
105 #include "misc.h"
106 
107 /*============================================================================
108  *  CONTAINER
109  */
110 typedef struct tAfterList
111 {
112     struct tAfter *head;
113     struct tAfter *tail;
114 }
115 tAfterList;
116 
117 typedef struct tAfter
118 {
119     struct tAfter *next;
120     const char *name;
121 }
122 tAfter;
123 
124 typedef struct tObjectList
125 {
126     struct tObject *head;
127     struct tObject *tail;
128 }
129 tObjectList;
130 
131 typedef enum
132 {
133     OBJTYPE_NONE,
134     OBJTYPE_FILE,                      // Regular file
135     OBJTYPE_STAR,                      // "*"
136     OBJTYPE_GROUP,                     // GROUP(xxxx)
137     OBJTYPE_OBJECT                     // OBJECT(yyy,zzz)
138 }
139 tObjectType;
140 
141 #define isNeedSection(obj)      ((obj)->objectType != OBJTYPE_OBJECT)
142 
143 typedef struct tObject
144 {
145     struct tObject *next;
146     const char *objectName;
147     const char *sectionName;
148     tObjectType objectType;
149 }
150 tObject;
151 
152 typedef struct tOverlayList
153 {
154     struct tOverlay *head;
155     struct tOverlay *tail;
156     u32     num;
157 }
158 tOverlayList;
159 
160 typedef enum
161 {
162     MEMTYPE_NONE = 0,
163     MEMTYPE_MAIN,
164     MEMTYPE_MAINEX,
165     MEMTYPE_ITCM,
166     MEMTYPE_DTCM,
167     MEMTYPE_ITCM_BSS,
168     MEMTYPE_DTCM_BSS,
169     MEMTYPE_SHARED,
170     MEMTYPE_WRAM,
171     MEMTYPE_WRAM_BSS,
172     MEMTYPE_VRAM,
173     MEMTYPE_DUMMY,
174 }
175 tMemType;
176 
177 typedef struct tOverlay
178 {
179     struct tOverlay *next;
180     u32     id;
181     const char *name;
182     const char *group;
183     u32     address;
184     char    compressSpec;
185     struct tAfterList afters;
186     struct tObjectList objects;
187     struct tObjectList libraries;
188     struct tObjectList searchSymbols;
189     struct tObjectList forces;
190     tMemType memtype;
191 }
192 tOverlay;
193 
194 typedef struct tStatic
195 {
196     const char *name;
197     u32     address;
198     struct tObjectList objects;
199     struct tObjectList libraries;
200     struct tObjectList searchSymbols;
201     struct tObjectList forces;
202     u32     stacksize;
203     u32     stacksize_irq;
204     tMemType memtype;
205     const char *targetName;
206 }
207 tStatic;
208 
209 typedef struct
210 {
211     const char *overlaydefs;
212     const char *overlaytable;
213     const char *suffix;
214 
215 }
216 tProperty;
217 
218 typedef struct
219 {
220     int count;
221     BOOL isFirst;
222     BOOL isLast;
223 }
224 tForeachStatus;
225 
226 typedef struct
227 {
228     tForeachStatus static_object;
229     tForeachStatus static_library;
230     tForeachStatus static_searchsymbol;
231     tForeachStatus static_force;
232     tForeachStatus autoload;
233     tForeachStatus autoload_object;
234     tForeachStatus autoload_library;
235     tForeachStatus autoload_searchsymbol;
236     tForeachStatus autoload_force;
237     tForeachStatus overlay;
238     tForeachStatus overlay_object;
239     tForeachStatus overlay_library;
240     tForeachStatus overlay_searchsymbol;
241     tForeachStatus overlay_force;
242 }
243 tForeach;
244 
245 BOOL    AddOverlay(const char *overlayName);
246 BOOL    AddAutoload(const char *overlayName);
247 BOOL    OverlaySetId(u32 id);
248 BOOL    OverlaySetGroup(const char *overlayGroup);
249 BOOL    OverlaySetAddress(u32 address);
250 BOOL    OverlayAddAfter(const char *overlayName);
251 BOOL    OverlayAddObject(const char *objectName, tObjectType objectType);
252 BOOL    OverlaySetObjectSection(const char *sectionName);
253 BOOL    OverlayAddLibrary(const char *objectName, tObjectType objectType);
254 BOOL    OverlaySetLibrarySection(const char *sectionName);
255 BOOL    OverlayAddSearchSymbol(const char *searchName);
256 BOOL    OverlayAddForce(const char *forceName);
257 BOOL    OverlaySetCompress(const char *compressSpec);
258 
259 BOOL    StaticSetTargetName(const char *targetName);
260 BOOL    StaticSetName(const char *fileName);
261 BOOL    StaticSetAddress(u32 address);
262 BOOL    StaticAddObject(const char *objectName, tObjectType objectType);
263 BOOL    StaticSetObjectSection(const char *sectionName);
264 BOOL    StaticAddLibrary(const char *objectName, tObjectType objectType);
265 BOOL    StaticSetLibrarySection(const char *sectionName);
266 BOOL    StaticAddSearchSymbol(const char *searchName);
267 BOOL    StaticAddForce(const char *forceName);
268 BOOL    StaticSetStackSize(u32 stacksize);
269 BOOL    StaticSetStackSizeIrq(u32 stacksize);
270 BOOL    PropertySetOverlayDefs(const char *filename);
271 BOOL    PropertySetOverlayTable(const char *filename);
272 BOOL    PropertySetSuffix(const char *suffix);
273 
274 BOOL    CheckSpec(void);
275 void    DumpSpec(void);
276 BOOL    isSame(const char *s1, const char *s2);
277 
278 int     ParseSpecFile(const char *filename);
279 
280 extern tStatic Static;
281 extern tProperty Property;
282 extern tForeach Foreach;
283 extern tOverlayList OverlayList;
284 extern tOverlayList AutoloadList;
285 
286 #define	DEFAULT_OVERLAYDEFS	"%_defs"
287 #define	DEFAULT_OVERLAYTABLE	"%_table"
288 #define	DEFAULT_SUFFIX		".sbin"
289 /* NITRO-SDK4.0RC: increased 0x400->0x800 */
290 #define	DEFAULT_IRQSTACKSIZE	0x800
291 
292 int     spec_yyparse(void);
293 int     spec_yylex(void);
294 void    spec_yyerror(const char *str);
295 
296 
297 /*============================================================================
298  *  TOKEN BUFFER
299  */
300 typedef struct tTokenBuffer
301 {
302     int     id;
303     const char *string;
304     int     loop_end;
305 }
306 tTokenBuffer;
307 
308 typedef struct tLoopStack
309 {
310     int     id;
311     int     start;
312 }
313 tLoopStack;
314 
315 #define	TOKEN_LEN		65536
316 #define	LOOP_STACK_MAX		32
317 
318 int     ParseTlcfFile(const char *filename);
319 int     CreateLcfFile(const char *filename);
320 
321 extern tTokenBuffer tokenBuffer[TOKEN_LEN];
322 extern int tokenBufferEnd;
323 
324 int     tlcf_yyparse(void);
325 int     tlcf_yylex(void);
326 void    tlcf_yyerror(const char *str);
327 void    lcf_error(const char *fmt, ...);
328 
329 extern BOOL DebugMode;
330 void    debug_printf(const char *str, ...);
331 
332 typedef struct
333 {
334     char   *string;
335     tObjectType type;
336 }
337 tObjectName;
338 
339 // For IF-ELSE-ENDIF
340 #define	COND_STACK_MAX		32
341 
342 typedef enum
343 {
344     COND_BLOCK_NOCOND,                 // Nonconditional block
345     COND_BLOCK_IF,                     // if(){} block
346     COND_BLOCK_ELSE                    // else{} block
347 }
348 tCondBlock;
349 
350 typedef struct
351 {
352     BOOL    valid;                     // Condition is TRUE or FALSE
353     tCondBlock block;                  // Regular/if{}/else{}
354 }
355 tCondStack;
356 
357 #endif //MAKELCF_H_
358