diff options
34 files changed, 1026 insertions, 551 deletions
diff --git a/frontends/yasm/yasm.c b/frontends/yasm/yasm.c index 8c24d285..b5f47080 100644 --- a/frontends/yasm/yasm.c +++ b/frontends/yasm/yasm.c @@ -120,6 +120,7 @@ static void print_yasm_warning(const char *filename, unsigned long line, const char *msg); static void apply_preproc_builtins(void); +static void apply_preproc_standard_macros(const yasm_stdmac *stdmacs); static void apply_preproc_saved_options(void); static void print_list_keyword_desc(const char *name, const char *keyword); @@ -264,13 +265,17 @@ do_preproc_only(void) return EXIT_FAILURE; } - /* Pre-process until done */ + /* Create preprocessor */ cur_preproc = yasm_preproc_create(cur_preproc_module, in_filename, NULL, linemap, errwarns); + /* Apply macros */ apply_preproc_builtins(); + apply_preproc_standard_macros(cur_parser_module->stdmacs); + apply_preproc_standard_macros(cur_objfmt_module->stdmacs); apply_preproc_saved_options(); + /* Pre-process until done */ if (generate_make_dependencies) { size_t totlen; @@ -429,6 +434,8 @@ do_assemble(void) object->symtab, linemap, errwarns); apply_preproc_builtins(); + apply_preproc_standard_macros(cur_parser_module->stdmacs); + apply_preproc_standard_macros(cur_objfmt_module->stdmacs); apply_preproc_saved_options(); /* Get initial x86 BITS setting from object format */ @@ -1126,6 +1133,25 @@ apply_preproc_builtins() } static void +apply_preproc_standard_macros(const yasm_stdmac *stdmacs) +{ + int i, matched; + + if (!stdmacs) + return; + + matched = -1; + for (i=0; stdmacs[i].parser; i++) + if (yasm__strcasecmp(stdmacs[i].parser, + cur_parser_module->keyword) == 0 && + yasm__strcasecmp(stdmacs[i].preproc, + cur_preproc_module->keyword) == 0) + matched = i; + if (matched >= 0 && stdmacs[matched].macros) + yasm_preproc_add_standard(cur_preproc, stdmacs[matched].macros); +} + +static void apply_preproc_saved_options() { constcharparam *cp, *cpnext; diff --git a/libyasm/coretype.h b/libyasm/coretype.h index 5c99816c..b23e3eae 100644 --- a/libyasm/coretype.h +++ b/libyasm/coretype.h @@ -52,6 +52,21 @@ typedef struct yasm_objfmt_module yasm_objfmt_module; /** Debug format module interface. \see dbgfmt.h for details. */ typedef struct yasm_dbgfmt_module yasm_dbgfmt_module; +/** Standard macro structure for modules that allows association of a set of + * standard macros with a parser/preprocessor combination. + * A NULL-terminated array of these structures is used in a number of module + * interfaces. + */ +typedef struct yasm_stdmac { + const char *parser; /**< Parser keyword */ + const char *preproc; /**< Preprocessor keyword */ + + /** NULL-terminated array of standard macros. May be NULL if no standard + * macros should be added for this preprocessor. + */ + const char **macros; +} yasm_stdmac; + /** YASM associated data callback structure. Many data structures can have * arbitrary data associated with them. */ diff --git a/libyasm/objfmt.h b/libyasm/objfmt.h index 0c40c4a3..c65e76c1 100644 --- a/libyasm/objfmt.h +++ b/libyasm/objfmt.h @@ -77,6 +77,9 @@ struct yasm_objfmt_module { /** NULL-terminated list of directives. NULL if none. */ /*@null@*/ const yasm_directive *directives; + /** NULL-terminated list of standard macro lookups. NULL if none. */ + const yasm_stdmac *stdmacs; + /** Create object format. * Module-level implementation of yasm_objfmt_create(). * Call yasm_objfmt_create() instead of calling this function. diff --git a/libyasm/parser.h b/libyasm/parser.h index fcbb20c4..26c347be 100644 --- a/libyasm/parser.h +++ b/libyasm/parser.h @@ -51,6 +51,9 @@ typedef struct yasm_parser_module { /** Default preprocessor. */ const char *default_preproc_keyword; + /** NULL-terminated list of standard macro lookups. NULL if none. */ + const yasm_stdmac *stdmacs; + /** Parse a source file into an object. * \param object object to parse into (already created) * \param pp preprocessor diff --git a/libyasm/preproc.h b/libyasm/preproc.h index fff40daa..0b8c54ff 100644 --- a/libyasm/preproc.h +++ b/libyasm/preproc.h @@ -105,6 +105,11 @@ typedef struct yasm_preproc_module { * Call yasm_preproc_builtin_define() instead of calling this function. */ void (*define_builtin) (yasm_preproc *preproc, const char *macronameval); + + /** Module-level implementation of yasm_preproc_add_standard(). + * Call yasm_preproc_add_standard() instead of calling this function. + */ + void (*add_standard) (yasm_preproc *preproc, const char **macros); } yasm_preproc_module; /** Initialize preprocessor. @@ -169,6 +174,14 @@ void yasm_preproc_undefine_macro(yasm_preproc *preproc, const char *macroname); void yasm_preproc_define_builtin(yasm_preproc *preproc, const char *macronameval); +/** Define additional standard macros, preprocessed after the builtins but + * prior to any user-defined macros. + * \param preproc preprocessor + * \param macros NULL-terminated array of macro strings + */ +void yasm_preproc_add_standard(yasm_preproc *preproc, + const char **macros); + #ifndef YASM_DOXYGEN /* Inline macro implementations for preproc functions */ @@ -192,6 +205,9 @@ void yasm_preproc_define_builtin(yasm_preproc *preproc, #define yasm_preproc_define_builtin(preproc, macronameval) \ ((yasm_preproc_base *)preproc)->module->define_builtin(preproc, \ macronameval) +#define yasm_preproc_add_standard(preproc, macros) \ + ((yasm_preproc_base *)preproc)->module->add_standard(preproc, \ + macros) #endif diff --git a/modules/objfmts/bin/bin-objfmt.c b/modules/objfmts/bin/bin-objfmt.c index e1080760..478502ec 100644 --- a/modules/objfmts/bin/bin-objfmt.c +++ b/modules/objfmts/bin/bin-objfmt.c @@ -1771,6 +1771,18 @@ static const yasm_directive bin_objfmt_directives[] = { { NULL, NULL, NULL, 0 } }; +static const char *bin_nasm_stdmac[] = { + "%imacro org 1+.nolist", + "[org %1]", + "%endmacro", + NULL +}; + +static const yasm_stdmac bin_objfmt_stdmacs[] = { + { "nasm", "nasm", bin_nasm_stdmac }, + { NULL, NULL, NULL } +}; + /* Define objfmt structure -- see objfmt.h for details */ yasm_objfmt_module yasm_bin_LTX_objfmt = { "Flat format binary", @@ -1780,6 +1792,7 @@ yasm_objfmt_module yasm_bin_LTX_objfmt = { bin_objfmt_dbgfmt_keywords, "null", bin_objfmt_directives, + bin_objfmt_stdmacs, bin_objfmt_create, bin_objfmt_output, bin_objfmt_destroy, diff --git a/modules/objfmts/coff/Makefile.inc b/modules/objfmts/coff/Makefile.inc index 526f7713..e9e8576d 100644 --- a/modules/objfmts/coff/Makefile.inc +++ b/modules/objfmts/coff/Makefile.inc @@ -6,6 +6,22 @@ libyasm_a_SOURCES += modules/objfmts/coff/win64-except.c YASM_MODULES += objfmt_coff +$(top_srcdir)/modules/objfmts/coff/coff-objfmt.c: win64-nasm.c win64-gas.c + +win64-nasm.c: $(srcdir)/modules/objfmts/coff/win64-nasm.mac genmacro$(EXEEXT) + $(top_builddir)/genmacro$(EXEEXT) $@ win64_nasm_stdmac $(srcdir)/modules/objfmts/coff/win64-nasm.mac + +BUILT_SOURCES += win64-nasm.c +CLEANFILES += win64-nasm.c +EXTRA_DIST += modules/objfmts/coff/win64-nasm.mac + +win64-gas.c: $(srcdir)/modules/objfmts/coff/win64-gas.mac genmacro$(EXEEXT) + $(top_builddir)/genmacro$(EXEEXT) $@ win64_gas_stdmac $(srcdir)/modules/objfmts/coff/win64-gas.mac + +BUILT_SOURCES += win64-gas.c +CLEANFILES += win64-gas.c +EXTRA_DIST += modules/objfmts/coff/win64-gas.mac + EXTRA_DIST += modules/objfmts/coff/tests/Makefile.inc include modules/objfmts/coff/tests/Makefile.inc diff --git a/modules/objfmts/coff/coff-objfmt.c b/modules/objfmts/coff/coff-objfmt.c index 22ecac45..16cf6ea3 100644 --- a/modules/objfmts/coff/coff-objfmt.c +++ b/modules/objfmts/coff/coff-objfmt.c @@ -2192,6 +2192,7 @@ yasm_objfmt_module yasm_coff_LTX_objfmt = { coff_objfmt_dbgfmt_keywords, "null", coff_objfmt_directives, + NULL, /* no standard macros */ coff_objfmt_create, coff_objfmt_output, coff_objfmt_destroy, @@ -2218,6 +2219,21 @@ static const yasm_directive win32_objfmt_directives[] = { { NULL, NULL, NULL, 0 } }; +static const char *win32_nasm_stdmac[] = { + "%imacro export 1+.nolist", + "[export %1]", + "%endmacro", + "%imacro safeseh 1+.nolist", + "[safeseh %1]", + "%endmacro", + NULL +}; + +static const yasm_stdmac win32_objfmt_stdmacs[] = { + { "nasm", "nasm", win32_nasm_stdmac }, + { NULL, NULL, NULL } +}; + /* Define objfmt structure -- see objfmt.h for details */ yasm_objfmt_module yasm_win32_LTX_objfmt = { "Win32", @@ -2227,6 +2243,7 @@ yasm_objfmt_module yasm_win32_LTX_objfmt = { winXX_objfmt_dbgfmt_keywords, "null", win32_objfmt_directives, + win32_objfmt_stdmacs, win32_objfmt_create, coff_objfmt_output, coff_objfmt_destroy, @@ -2261,6 +2278,15 @@ static const yasm_directive win64_objfmt_directives[] = { { NULL, NULL, NULL, 0 } }; +#include "win64-nasm.c" +#include "win64-gas.c" + +static const yasm_stdmac win64_objfmt_stdmacs[] = { + { "nasm", "nasm", win64_nasm_stdmac }, + { "gas", "nasm", win64_gas_stdmac }, + { NULL, NULL, NULL } +}; + /* Define objfmt structure -- see objfmt.h for details */ yasm_objfmt_module yasm_win64_LTX_objfmt = { "Win64", @@ -2270,6 +2296,7 @@ yasm_objfmt_module yasm_win64_LTX_objfmt = { winXX_objfmt_dbgfmt_keywords, "null", win64_objfmt_directives, + win64_objfmt_stdmacs, win64_objfmt_create, coff_objfmt_output, coff_objfmt_destroy, @@ -2285,6 +2312,7 @@ yasm_objfmt_module yasm_x64_LTX_objfmt = { winXX_objfmt_dbgfmt_keywords, "null", win64_objfmt_directives, + win64_objfmt_stdmacs, win64_objfmt_create, coff_objfmt_output, coff_objfmt_destroy, diff --git a/modules/objfmts/coff/win64-gas.mac b/modules/objfmts/coff/win64-gas.mac new file mode 100644 index 00000000..cf1e7dc6 --- /dev/null +++ b/modules/objfmts/coff/win64-gas.mac @@ -0,0 +1,73 @@ +%imacro export 1+.nolist +.export %1 +%endmacro + +; Raw exception handling operations +%imacro proc_frame 1+.nolist +%1: +.proc_frame %1 +%endmacro + +%imacro endproc_frame 0.nolist +.endproc_frame +%endmacro + +; Complex (macro) exception handling operations +; Mimics many macros provided by MASM's macamd64.inc +%imacro push_reg 1 +pushq %1 +.pushreg %1 +%endmacro + +%imacro rex_push_reg 1 +.byte 0x48 +pushq %1 +.pushreg %1 +%endmacro + +%imacro push_eflags 0 +pushfq +.allocstack 8 +%endmacro + +%imacro rex_push_eflags 0 +.byte 0x48 +pushfq +.allocstack 8 +%endmacro + +%imacro alloc_stack 1 +subq %1, %rsp +.allocstack %1 +%endmacro + +%imacro save_reg 2 +movq %1, %2(%rsp) +.savereg %1 %2 +%endmacro + +%imacro save_xmm128 2 +movdqa %1, %2(%rsp) +.savexmm128 %1, %2 +%endmacro + +%imacro push_frame 0-1.nolist +.pushframe %1 +%endmacro + +%imacro set_frame 1-2 +%if %0==1 +movq %rsp, %1 +%else +leaq %2(%rsp), %1 +%endif +.setframe %1, %2 +%endmacro + +%imacro end_prolog 0.nolist +.endprolog +%endmacro + +%imacro end_prologue 0.nolist +.endprolog +%endmacro diff --git a/modules/objfmts/coff/win64-nasm.mac b/modules/objfmts/coff/win64-nasm.mac new file mode 100644 index 00000000..13954b89 --- /dev/null +++ b/modules/objfmts/coff/win64-nasm.mac @@ -0,0 +1,106 @@ +%imacro export 1+.nolist +[export %1] +%endmacro + +; Raw exception handling operations +%imacro proc_frame 1+.nolist +%1: +[proc_frame %1] +%endmacro + +; Disable these as they're too closely named to the macroized ones. +; MASM needs a preceding . to use these, so it seems reasonable for +; us to similarly require the []. +; +;%imacro pushreg 1.nolist +;[pushreg %1] +;%endmacro +; +;%imacro setframe 1-2.nolist +;[setframe %1 %2] +;%endmacro +; +;%imacro allocstack 1.nolist +;[allocstack %1] +;%endmacro +; +;%imacro savereg 2.nolist +;[savereg %1 %2] +;%endmacro +; +;%imacro savexmm128 2.nolist +;[savexmm128 %1 %2] +;%endmacro +; +;%imacro pushframe 0-1.nolist +;[pushframe %1] +;%endmacro +; +;%imacro endprolog 0.nolist +;[endprolog] +;%endmacro +; + +%imacro endproc_frame 0.nolist +[endproc_frame] +%endmacro + +; Complex (macro) exception handling operations +; Mimics many macros provided by MASM's macamd64.inc +%imacro push_reg 1 +push %1 +[pushreg %1] +%endmacro + +%imacro rex_push_reg 1 +db 0x48 +push %1 +[pushreg %1] +%endmacro + +%imacro push_eflags 0 +pushfq +[allocstack 8] +%endmacro + +%imacro rex_push_eflags 0 +db 0x48 +pushfq +[allocstack 8] +%endmacro + +%imacro alloc_stack 1 +sub rsp, %1 +[allocstack %1] +%endmacro + +%imacro save_reg 2 +mov [rsp+%2], %1 +[savereg %1 %2] +%endmacro + +%imacro save_xmm128 2 +movdqa [rsp+%2], %1 +[savexmm128 %1 %2] +%endmacro + +%imacro push_frame 0-1.nolist +[pushframe %1] +%endmacro + +%imacro set_frame 1-2 +%if %0==1 +mov %1, rsp +%else +lea %1, [rsp+%2] +%endif +[setframe %1 %2] +%endmacro + +%imacro end_prolog 0.nolist +[endprolog] +%endmacro + +%imacro end_prologue 0.nolist +[endprolog] +%endmacro diff --git a/modules/objfmts/dbg/dbg-objfmt.c b/modules/objfmts/dbg/dbg-objfmt.c index 21a161ab..ad5f14a1 100644 --- a/modules/objfmts/dbg/dbg-objfmt.c +++ b/modules/objfmts/dbg/dbg-objfmt.c @@ -165,6 +165,7 @@ yasm_objfmt_module yasm_dbg_LTX_objfmt = { dbg_objfmt_dbgfmt_keywords, "null", NULL, /* no directives */ + NULL, /* no standard macros */ dbg_objfmt_create, dbg_objfmt_output, dbg_objfmt_destroy, diff --git a/modules/objfmts/elf/elf-objfmt.c b/modules/objfmts/elf/elf-objfmt.c index 142275ea..d2083a84 100644 --- a/modules/objfmts/elf/elf-objfmt.c +++ b/modules/objfmts/elf/elf-objfmt.c @@ -1310,6 +1310,24 @@ static const yasm_directive elf_objfmt_directives[] = { { NULL, NULL, NULL, 0 } }; +static const char *elf_nasm_stdmac[] = { + "%imacro type 1+.nolist", + "[type %1]", + "%endmacro", + "%imacro size 1+.nolist", + "[size %1]", + "%endmacro", + "%imacro weak 1+.nolist", + "[weak %1]", + "%endmacro", + NULL +}; + +static const yasm_stdmac elf_objfmt_stdmacs[] = { + { "nasm", "nasm", elf_nasm_stdmac }, + { NULL, NULL, NULL } +}; + /* Define objfmt structure -- see objfmt.h for details */ yasm_objfmt_module yasm_elf_LTX_objfmt = { "ELF", @@ -1319,6 +1337,7 @@ yasm_objfmt_module yasm_elf_LTX_objfmt = { elf_objfmt_dbgfmt_keywords, "null", elf_objfmt_directives, + elf_objfmt_stdmacs, elf_objfmt_create, elf_objfmt_output, elf_objfmt_destroy, @@ -1335,6 +1354,7 @@ yasm_objfmt_module yasm_elf32_LTX_objfmt = { elf_objfmt_dbgfmt_keywords, "null", elf_objfmt_directives, + elf_objfmt_stdmacs, elf32_objfmt_create, elf_objfmt_output, elf_objfmt_destroy, @@ -1351,6 +1371,7 @@ yasm_objfmt_module yasm_elf64_LTX_objfmt = { elf_objfmt_dbgfmt_keywords, "null", elf_objfmt_directives, + elf_objfmt_stdmacs, elf64_objfmt_create, elf_objfmt_output, elf_objfmt_destroy, diff --git a/modules/objfmts/macho/macho-objfmt.c b/modules/objfmts/macho/macho-objfmt.c index 4628bf74..0a049baf 100644 --- a/modules/objfmts/macho/macho-objfmt.c +++ b/modules/objfmts/macho/macho-objfmt.c @@ -1551,6 +1551,7 @@ yasm_objfmt_module yasm_macho_LTX_objfmt = { macho_objfmt_dbgfmt_keywords, "null", NULL, /* no directives */ + NULL, /* no standard macros */ macho_objfmt_create, macho_objfmt_output, macho_objfmt_destroy, @@ -1567,6 +1568,7 @@ yasm_objfmt_module yasm_macho32_LTX_objfmt = { macho_objfmt_dbgfmt_keywords, "null", NULL, /* no directives */ + NULL, /* no standard macros */ macho32_objfmt_create, macho_objfmt_output, macho_objfmt_destroy, @@ -1583,6 +1585,7 @@ yasm_objfmt_module yasm_macho64_LTX_objfmt = { macho_objfmt_dbgfmt_keywords, "null", NULL, /* no directives */ + NULL, /* no standard macros */ macho64_objfmt_create, macho_objfmt_output, macho_objfmt_destroy, diff --git a/modules/objfmts/rdf/rdf-objfmt.c b/modules/objfmts/rdf/rdf-objfmt.c index 22e2a1c7..e4173289 100644 --- a/modules/objfmts/rdf/rdf-objfmt.c +++ b/modules/objfmts/rdf/rdf-objfmt.c @@ -1057,6 +1057,21 @@ static const yasm_directive rdf_objfmt_directives[] = { { NULL, NULL, NULL, 0 } }; +static const char *rdf_nasm_stdmac[] = { + "%imacro library 1+.nolist", + "[library %1]", + "%endmacro", + "%imacro module 1+.nolist", + "[module %1]", + "%endmacro", + NULL +}; + +static const yasm_stdmac rdf_objfmt_stdmacs[] = { + { "nasm", "nasm", rdf_nasm_stdmac }, + { NULL, NULL, NULL } +}; + /* Define objfmt structure -- see objfmt.h for details */ yasm_objfmt_module yasm_rdf_LTX_objfmt = { "Relocatable Dynamic Object File Format (RDOFF) v2.0", @@ -1066,6 +1081,7 @@ yasm_objfmt_module yasm_rdf_LTX_objfmt = { rdf_objfmt_dbgfmt_keywords, "null", rdf_objfmt_directives, + rdf_objfmt_stdmacs, rdf_objfmt_create, rdf_objfmt_output, rdf_objfmt_destroy, diff --git a/modules/objfmts/win64/tests/Makefile.inc b/modules/objfmts/win64/tests/Makefile.inc index 4bc0907c..06e0f86d 100644 --- a/modules/objfmts/win64/tests/Makefile.inc +++ b/modules/objfmts/win64/tests/Makefile.inc @@ -27,3 +27,7 @@ EXTRA_DIST += modules/objfmts/win64/tests/win64-dataref.masm EXTRA_DIST += modules/objfmts/win64/tests/win64-dataref2.asm EXTRA_DIST += modules/objfmts/win64/tests/win64-dataref2.hex EXTRA_DIST += modules/objfmts/win64/tests/win64-dataref2.masm + +EXTRA_DIST += modules/objfmts/win64/tests/gas/Makefile.inc + +include modules/objfmts/win64/tests/gas/Makefile.inc diff --git a/modules/objfmts/win64/tests/gas/Makefile.inc b/modules/objfmts/win64/tests/gas/Makefile.inc new file mode 100644 index 00000000..0d16bd12 --- /dev/null +++ b/modules/objfmts/win64/tests/gas/Makefile.inc @@ -0,0 +1,7 @@ +# $Id$ + +TESTS += modules/objfmts/win64/tests/gas/win64_gas_test.sh + +EXTRA_DIST += modules/objfmts/win64/tests/gas/win64_gas_test.sh +EXTRA_DIST += modules/objfmts/win64/tests/gas/win64-gas-sce.asm +EXTRA_DIST += modules/objfmts/win64/tests/gas/win64-gas-sce.hex diff --git a/modules/objfmts/win64/tests/gas/win64-gas-sce.asm b/modules/objfmts/win64/tests/gas/win64-gas-sce.asm new file mode 100644 index 00000000..3a75ee4c --- /dev/null +++ b/modules/objfmts/win64/tests/gas/win64-gas-sce.asm @@ -0,0 +1,11 @@ +PROC_FRAME sample +rex_push_reg %rbp +rex_push_eflags +alloc_stack 16 +save_reg %rsi, 0x18 +save_xmm128 %xmm7, 0x20 +push_frame 16 +set_frame %rdi +set_frame %rdi, 16 +END_PROLOGUE +ENDPROC_FRAME diff --git a/modules/objfmts/win64/tests/gas/win64-gas-sce.hex b/modules/objfmts/win64/tests/gas/win64-gas-sce.hex new file mode 100644 index 00000000..ff4288f9 --- /dev/null +++ b/modules/objfmts/win64/tests/gas/win64-gas-sce.hex @@ -0,0 +1,403 @@ +64 +86 +03 +00 +00 +00 +00 +00 +ed +00 +00 +00 +09 +00 +00 +00 +00 +00 +04 +00 +2e +74 +65 +78 +74 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +1f +00 +00 +00 +8c +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +20 +00 +50 +60 +2e +78 +64 +61 +74 +61 +00 +00 +1f +00 +00 +00 +00 +00 +00 +00 +18 +00 +00 +00 +ab +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +40 +00 +40 +40 +2e +70 +64 +61 +74 +61 +00 +00 +37 +00 +00 +00 +00 +00 +00 +00 +0c +00 +00 +00 +c3 +00 +00 +00 +cf +00 +00 +00 +00 +00 +00 +00 +03 +00 +00 +00 +40 +00 +30 +40 +48 +55 +48 +9c +48 +2b +24 +25 +10 +00 +00 +00 +48 +89 +74 +24 +18 +66 +0f +7f +7c +24 +20 +48 +89 +e7 +48 +8d +7c +24 +10 +01 +1f +0a +17 +1f +73 +1a +73 +17 +1a +17 +78 +02 +00 +11 +64 +03 +00 +0c +12 +04 +02 +02 +50 +00 +00 +00 +00 +1f +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +04 +00 +00 +00 +03 +00 +04 +00 +00 +00 +04 +00 +00 +00 +03 +00 +08 +00 +00 +00 +05 +00 +00 +00 +03 +00 +2e +66 +69 +6c +65 +00 +00 +00 +00 +00 +00 +00 +fe +ff +00 +00 +67 +01 +2d +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +2e +74 +65 +78 +74 +00 +00 +00 +00 +00 +00 +00 +01 +00 +00 +00 +03 +01 +1f +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +73 +61 +6d +70 +6c +65 +00 +00 +00 +00 +00 +00 +01 +00 +00 +00 +03 +00 +2e +78 +64 +61 +74 +61 +00 +00 +00 +00 +00 +00 +02 +00 +00 +00 +03 +01 +18 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +2e +70 +64 +61 +74 +61 +00 +00 +00 +00 +00 +00 +03 +00 +00 +00 +03 +01 +0c +00 +00 +00 +03 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +00 +04 +00 +00 +00 diff --git a/modules/objfmts/win64/tests/gas/win64_gas_test.sh b/modules/objfmts/win64/tests/gas/win64_gas_test.sh new file mode 100755 index 00000000..55753839 --- /dev/null +++ b/modules/objfmts/win64/tests/gas/win64_gas_test.sh @@ -0,0 +1,4 @@ +#! /bin/sh +# $Id$ +${srcdir}/out_test.sh win64_gas_test modules/objfmts/win64/tests/gas "win64 objfmt" "-f win64 -p gas -r nasm" ".obj" +exit $? diff --git a/modules/objfmts/xdf/xdf-objfmt.c b/modules/objfmts/xdf/xdf-objfmt.c index d7cb453b..89cb403c 100644 --- a/modules/objfmts/xdf/xdf-objfmt.c +++ b/modules/objfmts/xdf/xdf-objfmt.c @@ -839,6 +839,7 @@ yasm_objfmt_module yasm_xdf_LTX_objfmt = { xdf_objfmt_dbgfmt_keywords, "null", NULL, /* no directives */ + NULL, /* no standard macros */ xdf_objfmt_create, xdf_objfmt_output, xdf_objfmt_destroy, diff --git a/modules/parsers/gas/gas-parser.c b/modules/parsers/gas/gas-parser.c index 1e7fb8b6..de3397c2 100644 --- a/modules/parsers/gas/gas-parser.c +++ b/modules/parsers/gas/gas-parser.c @@ -129,6 +129,7 @@ yasm_parser_module yasm_gas_LTX_parser = { "gas", gas_parser_preproc_keywords, "raw", + NULL, /* No standard macros */ gas_parser_do_parse }; yasm_parser_module yasm_gnu_LTX_parser = { @@ -136,5 +137,6 @@ yasm_parser_module yasm_gnu_LTX_parser = { "gnu", gas_parser_preproc_keywords, "raw", + NULL, /* No standard macros */ gas_parser_do_parse }; diff --git a/modules/parsers/nasm/Makefile.inc b/modules/parsers/nasm/Makefile.inc index 9994e316..ac174ca0 100644 --- a/modules/parsers/nasm/Makefile.inc +++ b/modules/parsers/nasm/Makefile.inc @@ -14,7 +14,17 @@ BUILT_SOURCES += nasm-token.c CLEANFILES += nasm-token.c -EXTRA_DIST += modules/parsers/nasm/tests/Makefile.inc EXTRA_DIST += modules/parsers/nasm/nasm-token.re +$(top_srcdir)/modules/parsers/nasm/nasm-parser.c: nasm-macros.c + +nasm-macros.c: $(srcdir)/modules/parsers/nasm/nasm-std.mac genmacro$(EXEEXT) + $(top_builddir)/genmacro$(EXEEXT) $@ nasm_standard_mac $(srcdir)/modules/parsers/nasm/nasm-std.mac + +BUILT_SOURCES += nasm-macros.c +CLEANFILES += nasm-macros.c +EXTRA_DIST += modules/parsers/nasm/nasm-std.mac + +EXTRA_DIST += modules/parsers/nasm/tests/Makefile.inc + include modules/parsers/nasm/tests/Makefile.inc diff --git a/modules/parsers/nasm/nasm-parser.c b/modules/parsers/nasm/nasm-parser.c index dc46a717..ac10de37 100644 --- a/modules/parsers/nasm/nasm-parser.c +++ b/modules/parsers/nasm/nasm-parser.c @@ -77,6 +77,8 @@ nasm_parser_do_parse(yasm_object *object, yasm_preproc *pp, yasm_symtab_parser_finalize(object->symtab, 0, errwarns); } +#include "nasm-macros.c" + /* Define valid preprocessors to use with this parser */ static const char *nasm_parser_preproc_keywords[] = { "raw", @@ -84,11 +86,17 @@ static const char *nasm_parser_preproc_keywords[] = { NULL }; +static const yasm_stdmac nasm_parser_stdmacs[] = { + { "nasm", "nasm", nasm_standard_mac }, + { NULL, NULL, NULL } +}; + /* Define parser structure -- see parser.h for details */ yasm_parser_module yasm_nasm_LTX_parser = { "NASM-compatible parser", "nasm", nasm_parser_preproc_keywords, "nasm", + nasm_parser_stdmacs, nasm_parser_do_parse }; diff --git a/modules/parsers/nasm/nasm-std.mac b/modules/parsers/nasm/nasm-std.mac new file mode 100644 index 00000000..3c9223ab --- /dev/null +++ b/modules/parsers/nasm/nasm-std.mac @@ -0,0 +1,109 @@ +; Standard macro set for NASM -*- nasm -*- + +; Note that although some user-level forms of directives are defined +; here, not all of them are: the user-level form of a format-specific +; directive should be defined in the module for that directive. + +; These two need to be defined, though the actual definitions will +; be constantly updated during preprocessing. +%define __FILE__ +%define __LINE__ + +%define __SECT__ [section .text] ; it ought to be defined, even if as nothing + +%imacro section 1+.nolist +%define __SECT__ [section %1] + __SECT__ +%endmacro +%imacro segment 1+.nolist +%define __SECT__ [segment %1] + __SECT__ +%endmacro + +%imacro absolute 1+.nolist +%define __SECT__ [absolute %1] + __SECT__ +%endmacro + +%imacro struc 1.nolist +%push struc +%define %$strucname %1 +[absolute 0] +%$strucname: ; allow definition of `.member' to work sanely +%endmacro +%imacro endstruc 0.nolist +%{$strucname}_size: +%pop +__SECT__ +%endmacro + +%imacro istruc 1.nolist +%push istruc +%define %$strucname %1 +%$strucstart: +%endmacro +%imacro at 1-2+.nolist + times %1-($-%$strucstart) db 0 + %2 +%endmacro +%imacro iend 0.nolist + times %{$strucname}_size-($-%$strucstart) db 0 +%pop +%endmacro + +%imacro align 1-2+.nolist nop +%ifidni %2,nop + [align %1] +%else + times ($$-$) & ((%1)-1) %2 +%endif +%endmacro +%imacro alignb 1-2+.nolist resb 1 + times ($$-$) & ((%1)-1) %2 +%endmacro + +%imacro extern 1-*.nolist +%rep %0 +[extern %1] +%rotate 1 +%endrep +%endmacro + +%imacro bits 1+.nolist +[bits %1] +%endmacro + +%imacro use16 0.nolist +[bits 16] +%endmacro +%imacro use32 0.nolist +[bits 32] +%endmacro +%imacro use64 0.nolist +[bits 64] +%endmacro + +%imacro global 1-*.nolist +%rep %0 +[global %1] +%rotate 1 +%endrep +%endmacro + +%imacro common 1-*.nolist +%rep %0 +[common %1] +%rotate 1 +%endrep +%endmacro + +%imacro cpu 1+.nolist +[cpu %1] +%endmacro + +%imacro default 1+.nolist +[default %1] +%endmacro + +; NASM compatibility shim +%define __OUTPUT_FORMAT__ __YASM_OBJFMT__ diff --git a/modules/preprocs/cpp/cpp-preproc.c b/modules/preprocs/cpp/cpp-preproc.c index dae2e032..c58e4044 100644 --- a/modules/preprocs/cpp/cpp-preproc.c +++ b/modules/preprocs/cpp/cpp-preproc.c @@ -377,6 +377,12 @@ cpp_preproc_define_builtin(yasm_preproc *preproc, const char *macronameval) cpp_preproc_predefine_macro(preproc, macronameval); } +static void +cpp_preproc_add_standard(yasm_preproc *preproc, const char **macros) +{ + /* TODO */ +} + /******************************************************************************* Preprocessor module object. *******************************************************************************/ @@ -391,5 +397,6 @@ yasm_preproc_module yasm_cpp_LTX_preproc = { cpp_preproc_add_include_file, cpp_preproc_predefine_macro, cpp_preproc_undefine_macro, - cpp_preproc_define_builtin + cpp_preproc_define_builtin, + cpp_preproc_add_standard }; diff --git a/modules/preprocs/nasm/Makefile.inc b/modules/preprocs/nasm/Makefile.inc index a91eb914..f9aa9d5e 100644 --- a/modules/preprocs/nasm/Makefile.inc +++ b/modules/preprocs/nasm/Makefile.inc @@ -11,23 +11,13 @@ libyasm_a_SOURCES += modules/preprocs/nasm/nasm-eval.c YASM_MODULES += preproc_nasm -$(top_srcdir)/src/preprocs/nasm/nasm-pp.c: nasm-macros.c +$(top_srcdir)/modules/preprocs/nasm/nasm-preproc.c: nasm-version.c -nasm-macros.c: $(top_srcdir)/modules/preprocs/nasm/standard.mac version.mac genmacro$(EXEEXT) - $(top_builddir)/genmacro$(EXEEXT) $(top_srcdir)/modules/preprocs/nasm/standard.mac version.mac +nasm-version.c: version.mac genmacro$(EXEEXT) + $(top_builddir)/genmacro$(EXEEXT) $@ nasm_version_mac version.mac -BUILT_SOURCES += nasm-macros.c -CLEANFILES += nasm-macros.c - -noinst_PROGRAMS += genmacro - -genmacro_SOURCES = -EXTRA_DIST += modules/preprocs/nasm/genmacro.c -genmacro_LDADD = genmacro.$(OBJEXT) -genmacro_LINK = $(CCLD_FOR_BUILD) -o $@ - -genmacro.$(OBJEXT): modules/preprocs/nasm/genmacro.c - $(CC_FOR_BUILD) $(DEFAULT_INCLUDES) $(INCLUDES) -c -o $@ `test -f modules/preprocs/nasm/genmacro.c || echo '$(srcdir)/'`modules/preprocs/nasm/genmacro.c +BUILT_SOURCES += nasm-version.c +CLEANFILES += nasm-version.c version.mac: genversion$(EXEEXT) $(top_builddir)/genversion$(EXEEXT) $@ @@ -45,7 +35,6 @@ genversion_LINK = $(CCLD_FOR_BUILD) -o $@ genversion.$(OBJEXT): modules/preprocs/nasm/genversion.c $(CC_FOR_BUILD) $(DEFAULT_INCLUDES) $(INCLUDES) -c -o $@ `test -f modules/preprocs/nasm/genversion.c || echo '$(srcdir)/'`modules/preprocs/nasm/genversion.c -EXTRA_DIST += modules/preprocs/nasm/standard.mac EXTRA_DIST += modules/preprocs/nasm/tests/Makefile.inc include modules/preprocs/nasm/tests/Makefile.inc diff --git a/modules/preprocs/nasm/genmacro.c b/modules/preprocs/nasm/genmacro.c deleted file mode 100644 index e6f40193..00000000 --- a/modules/preprocs/nasm/genmacro.c +++ /dev/null @@ -1,145 +0,0 @@ -/* $Id$ - * - * C version of NASM's macros.pl - * - * Copyright (C) 2004-2007 Peter Johnson - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above 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 AUTHOR AND OTHER CONTRIBUTORS ``AS IS'' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#define OUTPUT "nasm-macros.c" -#define MAXLINE 1024 - -int -main(int argc, char *argv[]) -{ - FILE *in, *out; - int i; - char *str; - char *strp; - char *charp; - int fline; - int line = 0; - int lindex = 0; - int tasm_count = -1; - size_t len; - - if (argc < 2) { - fprintf(stderr, "Usage: %s <file> [<file> ...]\n", argv[0]); - return EXIT_FAILURE; - } - - out = fopen(OUTPUT, "wt"); - - if (!out) { - fprintf(stderr, "Could not open `%s'.\n", OUTPUT); - return EXIT_FAILURE; - } - - str = malloc(MAXLINE); - - fprintf(out, "/* This file auto-generated from standard.mac by genmacro.c" - " - don't edit it */\n\n#include <stddef.h>\n\n" - "static const char *stdmac[] = {\n"); - - for (i=1; i<argc; i++) { - in = fopen(argv[i], "rt"); - if (!in) { - fprintf(stderr, "Could not open `%s'.\n", argv[i]); - fclose(out); - remove(OUTPUT); - return EXIT_FAILURE; - } - - fline = 0; - - while (fgets(str, MAXLINE, in)) { - line++; - fline++; - - strp = str; - - /* check for unterminated quotes and delete comments */ - charp = strp; - while ((charp = strpbrk(charp, "'\";"))) { - if (charp[0] == ';') { - *charp = '\0'; - break; - } - if ((charp = strchr(charp+1, charp[0])) == NULL) { - fprintf(stderr, "%s:%d: error: unterminated quote\n", - argv[i], fline); - fclose(out); - remove(OUTPUT); - return EXIT_FAILURE; - } - charp++; - } - - /* strip off leading and trailing whitespace */ - while (*strp == ' ' || *strp == '\t') - strp++; - len = strlen(strp); - while (len > 0 && (strp[len-1] == ' ' || strp[len-1] == '\t' || - strp[len-1] == '\n')) { - strp[len-1] = '\0'; - len--; - } - - /* skip blank lines */ - if (len == 0) - continue; - - /* check for special TASM ending token */ - if (strcmp(strp, "*END*TASM*MACROS*") == 0) { - tasm_count = lindex; - continue; - } - - /* output as string to output file */ - fprintf(out, " \""); - while (*strp != '\0') { - if (*strp == '\\' || *strp == '"') - fputc('\\', out); - fputc(*strp, out); - strp++; - } - fprintf(out, "\",\n"); - lindex++; - } - - fclose(in); - } - - fprintf(out, " NULL\n};\n"); - if (tasm_count == -1) - tasm_count = lindex; - fprintf(out, "#define TASM_MACRO_COUNT %d\n", tasm_count); - fclose(out); - - free(str); - - return EXIT_SUCCESS; -} diff --git a/modules/preprocs/nasm/genversion.c b/modules/preprocs/nasm/genversion.c index 5426c3dd..ac977685 100644 --- a/modules/preprocs/nasm/genversion.c +++ b/modules/preprocs/nasm/genversion.c @@ -43,6 +43,11 @@ main(int argc, char *argv[]) return EXIT_FAILURE; } + if (sscanf(PACKAGE_INTVER, "%d.%d.%d", &major, &minor, &subminor) != 3) { + fprintf(stderr, "Version tokenizing error\n"); + return EXIT_FAILURE; + } + out = fopen(argv[1], "wt"); if (!out) { @@ -53,13 +58,6 @@ main(int argc, char *argv[]) fprintf(out, "; This file auto-generated by genversion.c" " - don't edit it\n"); - if (sscanf(PACKAGE_INTVER, "%d.%d.%d", &major, &minor, &subminor) != 3) { - fprintf(stderr, "Version tokenizing error\n"); - fclose(out); - remove(argv[1]); - return EXIT_FAILURE; - } - fprintf(out, "%%define __YASM_MAJOR__ %d\n", major); fprintf(out, "%%define __YASM_MINOR__ %d\n", minor); fprintf(out, "%%define __YASM_SUBMINOR__ %d\n", subminor); diff --git a/modules/preprocs/nasm/nasm-pp.c b/modules/preprocs/nasm/nasm-pp.c index 2bb94b04..2d5e7d21 100644 --- a/modules/preprocs/nasm/nasm-pp.c +++ b/modules/preprocs/nasm/nasm-pp.c @@ -351,7 +351,9 @@ static int pass; /* HACK: pass 0 = generate dependencies only */ static unsigned long unique; /* unique identifier numbers */ static Line *builtindef = NULL; +static Line *stddef = NULL; static Line *predef = NULL; +static int first_line = 1; static ListGen *list; @@ -384,18 +386,19 @@ static MMacro *defining; #define PARAM_DELTA 16 /* - * The standard macro set: defined as `static char *stdmac[]'. Also - * gives our position in the macro set, when we're processing it. + * Macros to make NASM ignore some TASM directives before the first include + * directive. */ -#include "nasm-macros.c" -static const char **stdmacpos; - -/* - * The extra standard macros that come from the object format, if - * any. - */ -static const char **extrastdmac = NULL; -int any_extrastdmac; +static const char *tasm_compat_macros[] = +{ + "%idefine IDEAL", + "%idefine JUMPS", + "%idefine P386", + "%idefine P486", + "%idefine P586", + "%idefine END", + NULL +}; static int nested_mac_count, nested_rep_count; @@ -641,69 +644,6 @@ read_line(void) char *buffer, *p, *q; int bufsize, continued_count; - Line *pd, *l; - Token *head, **tail, *t; - - /* Nasty hack for builtin defines */ - for (pd = builtindef; pd; pd = pd->next) - { - head = NULL; - tail = &head; - for (t = pd->first; t; t = t->next) - { - *tail = new_Token(NULL, t->type, t->text, 0); - tail = &(*tail)->next; - } - l = nasm_malloc(sizeof(Line)); - l->next = istk->expansion; - l->first = head; - l->finishes = FALSE; - istk->expansion = l; - } - - if (stdmacpos) - { - if (*stdmacpos) - { - char *ret = nasm_strdup(*stdmacpos++); - if (!*stdmacpos && any_extrastdmac) - { - stdmacpos = extrastdmac; - any_extrastdmac = FALSE; - return ret; - } - /* - * Nasty hack: here we push the contents of `predef' on - * to the top-level expansion stack, since this is the - * most convenient way to implement the pre-include and - * pre-define features. - */ - if (!*stdmacpos) - { - for (pd = predef; pd; pd = pd->next) - { - head = NULL; - tail = &head; - for (t = pd->first; t; t = t->next) - { - *tail = new_Token(NULL, t->type, t->text, 0); - tail = &(*tail)->next; - } - l = nasm_malloc(sizeof(Line)); - l->next = istk->expansion; - l->first = head; - l->finishes = FALSE; - istk->expansion = l; - } - } - return ret; - } - else - { - stdmacpos = NULL; - } - } - bufsize = BUF_DELTA; buffer = nasm_malloc(BUF_DELTA); p = buffer; @@ -4213,15 +4153,42 @@ pp_reset(FILE *f, const char *file, int apass, efunc errfunc, evalfunc eval, smacros[h] = NULL; } unique = 0; - if (tasm_compatible_mode) { - stdmacpos = stdmac; - } else { - stdmacpos = &stdmac[TASM_MACRO_COUNT]; - } - any_extrastdmac = (extrastdmac != NULL); + if (tasm_compatible_mode) { + pp_extra_stdmac(tasm_compat_macros); + } list = listgen; evaluate = eval; pass = apass; + first_line = 1; +} + +/* + * Nasty hack: here we push the contents of `predef' on + * to the top-level expansion stack, since this is the + * most convenient way to implement the pre-include and + * pre-define features. + */ +static void +poke_predef(Line *predef_lines) +{ + Line *pd, *l; + Token *head, **tail, *t; + + for (pd = predef_lines; pd; pd = pd->next) + { + head = NULL; + tail = &head; + for (t = pd->first; t; t = t->next) + { + *tail = new_Token(NULL, t->type, t->text, 0); + tail = &(*tail)->next; + } + l = nasm_malloc(sizeof(Line)); + l->next = istk->expansion; + l->first = head; + l->finishes = FALSE; + istk->expansion = l; + } } static char * @@ -4237,6 +4204,16 @@ pp_getline(void) * buffer or from the input file. */ tline = NULL; + + if (first_line) + { + /* Reverse order */ + poke_predef(predef); + poke_predef(stddef); + poke_predef(builtindef); + first_line = 0; + } + if (!istk) return NULL; while (istk->expansion && istk->expansion->finishes) @@ -4501,6 +4478,7 @@ pp_cleanup(int pass_) if (pass_ == 0) { free_llist(builtindef); + free_llist(stddef); free_llist(predef); delete_Blocks(); } @@ -4589,7 +4567,24 @@ pp_builtin_define(char *definition) void pp_extra_stdmac(const char **macros) { - extrastdmac = macros; + const char **lp; + + for (lp=macros; *lp; lp++) + { + char *macro; + Token *t; + Line *l; + + macro = nasm_strdup(*lp); + t = tokenise(macro); + nasm_free(macro); + + l = nasm_malloc(sizeof(Line)); + l->next = stddef; + l->first = t; + l->finishes = FALSE; + stddef = l; + } } static void diff --git a/modules/preprocs/nasm/nasm-preproc.c b/modules/preprocs/nasm/nasm-preproc.c index a0d941cf..bb4c7a74 100644 --- a/modules/preprocs/nasm/nasm-preproc.c +++ b/modules/preprocs/nasm/nasm-preproc.c @@ -48,6 +48,8 @@ static yasm_linemap *cur_lm; static yasm_errwarns *cur_errwarns; int tasm_compatible_mode = 0; +#include "nasm-version.c" + typedef struct preproc_dep { STAILQ_ENTRY(preproc_dep) link; char *name; @@ -156,6 +158,8 @@ nasm_preproc_create(const char *in_filename, yasm_symtab *symtab, preproc_nasm->lineinc = 0; nasmpp.reset(f, in_filename, 2, nasm_efunc, nasm_evaluate, &nil_list); + pp_extra_stdmac(nasm_version_mac); + return (yasm_preproc *)preproc_nasm; } @@ -290,6 +294,12 @@ nasm_preproc_define_builtin(yasm_preproc *preproc, const char *macronameval) yasm_xfree(mnv); } +static void +nasm_preproc_add_standard(yasm_preproc *preproc, const char **macros) +{ + pp_extra_stdmac(macros); +} + /* Define preproc structure -- see preproc.h for details */ yasm_preproc_module yasm_nasm_LTX_preproc = { "Real NASM Preprocessor", @@ -301,5 +311,6 @@ yasm_preproc_module yasm_nasm_LTX_preproc = { nasm_preproc_add_include_file, nasm_preproc_predefine_macro, nasm_preproc_undefine_macro, - nasm_preproc_define_builtin + nasm_preproc_define_builtin, + nasm_preproc_add_standard }; diff --git a/modules/preprocs/nasm/standard.mac b/modules/preprocs/nasm/standard.mac deleted file mode 100644 index f459a7db..00000000 --- a/modules/preprocs/nasm/standard.mac +++ /dev/null @@ -1,293 +0,0 @@ -; Standard macro set for NASM -*- nasm -*- - -; Macros to make NASM ignore some TASM directives before the first include -; directive. - - %idefine IDEAL - %idefine JUMPS - %idefine P386 - %idefine P486 - %idefine P586 - %idefine END - -; This is a magic token which indicates the end of the TASM macros -*END*TASM*MACROS* - -; Note that although some user-level forms of directives are defined -; here, not all of them are: the user-level form of a format-specific -; directive should be defined in the module for that directive. - -; These two need to be defined, though the actual definitions will -; be constantly updated during preprocessing. -%define __FILE__ -%define __LINE__ - -%define __SECT__ [section .text] ; it ought to be defined, even if as nothing - -%imacro section 1+.nolist -%define __SECT__ [section %1] - __SECT__ -%endmacro -%imacro segment 1+.nolist -%define __SECT__ [segment %1] - __SECT__ -%endmacro - -%imacro absolute 1+.nolist -%define __SECT__ [absolute %1] - __SECT__ -%endmacro - -%imacro struc 1.nolist -%push struc -%define %$strucname %1 -[absolute 0] -%$strucname: ; allow definition of `.member' to work sanely -%endmacro -%imacro endstruc 0.nolist -%{$strucname}_size: -%pop -__SECT__ -%endmacro - -%imacro istruc 1.nolist -%push istruc -%define %$strucname %1 -%$strucstart: -%endmacro -%imacro at 1-2+.nolist - times %1-($-%$strucstart) db 0 - %2 -%endmacro -%imacro iend 0.nolist - times %{$strucname}_size-($-%$strucstart) db 0 -%pop -%endmacro - -%imacro align 1-2+.nolist nop -%ifidni %2,nop - [align %1] -%else - times ($$-$) & ((%1)-1) %2 -%endif -%endmacro -%imacro alignb 1-2+.nolist resb 1 - times ($$-$) & ((%1)-1) %2 -%endmacro - -%imacro extern 1-*.nolist -%rep %0 -[extern %1] -%rotate 1 -%endrep -%endmacro - -%imacro bits 1+.nolist -[bits %1] -%endmacro - -%imacro use16 0.nolist -[bits 16] -%endmacro -%imacro use32 0.nolist -[bits 32] -%endmacro -%imacro use64 0.nolist -[bits 64] -%endmacro - -%imacro global 1-*.nolist -%rep %0 -[global %1] -%rotate 1 -%endrep -%endmacro - -%imacro common 1-*.nolist -%rep %0 -[common %1] -%rotate 1 -%endrep -%endmacro - -%imacro cpu 1+.nolist -[cpu %1] -%endmacro - -%imacro default 1+.nolist -[default %1] -%endmacro - -; NASM compatibility shim -%define __OUTPUT_FORMAT__ __YASM_OBJFMT__ - -%ifidn __YASM_OBJFMT__,bin -%imacro org 1+.nolist -[org %1] -%endmacro -%endif - -%ifidn __YASM_OBJFMT__,win32 -%imacro export 1+.nolist -[export %1] -%endmacro - -%imacro safeseh 1+.nolist -[safeseh %1] -%endmacro -%endif - -%ifidn __YASM_OBJFMT__,win64 -%define __YASM_WIN64__ -%endif - -%ifidn __YASM_OBJFMT__,x64 -%define __YASM_WIN64__ -%endif - -%ifdef __YASM_WIN64__ -%undef __YASM_WIN64__ - -%imacro export 1+.nolist -[export %1] -%endmacro - -; Raw exception handling operations -%imacro proc_frame 1+.nolist -%1: -[proc_frame %1] -%endmacro - -%if 0 -; Disable these as they're too closely named to the macroized ones. -; MASM needs a preceding . to use these, so it seems reasonable for -; us to similarly require the []. -%imacro pushreg 1.nolist -[pushreg %1] -%endmacro - -%imacro setframe 1-2.nolist -[setframe %1 %2] -%endmacro - -%imacro allocstack 1.nolist -[allocstack %1] -%endmacro - -%imacro savereg 2.nolist -[savereg %1 %2] -%endmacro - -%imacro savexmm128 2.nolist -[savexmm128 %1 %2] -%endmacro - -%imacro pushframe 0-1.nolist -[pushframe %1] -%endmacro - -%imacro endprolog 0.nolist -[endprolog] -%endmacro -%endif - -%imacro endproc_frame 0.nolist -[endproc_frame] -%endmacro - -; Complex (macro) exception handling operations -; Mimics many macros provided by MASM's macamd64.inc -%imacro push_reg 1 -push %1 -[pushreg %1] -%endmacro - -%imacro rex_push_reg 1 -db 0x48 -push %1 -[pushreg %1] -%endmacro - -%imacro push_eflags 0 -pushfq -[allocstack 8] -%endmacro - -%imacro rex_push_eflags 0 -db 0x48 -pushfq -[allocstack 8] -%endmacro - -%imacro alloc_stack 1 -sub rsp, %1 -[allocstack %1] -%endmacro - -%imacro save_reg 2 -mov [rsp+%2], %1 -[savereg %1 %2] -%endmacro - -%imacro save_xmm128 2 -movdqa [rsp+%2], %1 -[savexmm128 %1 %2] -%endmacro - -%imacro push_frame 0-1.nolist -[pushframe %1] -%endmacro - -%imacro set_frame 1-2 -%if %0==1 -mov %1, rsp -%else -lea %1, [rsp+%2] -%endif -[setframe %1 %2] -%endmacro - -%imacro end_prolog 0.nolist -[endprolog] -%endmacro - -%imacro end_prologue 0.nolist -[endprolog] -%endmacro - -%endif - -%ifidn __YASM_OBJFMT__,elf -%define __YASM_ELF__ -%endif - -%ifidn __YASM_OBJFMT__,elf32 -%define __YASM_ELF__ -%endif - -%ifidn __YASM_OBJFMT__,elf64 -%define __YASM_ELF__ -%endif - -%ifdef __YASM_ELF__ -%undef __YASM_ELF__ -%imacro type 1+.nolist -[type %1] -%endmacro -%imacro size 1+.nolist -[size %1] -%endmacro -%imacro weak 1+.nolist -[weak %1] -%endmacro -%endif - -%ifidn __YASM_OBJFMT__,rdf -%imacro library 1+.nolist -[library %1] -%endmacro -%imacro module 1+.nolist -[module %1] -%endmacro -%endif - diff --git a/modules/preprocs/nasm/tests/nasmpp-nested.errwarn b/modules/preprocs/nasm/tests/nasmpp-nested.errwarn index 4df49285..31839e33 100644 --- a/modules/preprocs/nasm/tests/nasmpp-nested.errwarn +++ b/modules/preprocs/nasm/tests/nasmpp-nested.errwarn @@ -1,3 +1,3 @@ --:27: warning: (WORK_1:4) 4 --:28: warning: (WORK_2:4) 4 --:29: warning: (DONT_WORK_1:6) 4 4 +-:27: warning: (WORK_1:2) 4 +-:28: warning: (WORK_2:2) 4 +-:29: warning: (DONT_WORK_1:3) 4 4 diff --git a/modules/preprocs/raw/raw-preproc.c b/modules/preprocs/raw/raw-preproc.c index 03f07559..463ceaa1 100644 --- a/modules/preprocs/raw/raw-preproc.c +++ b/modules/preprocs/raw/raw-preproc.c @@ -147,6 +147,12 @@ raw_preproc_define_builtin(yasm_preproc *preproc, const char *macronameval) /* no builtin defines */ } +static void +raw_preproc_add_standard(yasm_preproc *preproc, const char **macros) +{ + /* no standard macros */ +} + /* Define preproc structure -- see preproc.h for details */ yasm_preproc_module yasm_raw_LTX_preproc = { @@ -159,5 +165,6 @@ yasm_preproc_module yasm_raw_LTX_preproc = { raw_preproc_add_include_file, raw_preproc_predefine_macro, raw_preproc_undefine_macro, - raw_preproc_define_builtin + raw_preproc_define_builtin, + raw_preproc_add_standard }; diff --git a/modules/preprocs/yapp/yapp-preproc.c b/modules/preprocs/yapp/yapp-preproc.c index e1215a75..0c774049 100644 --- a/modules/preprocs/yapp/yapp-preproc.c +++ b/modules/preprocs/yapp/yapp-preproc.c @@ -999,6 +999,12 @@ yapp_preproc_define_builtin(yasm_preproc *preproc, const char *macronameval) /* TODO */ } +static void +yapp_preproc_add_standard(yasm_preproc *preproc, const char **macros) +{ + /* TODO */ +} + /* Define preproc structure -- see preproc.h for details */ yasm_preproc_module yasm_yapp_LTX_preproc = { "YAPP preprocessing (NASM style)", @@ -1010,5 +1016,6 @@ yasm_preproc_module yasm_yapp_LTX_preproc = { yapp_preproc_add_include_file, yapp_preproc_predefine_macro, yapp_preproc_undefine_macro, - yapp_preproc_define_builtin + yapp_preproc_define_builtin, + yapp_preproc_add_standard }; |