scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | LICENSE

commit 050713688e684dee2357dac4ade1c481ea9d6f17
parent d0b2ef66dfa60adc27c6c9a7f89e6954afdae838
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Thu,  2 Mar 2023 18:42:24 +0100

cc1: Use FATAL() instead of abort()

FATAL() allows to give some additional information about
the reason to abort.

Diffstat:
Minclude/scc/scc/scc.h | 5+++++
Msrc/cmd/cc/cc1/cc1.h | 5+++--
Msrc/cmd/cc/cc1/code.c | 6+++---
Msrc/cmd/cc/cc1/error.c | 169+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/cmd/cc/cc1/expr.c | 4++--
Msrc/cmd/cc/cc1/fold.c | 2+-
Msrc/cmd/cc/cc1/init.c | 6++++--
Msrc/cmd/cc/cc1/lex.c | 4++--
Msrc/cmd/cc/cc1/symbol.c | 2+-
Msrc/cmd/cc/cc1/types.c | 8++++----
Msrc/libscc/Makefile | 1+
Asrc/libscc/fatal.c | 18++++++++++++++++++
12 files changed, 213 insertions(+), 17 deletions(-)

diff --git a/include/scc/scc/scc.h b/include/scc/scc/scc.h @@ -5,9 +5,11 @@ extern int enadebug; #ifndef NDEBUG #define DBG(...) dbg(__VA_ARGS__) #define DBGON() (enadebug = 1) +#define FATAL(...) fatal(__FILE__, __LINE__, __VA_ARGS__) #else #define DBG(...) #define DBGON() +#define FATAL(...) abort() #endif #define TINT long long @@ -17,6 +19,8 @@ extern int enadebug; #define TFLOAT double #define SIZET size_t +#define NELEM(x) (sizeof(x)/sizeof((x)[0])) + struct items { char **s; unsigned n; @@ -26,6 +30,7 @@ typedef struct alloc Alloc; extern void die(const char *fmt, ...); extern void dbg(const char *fmt, ...); +extern void fatal(char *, int, char *, ...); extern void newitem(struct items *items, char *item); extern void *xmalloc(size_t size); extern void *xcalloc(size_t nmemb, size_t size); diff --git a/src/cmd/cc/cc1/cc1.h b/src/cmd/cc/cc1/cc1.h @@ -129,7 +129,7 @@ enum { CPPMODE }; -/* input tokens */ +/* input tokens (see error.c for strings) */ enum tokens { CONST = 1 << 0, /* type qualifier tokens are used as flags */ RESTRICT = 1 << 1, @@ -216,7 +216,7 @@ enum tokens { EOFTOK }; -/* operations */ +/* operations (see error.c for strings) */ enum op { OADD, OMUL, @@ -433,6 +433,7 @@ extern void unexpected(void); extern void errorp(char *fmt, ...); extern void cpperror(char *fmt, ...); extern Type *deftype(Type *tp); +extern char *opstr(int), *tokstr(int); /* types.c */ extern int eqtype(Type *tp1, Type *tp2, int eqflag); diff --git a/src/cmd/cc/cc1/code.c b/src/cmd/cc/cc1/code.c @@ -230,7 +230,7 @@ emitconst(Node *np) (long long) u & ones(tp->size)); break; default: - abort(); + FATAL("default abort: tp->op = %s\n", tokstr(tp->op)); } } @@ -306,7 +306,7 @@ emittype(int op, void *arg) case ENUM: return; default: - abort(); + FATAL("default abort: tp->op = %s\n", tokstr(tp->op)); } } @@ -404,7 +404,7 @@ emitdesig(Node *np, Type *tp, SIZET *addr) emitpadding(tp, addr); break; default: - abort(); + FATAL("default abort: tp->op = %s\n", tokstr(tp->op)); } if (sym) { diff --git a/src/cmd/cc/cc1/error.c b/src/cmd/cc/cc1/error.c @@ -10,6 +10,175 @@ extern int failure; static unsigned nerrors; +#ifndef NDEBUG +char * +tokstr(int tok) +{ + char *strings[] = { + [CONST] = "CONST", + [RESTRICT] = "RESTRICT", + [VOLATILE] = "VOLATILE", + [INLINE] = "INLINE", + [TQUALIFIER] = "TQUALIFIER", + [MACROPAR] = "MACROPAR", + [CONCAT] = "CONCAT", + [STRINGIZE] = "STRINGIZE", + [TYPE] = "TYPE", + [IDEN] = "IDEN", + [SCLASS] = "SCLASS", + [CONSTANT] = "CONSTANT", + [STRING] = "STRING", + [SIZEOF] = "SIZEOF", + [INDIR] = "INDIR", + [INC] = "INC", + [DEC] = "DEC", + [SHL] = "SHL", + [SHR] = "SHR", + [LE] = "LE", + [GE] = "GE", + [EQ] = "EQ", + [NE] = "NE", + [AND] = "AND", + [OR] = "OR", + [MUL_EQ] = "MUL_EQ", + [DIV_EQ] = "DIV_EQ", + [MOD_EQ] = "MOD_EQ", + [ADD_EQ] = "ADD_EQ", + [SUB_EQ] = "SUB_EQ", + [AND_EQ] = "AND_EQ", + [XOR_EQ] = "XOR_EQ", + [OR_EQ] = "OR_EQ", + [SHL_EQ] = "SHL_EQ", + [SHR_EQ] = "SHR_EQ", + [ELLIPSIS] = "ELLIPSIS", + [CASE] = "CASE", + [DEFAULT] = "DEFAULT", + [IF] = "IF", + [ELSE] = "ELSE", + [SWITCH] = "SWITCH", + [WHILE] = "WHILE", + [DO] = "DO", + [FOR] = "FOR", + [GOTO] = "GOTO", + [VOID] = "VOID", + [FLOAT] = "FLOAT", + [INT] = "INT", + [BOOL] = "BOOL", + [VA_LIST] = "VA_LIST", + [STRUCT] = "STRUCT", + [UNION] = "UNION", + [CHAR] = "CHAR", + [DOUBLE] = "DOUBLE", + [SHORT] = "SHORT", + [LONG] = "LONG", + [LLONG] = "LLONG", + [COMPLEX] = "COMPLEX", + [TYPEDEF] = "TYPEDEF", + [EXTERN] = "EXTERN", + [STATIC] = "STATIC", + [AUTO] = "AUTO", + [REGISTER] = "REGISTER", + [ENUM] = "ENUM", + [TYPEIDEN] = "TYPEIDEN", + [UNSIGNED] = "UNSIGNED", + [SIGNED] = "SIGNED", + [CONTINUE] = "CONTINUE", + [BREAK] = "BREAK", + [RETURN] = "RETURN", + [DEFINE] = "DEFINE", + [DEFINED] = "DEFINED", + [INCLUDE] = "INCLUDE", + [LINE] = "LINE", + [PRAGMA] = "PRAGMA", + [ERROR] = "ERROR", + [IFDEF] = "IFDEF", + [ELIF] = "ELIF", + [IFNDEF] = "IFNDEF", + [UNDEF] = "UNDEF", + [ENDIF] = "ENDIF", + [BUILTIN] = "BUILTIN", + [EOFTOK] = "EOFTOK" + }; + + if (tok >= NELEM(strings) || !strings[tok]) + return "unkown token"; + return strings[tok]; +} + +char * +opstr(int op) +{ + char *strings[] = { + [OADD] = "OADD", + [OMUL] = "OMUL", + [OSUB] = "OSUB", + [OINC] = "OINC", + [ODEC] = "ODEC", + [ODIV] = "ODIV", + [OMOD] = "OMOD", + [OSHL] = "OSHL", + [OSHR] = "OSHR", + [OBAND] = "OBAND", + [OBXOR] = "OBXOR", + [OBOR] = "OBOR", + [OSNEG] = "OSNEG", + [ONEG] = "ONEG", + [OCPL] = "OCPL", + [OAND] = "OAND", + [OOR] = "OOR", + [OEQ] = "OEQ", + [ONE] = "ONE", + [OLT] = "OLT", + [OGE] = "OGE", + [OLE] = "OLE", + [OGT] = "OGT", + [OASSIGN] = "OASSIGN", + [OA_MUL] = "OA_MUL", + [OA_DIV] = "OA_DIV", + [OA_MOD] = "OA_MOD", + [OA_ADD] = "OA_ADD", + [OA_SUB] = "OA_SUB", + [OA_SHL] = "OA_SHL", + [OA_SHR] = "OA_SHR", + [OA_AND] = "OA_AND", + [OA_XOR] = "OA_XOR", + [OA_OR] = "OA_OR", + [OADDR] = "OADDR", + [OCOMMA] = "OCOMMA", + [OCAST] = "OCAST", + [OPTR] = "OPTR", + [OSYM] = "OSYM", + [OASK] = "OASK", + [OCOLON] = "OCOLON", + [OFIELD] = "OFIELD", + [OLABEL] = "OLABEL", + [ODEFAULT] = "ODEFAULT", + [OCASE] = "OCASE", + [OJUMP] = "OJUMP", + [OBRANCH] = "OBRANCH", + [OEXPR] = "OEXPR", + [OEFUN] = "OEFUN", + [OELOOP] = "OELOOP", + [OBLOOP] = "OBLOOP", + [OFUN] = "OFUN", + [OPAR] = "OPAR", + [OCALL] = "OCALL", + [OCALLE] = "OCALLE", + [ORET] = "ORET", + [ODECL] = "ODECL", + [OBSWITCH] = "OBSWITCH", + [OESWITCH] = "OESWITCH", + [OINIT] = "OINIT", + [OBUILTIN] = "OBUILTIN", + [OTYP] = "OTYP", + }; + + if (op >= NELEM(strings) || !strings[op]) + return "unkown operation"; + return strings[op]; +} +#endif + static void warn_error(int flag, char *fmt, va_list va) { diff --git a/src/cmd/cc/cc1/expr.c b/src/cmd/cc/cc1/expr.c @@ -81,7 +81,7 @@ promote(Node *np) tp = doubletype; break; default: - abort(); + FATAL("default abort: tp->op = %s\n", tokstr(tp->op)); } if ((new = convert(np, tp, 1)) != NULL) return new; @@ -466,7 +466,7 @@ negop(int op) case OGE: return OLT; case OLE: return OGT; case OGT: return OLE; - default: abort(); + default: FATAL("default abort: op = %s\n", opstr(op)); } return op; } diff --git a/src/cmd/cc/cc1/fold.c b/src/cmd/cc/cc1/fold.c @@ -305,7 +305,7 @@ foldconst(int type, int op, Type *tp, Symbol *ls, Symbol *rs) return NULL; break; default: - abort(); + FATAL("default abort: type = %s\n", tokstr(type)); } sym = newsym(NS_IDEN, NULL); sym->flags |= SCONSTANT; diff --git a/src/cmd/cc/cc1/init.c b/src/cmd/cc/cc1/init.c @@ -343,8 +343,10 @@ repeat: goto repeat; case ARY: case STRUCT: - if (!(np->flags & NCONST)) - abort(); /* TODO */ + if (!(np->flags & NCONST)) { + /* TODO */ + FATAL("default abort: tp->op = %s\n", tokstr(tp->op)); + } hidden = newsym(NS_IDEN, NULL); hidden->id = newid(); hidden->type = sym->type; diff --git a/src/cmd/cc/cc1/lex.c b/src/cmd/cc/cc1/lex.c @@ -107,7 +107,7 @@ addinput(int type, void *arg, int fail) DBG("INPUT: file input 'stdin'"); break; default: - abort(); + FATAL("default abort: type = %d\n", type); } if (!buffer) { @@ -153,7 +153,7 @@ delinput(void) DBG("INPUT: stdin finished"); break; default: - abort(); + FATAL("default abort: type = %d\n", ip->flags & ITYPE); } input = ip->next; diff --git a/src/cmd/cc/cc1/symbol.c b/src/cmd/cc/cc1/symbol.c @@ -40,7 +40,7 @@ dumpstab(Symbol **tbl, char *msg) else if (tbl == htablbl) size = NR_LBL_HASH; else - abort(); + FATAL("default abort; tbl = %d\n", tbl); for (bp = tbl; bp < &tbl[size]; ++bp) { if (*bp == NULL) diff --git a/src/cmd/cc/cc1/types.c b/src/cmd/cc/cc1/types.c @@ -98,7 +98,7 @@ getlimits(Type *tp) } break; default: - abort(); + FATAL("default abort: tp->op = %s\n", tokstr(tp->op)); } return &limits[ntable][ntype]; @@ -240,7 +240,7 @@ typesize(Type *tp) case FTN: return; default: - abort(); + FATAL("default abort: tp->op = %s\n", tokstr(tp->op)); } } @@ -337,7 +337,7 @@ mktype(Type *tp, int op, TINT nelem, Type *pars[]) create_type: return newtype(&type); default: - abort(); + FATAL("default abort: op = %s\n", tokstr(op)); } tbl = &typetab[HASH(&type)]; @@ -467,7 +467,7 @@ eqtype(Type *tp1, Type *tp2, int equiv) case FLOAT: return tp1->letter == tp2->letter; default: - abort(); + FATAL("default abort: tp1->op = %s\n", tokstr(tp1->op)); } } diff --git a/src/libscc/Makefile b/src/libscc/Makefile @@ -6,6 +6,7 @@ include $(PROJECTDIR)/scripts/rules.mk OBJS =\ debug.o\ die.o\ + fatal.o\ newitem.o\ xcalloc.o\ xmalloc.o\ diff --git a/src/libscc/fatal.c b/src/libscc/fatal.c @@ -0,0 +1,18 @@ +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> + +#include <scc/arg.h> +#include <scc/scc.h> + +void +fatal(char *fname, int lineno, char *fmt, ...) +{ + va_list va; + + va_start(va, fmt); + fprintf(stderr, "%s:", argv0); + vfprintf(stderr, fmt, va); + fputc('\n', stderr); + abort(); +}