From 79561027a08c3d673152775524cf713c80a82323 Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Fri, 15 Jun 2018 17:51:39 -0700 Subject: Make limits 64 bits, add globallines limit to configurable limits Make all limit counters 64 bits, in case someone really has a usage for an insanely large program. The globallines limit was omitted, add it to the list of configurable limits. Signed-off-by: H. Peter Anvin --- asm/eval.c | 2 +- asm/nasm.c | 32 +++++++++++++++++--------------- asm/preproc.c | 4 ++-- include/nasm.h | 9 +++++---- output/outdbg.c | 3 ++- 5 files changed, 27 insertions(+), 23 deletions(-) diff --git a/asm/eval.c b/asm/eval.c index 582f9503..1a6680f2 100644 --- a/asm/eval.c +++ b/asm/eval.c @@ -72,7 +72,7 @@ static void *scpriv; static int *opflags; static struct eval_hints *hint; -static int deadman; +static int64_t deadman; /* diff --git a/asm/nasm.c b/asm/nasm.c index 94bbc6b2..6299831f 100644 --- a/asm/nasm.c +++ b/asm/nasm.c @@ -94,7 +94,8 @@ static bool abort_on_panic = ABORT_ON_PANIC; static bool keep_all; bool tasm_compatible_mode = false; -int pass0, passn; +int pass0; +int64_t passn; static int pass1, pass2; /* XXX: Get rid of these, they are redundant */ int globalrel = 0; int globalbnd = 0; @@ -106,8 +107,7 @@ const char *outname; static const char *listname; static const char *errname; -static int globallineno; /* for forward-reference tracking */ -#define GLOBALLINENO_MAX INT32_MAX +static int64_t globallineno; /* for forward-reference tracking */ /* static int pass = 0; */ const struct ofmt *ofmt = &OF_DEFAULT; @@ -159,10 +159,10 @@ static char *(*quote_for_make)(const char *) = quote_for_pmake; * Execution limits that can be set via a command-line option or %pragma */ -#define LIMIT_MAX_VAL (INT_MAX >> 1) /* Effectively unlimited */ +#define LIMIT_MAX_VAL (INT64_MAX >> 1) /* Effectively unlimited */ -int nasm_limit[LIMIT_MAX+1] = -{ LIMIT_MAX_VAL, 1000, 1000000, 1000000, 1000000 }; +int64_t nasm_limit[LIMIT_MAX+1] = +{ LIMIT_MAX_VAL, 1000, 1000000, 1000000, 1000000, 2000000000 }; struct limit_info { const char *name; @@ -173,7 +173,8 @@ static const struct limit_info limit_info[LIMIT_MAX+1] = { { "stalled-passes", "number of passes without forward progress" }, { "macro-levels", "levels of macro expansion"}, { "rep", "%rep count" }, - { "eval", "expression evaluation descent"} + { "eval", "expression evaluation descent"}, + { "lines", "total source lines processed"} }; enum directive_result @@ -1378,7 +1379,7 @@ static void assemble_file(const char *fname, StrList **depend_ptr) insn output_ins; int i; uint64_t prev_offset_changed; - int stall_count = 0; /* Make sure we make forward progress... */ + int64_t stall_count = 0; /* Make sure we make forward progress... */ switch (cmd_sb) { case 16: @@ -1432,10 +1433,10 @@ static void assemble_file(const char *fname, StrList **depend_ptr) globallineno = 0; while ((line = preproc->getline())) { - if (globallineno++ == GLOBALLINENO_MAX) - nasm_error(ERR_FATAL, - "overall line number reaches the maximum %d\n", - GLOBALLINENO_MAX); + if (++globallineno > nasm_limit[LIMIT_LINES]) + nasm_fatal(0, + "overall line count exceeds the maximum %"PRId64"\n", + nasm_limit[LIMIT_LINES]); /* * Here we parse our directives; this is not handled by the @@ -1639,7 +1640,7 @@ static void assemble_file(const char *fname, StrList **depend_ptr) */ nasm_error(ERR_NONFATAL, "Can't find valid values for all labels " - "after %d passes, giving up.", passn); + "after %"PRId64" passes, giving up.", passn); nasm_error(ERR_NONFATAL, "Possible causes: recursive EQUs, macro abuse."); break; @@ -1650,7 +1651,8 @@ static void assemble_file(const char *fname, StrList **depend_ptr) lfmt->cleanup(); if (!terminate_after_phase && opt_verbose_info) { /* -On and -Ov switches */ - fprintf(stdout, "info: assembly required 1+%d+1 passes\n", passn-3); + fprintf(stdout, "info: assembly required 1+%"PRId64"+1 passes\n", + passn-3); } } @@ -1955,7 +1957,7 @@ static void help(const char xopt) printf(" %-15s %s (default ", limit_info[i].name, limit_info[i].help); if (nasm_limit[i] < LIMIT_MAX_VAL) { - printf("%d)\n", nasm_limit[i]); + printf("%"PRId64")\n", nasm_limit[i]); } else { printf("unlimited)\n"); } diff --git a/asm/preproc.c b/asm/preproc.c index 88bc6971..8e1e6369 100644 --- a/asm/preproc.c +++ b/asm/preproc.c @@ -3044,7 +3044,7 @@ issue_error: count = reloc_value(evalresult); if (count > nasm_limit[LIMIT_REP]) { nasm_error(ERR_NONFATAL, - "`%%rep' count %"PRId64" exceeds limit (currently %d)", + "`%%rep' count %"PRId64" exceeds limit (currently %"PRId64")", count, nasm_limit[LIMIT_REP]); count = 0; } else if (count < 0) { @@ -4195,7 +4195,7 @@ static Token *expand_smacro(Token * tline) Token *org_tline = tline; Context *ctx; const char *mname; - int deadman = nasm_limit[LIMIT_MACROS]; + int64_t deadman = nasm_limit[LIMIT_MACROS]; bool expanded; /* diff --git a/include/nasm.h b/include/nasm.h index a801da46..164ae0e7 100644 --- a/include/nasm.h +++ b/include/nasm.h @@ -768,10 +768,11 @@ enum nasm_limit { LIMIT_STALLED, LIMIT_MACROS, LIMIT_REP, - LIMIT_EVAL + LIMIT_EVAL, + LIMIT_LINES }; -#define LIMIT_MAX LIMIT_EVAL -extern int nasm_limit[LIMIT_MAX+1]; +#define LIMIT_MAX LIMIT_LINES +extern int64_t nasm_limit[LIMIT_MAX+1]; extern enum directive_result nasm_set_limit(const char *, const char *); /* @@ -1250,7 +1251,7 @@ enum decorator_tokens { */ extern int pass0; -extern int passn; /* Actual pass number */ +extern int64_t passn; /* Actual pass number */ extern bool tasm_compatible_mode; extern int optimizing; diff --git a/output/outdbg.c b/output/outdbg.c index 84cccf73..a28e85f7 100644 --- a/output/outdbg.c +++ b/output/outdbg.c @@ -75,7 +75,8 @@ static void dbg_init(void) static void dbg_reset(void) { - fprintf(ofile, "*** pass reset: pass0 = %d, passn = %d\n", pass0, passn); + fprintf(ofile, "*** pass reset: pass0 = %d, passn = %"PRId64"\n", + pass0, passn); } static void dbg_cleanup(void) -- cgit v1.2.1