Commit message (Collapse)AuthorAgeFilesLines
* preproc: %while ... %endwhile looploopsH. Peter Anvin2019-10-083-29/+97
| | | | | | | First user of the new loop infrastructure: a %while[n][cond] loop; supports anything that the %if/%elif directives support, too. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* preproc: make the handling of openers and closers betterH. Peter Anvin2019-10-081-28/+57
| | | | | | | | | Make a stack of openers and closers. The special handling of %rep...%endrep is really entirely bogus: we should be able to throw an immediate error when defining a macro which ends up having unbalanced %rep ... %endrep. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* preproc: generalize the loop handling, factor end of expansion handlingH. Peter Anvin2019-10-081-88/+102
| | | | | | | | | | | | | Combine together the end of mmacro and end of %rep processing, and don't hardcode that any mmacro without a name is a %rep. Instead keep a pointer to the level to which we need to unwind (we can only unwind one level at a time, almost by definition) if any; if this pointer is set we are currently unwinding. We really shouldn't need three stacks (cond, mstk, istk) to do the job of one, though. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* preproc: fix the detection of the >= operatorH. Peter Anvin2019-10-072-2/+4
| | | | | | There are *four* operators starting with ">": > >> >>> and >=. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* preproc: make %exitrep do what it is supposed toH. Peter Anvin2019-10-072-1/+17
| | | | | | | | | | | | | | %exitrep should should stop emitting code immediately, not just terminate the loop when we hit %endrep. There is a bunch of hacky code that special-cases that using istk->in_progress == 0. The handling of the tail of %exitrep, %include and non-emitting conditionals using entirely different mechanisms is just dumb. They need to be unified. Link: https://bugzilla.nasm.us/show_bug.cgi?id=3392612 Reported-by: Jason Hood <jadoxa@yahoo.com.au> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* warnings.pl: correct the documentation output for aliasesH. Peter Anvin2019-10-071-1/+1
| | | | | | Expand the list of aliases, not the prefix "="!! Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* doc: we really need a Fontmap fileH. Peter Anvin2019-10-044-25/+48
| | | | | | | | | | | | | | | | | It turns out that we need a Fontmap file after all, *and* -I. to make gs find it. Inconsistent results came from stray Fontmap files from previous debug attempts. Now generate both fontpath and Fontmap, and hopefully at least one of them should work. We might, in fact, need both, one for gs to know where the files are and one for gs to know it is allowed to read them. The core problem seems to be that gs will find OTF fonts by its normal discovery mechanisms, but for some reason don't seem to use them unless it can find them in a Fontmap, Font directory, of CIDFont directory. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* warnings: do a line break before enabled/disabled noteH. Peter Anvin2019-10-032-2/+1
| | | | | | | | We need to create a separate paragraph if the help text had used \c anyway. Putting the enabled/disabled separately for all entries makes it read a lot cleaner anyway. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* warnings: make it possible to put blank lines in doc textH. Peter Anvin2019-10-032-40/+37
| | | | | | | rdsrc.pl requires blank lines around \c paragraph, but warnings.pl would strip them. Create a *!- prefix to force a blank line. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* config/unconfig.h: eliminate #undef directivesH. Peter Anvin2019-10-034-184/+194
| | | | | | | | | | config/config.h as generated by autoconf has #undef directives commented out, but the autoheader-generated template contains them, and config/unconfig.h should not contain them. Re-introduce config/config.h.in, and postprocess it to generate config/unconfig.h by commenting out all the #undef directives, just as configure does. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* config/unconfig.h: add this autoconf-generated file to the treeH. Peter Anvin2019-10-032-1/+765
| | | | | | | | | | <config/unconfig.h> is generated by autoconf (autoheader), but just like the autoconf/helpers directory contains files for people who don't have the proper tools, check this file in. It should even be less annoying change-wise than the helpers... Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* Win32: when converting filenames to UTF-16, don't add \\?\H. Peter Anvin2019-10-031-13/+10
| | | | | | | | | | | | | \\?\ is supposed to override the hard-coded path limit, but it has other effects as well, such as not working with relative paths and paths containing /. On Windows 10 it is possible to set a registry key to override this option anyway. Maybe one day we can just use fopen() like on normal systems, even... Signed-off-by: H. Peter Anvin <hpa@zytor.com> Link: https://bugzilla.nasm.us/show_bug.cgi?id=3392614 Reported-by: Iouri Kharon <bc-info@styx.cabel.net>
* test: add a test for symbol prefixes via %pragmaH. Peter Anvin2019-09-301-0/+22
| | | | | | | Add a test for symbol prefixes via %pragma, including overlapping directives. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* outcoff: add semi-generic pragma namespacesH. Peter Anvin2019-09-301-4/+15
| | | | | | | Recognize the semi-generic pragma namespaces "coff" and "win" for the win32 and win64 backends. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* pragma: handle default name/fallback handler for NULL list; cleanupsH. Peter Anvin2019-09-301-68/+145
| | | | | | | | | | | | | | The previous code would fail to process any directive if the directive list was NULL. However, we also need to process the default name passed to search_pragma_list() (e.g. "elf32"), as well as the global name (e.g. "output") and call the default handler in that case. In the process, improve the handling such that if one handler returns DIRR_UNKNOWN, try calling subsequent handlers in the list. Finally, factor out as much as possible to generic handlers. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* Merge branch 'pp-inline'H. Peter Anvin (Intel)2019-09-246-698/+1057
|\ | | | | | | | | | | | | | | | | | | | | | | The inlining of preprocessor tokens has benchmarked about 15% faster in any realistic scenario than the old code. For an artificial case where over 50% of symbols are longer than 47 characters there was a slowdown of about 15%, but that represents an incredibly unlikely scenario in practice: even if labels are that long (e.g. C++ name mangling) the majority of tokens should be instructions and registers, which are uniformly short. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
| * preprocessor: major cleanups; inline text into Tokenpp-inlineH. Peter Anvin2019-09-236-698/+1057
| | | | | | | | | | | | | | | | | | | | | | | | | | Major cleanups of the preprocessor. In particular, the block-allocation of Token is pretty ridiculous since nearly every token requires a text allocation anyway. Change the definition of Token so that only very long tokens (48+ characters on 64-bit systems) need to be stored out of line. If malloc() preserves alignment (XXX: glibc doesn't) then this means that each Token will fit in a cache line. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* | autogen.sh: don't update helpers unless there is a newer versionH. Peter Anvin (Intel)2019-09-241-1/+8
|/ | | | | | | | Updating the autoconf helpers unconditionally is very noisy and probably the wrong thing to do anyway. Check the version numbers and only update if the current machine has a newer version installed. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* preproc: fix multiple memory corruption issuesH. Peter Anvin (Intel)2019-09-181-88/+104
| | | | | | | | | | | | paste_tokens() would not null-terminate the buffer before passing it to tokenize(), resulting in garbage or a memory overwrite. In several places the next pointers got confused; sometimes causing a circular list and sometimes an invalid pointer. Some minor code cleanups while fixing things, too... Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* preproc: fix list corruption bug; clean up token handlingH. Peter Anvin (Intel)2019-09-181-302/+319
| | | | | | | | | | | | | | | | | | | | | | | | | | | expand_one_smacro() would corrupt the end of the list if a macro expanded to another macro with arguments, which was also the last part of the expansion. Instead of doing all that testing with ttail, just scan forward at the end to find the tail pointer; it is O(n) regardless. Clean up the handling of tokens: use inline functions rather than odd macros that sometimes modify their arguments and sometimes don't, and fold some common code into new functions. The tok_is() and tok_isnt() functions always are used with single characters, so make it explicitly so (and remove the local hacks used in some places.) Allow using nasm_malloc() rather than blocked Tokens; this makes tools like valgrind more useful in their reports. For the future, consider making Tokens a separate memory allocation immediately followed by the text, instead of using a pointer; we allocate space for the string in almost every case anyway. Also consider making it a doubly linked list... Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* preproc: add %ifusable and %ifusing directivesH. Peter Anvin2019-09-122-3/+21
| | | | | | | | | %ifusable tests to see if a certain %use package is available in this version of NASM. %ifusing tests if a certain %use packages is already loaded. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* preproc: move %use package parsing to a separate routineH. Peter Anvin2019-09-121-18/+52
| | | | | | | | | | Move the parsing of %use package names to a separate routine, and stop using get_id() for that purpose -- get_id() is wrong in a number of ways. This also means we can drop the error string argument to get_id(). Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* travis utf-error test: update error messagesH. Peter Anvin2019-09-121-15/+15
| | | | | | Update error messages to match the new __?*?__ namespace. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* eval: don't try to poke *opflags if opflags is NULLH. Peter Anvin2019-09-121-1/+2
| | | | | | | While changing this code around to not do redundant lookups, dropped this NULL pointer check. Oops. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* preproc: correct handling of %ifdef for aliasesH. Peter Anvin2019-09-121-1/+1
| | | | | | | Correctly handling %ifdef when operating on aliases; we had an infinite loop going... Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* assemble: fix too aggressive dropping of overflow warningsH. Peter Anvin2019-09-121-2/+3
| | | | | | | Drop down to OUT_WRAP when the size is big enough, as opposed to not doing any tests at all. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* outelf: use "symbols" not "variables" in error messagesH. Peter Anvin2019-09-121-1/+1
| | | | | | | Many symbols are variables, but others are labels, etc. Use the common term "symbol". Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* elf: fix "object" symbol keywordH. Peter Anvin2019-09-122-1/+3
| | | | | | | | | The "object" symbol keyword would incorrectly generate STT_NOTYPE instead of STT_OBJECT. Add test for weak object references; they are different from plain weak references in that they are guaranteed to resolve to zero if the symbol is not found. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* Change LBL_NONE to LBL_noneH. Peter Anvin2019-09-125-7/+7
| | | | | | | | | | | NASM convention is to use all-upper-case for "real" information, and mixed-case (upper case common prefix, lower case description) for meta-information. This is a highly useful distinction. Thus "LBL_NONE" implies an actual label of type "NONE", as opposed to no label at all. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* Drop unnecessary EXTERN symbolsH. Peter Anvin2019-09-129-46/+81
| | | | | | | | | | | | Currently, NASM always issues as an unknown symbol any symbol declared EXTERN. This is highly undesirable when using common header files, as it might cause the linker to pull in a bunch of unnecessary modules, depending on how smart the linker is. Add a new REQUIRED directive which behaves like the old EXTERN, for the use cases which might still need this behavior. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* elf: support weak global and extern referencesH. Peter Anvin2019-09-123-97/+155
| | | | | | | | A global or extern definition can now contain the keyword "weak" (or "strong", although that is the default) to create a weak symbol or a weak external reference, respectively. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* error: replace nasm_verror() indirection with preproc callbackH. Peter Anvin2019-08-288-75/+46
| | | | | | | | | | Since pp_error_list_macros() was introduced, the only need for pp_verror() is to suppress error messages in certain contexts. Replace this function with a preprocessor callback, preproc->pp_suppress_error(), so we can drop the nasm_verror() function pointer entirely. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* errors: be more robust in handling unexpected fatal errorsH. Peter Anvin2019-08-287-94/+136
| | | | | | | | | | | | | Introduce a new error level, ERR_CRITICAL, beyond which we will minimize the amount of code that will be executed before we die; in particular don't execute any memory allocations, and if we somehow end up recursing, abort() immediately. Basically, "less than panic, more than fatal." At this point this level is used by nasm_alloc_failed(). Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* Correct __ALIGN_ -> __?ALIGN_H. Peter Anvin2019-08-271-2/+2
| | | | Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* nasm: avoid null pointer reference on VERY early memory allocation failureH. Peter Anvin2019-08-271-1/+2
| | | | | | | | If we get a memory allocation failure before preproc is initialized, we could end up taking a NULL pointer reference while trying to unwind macros. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* preproc: standard macros now C-safe, %aliases off, fix %? recursionH. Peter Anvin2019-08-2725-351/+519
| | | | | | | | | | | | | | | | | | | | Enough users expect the namespace starting with underscore to be safe for symbols. Change our private namespace from __foo__ to __?foo?__. Use %defalias to provide backwards compatiblity (by using %defalias instead of %define, we handle the case properly where the user changes the value.) Add a preprocessor directive: %aliases off ... to disable all smacro aliases and thereby making the namespace clean. Finally, fix infinite recursion when seeing %? or %?? due to paste_tokens(). If we don't paste anything, the expansion is done. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
* configure.ac: look for unconfig.h not uninit.h...H. Peter Anvin2019-08-271-1/+1
* preproc: make sure the mmacro params list is NULL-terminatedH. Peter Anvin (Intel)2019-08-201-1/+6
| | | | | | | If we adjust nparams due to default or greedy arguments, we need to re-terminate the params[] array. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* preproc: smacro argument lists can't be preceded by spaceH. Peter Anvin (Intel)2019-08-201-4/+8
| | | | | | | | The smacro argument list cannot be preceded by whitespace, or we wouldn't be able to define no-argument smacros the expansion of which starts with (. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* preproc: fix comment -La -> -LmH. Peter Anvin (Intel)2019-08-201-1/+1
| | | | | | The -Lm option was briefly called -Lm during development, fix. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* preproc: mmacro argument fixes; listing option for mmacro argsH. Peter Anvin (Intel)2019-08-202-23/+86
| | | | | | | | | | | | | | | | | | Correctly handle empty mmacro arguments that still have preceding whitespace tokens. Default mmacro parameters are obtained by count_mmac_params() so they, too, need to be shifted over by one. Add an option to list mmacro calls with arguments. Name this -Lm; remove the old -Lm option to -Ls since it is related to single-line macros. Trivially optimize the case where an mmacro is called from within itself: if all possible mmacros are excluded by loop removal, there is no need to delve into the mmac processing code. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* preproc: fix uninitialized variablesH. Peter Anvin (Intel)2019-08-201-2/+7
| | | | | | Fix uninitialized variables (not just warnings, actual bugs.) Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* preproc: fix varadic macros, add conditional comma operatorH. Peter Anvin (Intel)2019-08-202-31/+52
| | | | | | | | | | | Fix the (severely broken handling of) varadic macros. Add a conditional comma operator "%,". This expands to a comma unless followed by a null expansion of some sort, which allows suppressing the comma before an empty argument (usually varadic, but not necessarily.) Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* preproc: add suppport for stringify, nostrip, greedy smacro argumentsH. Peter Anvin (Intel)2019-08-201-198/+339
| | | | | | | | | | | Add a few more types of smacro arguments, and clean stuff up in process. If declared with an &, an smacro parameter will be quoted as a string. If declared with a +, it is a greedy/varadic parameter. If declared with an !, don't strip whitespace and braces (useful with &). Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* preproc: defer %00, %? and %?? expansion for nested macros, cleanupsH. Peter Anvin (Intel)2019-08-191-313/+400
| | | | | | | | | | | BR 3392603: When doing nested macro definitions, we need %00, %? and %?? expansion to be deferred to actual expansion time, just as the other parameters. Do major cleanups to the mmacro expansion code. Reported-by: Alexandre Audibert <alexandre.audibert@outlook.fr> Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* assemble.c: fix signed/unsigned comparison warningH. Peter Anvin (Intel)2019-08-191-1/+1
| | | | | | | Ponderance: if data->bits < globalbits, should we actually use OUT_UNSIGNED rather than OUT_WRAP here? Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* listing: add the -L+ option to enable all listing optionsH. Peter Anvin (Intel)2019-08-193-2/+9
| | | | | | | -L+ or %pragma list options ++ will enable all possible listing options. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* BR 3392472: don't complain on wraparound for lower bit modesH. Peter Anvin (Intel)2019-08-162-1/+14
| | | | | | | | | | | If the address we are using is >= the size of the instruction, then don't complain on overflow as we can wrap around the top and bottom of the address space just fine. Alternatively we could downgrade it to OUT_WRAP in that case. Reported-by: C. Masloch <pushbx@38.de> Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* Makefile.in: use $(ALL_LDFLAGS)H. Peter Anvin (Intel)2019-08-161-3/+3
| | | | | | $(ALL_LDFLAGS) was defined but not used; might as well use it. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
* BR 3392576: don't segfault on a bad %pragma limitH. Peter Anvin (Intel)2019-08-161-1/+6
| | | | | | | | Don't segfault on a bad %pragma limit. Instead treat a NULL pointer as an empty string. Reported-by: Ren Kimura <rkx1209dev@gmail.com> Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>