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     struct tAfterList afters;
185     struct tObjectList objects;
186     struct tObjectList libraries;
187     struct tObjectList searchSymbols;
188     tMemType memtype;
189 
190 }
191 tOverlay;
192 
193 typedef struct tStatic
194 {
195     const char *name;
196     u32     address;
197     struct tObjectList objects;
198     struct tObjectList libraries;
199     struct tObjectList searchSymbols;
200     u32     stacksize;
201     u32     stacksize_irq;
202     tMemType memtype;
203     const char *targetName;
204 }
205 tStatic;
206 
207 typedef struct
208 {
209     const char *overlaydefs;
210     const char *overlaytable;
211     const char *suffix;
212 
213 }
214 tProperty;
215 
216 typedef struct
217 {
218     int count;
219     BOOL isFirst;
220     BOOL isLast;
221 }
222 tForeachStatus;
223 
224 typedef struct
225 {
226     tForeachStatus static_object;
227     tForeachStatus static_library;
228     tForeachStatus static_searchsymbol;
229     tForeachStatus autoload;
230     tForeachStatus autoload_object;
231     tForeachStatus autoload_library;
232     tForeachStatus autoload_searchsymbol;
233     tForeachStatus overlay;
234     tForeachStatus overlay_object;
235     tForeachStatus overlay_library;
236     tForeachStatus overlay_searchsymbol;
237 }
238 tForeach;
239 
240 BOOL    AddOverlay(const char *overlayName);
241 BOOL    AddAutoload(const char *overlayName);
242 BOOL    OverlaySetId(u32 id);
243 BOOL    OverlaySetGroup(const char *overlayGroup);
244 BOOL    OverlaySetAddress(u32 address);
245 BOOL    OverlayAddAfter(const char *overlayName);
246 BOOL    OverlayAddObject(const char *objectName, tObjectType objectType);
247 BOOL    OverlaySetObjectSection(const char *sectionName);
248 BOOL    OverlayAddLibrary(const char *objectName, tObjectType objectType);
249 BOOL    OverlaySetLibrarySection(const char *sectionName);
250 BOOL    OverlayAddSearchSymbol(const char *searchName);
251 
252 BOOL    StaticSetTargetName(const char *targetName);
253 BOOL    StaticSetName(const char *fileName);
254 BOOL    StaticSetAddress(u32 address);
255 BOOL    StaticAddObject(const char *objectName, tObjectType objectType);
256 BOOL    StaticSetObjectSection(const char *sectionName);
257 BOOL    StaticAddLibrary(const char *objectName, tObjectType objectType);
258 BOOL    StaticSetLibrarySection(const char *sectionName);
259 BOOL    StaticAddSearchSymbol(const char *searchName);
260 BOOL    StaticSetStackSize(u32 stacksize);
261 BOOL    StaticSetStackSizeIrq(u32 stacksize);
262 BOOL    PropertySetOverlayDefs(const char *filename);
263 BOOL    PropertySetOverlayTable(const char *filename);
264 BOOL    PropertySetSuffix(const char *suffix);
265 
266 BOOL    CheckSpec(void);
267 void    DumpSpec(void);
268 BOOL    isSame(const char *s1, const char *s2);
269 
270 int     ParseSpecFile(const char *filename);
271 
272 extern tStatic Static;
273 extern tProperty Property;
274 extern tForeach Foreach;
275 extern tOverlayList OverlayList;
276 extern tOverlayList AutoloadList;
277 
278 #define	DEFAULT_OVERLAYDEFS	"%_defs"
279 #define	DEFAULT_OVERLAYTABLE	"%_table"
280 #define	DEFAULT_SUFFIX		".sbin"
281 /* NITRO-SDK4.0RC: increased 0x400->0x800 */
282 #define	DEFAULT_IRQSTACKSIZE	0x800
283 
284 int     spec_yyparse(void);
285 int     spec_yylex(void);
286 void    spec_yyerror(const char *str);
287 
288 
289 /*============================================================================
290  *  TOKEN BUFFER
291  */
292 typedef struct tTokenBuffer
293 {
294     int     id;
295     const char *string;
296     int     loop_end;
297 }
298 tTokenBuffer;
299 
300 typedef struct tLoopStack
301 {
302     int     id;
303     int     start;
304 }
305 tLoopStack;
306 
307 #define	TOKEN_LEN		65536
308 #define	LOOP_STACK_MAX		32
309 
310 int     ParseTlcfFile(const char *filename);
311 int     CreateLcfFile(const char *filename);
312 
313 extern tTokenBuffer tokenBuffer[TOKEN_LEN];
314 extern int tokenBufferEnd;
315 
316 int     tlcf_yyparse(void);
317 int     tlcf_yylex(void);
318 void    tlcf_yyerror(const char *str);
319 void    lcf_error(const char *fmt, ...);
320 
321 extern BOOL DebugMode;
322 void    debug_printf(const char *str, ...);
323 
324 typedef struct
325 {
326     char   *string;
327     tObjectType type;
328 }
329 tObjectName;
330 
331 // For IF-ELSE-ENDIF
332 #define	COND_STACK_MAX		32
333 
334 typedef enum
335 {
336     COND_BLOCK_NOCOND,                 // Nonconditional block
337     COND_BLOCK_IF,                     // if(){} block
338     COND_BLOCK_ELSE                    // else{} block
339 }
340 tCondBlock;
341 
342 typedef struct
343 {
344     BOOL    valid;                     // Condition is TRUE or FALSE
345     tCondBlock block;                  // Regular/if{}/else{}
346 }
347 tCondStack;
348 
349 #endif //MAKELCF_H_
350