/* */
/* */
/* */
-/* (C) 2000 Ullrich von Bassewitz */
-/* Wacholderweg 14 */
-/* D-70597 Stuttgart */
-/* EMail: uz@musoftware.de */
+/* (C) 2000-2001 Ullrich von Bassewitz */
+/* Wacholderweg 14 */
+/* D-70597 Stuttgart */
+/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
-#include "../common/xmalloc.h"
+/* common */
+#include "xmalloc.h"
+#include "xsprintf.h"
+/* cc65 */
#include "anonname.h"
#include "asmlabel.h"
#include "codegen.h"
* will usually waste some space but we don't need to dynamically
* grow the array.
*/
- RegSyms = xmalloc (MaxRegSpace * sizeof (RegSyms[0]));
+ RegSyms = (const SymEntry**) xmalloc (MaxRegSpace * sizeof (RegSyms[0]));
RegOffs = MaxRegSpace;
}
ParseDecl (Spec, &Decl, DM_NEED_IDENT);
/* Set the correct storage class for functions */
- if (IsFunc (Decl.Type)) {
+ if (IsTypeFunc (Decl.Type)) {
/* Function prototypes are always external */
if ((SC & SC_EXTERN) == 0) {
- Warning (WARN_FUNC_MUST_BE_EXTERN);
+ Warning ("Function must be extern");
}
SC |= SC_FUNC | SC_EXTERN;
/* Change SC in case it was register */
SC = (SC & ~SC_REGISTER) | SC_AUTO;
- if (curtok == TOK_ASSIGN) {
+ if (CurTok.Tok == TOK_ASSIGN) {
struct expent lval;
/* Setup the type flags for the assignment */
flags = Size == 1? CF_FORCECHAR : CF_NONE;
- /* Get the expression into the primary */
+ /* Get the expression into the primary */
if (evalexpr (flags, hie1, &lval) == 0) {
/* Constant expression. Adjust the types */
assignadjust (Decl.Type, &lval);
g_usebss ();
/* Define the variable label */
- SymData = GetLabel ();
- g_defloclabel (SymData);
+ SymData = GetLocalLabel ();
+ g_defdatalabel (SymData);
/* Reserve space for the data */
g_res (Size);
/* Allow assignments */
- if (curtok == TOK_ASSIGN) {
+ if (CurTok.Tok == TOK_ASSIGN) {
struct expent lval;
- /* Switch to the code segment. */
- g_usecode ();
-
/* Skip the '=' */
NextToken ();
} else if ((SC & SC_STATIC) == SC_STATIC) {
/* Static data */
- if (curtok == TOK_ASSIGN) {
+ if (CurTok.Tok == TOK_ASSIGN) {
- /* Initialization ahead, switch to data segment */
- g_usedata ();
+ /* Initialization ahead, switch to data segment */
+ if (IsQualConst (Decl.Type)) {
+ g_userodata ();
+ } else {
+ g_usedata ();
+ }
- /* Define the variable label */
- SymData = GetLabel ();
- g_defloclabel (SymData);
+ /* Define the variable label */
+ SymData = GetLocalLabel ();
+ g_defdatalabel (SymData);
- /* Skip the '=' */
- NextToken ();
+ /* Skip the '=' */
+ NextToken ();
- /* Allow initialization of static vars */
- ParseInit (Decl.Type);
+ /* Allow initialization of static vars */
+ ParseInit (Decl.Type);
- /* Mark the variable as referenced */
+ /* Mark the variable as referenced */
SC |= SC_REF;
} else {
g_usebss ();
/* Define the variable label */
- SymData = GetLabel ();
- g_defloclabel (SymData);
+ SymData = GetLocalLabel ();
+ g_defdatalabel (SymData);
/* Reserve space for the data */
g_res (Size);
void DeclareLocals (void)
/* Declare local variables and types. */
{
+ /* Remember the current stack pointer */
+ int InitialStack = oursp;
+
/* Loop until we don't find any more variables */
while (1) {
}
/* Accept type only declarations */
- if (curtok == TOK_SEMI) {
+ if (CurTok.Tok == TOK_SEMI) {
/* Type declaration only */
CheckEmptyDecl (&Spec);
NextToken ();
ParseOneDecl (&Spec);
/* Check if there is more */
- if (curtok == TOK_COMMA) {
+ if (CurTok.Tok == TOK_COMMA) {
/* More to come */
NextToken ();
} else {
/* Be sure to allocate any reserved space for locals */
AllocLocalSpace (CurrentFunc);
- /* In case we switched away from code segment, switch back now */
- g_usecode ();
+ /* In case we've allocated local variables in this block, emit a call to
+ * the stack checking routine if stack checks are enabled.
+ */
+ if (CheckStack && InitialStack != oursp) {
+ g_cstackcheck ();
+ }
}