1 | /*****************************************************************************/ |
2 | /* */ |
3 | /* function.h */ |
4 | /* */ |
5 | /* Function management */ |
6 | /* */ |
7 | /* */ |
8 | /* */ |
9 | /* (C) 1998-2012, Ullrich von Bassewitz */ |
10 | /* Roemerstrasse 52 */ |
11 | /* D-70794 Filderstadt */ |
12 | /* EMail: uz@cc65.org */ |
13 | /* */ |
14 | /* */ |
15 | /* This software is provided 'as-is', without any expressed or implied */ |
16 | /* warranty. In no event will the authors be held liable for any damages */ |
17 | /* arising from the use of this software. */ |
18 | /* */ |
19 | /* Permission is granted to anyone to use this software for any purpose, */ |
20 | /* including commercial applications, and to alter it and redistribute it */ |
21 | /* freely, subject to the following restrictions: */ |
22 | /* */ |
23 | /* 1. The origin of this software must not be misrepresented; you must not */ |
24 | /* claim that you wrote the original software. If you use this software */ |
25 | /* in a product, an acknowledgment in the product documentation would be */ |
26 | /* appreciated but is not required. */ |
27 | /* 2. Altered source versions must be plainly marked as such, and must not */ |
28 | /* be misrepresented as being the original software. */ |
29 | /* 3. This notice may not be removed or altered from any source */ |
30 | /* distribution. */ |
31 | /* */ |
32 | /*****************************************************************************/ |
33 | |
34 | |
35 | |
36 | #ifndef FUNCTION_H |
37 | #define FUNCTION_H |
38 | |
39 | #include "coll.h" |
40 | |
41 | /*****************************************************************************/ |
42 | /* Data */ |
43 | /*****************************************************************************/ |
44 | |
45 | |
46 | /* Enumeration for function flags */ |
47 | typedef enum { |
48 | FF_NONE = 0x0000, |
49 | FF_HAS_RETURN = 0x0001, /* Function has a return statement */ |
50 | FF_IS_MAIN = 0x0002, /* This is the main function */ |
51 | FF_VOID_RETURN = 0x0004, /* Function returning void */ |
52 | } funcflags_t; |
53 | |
54 | /* Structure that holds all data needed for function activation */ |
55 | struct Function { |
56 | struct SymEntry* FuncEntry; /* Symbol table entry */ |
57 | Type* ReturnType; /* Function return type */ |
58 | FuncDesc* Desc; /* Function descriptor */ |
59 | int Reserved; /* Reserved local space */ |
60 | unsigned RetLab; /* Return code label */ |
61 | int TopLevelSP; /* SP at function top level */ |
62 | unsigned RegOffs; /* Register variable space offset */ |
63 | funcflags_t Flags; /* Function flags */ |
64 | Collection LocalsBlockStack; /* Stack of blocks with local vars */ |
65 | }; |
66 | |
67 | /* Structure that holds all data needed for function activation */ |
68 | typedef struct Function Function; |
69 | |
70 | /* Function activation data for current function (or NULL) */ |
71 | extern Function* CurrentFunc; |
72 | |
73 | |
74 | |
75 | /*****************************************************************************/ |
76 | /* Code */ |
77 | /*****************************************************************************/ |
78 | |
79 | |
80 | |
81 | const char* F_GetFuncName (const Function* F); |
82 | /* Return the name of the current function */ |
83 | |
84 | unsigned F_GetParamCount (const Function* F); |
85 | /* Return the parameter count for the current function */ |
86 | |
87 | unsigned F_GetParamSize (const Function* F); |
88 | /* Return the parameter size for the current function */ |
89 | |
90 | Type* F_GetReturnType (Function* F); |
91 | /* Get the return type for the function */ |
92 | |
93 | int F_HasVoidReturn (const Function* F); |
94 | /* Return true if the function does not have a return value */ |
95 | |
96 | void F_ReturnFound (Function* F); |
97 | /* Mark the function as having a return statement */ |
98 | |
99 | int F_HasReturn (const Function* F); |
100 | /* Return true if the function contains a return statement*/ |
101 | |
102 | int F_IsMainFunc (const Function* F); |
103 | /* Return true if this is the main function */ |
104 | |
105 | int F_IsVariadic (const Function* F); |
106 | /* Return true if this is a variadic function */ |
107 | |
108 | int F_IsOldStyle (const Function* F); |
109 | /* Return true if this is an old style (K&R) function */ |
110 | |
111 | int F_HasOldStyleIntRet (const Function* F); |
112 | /* Return true if this is an old style (K&R) function with an implicit int return */ |
113 | |
114 | unsigned F_GetRetLab (const Function* F); |
115 | /* Return the return jump label */ |
116 | |
117 | int F_GetTopLevelSP (const Function* F); |
118 | /* Get the value of the stack pointer on function top level */ |
119 | |
120 | int F_ReserveLocalSpace (Function* F, unsigned Size); |
121 | /* Reserve (but don't allocate) the given local space and return the stack |
122 | ** offset. |
123 | */ |
124 | |
125 | int F_GetStackPtr (const Function* F); |
126 | /* Return the current stack pointer including reserved (but not allocated) |
127 | ** space on the stack. |
128 | */ |
129 | |
130 | void F_AllocLocalSpace (Function* F); |
131 | /* Allocate any local space previously reserved. The function will do |
132 | ** nothing if there is no reserved local space. |
133 | */ |
134 | |
135 | int F_AllocRegVar (Function* F, const Type* Type); |
136 | /* Allocate a register variable for the given variable type. If the allocation |
137 | ** was successful, return the offset of the register variable in the register |
138 | ** bank (zero page storage). If there is no register space left, return -1. |
139 | */ |
140 | |
141 | void NewFunc (struct SymEntry* Func); |
142 | /* Parse argument declarations and function body. */ |
143 | |
144 | |
145 | |
146 | /* End of function.h */ |
147 | |
148 | #endif |
149 | |