+/* Enumeration for function flags */
+typedef enum {
+ FF_NONE = 0x0000,
+ FF_HAS_RETURN = 0x0001, /* Function has a return statement */
+ FF_IS_MAIN = 0x0002, /* This is the main function */
+ FF_VOID_RETURN = 0x0004, /* Function returning void */
+} funcflags_t;
+
/* Structure that holds all data needed for function activation */
struct Function {
struct SymEntry* FuncEntry; /* Symbol table entry */
/* Structure that holds all data needed for function activation */
struct Function {
struct SymEntry* FuncEntry; /* Symbol table entry */
- Type* ReturnType; /* Function return type */
+ Type* ReturnType; /* Function return type */
struct FuncDesc* Desc; /* Function descriptor */
struct FuncDesc* Desc; /* Function descriptor */
- int Reserved; /* Reserved local space */
- unsigned RetLab; /* Return code label */
- int TopLevelSP; /* SP at function top level */
+ int Reserved; /* Reserved local space */
+ unsigned RetLab; /* Return code label */
+ int TopLevelSP; /* SP at function top level */
unsigned RegOffs; /* Register variable space offset */
unsigned RegOffs; /* Register variable space offset */
- int HasRetStmt; /* Function has a return statement */
+ funcflags_t Flags; /* Function flags */
};
/* Pointer to current function */
};
/* Pointer to current function */
F->RetLab = GetLocalLabel ();
F->TopLevelSP = 0;
F->RegOffs = RegisterSpace;
F->RetLab = GetLocalLabel ();
F->TopLevelSP = 0;
F->RegOffs = RegisterSpace;
+ F->Flags = IsTypeVoid (F->ReturnType) ? FF_VOID_RETURN : FF_NONE;
/* Return the new structure */
return F;
/* Return the new structure */
return F;
int F_HasVoidReturn (const Function* F)
/* Return true if the function does not have a return value */
{
int F_HasVoidReturn (const Function* F)
/* Return true if the function does not have a return value */
{
- return IsTypeVoid (F->ReturnType);
+ return (F->Flags & FF_VOID_RETURN) != 0;
-void F_HasReturn (Function* F)
+void F_ReturnFound (Function* F)
/* Mark the function as having a return statement */
{
/* Mark the function as having a return statement */
{
+ F->Flags |= FF_HAS_RETURN;
+}
+
+
+
+int F_HasReturn (const Function* F)
+/* Return true if the function contains a return statement*/
+{
+ return (F->Flags & FF_HAS_RETURN) != 0;
+}
+
+
+
+int F_IsMainFunc (const Function* F)
+/* Return true if this is the main function */
+{
+ return (F->Flags & FF_IS_MAIN) != 0;
/* Special handling for main() */
if (strcmp (Func->Name, "main") == 0) {
/* Special handling for main() */
if (strcmp (Func->Name, "main") == 0) {
+
+ /* Mark this as the main function */
+ CurrentFunc->Flags |= FF_IS_MAIN;
+
/* Main cannot be a fastcall function */
if (IsQualFastcall (Func->Type)) {
Error ("`main' cannot be declared as __fastcall__");
/* Main cannot be a fastcall function */
if (IsQualFastcall (Func->Type)) {
Error ("`main' cannot be declared as __fastcall__");
/* Generate swap code */
g_swap_regvars (Param->V.R.SaveOffs, Reg, CheckedSizeOf (Param->Type));
/* Generate swap code */
g_swap_regvars (Param->V.R.SaveOffs, Reg, CheckedSizeOf (Param->Type));
/* If this is not a void function, output a warning if we didn't see a
* return statement.
*/
/* If this is not a void function, output a warning if we didn't see a
* return statement.
*/
- if (!F_HasVoidReturn (CurrentFunc) && !CurrentFunc->HasRetStmt) {
+ if (!F_HasVoidReturn (CurrentFunc) && !F_HasReturn (CurrentFunc)) {
Warning ("Control reaches end of non-void function");
}
Warning ("Control reaches end of non-void function");
}
int F_HasVoidReturn (const Function* F);
/* Return true if the function does not have a return value */
int F_HasVoidReturn (const Function* F);
/* Return true if the function does not have a return value */
-void F_HasReturn (Function* F);
+void F_ReturnFound (Function* F);
/* Mark the function as having a return statement */
/* Mark the function as having a return statement */
+int F_HasReturn (const Function* F);
+/* Return true if the function contains a return statement*/
+
int F_IsVariadic (const Function* F);
/* Return true if this is a variadic function */
int F_IsVariadic (const Function* F);
/* Return true if this is a variadic function */
}
/* Mark the function as having a return statement */
}
/* Mark the function as having a return statement */
- F_HasReturn (CurrentFunc);
+ F_ReturnFound (CurrentFunc);
/* Cleanup the stack in case we're inside a block with locals */
g_space (StackPtr - F_GetTopLevelSP (CurrentFunc));
/* Cleanup the stack in case we're inside a block with locals */
g_space (StackPtr - F_GetTopLevelSP (CurrentFunc));