From 1efebb902493a738b163abad42bc2bd4d0e3521a Mon Sep 17 00:00:00 2001 From: uz Date: Sun, 4 Oct 2009 12:40:19 +0000 Subject: [PATCH] Add .assert actions that aren't evaluated at assembly time. git-svn-id: svn://svn.cc65.org/cc65/trunk@4321 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/ca65/asserts.c | 23 ++++--- src/ca65/asserts.h | 11 +++- src/ca65/instr.c | 5 +- src/ca65/pseudo.c | 30 +++++++--- src/common/{assertdefs.h => assertion.c} | 32 +++++----- src/common/assertion.h | 76 ++++++++++++++++++++++++ src/common/make/gcc.mak | 1 + src/common/make/watcom.mak | 1 + src/ld65/asserts.c | 22 ++++++- src/ld65/asserts.h | 20 +++---- 10 files changed, 170 insertions(+), 51 deletions(-) rename src/common/{assertdefs.h => assertion.c} (75%) create mode 100644 src/common/assertion.h diff --git a/src/ca65/asserts.c b/src/ca65/asserts.c index 51083e620..09341d935 100644 --- a/src/ca65/asserts.c +++ b/src/ca65/asserts.c @@ -34,7 +34,6 @@ /* common */ -#include "assertdefs.h" #include "coll.h" #include "xmalloc.h" @@ -57,10 +56,10 @@ /* 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 */ @@ -74,7 +73,7 @@ static Collection Assertions = STATIC_COLLECTION_INITIALIZER; -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 */ @@ -92,7 +91,7 @@ static Assertion* NewAssertion (ExprNode* Expr, unsigned Action, unsigned Msg) -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 */ @@ -112,11 +111,17 @@ void CheckAssertions (void) /* 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); @@ -162,7 +167,7 @@ void WriteAssertions (void) /* Write it to the file */ WriteExpr (A->Expr); - ObjWriteVar (A->Action); + ObjWriteVar ((unsigned) A->Action); ObjWriteVar (A->Msg); ObjWritePos (&A->Pos); } diff --git a/src/ca65/asserts.h b/src/ca65/asserts.h index 09824e9af..fe1925e3c 100644 --- a/src/ca65/asserts.h +++ b/src/ca65/asserts.h @@ -6,8 +6,8 @@ /* */ /* */ /* */ -/* (C) 2003-2005, Ullrich von Bassewitz */ -/* Römerstrasse 52 */ +/* (C) 2003-2009, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ /* */ @@ -38,6 +38,11 @@ +/* common */ +#include "assertion.h" + + + /*****************************************************************************/ /* Data */ /*****************************************************************************/ @@ -55,7 +60,7 @@ struct ExprNode; -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); diff --git a/src/ca65/instr.c b/src/ca65/instr.c index 74529865b..bc6c42667 100644 --- a/src/ca65/instr.c +++ b/src/ca65/instr.c @@ -6,7 +6,7 @@ /* */ /* */ /* */ -/* (C) 1998-2008, Ullrich von Bassewitz */ +/* (C) 1998-2009, Ullrich von Bassewitz */ /* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ @@ -39,7 +39,6 @@ /* common */ #include "addrsize.h" -#include "assertdefs.h" #include "attrib.h" #include "bitops.h" #include "check.h" @@ -60,7 +59,7 @@ #include "studyexpr.h" #include "symtab.h" - + /*****************************************************************************/ /* Forwards */ diff --git a/src/ca65/pseudo.c b/src/ca65/pseudo.c index 00c9bdc72..64a292c5b 100644 --- a/src/ca65/pseudo.c +++ b/src/ca65/pseudo.c @@ -40,7 +40,7 @@ #include /* common */ -#include "assertdefs.h" +#include "assertion.h" #include "bitops.h" #include "cddefs.h" #include "coll.h" @@ -408,11 +408,13 @@ static void DoAssert (void) { 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 (); @@ -423,8 +425,7 @@ static void DoAssert (void) 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: @@ -437,8 +438,23 @@ static void DoAssert (void) 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 (); @@ -470,7 +486,7 @@ static void DoAssert (void) } /* Remember the assertion */ - AddAssertion (Expr, Action, Msg); + AddAssertion (Expr, (AssertAction) Action, Msg); } diff --git a/src/common/assertdefs.h b/src/common/assertion.c similarity index 75% rename from src/common/assertdefs.h rename to src/common/assertion.c index d992f5a19..8d93be430 100644 --- a/src/common/assertdefs.h +++ b/src/common/assertion.c @@ -1,15 +1,15 @@ /*****************************************************************************/ /* */ -/* assertdefs.h */ +/* assertion.c */ /* */ /* Definitions for linker assertions */ /* */ /* */ /* */ -/* (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 */ @@ -33,26 +33,30 @@ -#ifndef ASSERTDEFS_H -#define ASSERTDEFS_H +#include "assertion.h" /*****************************************************************************/ -/* Data */ +/* Code */ /*****************************************************************************/ -/* Assertion actions */ -#define ASSERT_ACT_WARN 0x00 /* Print a warning */ -#define ASSERT_ACT_ERROR 0x01 /* Print an error (no output) */ +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; +} -/* End of assertdefs.h */ - -#endif +int AssertAtAsmTime (AssertAction A) +/* Return true if this assertion should be evaluated at assembly time */ +{ + return (A & 0x02U) == 0; +} diff --git a/src/common/assertion.h b/src/common/assertion.h new file mode 100644 index 000000000..3f41161be --- /dev/null +++ b/src/common/assertion.h @@ -0,0 +1,76 @@ +/*****************************************************************************/ +/* */ +/* 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 + + + diff --git a/src/common/make/gcc.mak b/src/common/make/gcc.mak index 5c40b6851..11b783fae 100644 --- a/src/common/make/gcc.mak +++ b/src/common/make/gcc.mak @@ -11,6 +11,7 @@ LIB = common.a OBJS = abend.o \ addrsize.o \ + assertion.o \ bitops.o \ chartype.o \ check.o \ diff --git a/src/common/make/watcom.mak b/src/common/make/watcom.mak index 46efdbacc..d870c3f02 100644 --- a/src/common/make/watcom.mak +++ b/src/common/make/watcom.mak @@ -57,6 +57,7 @@ endif OBJS = abend.obj \ addrsize.obj \ + assertion.obj \ bitops.obj \ chartype.obj \ check.obj \ diff --git a/src/ld65/asserts.c b/src/ld65/asserts.c index 14da94c3e..d0902e924 100644 --- a/src/ld65/asserts.c +++ b/src/ld65/asserts.c @@ -6,7 +6,7 @@ /* */ /* */ /* */ -/* (C) 2003-2008, Ullrich von Bassewitz */ +/* (C) 2003-2009, Ullrich von Bassewitz */ /* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ @@ -34,7 +34,7 @@ /* common */ -#include "assertdefs.h" +#include "assertion.h" #include "coll.h" #include "xmalloc.h" @@ -54,6 +54,15 @@ +/* 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; @@ -73,7 +82,7 @@ Assertion* ReadAssertion (FILE* F, struct ObjData* O) /* 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); @@ -100,6 +109,11 @@ void CheckAssertions (void) /* 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", @@ -113,10 +127,12 @@ void CheckAssertions (void) 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; diff --git a/src/ld65/asserts.h b/src/ld65/asserts.h index 765be6e47..cc4b7cde4 100644 --- a/src/ld65/asserts.h +++ b/src/ld65/asserts.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (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 */ @@ -51,15 +51,11 @@ -/* 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; -- 2.39.5