diff options
-rw-r--r-- | .gitattributes | 1 | ||||
-rw-r--r-- | asm/listing.c | 9 | ||||
-rw-r--r-- | asm/parser.c | 14 | ||||
-rwxr-xr-x | asm/pptok.pl | 6 | ||||
-rw-r--r-- | asm/preproc.c | 95 | ||||
-rw-r--r-- | asm/stdscan.c | 2 | ||||
-rwxr-xr-x | asm/tokhash.pl | 6 | ||||
-rwxr-xr-x | asm/warnings.pl | 13 | ||||
-rw-r--r-- | config/unconfig.h | 30 | ||||
-rw-r--r-- | configure.ac | 38 | ||||
-rw-r--r-- | doc/changes.src | 11 | ||||
-rwxr-xr-x | doc/genps.pl | 4 | ||||
-rw-r--r-- | doc/head.ps | 8 | ||||
-rw-r--r-- | doc/nasmdoc.css | 1 | ||||
-rw-r--r-- | doc/nasmdoc.src | 260 | ||||
-rw-r--r-- | doc/psfonts.ph | 47 | ||||
-rw-r--r-- | include/compiler.h | 25 | ||||
-rw-r--r-- | include/strlist.h | 8 | ||||
-rwxr-xr-x | macros/macros.pl | 6 | ||||
-rwxr-xr-x | nasmlib/perfhash.pl | 6 | ||||
-rw-r--r-- | nasmlib/strlist.c | 5 | ||||
-rw-r--r-- | test/dup.asm | 15 | ||||
-rw-r--r--[l---------] | test/emptyarg.asm | 148 |
23 files changed, 514 insertions, 244 deletions
diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..d94c5fb3 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +/version -merge diff --git a/asm/listing.c b/asm/listing.c index 9b101ff4..6d6f3606 100644 --- a/asm/listing.c +++ b/asm/listing.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 1996-2019 The NASM Authors - All Rights Reserved + * Copyright 1996-2020 The NASM Authors - All Rights Reserved * See the file AUTHORS included with the NASM distribution for * the specific copyright holders. * @@ -276,8 +276,13 @@ static void list_output(const struct out_data *data) break; case OUT_RESERVE: { - if (size) + if (size > 8) { list_size(offset, "res", size); + } else { + memset(q, '?', size << 1); + q[size << 1] = '\0'; + list_out(offset, q); + } break; } default: diff --git a/asm/parser.c b/asm/parser.c index de24103e..7c24cc00 100644 --- a/asm/parser.c +++ b/asm/parser.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 1996-2019 The NASM Authors - All Rights Reserved + * Copyright 1996-2020 The NASM Authors - All Rights Reserved * See the file AUTHORS included with the NASM distribution for * the specific copyright holders. * @@ -234,7 +234,8 @@ static bool parse_braces(decoflags_t *decoflags) } } -static inline const expr *next_expr(const expr *e, const expr **next_list) +static inline unused +const expr *next_expr(const expr *e, const expr **next_list) { e++; if (!e->type) { @@ -830,7 +831,14 @@ restart_parse: /* DB et al */ result->operands = oper_num; if (oper_num == 0) - nasm_warn(WARN_OTHER, "no operand for data declaration"); + /*! + *!db-empty [on] no operand for data declaration + *! warns about a \c{DB}, \c{DW}, etc declaration + *! with no operands, producing no output. + *! This is permitted, but often indicative of an error. + *! See \k{db}. + */ + nasm_warn(WARN_DB_EMPTY, "no operand for data declaration"); } return result; } diff --git a/asm/pptok.pl b/asm/pptok.pl index a4853f2e..5498cb46 100755 --- a/asm/pptok.pl +++ b/asm/pptok.pl @@ -223,19 +223,19 @@ if ($what eq 'c') { # Put a large value in unused slots. This makes it extremely unlikely # that any combination that involves unused slot will pass the range test. # This speeds up rejection of unrecognized tokens, i.e. identifiers. - print OUT "#define UNUSED (65535/3)\n"; + print OUT "#define UNUSED_HASH_ENTRY (65535/3)\n"; print OUT " static const int16_t hash1[$n] = {\n"; for ($i = 0; $i < $n; $i++) { my $h = ${$g}[$i*2+0]; - print OUT " ", defined($h) ? $h : 'UNUSED', ",\n"; + print OUT " ", defined($h) ? $h : 'UNUSED_HASH_ENTRY', ",\n"; } print OUT " };\n"; print OUT " static const int16_t hash2[$n] = {\n"; for ($i = 0; $i < $n; $i++) { my $h = ${$g}[$i*2+1]; - print OUT " ", defined($h) ? $h : 'UNUSED', ",\n"; + print OUT " ", defined($h) ? $h : 'UNUSED_HASH_ENTRY', ",\n"; } print OUT " };\n"; diff --git a/asm/preproc.c b/asm/preproc.c index 0a6e2451..eee4d8a9 100644 --- a/asm/preproc.c +++ b/asm/preproc.c @@ -345,7 +345,8 @@ static inline bool tok_text_match(const struct Token *a, const struct Token *b) return a->len == b->len && !memcmp(tok_text(a), tok_text(b), a->len); } -static inline bool tok_match(const struct Token *a, const struct Token *b) +static inline unused bool +tok_match(const struct Token *a, const struct Token *b) { return a->type == b->type && tok_text_match(a, b); } @@ -763,7 +764,8 @@ static const char *unquote_token_cstr(Token *t) * TOK_STRING tokens. */ static Token *quote_any_token(Token *t); -static inline Token *quote_token(Token *t) +static inline unused +Token *quote_token(Token *t) { if (likely(!tok_is(t, TOK_INTERNAL_STRING))) return t; @@ -4886,17 +4888,15 @@ static int mmac_rotate(const MMacro *mac, unsigned int n) /* * expands to a list of tokens from %{x:y} */ -static Token *expand_mmac_params_range(MMacro *mac, Token *tline, Token ***last) +void expand_mmac_params_range(MMacro *mac, Token *tline, Token ***tail) { - Token *t = tline, **tt, *tm, *head; - char *pos; - int fst, lst, j, i; - - pos = strchr(tok_text(tline), ':'); - nasm_assert(pos); + Token *t; + const char *arg = tok_text(tline) + 1; + int fst, lst, incr, n; + int parsed; - lst = atoi(pos + 1); - fst = atoi(tok_text(tline) + 1); + parsed = sscanf(arg, "%d:%d", &fst, &lst); + nasm_assert(parsed == 2); /* * only macros params are accounted so @@ -4914,56 +4914,28 @@ static Token *expand_mmac_params_range(MMacro *mac, Token *tline, Token ***last) fst = fst < 0 ? fst + (int)mac->nparam + 1: fst; lst = lst < 0 ? lst + (int)mac->nparam + 1: lst; - /* count from zero */ - fst--, lst--; - /* - * It will be at least one token. Note we - * need to scan params until separator, otherwise - * only first token will be passed. + * It will be at least one parameter, as we can loop + * in either direction. */ - j = (fst + mac->rotate) % mac->nparam; - tm = mac->params[j+1]; - if (!tm) - goto err; - head = dup_Token(NULL, tm); - tt = &head->next, tm = tm->next; - while (tok_isnt(tm, ',')) { - t = dup_Token(NULL, tm); - *tt = t, tt = &t->next, tm = tm->next; - } + incr = (fst < lst) ? 1 : -1; - if (fst < lst) { - for (i = fst + 1; i <= lst; i++) { - t = make_tok_char(NULL, ','); - *tt = t, tt = &t->next; - j = (i + mac->rotate) % mac->nparam; - tm = mac->params[j+1]; - while (tok_isnt(tm, ',')) { - t = dup_Token(NULL, tm); - *tt = t, tt = &t->next, tm = tm->next; - } - } - } else { - for (i = fst - 1; i >= lst; i--) { - t = make_tok_char(NULL, ','); - *tt = t, tt = &t->next; - j = (i + mac->rotate) % mac->nparam; - tm = mac->params[j+1]; - while (!tok_isnt(tm, ',')) { - t = dup_Token(NULL, tm); - *tt = t, tt = &t->next, tm = tm->next; - } - } + while (true) { + n = mmac_rotate(mac, fst); + dup_tlistn(mac->params[n], mac->paramlen[n], tail); + if (fst == lst) + break; + t = make_tok_char(NULL, ','); + **tail = t; + *tail = &t->next; + fst += incr; } - *last = tt; - return head; + return; err: - nasm_nonfatal("`%%{%s}': macro parameters out of range", - tok_text(tline) + 1); - return NULL; + nasm_nonfatal("`%%{%s}': macro parameters out of range", arg); + return; } /* @@ -5014,16 +4986,9 @@ static Token *expand_mmac_params(Token * tline) } if (strchr(text, ':')) { - /* - * seems we have a parameters range here - */ - Token *head, **last; - head = expand_mmac_params_range(mac, t, &last); - if (head) { - *tail = head; - *last = tline; - text = NULL; - } + /* It is a range */ + expand_mmac_params_range(mac, t, &tail); + text = NULL; break; } @@ -5999,7 +5964,7 @@ static MMacro *is_mmacro(Token * tline, int *nparamp, Token ***paramsp) *! The legacy behavior is quite strange and highly context-dependent, *! and can be disabled with: *!- - *! \c %pragma preproc sane_empty_expansion true + *! \c %pragma preproc sane_empty_expansion true *!- *! It is highly recommended to use this option in new code. */ diff --git a/asm/stdscan.c b/asm/stdscan.c index c1c38f42..cbc0fc77 100644 --- a/asm/stdscan.c +++ b/asm/stdscan.c @@ -164,7 +164,7 @@ int stdscan(void *private_data, struct tokenval *tv) *!ptr [on] non-NASM keyword used in other assemblers *! warns about keywords used in other assemblers that might *! indicate a mistake in the source code. Currently only the MASM - *! \c{PTR} keyword is recognized. + *! \c{PTR} keyword is recognized. See also \k{pkg_masm}. */ nasm_warn(WARN_PTR, "`%s' is not a NASM keyword", tv->t_charptr); diff --git a/asm/tokhash.pl b/asm/tokhash.pl index 9dbe77a2..9303157b 100755 --- a/asm/tokhash.pl +++ b/asm/tokhash.pl @@ -234,19 +234,19 @@ if ($output eq 'h') { # Put a large value in unused slots. This makes it extremely unlikely # that any combination that involves unused slot will pass the range test. # This speeds up rejection of unrecognized tokens, i.e. identifiers. - print "#define UNUSED (65535/3)\n"; + print "#define UNUSED_HASH_ENTRY (65535/3)\n"; print " static const int16_t hash1[$n] = {\n"; for ($i = 0; $i < $n; $i++) { my $h = ${$g}[$i*2+0]; - print " ", defined($h) ? $h : 'UNUSED', ",\n"; + print " ", defined($h) ? $h : 'UNUSED_HASH_ENTRY', ",\n"; } print " };\n"; print " static const int16_t hash2[$n] = {\n"; for ($i = 0; $i < $n; $i++) { my $h = ${$g}[$i*2+1]; - print " ", defined($h) ? $h : 'UNUSED', ",\n"; + print " ", defined($h) ? $h : 'UNUSED_HASH_ENTRY', ",\n"; } print " };\n"; diff --git a/asm/warnings.pl b/asm/warnings.pl index a609e132..8a79568a 100755 --- a/asm/warnings.pl +++ b/asm/warnings.pl @@ -253,7 +253,18 @@ if ($what eq 'c') { } else { my $docdef = $whatdef{$warn->{def}}; - @doc = @{$warn->{doc}}; + my $newpara = 0; + foreach my $l (@{$warn->{doc}}) { + if ($l =~ /^\s*$/) { + $newpara = 1; + } else { + if ($newpara && $l !~ /^\\c\s+/) { + $l = '\> ' . $l; + } + $newpara = 0; + } + push(@doc, $l); + } if (defined($docdef)) { push(@doc, "\n", "\\> $docdef by default.\n"); } diff --git a/config/unconfig.h b/config/unconfig.h index d01c2b3e..c7d900fc 100644 --- a/config/unconfig.h +++ b/config/unconfig.h @@ -60,6 +60,12 @@ /* Define to 1 if compiled with the `-Wc90-c99-compat' compiler flag */ /* #undef CFLAGS_WC90_C99_COMPAT */ +/* Define to 1 if compiled with the `-Wc99-compat' compiler flag */ +/* #undef CFLAGS_WC99_COMPAT */ + +/* Define to 1 if compiled with the `-Wc99-extensions' compiler flag */ +/* #undef CFLAGS_WC99_EXTENSIONS */ + /* Define to 1 if compiled with the `-Werror' compiler flag */ /* #undef CFLAGS_WERROR */ @@ -225,6 +231,10 @@ functions */ /* #undef HAVE_FUNC_ATTRIBUTE_SENTINEL */ +/* Define to 1 if your compiler supports __attribute__((unused)) on functions + */ +/* #undef HAVE_FUNC_ATTRIBUTE_UNUSED */ + /* Define to 1 if your compiler supports __attribute__((alloc_size)) on function pointers */ /* #undef HAVE_FUNC_PTR_ATTRIBUTE1_ALLOC_SIZE */ @@ -265,6 +275,10 @@ pointers */ /* #undef HAVE_FUNC_PTR_ATTRIBUTE_SENTINEL */ +/* Define to 1 if your compiler supports __attribute__((unused)) on function + pointers */ +/* #undef HAVE_FUNC_PTR_ATTRIBUTE_UNUSED */ + /* Define to 1 if you have the `getgid' function. */ /* #undef HAVE_GETGID */ @@ -714,6 +728,22 @@ # endif #endif +#ifndef unused_func +# ifdef HAVE_FUNC_ATTRIBUTE_UNUSED +# define unused_func __attribute__((unused)) +# else +# define unused_func +# endif +#endif + +#ifndef unused_func_ptr +# ifdef HAVE_FUNC_PTR_ATTRIBUTE_UNUSED +# define unused_func_ptr __attribute__((unused)) +# else +# define unused_func_ptr +# endif +#endif + #ifndef never_null # ifdef HAVE_FUNC_ATTRIBUTE_RETURNS_NONNULL # define never_null __attribute__((returns_nonnull)) diff --git a/configure.ac b/configure.ac index 85393d03..d9d45837 100644 --- a/configure.ac +++ b/configure.ac @@ -23,12 +23,6 @@ AC_USE_SYSTEM_EXTENSIONS AC_SYS_LARGEFILE AC_PROG_CC AC_PROG_CC_STDC -AC_PROG_LN_S -AC_PROG_MAKE_SET -AC_PROG_INSTALL -AC_PROG_MKDIR_P - -pa_no_optimize=false dnl If the user did not specify a CFLAGS default, change default dnl to -O0 for debugging @@ -36,6 +30,19 @@ PA_ARG_DISABLED([optimization], [compile without optimization (-O0) to help debugging], [pa_no_optimize=true]) +dnl LLVM doesn't error out on invalid -W options unless this option is +dnl specified first. Enable this so this script can actually discover +dnl which -W options are possible for this compiler. +PA_ADD_CFLAGS([-Werror=unknown-warning-option]) + +dnl Other programs +AC_PROG_LN_S +AC_PROG_MAKE_SET +AC_PROG_INSTALL +AC_PROG_MKDIR_P + +pa_no_optimize=false + dnl Compile and link with dwarf debug PA_ARG_ENABLED([gdb], [disable optimization and compile with extra debug information for GDB debugger], @@ -282,6 +289,7 @@ PA_FUNC_ATTRIBUTE(format, [printf,1,2], int, [const char *, ...], ["%d",1]) PA_FUNC_ATTRIBUTE(const) PA_FUNC_ATTRIBUTE(pure) PA_FUNC_ATTRIBUTE(cold,,,,,unlikely_func) +PA_FUNC_ATTRIBUTE(unused) PA_FUNC_ATTRIBUTE_ERROR dnl @@ -320,22 +328,25 @@ PA_ARG_ENABLED([sanitizer], dnl dnl Don't make symbols visible, there is no point and it just -dnl makes the code slower. +dnl makes the code slower. This mainly affects ELF. dnl PA_ADD_CFLAGS([-fvisibility=hidden]) -dnl If we have gcc, add appropriate code cleanliness options +dnl +dnl If we have gcc, add appropriate code cleanliness options. Do this +dnl here at the end, because configure relies on being able to use +dnl some very, very old C constructs. +dnl PA_ADD_CFLAGS([-Wall]) PA_ARG_DISABLED([pedantic], [disable some extra paranoid compiler warnings], [], [PA_ADD_CFLAGS([-W]) PA_ADD_CFLAGS([-pedantic]) - PA_ADD_CFLAGS([-Wc90-c99-compat])]) -dnl LLVM doesn't error out on invalid -W options unless this option is -dnl specified first. Enable this so this script can actually discover -dnl which -W options are possible for this compiler. -PA_ADD_CFLAGS([-Werror=unknown-warning-option]) + PA_ADD_CFLAGS([-Wc90-c99-compat]) + PA_ADD_CFLAGS([-Wc99-compat]) + PA_ADD_CFLAGS([-Wc99-extensions]) +]) dnl Suppress format warning on Windows targets due to their <inttypes.h> PA_ADD_CFLAGS([-Wpedantic-ms-format],[-Wno-pedantic-ms-format]) PA_ADD_CFLAGS([-Wlong-long],[-Wno-long-long]) @@ -347,6 +358,7 @@ dnl on compilers with gcc-like command line syntax we pass the -fwrapv dnl option for exactly that reason. PA_ADD_CFLAGS([-Wshift-negative-value],[-Wno-shift-negative-value]) +dnl Want to turn this on at some point... dnl PA_ADD_CFLAGS([-Wwrite-strings]) PA_ARG_ENABLED([werror], [compile with -Werror to error out on any warning], diff --git a/doc/changes.src b/doc/changes.src index 29f190d4..f33e3ce4 100644 --- a/doc/changes.src +++ b/doc/changes.src @@ -7,6 +7,17 @@ The NASM 2 series supports x86-64, and is the production version of NASM since 2007. +\S{cl-2.15.02} Version 2.15.02 + +\b Fix miscompilation when building with \c{clang}. + +\b Add \c{db-empty} warning class, see \k{opt-w}. + +\b Some documentation improvements and cleanups. + +\b Fix the handling of macro parameter ranges (\c{%\{:\}}), including +with brace-enclosed original arguments. + \S{cl-2.15.01} Version 2.15.01 \b Fix building the documentation from the release archive. For 2.15, diff --git a/doc/genps.pl b/doc/genps.pl index 7cbe23c0..b5a1a8a2 100755 --- a/doc/genps.pl +++ b/doc/genps.pl @@ -1,7 +1,7 @@ #!/usr/bin/perl ## -------------------------------------------------------------------------- ## -## Copyright 1996-2017 The NASM Authors - All Rights Reserved +## Copyright 1996-2020 The NASM Authors - All Rights Reserved ## See the file AUTHORS included with the NASM distribution for ## the specific copyright holders. ## @@ -775,7 +775,7 @@ sub ps_break_lines($$) { my $p; # Code paragraph; each chunk is a line foreach $p ( @data ) { - push(@ls, [[$ptype,0,undef,\%BodyFont,0,0],[$p]]); + push(@ls, [[$ptype,0,undef,\%CodeFont,0,0],[$p]]); } $ls[0]->[0]->[1] |= 1; # First in para $ls[-1]->[0]->[1] |= 2; # Last in para diff --git a/doc/head.ps b/doc/head.ps index 7fbb3a90..6109915d 100644 --- a/doc/head.ps +++ b/doc/head.ps @@ -246,10 +246,10 @@ /norm2 { lmarg exch moveto bfont showstream } def /norm3 { lmarg exch moveto bfont showstream } def -/code0 { lmarg exch moveto bfont showstream } def -/code1 { lmarg exch moveto bfont showstream } def -/code2 { lmarg exch moveto bfont showstream } def -/code3 { lmarg exch moveto bfont showstream } def +/code0 { lmarg exch moveto xfont showstream } def +/code1 { lmarg exch moveto xfont showstream } def +/code2 { lmarg exch moveto xfont showstream } def +/code3 { lmarg exch moveto xfont showstream } def /bull0 { bullmarg exch moveto bfont bwidth showstreamjust } def /bull1 { dup lmarg exch moveto bullet bfont showstream diff --git a/doc/nasmdoc.css b/doc/nasmdoc.css index 6ad9e913..7926d2b4 100644 --- a/doc/nasmdoc.css +++ b/doc/nasmdoc.css @@ -18,6 +18,7 @@ span.subtitle { } code, pre { font-family: "source code pro", "liberation mono", "monospace"; + font-size: 80%; } pre, blockquote { margin-left: 4em; diff --git a/doc/nasmdoc.src b/doc/nasmdoc.src index 86b2c826..eb49d1a8 100644 --- a/doc/nasmdoc.src +++ b/doc/nasmdoc.src @@ -126,7 +126,13 @@ \IR{+ modifier} \c{+} modifier \IR{- opsubtraction} \c{-} operator, binary \IR{- opunary} \c{-} operator, unary -\IR{! opunary} \c{!} operator, unary +\IR{! opunary} \c{!} operator +\IA{A16}{a16} +\IA{A32}{a32} +\IA{A64}{a64} +\IA{O16}{o16} +\IA{O32}{o32} +\IA{O64}{o64} \IR{alignment, in bin sections} alignment, in \c{bin} sections \IR{alignment, in elf sections} alignment, in ELF sections \IR{alignment, in win32 sections} alignment, in \c{win32} sections @@ -152,10 +158,9 @@ variables \IA{case-sensitive}{case sensitive} \IA{case-insensitive}{case sensitive} \IA{character constants}{character constant} -\IR{codeview} CodeView debugging format +\IR{codeview debugging format} CodeView debugging format \IR{common object file format} Common Object File Format -\IR{common variables, alignment in elf} common variables, alignment -in ELF +\IR{common variables, alignment in elf} common variables, alignment in ELF \IR{common, elf extensions to} \c{COMMON}, ELF extensions to \IR{common, obj extensions to} \c{COMMON}, \c{obj} extensions to \IR{declaring structure} declaring structures @@ -165,15 +170,12 @@ in ELF \IR{dll symbols, exporting} DLL symbols, exporting \IR{dll symbols, importing} DLL symbols, importing \IR{dos} DOS -\IR{dos archive} DOS archive -\IR{dos source archive} DOS source archive -\IR{dup} \c{DUP} \IA{effective address}{effective addresses} \IA{effective-address}{effective addresses} \IR{elf} ELF \IR{elf, 16-bit code} ELF, 16-bit code \IR{elf, debug formats} ELF, debug formats -\IR{elf shared libraries} ELF, shared libraries +\IR{elf shared library} ELF, shared libraries \IR{elf32} \c{elf32} \IR{elf64} \c{elf64} \IR{elfx32} \c{elfx32} @@ -186,8 +188,7 @@ in ELF \IR{freebsd} FreeBSD \IR{freelink} FreeLink \IR{functions, c calling convention} functions, C calling convention -\IR{functions, pascal calling convention} functions, Pascal calling -convention +\IR{functions, pascal calling convention} functions, \c{PASCAL} calling convention \IR{global, aoutb extensions to} \c{GLOBAL}, \c{aoutb} extensions to \IR{global, elf extensions to} \c{GLOBAL}, ELF extensions to \IR{global, rdf extensions to} \c{GLOBAL}, \c{rdf} extensions to @@ -199,9 +200,6 @@ convention \IR{linux, elf} Linux, ELF \IR{linux, a.out} Linux, \c{a.out} \IR{linux, as86} Linux, \c{as86} -\IR{logical and} logical AND -\IR{logical or} logical OR -\IR{logical xor} logical XOR \IR{mach object file format} Mach, object file format \IA{mach-o}{macho} \IR{mach-o} Mach-O, object file format @@ -215,24 +213,30 @@ convention \IA{misc directory}{misc subdirectory} \IR{misc subdirectory} \c{misc} subdirectory \IR{microsoft omf} Microsoft OMF -\IR{mmx registers} MMX registers -\IA{modr/m}{modr/m byte} -\IR{modr/m byte} ModR/M byte \IR{ms-dos} MS-DOS \IR{ms-dos device drivers} MS-DOS device drivers \IR{multipush} \c{multipush} macro \IR{nan} NaN \IR{nasm version} NASM version +\IR{nasm version history} NASM version, history +\IR{nasm version macros} NASM version, macros +\IR{nasm version id} NASM version, ID macro +\IR{nasm version string} NASM version, string macro +\IR{arithmetic negation} negation, arithmetic +\IR{bitwise negation} negation, bitwise +\IR{boolean negation} negation, boolean +\IR{boolean and} boolean, AND +\IR{boolean or} boolean, OR +\IR{boolean xor} boolean, XOR \IR{netbsd} NetBSD \IR{nsis} NSIS \IR{nullsoft scriptable installer} Nullsoft Scriptable Installer +\IA{.OBJ}{.obj} \IR{omf} OMF \IR{openbsd} OpenBSD \IR{operating system} operating system \IR{os/2} OS/2 -\IR{pascal calling convention}Pascal calling convention -\IR{passes} passes, assembly -\IR{perl} Perl +\IR{pascal calling convention} Pascal calling convention \IR{pic} PIC \IR{pharlap} PharLap \IR{plt} PLT @@ -253,14 +257,16 @@ Object File Format \IR{section alignment, in win32} section alignment, in \c{win32} \IR{section, elf extensions to} \c{SECTION}, ELF extensions to \IR{section, macho extensions to} \c{SECTION}, \c{macho} extensions to -\IR{section, win32 extensions to} \c{SECTION}, \c{win32} extensions to +\IR{section, windows extensions to} \c{SECTION}, Windows extensions to \IR{segment alignment, in bin} segment alignment, in \c{bin} \IR{segment alignment, in obj} segment alignment, in \c{obj} -\IR{segment, obj extensions to} \c{SEGMENT}, ELF extensions to +\IR{segment, obj extensions to} \c{SEGMENT}, \c{obj} extensions to \IR{segment names, borland pascal} segment names, Borland Pascal \IR{shift command} \c{shift} command -\IA{sib}{sib byte} -\IR{sib byte} SIB byte +\IA{string constant}{string constants} +\IR{string constants} string, constants +\IR{string length} string, length +\IR{string manipulation in macros} string, manipulation in macros \IR{align, smart} \c{ALIGN}, smart \IA{sectalign}{sectalign} \IR{solaris x86} Solaris x86 @@ -271,7 +277,9 @@ Object File Format \IR{thread local storage in elf} thread local storage, in ELF \IR{thread local storage in mach-o} thread local storage, in \c{macho} \IR{tlink} \c{TLINK} +\IR{unconditionally importing symbols} importing symbols, unconditionally \IR{underscore, in c symbols} underscore, in C symbols +\IA{uninitialized storage}{storage, uninitialized} \IR{unicode} Unicode \IR{unix} Unix \IR{utf-8} UTF-8 @@ -279,20 +287,16 @@ Object File Format \IR{utf-32} UTF-32 \IA{sco unix}{unix, sco} \IR{unix, sco} Unix, SCO -\IA{unix source archive}{unix, source archive} -\IR{unix, source archive} Unix, source archive \IA{unix system v}{unix, system v} \IR{unix, system v} Unix, System V \IR{unixware} UnixWare \IR{val} VAL -\IR{version number of nasm} version number of NASM +\IA{version number of nasm}{nasm, version} \IR{visual c++} Visual C++ -\IR{www page} WWW page \IR{win32} Win32 -\IR{win32} Win64 +\IR{win64} Win64 \IR{windows} Windows -\IR{windows 95} Windows 95 -\IR{windows nt} Windows NT +\IR{windows debugging formats} Windows, debugging formats \# \IC{program entry point}{entry point, program} \# \IC{program entry point}{start point, program} \# \IC{MS-DOS device drivers}{device drivers, MS-DOS} @@ -433,7 +437,7 @@ an intervening space. For example: \c nasm -f bin driver.asm -odriver.sys Note that this is a small o, and is different from a capital O , which -is used to specify the number of optimisation passes required. See \k{opt-O}. +is used to specify the number of optimization passes required. See \k{opt-O}. \S{opt-f} The \i\c{-f} Option: Specifying the \i{Output File Format} @@ -1195,21 +1199,21 @@ defines a symbol called \c{eax}, you can refer to \c{$eax} in NASM code to distinguish the symbol from the register. Maximum length of an identifier is 4095 characters. -The instruction field may contain any machine instruction: Pentium -and P6 instructions, FPU instructions, MMX instructions and even +The instruction field may contain any machine instruction: Pentium and +P6 instructions, FPU instructions, MMX instructions and even undocumented instructions are all supported. The instruction may be prefixed by \c{LOCK}, \c{REP}, \c{REPE}/\c{REPZ}, \c{REPNE}/\c{REPNZ}, -\c{XACQUIRE}/\c{XRELEASE} or \c{BND}/\c{NOBND}, in the usual way. Explicit -\I{address-size prefixes}address-size and \i{operand-size prefixes} \i\c{A16}, -\i\c{A32}, \i\c{A64}, \i\c{O16} and \i\c{O32}, \i\c{O64} are provided - one example of their use -is given in \k{mixsize}. You can also use the name of a \I{segment -override}segment register as an instruction prefix: coding -\c{es mov [bx],ax} is equivalent to coding \c{mov [es:bx],ax}. We -recommend the latter syntax, since it is consistent with other -syntactic features of the language, but for instructions such as -\c{LODSB}, which has no operands and yet can require a segment -override, there is no clean syntactic way to proceed apart from -\c{es lodsb}. +\c{XACQUIRE}/\c{XRELEASE} or \c{BND}/\c{NOBND}, in the usual +way. Explicit \I{address-size prefixes}address-size and +\i{operand-size prefixes} \i\c{A16}, \i\c{A32}, \i\c{A64}, \i\c{O16} +and \i\c{O32}, \i\c{O64} are provided - one example of their use is +given in \k{mixsize}. You can also use the name of a \I{segment +override}segment register as an instruction prefix: coding \c{es mov +[bx],ax} is equivalent to coding \c{mov [es:bx],ax}. We recommend the +latter syntax, since it is consistent with other syntactic features of +the language, but for instructions such as \c{LODSB}, which has no +operands and yet can require a segment override, there is no clean +syntactic way to proceed apart from \c{es lodsb}. An instruction is not required to use a prefix: prefixes such as \c{CS}, \c{A32}, \c{LOCK} or \c{REPE} can appear on a line by @@ -1250,10 +1254,11 @@ Pseudo-instructions are things which, though not real x86 machine instructions, are used in the instruction field anyway because that's the most convenient place to put them. The current pseudo-instructions are \i\c{DB}, \i\c{DW}, \i\c{DD}, \i\c{DQ}, \i\c{DT}, \i\c{DO}, -\i\c{DY} and \i\c\{DZ}; their \i{uninitialized} counterparts -\i\c{RESB}, \i\c{RESW}, \i\c{RESD}, \i\c{RESQ}, \i\c{REST}, -\i\c{RESO}, \i\c{RESY} and \i\c\{RESZ}; the \i\c{INCBIN} command, the -\i\c{EQU} command, and the \i\c{TIMES} prefix. +\i\c{DY} and \i\c\{DZ}; their \I{storage, +uninitialized}\i{uninitialized} counterparts \i\c{RESB}, \i\c{RESW}, +\i\c{RESD}, \i\c{RESQ}, \i\c{REST}, \i\c{RESO}, \i\c{RESY} and +\i\c\{RESZ}; the \i\c{INCBIN} command, the \i\c{EQU} command, and the +\i\c{TIMES} prefix. \S{db} \c{DB} and Friends: Declaring Initialized Data @@ -1280,12 +1285,12 @@ the output file. They can be invoked in a wide range of ways: \c{DT}, \c{DO}, \c{DY} and \c{DZ} do not accept \i{numeric constants} as operands. -\I{masmdb} Starting in NASM 2.15, a the following MASM-like features +\I{masmdb} Starting in NASM 2.15, a the following \i{MASM}-like features have been implemented: -\b A \I{?db}\c{?} argument to declare uninitialized data: +\b A \I{?db}\c{?} argument to declare \i{uninitialized storage}: -\c db ? ; uninitialized data +\c db ? ; uninitialized \b A superset of the \i\c{DUP} syntax. The NASM version of this has the following syntax specification; capital letters indicate literal @@ -1308,7 +1313,7 @@ valid: \c db 33 \c db (44) ; Integer expression -\c ; db (44,55) ; Invalid - error +\c ; db (44,55) ; Invalid - error \c db %(44,55) \c db %('XX','YY') \c db ('AA') ; Integer expression - outputs single byte @@ -1355,11 +1360,10 @@ the above example could also be written: \S{incbin} \i\c{INCBIN}: Including External \i{Binary Files} -\c{INCBIN} is borrowed from the old Amiga assembler \i{DevPac}: it -includes a binary file verbatim into the output file. This can be -handy for (for example) including \i{graphics} and \i{sound} data -directly into a game executable file. It can be called in one of -these three ways: +\c{INCBIN} includes binary file data verbatim into the output +file. This can be handy for (for example) including \i{graphics} and +\i{sound} data directly into a game executable file. It can be called +in one of these three ways: \c incbin "file.dat" ; include the whole file \c incbin "file.dat",1024 ; skip the first 1024 bytes @@ -1574,7 +1578,7 @@ Some examples (all producing exactly the same code): \c mov ax,0b1100_1000 ; same binary constant yet again \c mov ax,0y1100_1000 ; same binary constant yet again -\S{strings} \I{Strings}\i{Character Strings} +\S{strings} \I{string}\I{string constants}\i{Character Strings} A character string consists of up to eight characters enclosed in either single quotes (\c{'...'}), double quotes (\c{"..."}) or @@ -1884,15 +1888,15 @@ The \c{|} operator gives a bitwise OR, exactly as performed by the \S{expshift} \i{Bit Shift} Operators \i\c{<<} gives a bit-shift to the left, just as it does in C. So -\c{5<<3} evaluates to 5 times 8, or 40. \i\c{>>} gives an \e{unsigned} -(logical) bit-shift to the right; the bits shifted in from the left -are set to zero. +\c{5<<3} evaluates to 5 times 8, or 40. \i\c{>>} gives an \I{unsigned, +bit shift}\e{unsigned} (logical) bit-shift to the right; the bits +shifted in from the left are set to zero. \i\c{<<<} gives a bit-shift to the left, exactly equivalent to the \c{<<} operator; it is included for completeness. \i\c{>>>} gives an -\e{signed} (arithmetic) bit-shift to the right; the bits shifted in -from the left are filled with copies of the most significant (sign) -bit. +\I{signed, bit shift}\e{signed} (arithmetic) bit-shift to the right; +the bits shifted in from the left are filled with copies of the most +significant (sign) bit. \S{expplmi} \I{+ opaddition}\c{+} and \I{- opsubtraction}\c{-}: @@ -1906,11 +1910,13 @@ subtraction. \i\c{*} is the multiplication operator. -\i\c{/} and \i\c{//} are both division operators: \c{/} is \i{unsigned -division} and \c{//} is \i{signed division}. +\i\c{/} and \i\c{//} are both division operators: \c{/} is +\I{division, unsigned}\I{unsigned, division}unsigned division and \c{//} is +\I{division, signed}\I{signed, division}signed division. -Similarly, \i\c{%} and \i\c{%%} provide \I{unsigned modulo}\I{modulo -operators} unsigned and \i{signed modulo} operators respectively. +Similarly, \i\c{%} and \i\c{%%} provide \I{modulo, +unsigned}\I{unsigned, modulo}unsigned and \I{modulo, signed}\I{signed, +modulo}signed modulo operators respectively. Since the \c{%} character is used extensively by the macro \i{preprocessor}, you should ensure that both the signed and unsigned @@ -1923,22 +1929,27 @@ the signed division operator, such that: \c b * (a // b) + (a %% b) = a (b != 0) -\S{expmul} \i{Unary Operators} +\S{expmul} \I{operators, unary}\i{Unary Operators} The highest-priority operators in NASM's expression grammar are those -which only apply to one argument. These are \I{+ opunary}\c{+}, \I{- -opunary}\c{-}, \i\c{~}, \I{! opunary}\c{!}, \i\c{SEG}, and the -\i{integer functions} operators. +which only apply to one argument. These are: + +\b \I{- opunary}\c{-} \I{arithmetic negation}negates (\i{2's complement}) its +operand. + +\b \I{+ opunary}\c{+} does nothing; it's provided for symmetry with \c{-}. + +\b \I{~ opunary}\c{~} computes the \I{negation, bitwise}\i{bitwise +negation} (\i{1's complement}) of its operand. -\c{-} negates its operand, \c{+} does nothing (it's provided for -symmetry with \c{-}), \c{~} computes the \i{one's complement} of its -operand, \c{!} is the \i{logical negation} operator. +\b \I{! opunary}\c{!} is the \I{negation, boolean}\i{boolean negation} +operator. It evaluates to 1 if the argument is 0, otherwise 0. -\c{SEG} provides the \i{segment address} -of its operand (explained in more detail in \k{segwrt}). +\b \c{SEG} provides the \i{segment address} of its operand (explained in +more detail in \k{segwrt}). -A set of additional operators with leading and trailing double -underscores are used to implement the integer functions of the +\b A set of additional operators with leading and trailing double +underscores are used to implement the \c{integer functions} of the \c{ifunc} macro package, see \k{pkg_ifunc}. @@ -2239,7 +2250,7 @@ if the argument is never used. For example: A single pair of parentheses is a subcase of a single, unused argument: \c %define myreg() eax -\c mov edx,myreg() +\c mov edx,myreg() This is similar to the behavior of the C preprocessor. @@ -4109,10 +4120,9 @@ be assembled with no pre-defined macros, you can use the \i\c{%clear} directive to empty the preprocessor of everything but context-local preprocessor variables and single-line macros, see \k{clear}. -Most \i{user-level assembler directives} (see \k{directive}) are -implemented as macros which invoke primitive directives; these are -described in \k{directive}. The rest of the standard macro set is -described here. +Most \i{user-level directives} (see \k{directive}) are implemented as +macros which invoke primitive directives; these are described in +\k{directive}. The rest of the standard macro set is described here. For compability with NASM versions before NASM 2.15, most standard macros of the form \c{__?foo?__} have aliases of form \c{__foo__} (see @@ -4120,15 +4130,15 @@ macros of the form \c{__?foo?__} have aliases of form \c{__foo__} (see defalias}. -\H{stdmacver} \i{NASM Version} Macros +\H{stdmacver} \i{NASM Version Macros} The single-line macros \i\c{__?NASM_MAJOR?__}, \i\c{__?NASM_MINOR?__}, -\i\c{__?NASM_SUBMINOR?__} and \i\c{__?_NASM_PATCHLEVEL?__} expand to the +\i\c{__?NASM_SUBMINOR?__} and \i\c{__?NASM_PATCHLEVEL?__} expand to the major, minor, subminor and patch level parts of the \i{version number of NASM} being used. So, under NASM 0.98.32p1 for example, \c{__?NASM_MAJOR?__} would be defined to be 0, \c{__?NASM_MINOR?__} would be defined as 98, \c{__?NASM_SUBMINOR?__} would be defined to 32, -and \c{__?_NASM_PATCHLEVEL?__} would be defined as 1. +and \c{__?NASM_PATCHLEVEL?__} would be defined as 1. Additionally, the macro \i\c{__?NASM_SNAPSHOT?__} is defined for automatically generated snapshot releases \e{only}. @@ -4139,7 +4149,7 @@ automatically generated snapshot releases \e{only}. The single-line macro \c{__?NASM_VERSION_ID?__} expands to a dword integer representing the full version number of the version of nasm being used. The value is the equivalent to \c{__?NASM_MAJOR?__}, \c{__?NASM_MINOR?__}, -\c{__?NASM_SUBMINOR?__} and \c{__?_NASM_PATCHLEVEL?__} concatenated to +\c{__?NASM_SUBMINOR?__} and \c{__?NASM_PATCHLEVEL?__} concatenated to produce a single doubleword. Hence, for 0.98.32p1, the returned number would be equivalent to: @@ -4154,7 +4164,7 @@ line is used just to give an indication of the order that the separate values will be present in memory. -\S{stdmacverstr} \i\c{__?NASM_VER?__}: \i{NASM Version string} +\S{stdmacverstr} \i\c{__?NASM_VER?__}: \i{NASM Version String} The single-line macro \c{__?NASM_VER?__} expands to a string which defines the version number of nasm being used. So, under NASM 0.98.32 for example, @@ -4650,13 +4660,17 @@ functionality, as intended to be used primarily with machine-generated code. It does not include any "programmer-friendly" shortcuts, nor does it in any way support ASSUME, symbol typing, or MASM-style structures. -Currently, the MASM compatibility package emulates only the PTR keyword and -recognize syntax displacement[index] for memory operations. - +Currently, the MASM compatibility package emulates only the PTR +keyword and recognize syntax displacement[index] for memory +operations. To enable the package, use the directive: \c{%use masm} +In addition, NASM now natively supports the MASM \c{?} and +\c{DUP} syntax for the \c{DB} etc data declaration directives, +regardless of if this package is included or not. See \k{db}. + \C{directive} \i{Assembler Directives} @@ -4949,13 +4963,12 @@ declared as \c{EXTERN} and then defined, it will be treated as \c{EXTERN}, it will be treated as \c{COMMON}. -\H{required} \i\c{REQUIRED}: \i{Importing Symbols} from Other Modules +\H{required} \i\c{REQUIRED}: \i{Unconditionally Importing Symbols} from Other Modules -The \c{REQUIRED} keyword is similar to \c{EXTERN} one. The difference is that -the \c{EXTERN} keyword as of version 2.15 does not generate unknown symbols, as -this behavior is highly undesirable when using common header files, -because it might cause the linker to pull in a bunch of unnecessary modules, -depending on how smart the linker is. +The \c{REQUIRED} keyword is similar to \c{EXTERN} one. The difference +is that the \c{EXTERN} keyword as of version 2.15 does not generate +unknown symbols as that prevents using common header files, as it +might cause the linker to pull in a bunch of unnecessary modules. If the old behavior is required, use \c{REQUIRED} keyword instead. @@ -5244,7 +5257,7 @@ does. See \k{proborg} for further comments. \S{binseg} \c{bin} Extensions to the \c{SECTION} -Directive\I{SECTION, bin extensions to} +Directive\I{\c{SECTION}, \c{bin} extensions to} The \c{bin} output format extends the \c{SECTION} (or \c{SEGMENT}) directive to allow you to specify the alignment requirements of @@ -5557,7 +5570,7 @@ be specified, even if it is the same as the internal name. The available attributes are: \b \c{resident} indicates that the exported name is to be kept -resident by the system loader. This is an optimisation for +resident by the system loader. This is an optimization for frequently used symbols imported by name. \b \c{nodata} indicates that the exported symbol is a function which @@ -5701,7 +5714,7 @@ files that Win32 linkers can generate correct output from. \S{win32sect} \c{win32} Extensions to the \c{SECTION} -Directive\I{SECTION, win32 extensions to} +Directive\I{SECTION, Windows extensions to} Like the \c{obj} format, \c{win32} allows you to specify additional information on the \c{SECTION} directive line, to control the type @@ -5847,8 +5860,8 @@ later can still be linked by earlier versions or non-Microsoft linkers. \S{codeview} Debugging formats for Windows \I{Windows debugging formats} -The \c{win32} and \c{win64} formats support the Microsoft CodeView -debugging format. Currently CodeView version 8 format is supported +The \c{win32} and \c{win64} formats support the Microsoft \i{CodeView +debugging format}. Currently CodeView version 8 format is supported (\i\c{cv8}), but newer versions of the CodeView debugger should be able to handle this format as well. @@ -6420,14 +6433,14 @@ of the symbol with code such as: \S{elfglob} \c{elf} Extensions to the \c{GLOBAL} Directive\I{GLOBAL, elf extensions to}\I{GLOBAL, aoutb extensions to} -\c{ELF} object files can contain more information about a global symbol -than just its address: they can contain the \I{symbol sizes, -specifying}\I{size, of symbols}size of the symbol and its \I{symbol -types, specifying}\I{type, of symbols}type as well. These are not -merely debugger conveniences, but are actually necessary when the -program being written is a \i{shared library}. NASM therefore -supports some extensions to the \c{GLOBAL} directive, allowing you -to specify these features. +\c{ELF} object files can contain more information about a global +symbol than just its address: they can contain the \I{symbols, +specifying sizes}\I{size, of symbols}size of the symbol and its +\I{symbols, specifying types}\I{type, of symbols}type as well. These +are not merely debugger conveniences, but are actually necessary when +the program being written is a \I{elf shared library}shared +library. NASM therefore supports some extensions to the \c{GLOBAL} +directive, allowing you to specify these features. You can specify whether a global variable is a function or a data object by suffixing the name with a colon and the word @@ -6731,7 +6744,7 @@ also, have to be built as \c{.EXE} files, since Windows does not support the \c{.COM} format. In general, you generate \c{.EXE} files by using the \c{obj} output -format to produce one or more \i\c{.OBJ} files, and then linking +format to produce one or more \i\c{.obj} files, and then linking them together using a linker. However, NASM also supports the direct generation of simple DOS \c{.EXE} files using the \c{bin} output format (by using \c{DB} and \c{DW} to construct the \c{.EXE} file @@ -8060,7 +8073,7 @@ and create \c{library.so.1} as a symbolic link to it. This chapter tries to cover some of the issues, largely related to unusual forms of addressing and jump instructions, encountered when -writing operating system code such as protected-mode initialisation +writing operating system code such as protected-mode initialization routines, which require code that operates in mixed segment sizes, such as code in a 16-bit segment trying to modify data in a 32-bit one, or jumps between different-size segments. @@ -8571,7 +8584,7 @@ Hence, to disassemble a \c{.COM} file: will do the trick. -\S{ndissync} Code Following Data: Synchronisation +\S{ndissync} Code Following Data: Synchronization Suppose you are disassembling a file which contains some data which isn't machine code, and \e{then} contains some machine code. NDISASM @@ -8590,8 +8603,8 @@ then the correct first instruction in the code section will not be seen because the starting point skipped over it. This isn't really ideal. -To avoid this, you can specify a `\i{synchronisation}' point, or indeed -as many synchronisation points as you like (although NDISASM can +To avoid this, you can specify a `\i{synchronization}' point, or indeed +as many synchronization points as you like (although NDISASM can only handle 2147483647 sync points internally). The definition of a sync point is this: NDISASM guarantees to hit sync points exactly during disassembly. If it is thinking about generating an instruction which @@ -8615,7 +8628,7 @@ As stated above, you can specify multiple sync markers if you need to, just by repeating the \c{-s} option. -\S{ndisisync} Mixed Code and Data: Automatic (Intelligent) Synchronisation +\S{ndisisync} Mixed Code and Data: Automatic (Intelligent) Synchronization \I\c{auto-sync} Suppose you are disassembling the boot sector of a \c{DOS} floppy (maybe @@ -8734,8 +8747,9 @@ the \c{git} distributed source control system. The link is available on the website. This is recommended only to participate in the development of NASM or to assist with testing the development code. -To build NASM from the \c{git} repository you will need a Perl and, if -building on a Unix system, GNU autoconf. +To build NASM from the \c{git} repository you will need a Perl +interpreter and, if building on a Unix system, GNU autoconf installed +on your system. To build on a Unix system, run: @@ -8743,6 +8757,14 @@ To build on a Unix system, run: to create the \c{configure} script and then build as listed above. +\H{builddoc} Building the documentation + +To build the documentation, you will need a Perl interpreter, a +Postscript to PDF converter such as Ghostscript, and suitable fonts +installed on your system. The recommended (and default) fonts are +Adobe's Source Sans and Source Code fonts, which are freely available +under the SIL Open Font License. + \A{contact} Contact Information \H{website} Website diff --git a/doc/psfonts.ph b/doc/psfonts.ph index 093d9dc4..9ebbe09d 100644 --- a/doc/psfonts.ph +++ b/doc/psfonts.ph @@ -21,33 +21,54 @@ my @QText = ('SourceSansPro-It', 'ClearSans-Italic', 'LiberationSans-Italic', 'Arial-Italic', 'Helvetica-Italic'); my @QBold = ('SourceSansPro-BoldIt', 'ClearSans-BoldItalic', 'LiberationSans-BoldItalic', 'Arial-Bold', 'Helvetica-BoldItalic'); my @QCode = ('SourceCodePro-Regular', 'LiberationMono', 'Courier'); +my @XCode = ('SourceCodePro-Regular', 'LiberationMono', 'Courier'); # The fonts we want to use for various things # The order is: <normal> <emphatic> <code> +my $lf = 1.2; # Leading scale factor +my $cf = 0.8; # Code size scale factor + +my $st = 20; %TitlFont = (name => 'tfont', - leading => 24, - fonts => [[20, \@TText], [20, \@TItal], [20, \@TCode]]); + leading => $st*$lf, + fonts => [[$st, \@TText], [$st, \@TItal], [$st*$cf, \@TCode]]); + +my $sc = 18; %ChapFont = (name => 'cfont', - leading => 21.6, - fonts => [[18, \@HText], [18, \@HItal], [18, \@HCode]]); + leading => $sc*$lf, + fonts => [[$sc, \@HText], [$sc, \@HItal], [$sc*$cf, \@HCode]]); + +my $sh = 14; %HeadFont = (name => 'hfont', - leading => 16.8, - fonts => [[14, \@HText], [14, \@HItal], [14, \@HCode]]); + leading => $sh*$lf, + fonts => [[$sh, \@HText], [$sh, \@HItal], [$sh*$cf, \@HCode]]); + +my $ss = 12; %SubhFont = (name => 'sfont', - leading => 14.4, - fonts => [[12, \@HText], [12, \@HItal], [12, \@HCode]]); + leading => $ss*$lf, + fonts => [[$ss, \@HText], [$ss, \@HItal], [$ss*$cf, \@HCode]]); + +my $sb = 10; %BodyFont = (name => 'bfont', - leading => 12, - fonts => [[10, \@BText], [10, \@BItal], [10, \@BCode]]); + leading => $sb*$lf, + fonts => [[$sb, \@BText], [$sb, \@BItal], [$sb*$cf, \@BCode]]); + +my $sq = 9; %BquoFont = (name => 'qfont', - leading => 10.8, - fonts => [[9, \@QText], [9, \@QBold], [9, \@QCode]]); + leading => $sq*$lf, + fonts => [[$sq, \@QText], [$sq, \@QBold], [$sq*$cf, \@QCode]]); + +my $sx = $sb*$cf; +%CodeFont = (name => 'xfont', + leading => $sx*$lf, + fonts => [[$sx, \@XCode], [$sx, \@XCode], [$sx, \@XCode]]); + # # List of all fontsets; used to compute the list of fonts needed # @AllFonts = ( \%TitlFont, \%ChapFont, \%HeadFont, \%SubhFont, \%BodyFont, - \%BquoFont); + \%BquoFont, \%CodeFont ); # OK 1; diff --git a/include/compiler.h b/include/compiler.h index 43984338..a1905d27 100644 --- a/include/compiler.h +++ b/include/compiler.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------- * - * + * * Copyright 2007-2018 The NASM Authors - All Rights Reserved * See the file AUTHORS included with the NASM distribution for * the specific copyright holders. @@ -14,7 +14,7 @@ * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF @@ -310,6 +310,27 @@ static inline void *mempcpy(void *dst, const void *src, size_t n) #define printf_func(fmt, list) format_func3(printf,fmt,list) #define printf_func_ptr(fmt, list) format_func3_ptr(printf,fmt,list) +/* + * A static [inline] function which either is currently unused but + * likely to be used in the future, or used only under some #if + * combinations. Mark with this option to suppress compiler + * warnings. + * + * This is better than #if(def) because it still lets the compiler + * analyze the function for validity, and it works even for the + * conditional use case. + * + * The macro UNUSED is set to 1 if the unused macro is meaningful, + * otherwise 0; this may be useful in some #if statements. + */ +#ifdef HAVE_FUNC_ATTRIBUTE_UNUSED +# define unused __attribute__((unused)) +# define UNUSED 1 +#else +# define unused +# define UNUSED 0 +#endif + /* Determine probabilistically if something is a compile-time constant */ #ifdef HAVE___BUILTIN_CONSTANT_P # if defined(__GNUC__) && (__GNUC__ >= 5) diff --git a/include/strlist.h b/include/strlist.h index 2c80d0be..f1775abd 100644 --- a/include/strlist.h +++ b/include/strlist.h @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 1996-2018 The NASM Authors - All Rights Reserved + * Copyright 1996-2020 The NASM Authors - All Rights Reserved * See the file AUTHORS included with the NASM distribution for * the specific copyright holders. * @@ -78,10 +78,10 @@ static inline size_t strlist_size(const struct strlist *list) } struct strlist safe_alloc *strlist_alloc(bool uniq); -const struct strlist_entry * never_null strlist_add(struct strlist *list, const char *str); -const struct strlist_entry * printf_func(2, 3) never_null +const struct strlist_entry *strlist_add(struct strlist *list, const char *str); +const struct strlist_entry * printf_func(2, 3) strlist_printf(struct strlist *list, const char *fmt, ...); -const struct strlist_entry * never_null +const struct strlist_entry * strlist_vprintf(struct strlist *list, const char *fmt, va_list ap); const struct strlist_entry * strlist_find(const struct strlist *list, const char *str); diff --git a/macros/macros.pl b/macros/macros.pl index 9fc425d4..517a9e6f 100755 --- a/macros/macros.pl +++ b/macros/macros.pl @@ -276,19 +276,19 @@ print OUT " };\n"; # Put a large value in unused slots. This makes it extremely unlikely # that any combination that involves unused slot will pass the range test. # This speeds up rejection of unrecognized tokens, i.e. identifiers. -print OUT "#define UNUSED (65535/3)\n"; +print OUT "#define UNUSED_HASH_ENTRY (65535/3)\n"; print OUT " static const int16_t hash1[$n] = {\n"; for ($i = 0; $i < $n; $i++) { my $h = ${$g}[$i*2+0]; - print OUT " ", defined($h) ? $h : 'UNUSED', ",\n"; + print OUT " ", defined($h) ? $h : 'UNUSED_HASH_ENTRY', ",\n"; } print OUT " };\n"; print OUT " static const int16_t hash2[$n] = {\n"; for ($i = 0; $i < $n; $i++) { my $h = ${$g}[$i*2+1]; - print OUT " ", defined($h) ? $h : 'UNUSED', ",\n"; + print OUT " ", defined($h) ? $h : 'UNUSED_HASH_ENTRY', ",\n"; } print OUT " };\n"; diff --git a/nasmlib/perfhash.pl b/nasmlib/perfhash.pl index 8df21f69..9236bfec 100755 --- a/nasmlib/perfhash.pl +++ b/nasmlib/perfhash.pl @@ -334,18 +334,18 @@ if ($output eq 'h') { } print F "\n};\n\n"; - print F "#define UNUSED (65536/3)\n\n"; + print F "#define UNUSED_HASH_ENTRY (65536/3)\n\n"; printf F "static const int16_t %s_hashvals[%d] = ", $name, $n*2; $c = '{'; for (my $i = 0; $i < $n; $i++) { my $h = ${$g}[$i*2+0]; - print F "$c\n ", defined($h) ? $h : 'UNUSED'; + print F "$c\n ", defined($h) ? $h : 'UNUSED_HASH_ENTRY'; $c = ','; } for (my $i = 0; $i < $n; $i++) { my $h = ${$g}[$i*2+1]; - print F "$c\n ", defined($h) ? $h : 'UNUSED'; + print F "$c\n ", defined($h) ? $h : 'UNUSED_HASH_ENTRY'; $c = ','; } print F "\n};\n\n"; diff --git a/nasmlib/strlist.c b/nasmlib/strlist.c index db5a09ab..449304b7 100644 --- a/nasmlib/strlist.c +++ b/nasmlib/strlist.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- * * - * Copyright 1996-2018 The NASM Authors - All Rights Reserved + * Copyright 1996-2020 The NASM Authors - All Rights Reserved * See the file AUTHORS included with the NASM distribution for * the specific copyright holders. * @@ -102,7 +102,8 @@ strlist_add(struct strlist *list, const char *str) const struct strlist_entry * strlist_vprintf(struct strlist *list, const char *fmt, va_list ap) { - struct strlist_entry *e; + /* clang miscompiles offsetin() unless e is initialized here */ + struct strlist_entry *e = NULL; struct hash_insert hi; if (!list) diff --git a/test/dup.asm b/test/dup.asm index 723da48b..62785628 100644 --- a/test/dup.asm +++ b/test/dup.asm @@ -19,3 +19,18 @@ dd 16 dup (0xaaaa, ?, 0xbbbbbb) dd 64 dup (?) + + resb 1 + resb 2 + resb 4 + resb 8 + + resw 1 + resw 2 + resw 4 + resw 8 + + resq 1 + resq 2 + resq 4 + resq 8 diff --git a/test/emptyarg.asm b/test/emptyarg.asm index 0627dfae..af02e378 120000..100644 --- a/test/emptyarg.asm +++ b/test/emptyarg.asm @@ -1 +1,147 @@ -../../nasm-2.14.xx/test/emptyarg.asm
\ No newline at end of file +%define EMPTY + +%macro bar 1 + db "bar", __LINE__, %0, %1 +%endmacro + +%macro baz 2 + db "baz", __LINE__, %0, %1, %2 +%endmacro + +%macro nothing 0 + db "nothing", __LINE__, %0 +%endmacro + +%macro xyzzy 1-2 + db "xyzzy", __LINE__, %0, %1, %2, %3 +%endmacro + +%macro vararg 0-* + db "vararg", __LINE__, %0 + %assign %%i 1 + %rep %0 + db "vararg arg ", %%i, %1 + %rotate 1 + %assign %%i %%i + 1 + %endrep +%endmacro + +%macro defargs 1-5 def2, def3, def4, def5 + db "defargs", __LINE__, %0, %1, %2, %3, %4, %5 +%endmacro + +%macro ivar 1 + vararg %1 +%endmacro + +%macro foo 1-2 + db "foo", __LINE__, %0, %1, %2 + bar %2 + bar {%2} + bar %2, + bar {%2}, + baz %1,%2 + baz {%1},{%2} + nothing %1 + nothing %2 + xyzzy "meep",%1,%2, + xyzzy "meep","meep",%1,%2 + xyzzy "alpha","bravo", + xyzzy "with","empty",EMPTY +%endmacro + +%macro orange 1 + db %{1:1} +%endmacro + +%macro prange1 2-3 + db %{1:2}, 0%3 +%endmacro + +%macro prange2 1-3 'two', 'three' + db %{1:3} +%endmacro + + db 4, + nothing + nothing 1 + nothing ; foo + nothing EMPTY + +flup: foo 1,2 + foo 3 + bar + bar EMPTY + foo 6, + foo 6, ; With space/comment + foo 6,EMPTY + baz 8,EMPTY + foo 6,{} + foo ,5 + + xyzzy 13,14,15, + xyzzy 13,14,15,EMPTY + xyzzy 20,21 + xyzzy 22,23, + xyzzy 24,25,EMPTY + xyzzy 26,27,, + xyzzy 28,29,EMPTY,EMPTY + + vararg + vararg EMPTY + vararg , + vararg 10 + vararg 11, + vararg 12,EMPTY + vararg 13,14,15, + vararg 13,14,15,EMPTY + vararg 20,21 + vararg 22,23, + vararg 24,25,EMPTY + vararg 26,27,, + vararg 28,29,EMPTY,EMPTY + + ivar {} + ivar {EMPTY} + ivar EMPTY + ivar , + ivar {,} + ivar {60} + ivar {61,} + ivar {62,EMPTY} + ivar {63,64,65,} + ivar {63,64,65,EMPTY} + ivar {70,71} + ivar {72,73,} + ivar {74,75,EMPTY} + ivar {76,77,,} + ivar {78,79,EMPTY,EMPTY} + + defargs EMPTY + defargs 91 + defargs 91,92 + defargs 91,92,93 + defargs 91,92,93,94 + defargs 91,92,93,94,95 + defargs , + defargs 91, + defargs 91,92, + defargs 91,92,93, + defargs 91,92,93,94, + defargs 91,92,93,94,95, + + prange1 101 + prange1 101, 102 + prange1 101, 102, 103 + prange2 121 + prange2 121, 122 + prange2 121, 122, 123 + prange2 {121} + prange2 {121,121} + prange2 {121},{122} + prange2 {121},122,{123} + prange2 121,{122,122},123 + + orange 130 + orange 130, 131 + orange {130, 131} |