/* common */
-#include "assertdefs.h"
#include "coll.h"
#include "xmalloc.h"
/* An assertion entry */
typedef struct Assertion Assertion;
struct Assertion {
- ExprNode* Expr; /* Expression to evaluate */
- unsigned Action; /* Action to take */
- unsigned Msg; /* Message to print (if any) */
- FilePos Pos; /* File position of assertion */
+ ExprNode* Expr; /* Expression to evaluate */
+ AssertAction Action; /* Action to take */
+ unsigned Msg; /* Message to print (if any) */
+ FilePos Pos; /* File position of assertion */
};
/* Collection with all assertions for a module */
-static Assertion* NewAssertion (ExprNode* Expr, unsigned Action, unsigned Msg)
+static Assertion* NewAssertion (ExprNode* Expr, AssertAction Action, unsigned Msg)
/* Create a new Assertion struct and return it */
{
/* Allocate memory */
-void AddAssertion (ExprNode* Expr, unsigned Action, unsigned Msg)
+void AddAssertion (ExprNode* Expr, AssertAction Action, unsigned Msg)
/* Add an assertion to the assertion table */
{
/* Add an assertion object to the table */
/* Check the assertions */
for (I = 0; I < Count; ++I) {
+ long Val;
+
/* Get the next assertion */
Assertion* A = CollAtUnchecked (&Assertions, I);
+ /* Ignore it, if it should only be evaluated by the linker */
+ if (!AssertAtAsmTime (A->Action)) {
+ continue;
+ }
+
/* Can we evaluate the expression? */
- long Val;
if (IsConstExpr (A->Expr, &Val) && Val == 0) {
/* Apply the action */
const char* Msg = GetString (A->Msg);
/* Write it to the file */
WriteExpr (A->Expr);
- ObjWriteVar (A->Action);
+ ObjWriteVar ((unsigned) A->Action);
ObjWriteVar (A->Msg);
ObjWritePos (&A->Pos);
}
/* */
/* */
/* */
-/* (C) 2003-2005, Ullrich von Bassewitz */
-/* Römerstrasse 52 */
+/* (C) 2003-2009, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* */
+/* common */
+#include "assertion.h"
+
+
+
/*****************************************************************************/
/* Data */
/*****************************************************************************/
-void AddAssertion (struct ExprNode* Expr, unsigned Action, unsigned Msg);
+void AddAssertion (struct ExprNode* Expr, AssertAction Action, unsigned Msg);
/* Add an assertion to the assertion table */
void CheckAssertions (void);
/* */
/* */
/* */
-/* (C) 1998-2008, Ullrich von Bassewitz */
+/* (C) 1998-2009, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* common */
#include "addrsize.h"
-#include "assertdefs.h"
#include "attrib.h"
#include "bitops.h"
#include "check.h"
#include "studyexpr.h"
#include "symtab.h"
-
+
/*****************************************************************************/
/* Forwards */
#include <errno.h>
/* common */
-#include "assertdefs.h"
+#include "assertion.h"
#include "bitops.h"
#include "cddefs.h"
#include "coll.h"
{
static const char* ActionTab [] = {
"WARN", "WARNING",
- "ERROR"
+ "ERROR",
+ "LDWARN", "LDWARNING",
+ "LDERROR",
};
- int Action;
- unsigned Msg;
+ AssertAction Action;
+ unsigned Msg;
/* First we have the expression that has to evaluated */
ExprNode* Expr = Expression ();
ErrorSkip ("Identifier expected");
return;
}
- Action = GetSubKey (ActionTab, sizeof (ActionTab) / sizeof (ActionTab[0]));
- switch (Action) {
+ switch (GetSubKey (ActionTab, sizeof (ActionTab) / sizeof (ActionTab[0]))) {
case 0:
case 1:
Action = ASSERT_ACT_ERROR;
break;
+ case 3:
+ case 4:
+ /* Linker warning */
+ Action = ASSERT_ACT_LDWARN;
+ break;
+
+ case 5:
+ /* Linker error */
+ Action = ASSERT_ACT_LDERROR;
+ break;
+
default:
Error ("Illegal assert action specifier");
+ /* Use lderror - there won't be an .o file anyway */
+ Action = ASSERT_ACT_LDERROR;
+ break;
+
}
NextTok ();
}
/* Remember the assertion */
- AddAssertion (Expr, Action, Msg);
+ AddAssertion (Expr, (AssertAction) Action, Msg);
}
+++ /dev/null
-/*****************************************************************************/
-/* */
-/* assertdefs.h */
-/* */
-/* Definitions for linker assertions */
-/* */
-/* */
-/* */
-/* (C) 2003 Ullrich von Bassewitz */
-/* Römerstrasse 52 */
-/* D-70794 Filderstadt */
-/* EMail: uz@cc65.org */
-/* */
-/* */
-/* This software is provided 'as-is', without any expressed or implied */
-/* warranty. In no event will the authors be held liable for any damages */
-/* arising from the use of this software. */
-/* */
-/* Permission is granted to anyone to use this software for any purpose, */
-/* including commercial applications, and to alter it and redistribute it */
-/* freely, subject to the following restrictions: */
-/* */
-/* 1. The origin of this software must not be misrepresented; you must not */
-/* claim that you wrote the original software. If you use this software */
-/* in a product, an acknowledgment in the product documentation would be */
-/* appreciated but is not required. */
-/* 2. Altered source versions must be plainly marked as such, and must not */
-/* be misrepresented as being the original software. */
-/* 3. This notice may not be removed or altered from any source */
-/* distribution. */
-/* */
-/*****************************************************************************/
-
-
-
-#ifndef ASSERTDEFS_H
-#define ASSERTDEFS_H
-
-
-
-/*****************************************************************************/
-/* Data */
-/*****************************************************************************/
-
-
-
-/* Assertion actions */
-#define ASSERT_ACT_WARN 0x00 /* Print a warning */
-#define ASSERT_ACT_ERROR 0x01 /* Print an error (no output) */
-
-
-
-/* End of assertdefs.h */
-
-#endif
-
-
-
--- /dev/null
+/*****************************************************************************/
+/* */
+/* assertion.c */
+/* */
+/* Definitions for linker assertions */
+/* */
+/* */
+/* */
+/* (C) 2003-2009, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
+/* */
+/* */
+/* This software is provided 'as-is', without any expressed or implied */
+/* warranty. In no event will the authors be held liable for any damages */
+/* arising from the use of this software. */
+/* */
+/* Permission is granted to anyone to use this software for any purpose, */
+/* including commercial applications, and to alter it and redistribute it */
+/* freely, subject to the following restrictions: */
+/* */
+/* 1. The origin of this software must not be misrepresented; you must not */
+/* claim that you wrote the original software. If you use this software */
+/* in a product, an acknowledgment in the product documentation would be */
+/* appreciated but is not required. */
+/* 2. Altered source versions must be plainly marked as such, and must not */
+/* be misrepresented as being the original software. */
+/* 3. This notice may not be removed or altered from any source */
+/* distribution. */
+/* */
+/*****************************************************************************/
+
+
+
+#include "assertion.h"
+
+
+
+/*****************************************************************************/
+/* Code */
+/*****************************************************************************/
+
+
+
+int AssertAtLinkTime (AssertAction A)
+/* Return true if this assertion should be evaluated at link time */
+{
+ /* Currently all assertions are evaluated at link time */
+ return 1;
+}
+
+
+
+int AssertAtAsmTime (AssertAction A)
+/* Return true if this assertion should be evaluated at assembly time */
+{
+ return (A & 0x02U) == 0;
+}
+
+
+
--- /dev/null
+/*****************************************************************************/
+/* */
+/* assertion.h */
+/* */
+/* Definitions for linker assertions */
+/* */
+/* */
+/* */
+/* (C) 2003-2009, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
+/* */
+/* */
+/* This software is provided 'as-is', without any expressed or implied */
+/* warranty. In no event will the authors be held liable for any damages */
+/* arising from the use of this software. */
+/* */
+/* Permission is granted to anyone to use this software for any purpose, */
+/* including commercial applications, and to alter it and redistribute it */
+/* freely, subject to the following restrictions: */
+/* */
+/* 1. The origin of this software must not be misrepresented; you must not */
+/* claim that you wrote the original software. If you use this software */
+/* in a product, an acknowledgment in the product documentation would be */
+/* appreciated but is not required. */
+/* 2. Altered source versions must be plainly marked as such, and must not */
+/* be misrepresented as being the original software. */
+/* 3. This notice may not be removed or altered from any source */
+/* distribution. */
+/* */
+/*****************************************************************************/
+
+
+
+#ifndef ASSERTION_H
+#define ASSERTION_H
+
+
+
+/*****************************************************************************/
+/* Data */
+/*****************************************************************************/
+
+
+
+/* Assertion actions. The second two are linker only (not evaluated by ca65) */
+typedef enum {
+ ASSERT_ACT_WARN = 0x00U, /* Print a warning */
+ ASSERT_ACT_ERROR = 0x01U, /* Print an error */
+ ASSERT_ACT_LDWARN = 0x02U, /* Print a warning (linker only) */
+ ASSERT_ACT_LDERROR = 0x03U, /* Print an error (linker only) */
+} AssertAction;
+
+
+
+/*****************************************************************************/
+/* Code */
+/*****************************************************************************/
+
+
+
+int AssertAtLinkTime (AssertAction A);
+/* Return true if this assertion should be evaluated at link time */
+
+int AssertAtAsmTime (AssertAction A);
+/* Return true if this assertion should be evaluated at assembly time */
+
+
+
+/* End of assertion.h */
+
+#endif
+
+
+
OBJS = abend.o \
addrsize.o \
+ assertion.o \
bitops.o \
chartype.o \
check.o \
OBJS = abend.obj \
addrsize.obj \
+ assertion.obj \
bitops.obj \
chartype.obj \
check.obj \
/* */
/* */
/* */
-/* (C) 2003-2008, Ullrich von Bassewitz */
+/* (C) 2003-2009, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* common */
-#include "assertdefs.h"
+#include "assertion.h"
#include "coll.h"
#include "xmalloc.h"
+/* Assertion struct decl */
+struct Assertion {
+ FilePos Pos; /* File position of assertion */
+ ExprNode* Expr; /* Expression to evaluate */
+ AssertAction Action; /* What to do */
+ unsigned Msg; /* Message to print */
+ ObjData* Obj; /* Object file containing the assertion */
+};
+
/* List with all assertions */
static Collection Assertions = STATIC_COLLECTION_INITIALIZER;
/* Read the fields from the file */
A->Expr = ReadExpr (F, O);
- A->Action = ReadVar (F);
+ A->Action = (AssertAction) ReadVar (F);
A->Msg = MakeGlobalStringId (O, ReadVar (F));
ReadFilePos (F, &A->Pos);
/* Get the assertion */
Assertion* A = CollAtUnchecked (&Assertions, I);
+ /* Ignore assertions that shouldn't be handled at link time */
+ if (!AssertAtLinkTime (A->Action)) {
+ continue;
+ }
+
/* If the expression is not constant, we're not able to handle it */
if (!IsConstExpr (A->Expr)) {
Warning ("Cannot evaluate assertion in module `%s', line %lu",
switch (A->Action) {
case ASSERT_ACT_WARN:
+ case ASSERT_ACT_LDWARN:
Warning ("%s(%lu): %s", Module, A->Pos.Line, Message);
break;
case ASSERT_ACT_ERROR:
+ case ASSERT_ACT_LDERROR:
Error ("%s(%lu): %s", Module, A->Pos.Line, Message);
break;
/* */
/* */
/* */
-/* (C) 2003 Ullrich von Bassewitz */
-/* Römerstrasse 52 */
-/* D-70794 Filderstadt */
-/* EMail: uz@cc65.org */
+/* (C) 2003-2009, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
-/* Assertion object */
+/* Assertion object forward decl */
typedef struct Assertion Assertion;
-struct Assertion {
- FilePos Pos; /* File position of assertion */
- struct ExprNode* Expr; /* Expression to evaluate */
- unsigned Action; /* What to do */
- unsigned Msg; /* Message to print */
- struct ObjData* Obj; /* Object file containing the assertion */
-};
+
+/* ObjData forward decl */
+struct ObjData;