mirror of
https://github.com/netwide-assembler/nasm.git
synced 2025-07-24 10:25:42 -04:00
Merge branch 'master' into elf
This commit is contained in:
commit
e0172d5870
3
.gitignore
vendored
3
.gitignore
vendored
@ -14,11 +14,13 @@
|
|||||||
*.pdb
|
*.pdb
|
||||||
*.rej
|
*.rej
|
||||||
*.s
|
*.s
|
||||||
|
*.si
|
||||||
*.swp
|
*.swp
|
||||||
*.xml
|
*.xml
|
||||||
.*swo
|
.*swo
|
||||||
*~
|
*~
|
||||||
\#*
|
\#*
|
||||||
|
.\#*
|
||||||
*.bak
|
*.bak
|
||||||
*.tmp
|
*.tmp
|
||||||
.git-ignore
|
.git-ignore
|
||||||
@ -54,6 +56,7 @@ TAGS
|
|||||||
/macros/macros.c
|
/macros/macros.c
|
||||||
/nasm
|
/nasm
|
||||||
/ndisasm
|
/ndisasm
|
||||||
|
/nasm.spec
|
||||||
/nsis/arch.nsh
|
/nsis/arch.nsh
|
||||||
/nsis/version.nsh
|
/nsis/version.nsh
|
||||||
/rdoff/Makefile
|
/rdoff/Makefile
|
||||||
|
19
Makefile.in
19
Makefile.in
@ -100,7 +100,8 @@ LIBOBJ = stdlib/snprintf.$(O) stdlib/vsnprintf.$(O) stdlib/strlcpy.$(O) \
|
|||||||
nasmlib/crc64.$(O) nasmlib/malloc.$(O) \
|
nasmlib/crc64.$(O) nasmlib/malloc.$(O) \
|
||||||
nasmlib/md5c.$(O) nasmlib/string.$(O) \
|
nasmlib/md5c.$(O) nasmlib/string.$(O) \
|
||||||
nasmlib/file.$(O) nasmlib/mmap.$(O) nasmlib/ilog2.$(O) \
|
nasmlib/file.$(O) nasmlib/mmap.$(O) nasmlib/ilog2.$(O) \
|
||||||
nasmlib/realpath.$(O) nasmlib/filename.$(O) nasmlib/srcfile.$(O) \
|
nasmlib/realpath.$(O) nasmlib/path.$(O) \
|
||||||
|
nasmlib/filename.$(O) nasmlib/srcfile.$(O) \
|
||||||
nasmlib/zerobuf.$(O) nasmlib/readnum.$(O) nasmlib/bsi.$(O) \
|
nasmlib/zerobuf.$(O) nasmlib/readnum.$(O) nasmlib/bsi.$(O) \
|
||||||
nasmlib/rbtree.$(O) nasmlib/hashtbl.$(O) \
|
nasmlib/rbtree.$(O) nasmlib/hashtbl.$(O) \
|
||||||
nasmlib/raa.$(O) nasmlib/saa.$(O) \
|
nasmlib/raa.$(O) nasmlib/saa.$(O) \
|
||||||
@ -348,6 +349,7 @@ clean:
|
|||||||
$(RM_F) nasm-*-installer-*.exe
|
$(RM_F) nasm-*-installer-*.exe
|
||||||
$(RM_F) tags TAGS
|
$(RM_F) tags TAGS
|
||||||
$(RM_F) nsis/arch.nsh
|
$(RM_F) nsis/arch.nsh
|
||||||
|
$(RM_F) perlbreq.si
|
||||||
$(RM_F) $(RDFPROGS) $(RDF2BINLINKS)
|
$(RM_F) $(RDFPROGS) $(RDF2BINLINKS)
|
||||||
|
|
||||||
distclean: clean
|
distclean: clean
|
||||||
@ -417,8 +419,16 @@ tar: dist
|
|||||||
|
|
||||||
spec: nasm.spec
|
spec: nasm.spec
|
||||||
|
|
||||||
nasm.spec: nasm.spec.in version.sed
|
ALLPERLSRC := $(shell find $(srcdir) -type f -name '*.p[lh]')
|
||||||
sed -f version.sed < nasm.spec.in > nasm.spec
|
|
||||||
|
perlbreq.si: $(ALLPERLSRC)
|
||||||
|
sed -n -r -e 's/^use[[:space:]]+([^[:space:];]+).*$$/BuildRequires: perl(\1)/p' $(ALLPERLSRC) | \
|
||||||
|
sed -r -e '/perl\((strict|warnings)\)/d' | \
|
||||||
|
sort | uniq > perlbreq.si || ( rm -f perlbreq.si ; false )
|
||||||
|
|
||||||
|
nasm.spec: nasm.spec.in nasm.spec.sed version.sed perlbreq.si
|
||||||
|
sed -f version.sed -f nasm.spec.sed \
|
||||||
|
< nasm.spec.in > nasm.spec || ( rm -f nasm.spec ; false )
|
||||||
|
|
||||||
splint:
|
splint:
|
||||||
splint -weak *.c
|
splint -weak *.c
|
||||||
@ -619,6 +629,9 @@ nasmlib/md5c.$(O): nasmlib/md5c.c config/config.h config/msvc.h \
|
|||||||
nasmlib/mmap.$(O): nasmlib/mmap.c config/config.h config/msvc.h \
|
nasmlib/mmap.$(O): nasmlib/mmap.c config/config.h config/msvc.h \
|
||||||
config/unknown.h config/watcom.h include/compiler.h include/error.h \
|
config/unknown.h config/watcom.h include/compiler.h include/error.h \
|
||||||
include/nasmint.h include/nasmlib.h nasmlib/file.h
|
include/nasmint.h include/nasmlib.h nasmlib/file.h
|
||||||
|
nasmlib/path.$(O): nasmlib/path.c config/config.h config/msvc.h \
|
||||||
|
config/unknown.h config/watcom.h include/compiler.h include/error.h \
|
||||||
|
include/nasmint.h include/nasmlib.h
|
||||||
nasmlib/perfhash.$(O): nasmlib/perfhash.c config/config.h config/msvc.h \
|
nasmlib/perfhash.$(O): nasmlib/perfhash.c config/config.h config/msvc.h \
|
||||||
config/unknown.h config/watcom.h include/compiler.h include/hashtbl.h \
|
config/unknown.h config/watcom.h include/compiler.h include/hashtbl.h \
|
||||||
include/nasmint.h include/nasmlib.h include/perfhash.h
|
include/nasmint.h include/nasmlib.h include/perfhash.h
|
||||||
|
@ -73,7 +73,8 @@ LIBOBJ = stdlib\snprintf.$(O) stdlib\vsnprintf.$(O) stdlib\strlcpy.$(O) \
|
|||||||
nasmlib\crc64.$(O) nasmlib\malloc.$(O) \
|
nasmlib\crc64.$(O) nasmlib\malloc.$(O) \
|
||||||
nasmlib\md5c.$(O) nasmlib\string.$(O) \
|
nasmlib\md5c.$(O) nasmlib\string.$(O) \
|
||||||
nasmlib\file.$(O) nasmlib\mmap.$(O) nasmlib\ilog2.$(O) \
|
nasmlib\file.$(O) nasmlib\mmap.$(O) nasmlib\ilog2.$(O) \
|
||||||
nasmlib\realpath.$(O) nasmlib\filename.$(O) nasmlib\srcfile.$(O) \
|
nasmlib\realpath.$(O) nasmlib\path.$(O) \
|
||||||
|
nasmlib\filename.$(O) nasmlib\srcfile.$(O) \
|
||||||
nasmlib\zerobuf.$(O) nasmlib\readnum.$(O) nasmlib\bsi.$(O) \
|
nasmlib\zerobuf.$(O) nasmlib\readnum.$(O) nasmlib\bsi.$(O) \
|
||||||
nasmlib\rbtree.$(O) nasmlib\hashtbl.$(O) \
|
nasmlib\rbtree.$(O) nasmlib\hashtbl.$(O) \
|
||||||
nasmlib\raa.$(O) nasmlib\saa.$(O) \
|
nasmlib\raa.$(O) nasmlib\saa.$(O) \
|
||||||
@ -519,6 +520,9 @@ nasmlib\md5c.$(O): nasmlib\md5c.c config\msvc.h config\unknown.h \
|
|||||||
nasmlib\mmap.$(O): nasmlib\mmap.c config\msvc.h config\unknown.h \
|
nasmlib\mmap.$(O): nasmlib\mmap.c config\msvc.h config\unknown.h \
|
||||||
config\watcom.h include\compiler.h include\error.h include\nasmint.h \
|
config\watcom.h include\compiler.h include\error.h include\nasmint.h \
|
||||||
include\nasmlib.h nasmlib\file.h
|
include\nasmlib.h nasmlib\file.h
|
||||||
|
nasmlib\path.$(O): nasmlib\path.c config\msvc.h config\unknown.h \
|
||||||
|
config\watcom.h include\compiler.h include\error.h include\nasmint.h \
|
||||||
|
include\nasmlib.h
|
||||||
nasmlib\perfhash.$(O): nasmlib\perfhash.c config\msvc.h config\unknown.h \
|
nasmlib\perfhash.$(O): nasmlib\perfhash.c config\msvc.h config\unknown.h \
|
||||||
config\watcom.h include\compiler.h include\hashtbl.h include\nasmint.h \
|
config\watcom.h include\compiler.h include\hashtbl.h include\nasmint.h \
|
||||||
include\nasmlib.h include\perfhash.h
|
include\nasmlib.h include\perfhash.h
|
||||||
|
@ -59,7 +59,8 @@ LIBOBJ = stdlib/snprintf.$(O) stdlib/vsnprintf.$(O) stdlib/strlcpy.$(O) &
|
|||||||
nasmlib/crc64.$(O) nasmlib/malloc.$(O) &
|
nasmlib/crc64.$(O) nasmlib/malloc.$(O) &
|
||||||
nasmlib/md5c.$(O) nasmlib/string.$(O) &
|
nasmlib/md5c.$(O) nasmlib/string.$(O) &
|
||||||
nasmlib/file.$(O) nasmlib/mmap.$(O) nasmlib/ilog2.$(O) &
|
nasmlib/file.$(O) nasmlib/mmap.$(O) nasmlib/ilog2.$(O) &
|
||||||
nasmlib/realpath.$(O) nasmlib/filename.$(O) nasmlib/srcfile.$(O) &
|
nasmlib/realpath.$(O) nasmlib/path.$(O) &
|
||||||
|
nasmlib/filename.$(O) nasmlib/srcfile.$(O) &
|
||||||
nasmlib/zerobuf.$(O) nasmlib/readnum.$(O) nasmlib/bsi.$(O) &
|
nasmlib/zerobuf.$(O) nasmlib/readnum.$(O) nasmlib/bsi.$(O) &
|
||||||
nasmlib/rbtree.$(O) nasmlib/hashtbl.$(O) &
|
nasmlib/rbtree.$(O) nasmlib/hashtbl.$(O) &
|
||||||
nasmlib/raa.$(O) nasmlib/saa.$(O) &
|
nasmlib/raa.$(O) nasmlib/saa.$(O) &
|
||||||
@ -493,6 +494,9 @@ nasmlib/md5c.$(O): nasmlib/md5c.c config/msvc.h config/unknown.h &
|
|||||||
nasmlib/mmap.$(O): nasmlib/mmap.c config/msvc.h config/unknown.h &
|
nasmlib/mmap.$(O): nasmlib/mmap.c config/msvc.h config/unknown.h &
|
||||||
config/watcom.h include/compiler.h include/error.h include/nasmint.h &
|
config/watcom.h include/compiler.h include/error.h include/nasmint.h &
|
||||||
include/nasmlib.h nasmlib/file.h
|
include/nasmlib.h nasmlib/file.h
|
||||||
|
nasmlib/path.$(O): nasmlib/path.c config/msvc.h config/unknown.h &
|
||||||
|
config/watcom.h include/compiler.h include/error.h include/nasmint.h &
|
||||||
|
include/nasmlib.h
|
||||||
nasmlib/perfhash.$(O): nasmlib/perfhash.c config/msvc.h config/unknown.h &
|
nasmlib/perfhash.$(O): nasmlib/perfhash.c config/msvc.h config/unknown.h &
|
||||||
config/watcom.h include/compiler.h include/hashtbl.h include/nasmint.h &
|
config/watcom.h include/compiler.h include/hashtbl.h include/nasmint.h &
|
||||||
include/nasmlib.h include/perfhash.h
|
include/nasmlib.h include/perfhash.h
|
||||||
|
30
aclocal.m4
vendored
30
aclocal.m4
vendored
@ -9,10 +9,10 @@ AC_DEFUN(PA_ADD_CFLAGS,
|
|||||||
CFLAGS="$CFLAGS $1"
|
CFLAGS="$CFLAGS $1"
|
||||||
AC_TRY_LINK(AC_INCLUDES_DEFAULT,
|
AC_TRY_LINK(AC_INCLUDES_DEFAULT,
|
||||||
[printf("Hello, World!\n");],
|
[printf("Hello, World!\n");],
|
||||||
AC_MSG_RESULT([yes])
|
[AC_MSG_RESULT([yes])
|
||||||
CFLAGS="$pa_add_cflags__old_cflags ifelse([$2],[],[$1],[$2])",
|
CFLAGS="$pa_add_cflags__old_cflags ifelse([$2],[],[$1],[$2])"],
|
||||||
AC_MSG_RESULT([no])
|
[AC_MSG_RESULT([no])
|
||||||
CFLAGS="$pa_add_cflags__old_cflags")])
|
CFLAGS="$pa_add_cflags__old_cflags"])])
|
||||||
|
|
||||||
dnl --------------------------------------------------------------------------
|
dnl --------------------------------------------------------------------------
|
||||||
dnl PA_ADD_CLDFLAGS()
|
dnl PA_ADD_CLDFLAGS()
|
||||||
@ -28,12 +28,12 @@ AC_DEFUN(PA_ADD_CLDFLAGS,
|
|||||||
LDFLAGS="$LDFLAGS $1"
|
LDFLAGS="$LDFLAGS $1"
|
||||||
AC_TRY_LINK(AC_INCLUDES_DEFAULT,
|
AC_TRY_LINK(AC_INCLUDES_DEFAULT,
|
||||||
[printf("Hello, World!\n");],
|
[printf("Hello, World!\n");],
|
||||||
AC_MSG_RESULT([yes])
|
[AC_MSG_RESULT([yes])
|
||||||
CFLAGS="$pa_add_cldflags__old_cflags ifelse([$2],[],[$1],[$2])"
|
CFLAGS="$pa_add_cldflags__old_cflags ifelse([$2],[],[$1],[$2])"
|
||||||
LDFLAGS="$pa_add_cldflags__old_ldflags ifelse([$2],[],[$1],[$2])",
|
LDFLAGS="$pa_add_cldflags__old_ldflags ifelse([$2],[],[$1],[$2])"],
|
||||||
AC_MSG_RESULT([no])
|
[AC_MSG_RESULT([no])
|
||||||
CFLAGS="$pa_add_cldflags__old_cflags"
|
CFLAGS="$pa_add_cldflags__old_cflags"
|
||||||
LDFLAGS="$pa_add_cldflags__old_ldflags")])
|
LDFLAGS="$pa_add_cldflags__old_ldflags"])])
|
||||||
|
|
||||||
dnl --------------------------------------------------------------------------
|
dnl --------------------------------------------------------------------------
|
||||||
dnl PA_VAR
|
dnl PA_VAR
|
||||||
@ -137,15 +137,13 @@ dnl Simpler-to-use versions of AC_ARG_ENABLED, that include the
|
|||||||
dnl test for $enableval and the AS_HELP_STRING definition
|
dnl test for $enableval and the AS_HELP_STRING definition
|
||||||
dnl --------------------------------------------------------------------------
|
dnl --------------------------------------------------------------------------
|
||||||
AC_DEFUN(PA_ARG_ENABLED,
|
AC_DEFUN(PA_ARG_ENABLED,
|
||||||
[AC_ARG_ENABLE([$1],
|
[AC_ARG_ENABLE([$1], [AS_HELP_STRING([--enable-$1],[$2])], [], [enableval=no])
|
||||||
[AS_HELP_STRING([--enable-$1],[$2])], [], [enableval=no])
|
AS_IF([test x"$enableval" != xno], [$3], [$4])
|
||||||
AS_IF([test x"$enableval" != xno], [$3], [$4])
|
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_DEFUN(PA_ARG_DISABLED,
|
AC_DEFUN(PA_ARG_DISABLED,
|
||||||
[AC_ARG_ENABLE([$1],
|
[AC_ARG_ENABLE([$1],[AS_HELP_STRING([--disable-$1],[$2])], [], [enableval=yes])
|
||||||
[AS_HELP_STRING([--disable-$1],[$2])], [], [enableval=yes])
|
AS_IF([test x"$enableval" = xno], [$3], [$4])
|
||||||
AS_IF([test x"$enableval" = xno], [$3], [$4])
|
|
||||||
])
|
])
|
||||||
|
|
||||||
dnl --------------------------------------------------------------------------
|
dnl --------------------------------------------------------------------------
|
||||||
|
@ -2426,13 +2426,11 @@ static enum match_result matches(const struct itemplate *itemp,
|
|||||||
* - offset can fit in a byte when EVEX is not used
|
* - offset can fit in a byte when EVEX is not used
|
||||||
* - offset can be compressed when EVEX is used
|
* - offset can be compressed when EVEX is used
|
||||||
*/
|
*/
|
||||||
#define IS_MOD_01() (input->eaflags & EAF_BYTEOFFS || \
|
#define IS_MOD_01() (!(input->eaflags & EAF_WORDOFFS) && \
|
||||||
(o >= -128 && o <= 127 && \
|
(ins->rex & REX_EV ? seg == NO_SEG && !forw_ref && \
|
||||||
seg == NO_SEG && !forw_ref && \
|
is_disp8n(input, ins, &output->disp8) : \
|
||||||
!(input->eaflags & EAF_WORDOFFS) && \
|
input->eaflags & EAF_BYTEOFFS || (o >= -128 && \
|
||||||
!(ins->rex & REX_EV)) || \
|
o <= 127 && seg == NO_SEG && !forw_ref)))
|
||||||
(ins->rex & REX_EV && \
|
|
||||||
is_disp8n(input, ins, &output->disp8)))
|
|
||||||
|
|
||||||
static enum ea_type process_ea(operand *input, ea *output, int bits,
|
static enum ea_type process_ea(operand *input, ea *output, int bits,
|
||||||
int rfield, opflags_t rflags, insn *ins,
|
int rfield, opflags_t rflags, insn *ins,
|
||||||
|
@ -186,7 +186,7 @@ static union label *find_label(const char *label, int create, int *created)
|
|||||||
/*
|
/*
|
||||||
* must allocate a new block
|
* must allocate a new block
|
||||||
*/
|
*/
|
||||||
lfree->admin.next = (union label *)nasm_malloc(LBLK_SIZE);
|
lfree->admin.next = nasm_malloc(LBLK_SIZE);
|
||||||
lfree = lfree->admin.next;
|
lfree = lfree->admin.next;
|
||||||
init_block(lfree);
|
init_block(lfree);
|
||||||
}
|
}
|
||||||
@ -424,11 +424,11 @@ int init_labels(void)
|
|||||||
{
|
{
|
||||||
hash_init(<ab, HASH_LARGE);
|
hash_init(<ab, HASH_LARGE);
|
||||||
|
|
||||||
ldata = lfree = (union label *)nasm_malloc(LBLK_SIZE);
|
ldata = lfree = nasm_malloc(LBLK_SIZE);
|
||||||
init_block(lfree);
|
init_block(lfree);
|
||||||
|
|
||||||
perm_head = perm_tail =
|
perm_head = perm_tail =
|
||||||
(struct permts *)nasm_malloc(sizeof(struct permts));
|
nasm_malloc(sizeof(struct permts));
|
||||||
|
|
||||||
perm_head->next = NULL;
|
perm_head->next = NULL;
|
||||||
perm_head->size = PERMTS_SIZE;
|
perm_head->size = PERMTS_SIZE;
|
||||||
@ -483,7 +483,7 @@ static char *perm_copy(const char *string)
|
|||||||
|
|
||||||
if (perm_tail->size - perm_tail->usage < len) {
|
if (perm_tail->size - perm_tail->usage < len) {
|
||||||
perm_tail->next =
|
perm_tail->next =
|
||||||
(struct permts *)nasm_malloc(sizeof(struct permts));
|
nasm_malloc(sizeof(struct permts));
|
||||||
perm_tail = perm_tail->next;
|
perm_tail = perm_tail->next;
|
||||||
perm_tail->next = NULL;
|
perm_tail->next = NULL;
|
||||||
perm_tail->size = PERMTS_SIZE;
|
perm_tail->size = PERMTS_SIZE;
|
||||||
|
@ -208,8 +208,9 @@ dnl support function sections
|
|||||||
dnl
|
dnl
|
||||||
PA_ARG_ENABLED([sections],
|
PA_ARG_ENABLED([sections],
|
||||||
[compile with function/data section support],
|
[compile with function/data section support],
|
||||||
[PA_ADD_CFLAGS([-ffunction-sections]),
|
[PA_ADD_CLDFLAGS([-ffunction-sections])
|
||||||
PA_ADD_CFLAGS([-fdata-sections])],
|
PA_ADD_CLDFLAGS([-fdata-sections])
|
||||||
|
PA_ADD_CLDFLAGS([-Wl,--gc-sections])],
|
||||||
[])
|
[])
|
||||||
dnl
|
dnl
|
||||||
dnl support LTO
|
dnl support LTO
|
||||||
|
@ -61,11 +61,26 @@ ul.index {
|
|||||||
color: inherit;
|
color: inherit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@media only screen and (min-width: 90em) {
|
||||||
|
/* For a very wide screen, go to a columnar layout */
|
||||||
|
div.contents {
|
||||||
|
-webkit-column-count: 2;
|
||||||
|
-moz-column-count: 2;
|
||||||
|
column-count: 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media only screen and (min-width: 135em) {
|
||||||
|
div.contents {
|
||||||
|
-webkit-column-count: 3;
|
||||||
|
-moz-column-count: 3;
|
||||||
|
column-count: 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
@media screen {
|
@media screen {
|
||||||
/* Setting an explicit margin to keep the navbar from moving */
|
/* Setting an explicit margin to keep the navbar from moving */
|
||||||
body {
|
body {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 10px;
|
margin: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Link styles */
|
/* Link styles */
|
||||||
@ -94,7 +109,7 @@ ul.index {
|
|||||||
ul.navbar {
|
ul.navbar {
|
||||||
display: block;
|
display: block;
|
||||||
position: sticky;
|
position: sticky;
|
||||||
top: 10px;
|
top: 8px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
@ -791,31 +791,30 @@ disable it by \c{-w-orphan-labels}.
|
|||||||
The current \i{warning classes} are:
|
The current \i{warning classes} are:
|
||||||
|
|
||||||
\b \i\c{other} specifies any warning not otherwise specified in any
|
\b \i\c{other} specifies any warning not otherwise specified in any
|
||||||
class.
|
class. Enabled by default.
|
||||||
|
|
||||||
\b \i\c{macro-params} covers warnings about \i{multi-line macros}
|
\b \i\c{macro-params} covers warnings about \i{multi-line macros}
|
||||||
being invoked with the wrong number of parameters. This warning
|
being invoked with the wrong number of parameters. Enabled by default;
|
||||||
class is enabled by default; see \k{mlmacover} for an example of why
|
see \k{mlmacover} for an example of why you might want to disable it.
|
||||||
|
|
||||||
|
\b \i\c{macro-selfref} warns if a macro references itself. Disabled by
|
||||||
|
default.
|
||||||
|
|
||||||
|
\b \i\c{macro-defaults} warns when a macro has more default parameters
|
||||||
|
than optional parameters. Enabled by default; see \k{mlmacdef} for why
|
||||||
you might want to disable it.
|
you might want to disable it.
|
||||||
|
|
||||||
\b \i\c{macro-selfref} warns if a macro references itself. This
|
|
||||||
warning class is disabled by default.
|
|
||||||
|
|
||||||
\b\i\c{macro-defaults} warns when a macro has more default
|
|
||||||
parameters than optional parameters. This warning class
|
|
||||||
is enabled by default; see \k{mlmacdef} for why you might want to disable it.
|
|
||||||
|
|
||||||
\b \i\c{orphan-labels} covers warnings about source lines which
|
\b \i\c{orphan-labels} covers warnings about source lines which
|
||||||
contain no instruction but define a label without a trailing colon.
|
contain no instruction but define a label without a trailing colon.
|
||||||
NASM warns about this somewhat obscure condition by default;
|
NASM warns about this somewhat obscure condition by default;
|
||||||
see \k{syntax} for more information.
|
see \k{syntax} for more information.
|
||||||
|
|
||||||
\b \i\c{number-overflow} covers warnings about numeric constants which
|
\b \i\c{number-overflow} covers warnings about numeric constants which
|
||||||
don't fit in 64 bits. This warning class is enabled by default.
|
don't fit in 64 bits. Enabled by default.
|
||||||
|
|
||||||
\b \i\c{gnu-elf-extensions} warns if 8-bit or 16-bit relocations
|
\b \i\c{gnu-elf-extensions} warns if 8-bit or 16-bit relocations
|
||||||
are used in \c{-f elf} format. The GNU extensions allow this.
|
are used in \c{-f elf} format. The GNU extensions allow this.
|
||||||
This warning class is disabled by default.
|
Disabled by default.
|
||||||
|
|
||||||
\b \i\c{float-overflow} warns about floating point overflow.
|
\b \i\c{float-overflow} warns about floating point overflow.
|
||||||
Enabled by default.
|
Enabled by default.
|
||||||
@ -844,11 +843,11 @@ form of jmp instruction becomes jmp short form.
|
|||||||
Enabled by default.
|
Enabled by default.
|
||||||
|
|
||||||
\b \i\c{zext-reloc} warns that a relocation has been zero-extended due
|
\b \i\c{zext-reloc} warns that a relocation has been zero-extended due
|
||||||
to limitations in the output format.
|
to limitations in the output format. Enabled by default.
|
||||||
|
|
||||||
\b \i\c\{ptr} warns about keywords used in other assemblers that might
|
\b \i\c\{ptr} warns about keywords used in other assemblers that might
|
||||||
indicate a mistake in the source code. Currently only the MASM
|
indicate a mistake in the source code. Currently only the MASM
|
||||||
\c{PTR} keyword is recognized.
|
\c{PTR} keyword is recognized. Enabled by default.
|
||||||
|
|
||||||
\b \i\c{bad-pragma} warns about a malformed or otherwise unparsable
|
\b \i\c{bad-pragma} warns about a malformed or otherwise unparsable
|
||||||
\c{%pragma} directive. Disabled by default.
|
\c{%pragma} directive. Disabled by default.
|
||||||
@ -862,22 +861,24 @@ implemented. Disabled by default.
|
|||||||
|
|
||||||
\b \i\c{unknown-warning} warns about a \c{-w} or \c{-W} option or a
|
\b \i\c{unknown-warning} warns about a \c{-w} or \c{-W} option or a
|
||||||
\c{[WARNING]} directive that contains an unknown warning name or is
|
\c{[WARNING]} directive that contains an unknown warning name or is
|
||||||
otherwise not possible to process.
|
otherwise not possible to process. Disabled by default.
|
||||||
|
|
||||||
\b \i\c{all} is an alias for \e{all} suppressible warning classes.
|
\b \i\c{all} is an alias for \e{all} suppressible warning classes.
|
||||||
Thus, \c{-w+all} enables all available warnings, and \c{-w-all}
|
Thus, \c{-w+all} enables all available warnings, and \c{-w-all}
|
||||||
disables warnings entirely (since NASM 2.13).
|
disables warnings entirely (since NASM 2.13).
|
||||||
|
|
||||||
Since version 2.00, NASM has also supported the gcc-like syntax
|
Since version 2.00, NASM has also supported the \c{gcc}-like syntax
|
||||||
\c{-Wwarning-class} and \c{-Wno-warning-class} instead of
|
\c{-Wwarning-class} and \c{-Wno-warning-class} instead of
|
||||||
\c{-w+warning-class} and \c{-w-warning-class}, respectively; both
|
\c{-w+warning-class} and \c{-w-warning-class}, respectively; both
|
||||||
syntaxes work identically.
|
syntaxes work identically.
|
||||||
|
|
||||||
The option \c{-w+error} or \i\c{-Werror} can be used to treat warnings
|
The option \c{-w+error} or \i\c{-Werror} can be used to treat warnings
|
||||||
as errors. This can be controlled on a per warning class basis
|
as errors. This can be controlled on a per warning class basis
|
||||||
(\c{-w+error=}\e{warning-class}); if no \e{warning-class} is specified
|
(\c{-w+error=}\e{warning-class} or \c{-Werror=}\e{warning-class});
|
||||||
NASM treats it as \c{-w+error=all}; the same applies to \c{-w-error}
|
if no \e{warning-class} is specified NASM treats it as
|
||||||
or \i\c{-Wno-error}, of course.
|
\c{-w+error=all}; the same applies to \c{-w-error} or
|
||||||
|
\i\c{-Wno-error},
|
||||||
|
of course.
|
||||||
|
|
||||||
In addition, you can control warnings in the source code itself, using
|
In addition, you can control warnings in the source code itself, using
|
||||||
the \i\c{[WARNING]} directive. See \k{asmdir-warning}.
|
the \i\c{[WARNING]} directive. See \k{asmdir-warning}.
|
||||||
@ -4678,9 +4679,15 @@ The \c{[WARNING]} directive can be used to enable or disable classes
|
|||||||
of warnings in the same way as the \c{-w} option, see \k{opt-w} for
|
of warnings in the same way as the \c{-w} option, see \k{opt-w} for
|
||||||
more details about warning classes.
|
more details about warning classes.
|
||||||
|
|
||||||
Warning classes may be enabled with \c{[warning +]\e{warning-class}\c{]}, disabled
|
\b \c{[warning +}\e{warning-class}\c{]} enables warnings for
|
||||||
with \c{[warning -}\e{warning-class}\c{]}, or reset to their original value (as
|
\e{warning-class}.
|
||||||
specified on the command line) with \c{[warning *}\e{warning-class}{]}.
|
|
||||||
|
\b \c{[warning -}\e{warning-class}\c{]} disables warnings for
|
||||||
|
\e{warning-class}.
|
||||||
|
|
||||||
|
\b \c{[warning *}\e{warning-class}\c{]} restores \e{warning-class} to
|
||||||
|
the original value, either the default value or as specified on the
|
||||||
|
command line.
|
||||||
|
|
||||||
The \c{[WARNING]} directive also accepts the \c{all}, \c{error} and
|
The \c{[WARNING]} directive also accepts the \c{all}, \c{error} and
|
||||||
\c{error=}\e{warning-class} specifiers.
|
\c{error=}\e{warning-class} specifiers.
|
||||||
@ -7754,9 +7761,10 @@ a zero-extended absolute displacement can access from 0 to 4 GB.
|
|||||||
|
|
||||||
\H{unix64} Interfacing to 64-bit C Programs (Unix)
|
\H{unix64} Interfacing to 64-bit C Programs (Unix)
|
||||||
|
|
||||||
On Unix, the 64-bit ABI is defined by the document:
|
On Unix, the 64-bit ABI as well as the x32 ABI (32-bit ABI with the
|
||||||
|
CPU in 64-bit mode) is defined by the documents at:
|
||||||
|
|
||||||
\W{http://www.nasm.us/links/unix64abi}\c{http://www.nasm.us/links/unix64abi}
|
\W{http://www.nasm.us/abi/unix64}\c{http://www.nasm.us/abi/unix64}
|
||||||
|
|
||||||
Although written for AT&T-syntax assembly, the concepts apply equally
|
Although written for AT&T-syntax assembly, the concepts apply equally
|
||||||
well for NASM-style assembly. What follows is a simplified summary.
|
well for NASM-style assembly. What follows is a simplified summary.
|
||||||
@ -7786,9 +7794,9 @@ Integer and SSE register arguments are counted separately, so for the case of
|
|||||||
|
|
||||||
\H{win64} Interfacing to 64-bit C Programs (Win64)
|
\H{win64} Interfacing to 64-bit C Programs (Win64)
|
||||||
|
|
||||||
The Win64 ABI is described at:
|
The Win64 ABI is described by the document at:
|
||||||
|
|
||||||
\W{http://www.nasm.us/links/win64abi}\c{http://www.nasm.us/links/win64abi}
|
\W{http://www.nasm.us/abi/win64}\c{http://www.nasm.us/abi/win64}
|
||||||
|
|
||||||
What follows is a simplified summary.
|
What follows is a simplified summary.
|
||||||
|
|
||||||
|
@ -971,11 +971,12 @@ sub html_preamble {
|
|||||||
print "<h1>", $metadata{'title'}, "</h1>\n";
|
print "<h1>", $metadata{'title'}, "</h1>\n";
|
||||||
print '<span class="subtitle">', $metadata{'subtitle'}, "</span>\n";
|
print '<span class="subtitle">', $metadata{'subtitle'}, "</span>\n";
|
||||||
print "</div>\n";
|
print "</div>\n";
|
||||||
|
print "<div class=\"contents\"\n>\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
sub html_postamble {
|
sub html_postamble {
|
||||||
# Closing tags
|
# Common closing tags
|
||||||
print "</body>\n</html>\n";
|
print "</div>\n</body>\n</html>\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
sub html_index {
|
sub html_index {
|
||||||
|
@ -426,7 +426,14 @@ char *nasm_opt_val(char *p, char **opt, char **val);
|
|||||||
*
|
*
|
||||||
* The buffer returned must be freed by the caller
|
* The buffer returned must be freed by the caller
|
||||||
*/
|
*/
|
||||||
char *nasm_realpath(const char *rel_path);
|
char * safe_alloc nasm_realpath(const char *rel_path);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Path-splitting and merging functions
|
||||||
|
*/
|
||||||
|
char * safe_alloc nasm_dirname(const char *path);
|
||||||
|
char * safe_alloc nasm_basename(const char *path);
|
||||||
|
char * safe_alloc nasm_catfile(const char *dir, const char *path);
|
||||||
|
|
||||||
const char * pure_func prefix_name(int);
|
const char * pure_func prefix_name(int);
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
struct RAA;
|
struct RAA;
|
||||||
|
|
||||||
struct RAA *raa_init(void);
|
struct RAA * never_null raa_init(void);
|
||||||
void raa_free(struct RAA *);
|
void raa_free(struct RAA *);
|
||||||
int64_t raa_read(struct RAA *, int32_t);
|
int64_t raa_read(struct RAA *, int32_t);
|
||||||
struct RAA *raa_write(struct RAA *r, int32_t posn, int64_t value);
|
struct RAA *raa_write(struct RAA *r, int32_t posn, int64_t value);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* ----------------------------------------------------------------------- *
|
/* ----------------------------------------------------------------------- *
|
||||||
*
|
*
|
||||||
* Copyright 1996-2009 The NASM Authors - All Rights Reserved
|
* Copyright 1996-2017 The NASM Authors - All Rights Reserved
|
||||||
* See the file AUTHORS included with the NASM distribution for
|
* See the file AUTHORS included with the NASM distribution for
|
||||||
* the specific copyright holders.
|
* the specific copyright holders.
|
||||||
*
|
*
|
||||||
@ -66,10 +66,11 @@ struct SAA {
|
|||||||
char **blk_ptrs; /* Pointer to pointer blocks */
|
char **blk_ptrs; /* Pointer to pointer blocks */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SAA *saa_init(size_t elem_len); /* 1 == byte */
|
struct SAA * never_null saa_init(size_t elem_len); /* 1 == byte */
|
||||||
void saa_free(struct SAA *);
|
void saa_free(struct SAA *);
|
||||||
void *saa_wstruct(struct SAA *); /* return a structure of elem_len */
|
void *saa_wstruct(struct SAA *); /* return a structure of elem_len */
|
||||||
void saa_wbytes(struct SAA *, const void *, size_t); /* write arbitrary bytes */
|
void saa_wbytes(struct SAA *, const void *, size_t); /* write arbitrary bytes */
|
||||||
|
size_t saa_wcstring(struct SAA *s, const char *str); /* write a C string */
|
||||||
void saa_rewind(struct SAA *); /* for reading from beginning */
|
void saa_rewind(struct SAA *); /* for reading from beginning */
|
||||||
void *saa_rstruct(struct SAA *); /* return NULL on EOA */
|
void *saa_rstruct(struct SAA *); /* return NULL on EOA */
|
||||||
const void *saa_rbytes(struct SAA *, size_t *); /* return 0 on EOA */
|
const void *saa_rbytes(struct SAA *, size_t *); /* return 0 on EOA */
|
||||||
|
58
nasm.spec.in
58
nasm.spec.in
@ -3,25 +3,29 @@
|
|||||||
Summary: The Netwide Assembler, a portable x86 assembler with Intel-like syntax
|
Summary: The Netwide Assembler, a portable x86 assembler with Intel-like syntax
|
||||||
Name: nasm
|
Name: nasm
|
||||||
Version: @@NASM_MANGLED_VER@@
|
Version: @@NASM_MANGLED_VER@@
|
||||||
Release: 0
|
Release: 0%{?dist}
|
||||||
License: BSD
|
License: BSD
|
||||||
Group: Development/Languages
|
|
||||||
Source: http://www.nasm.us/pub/nasm/releasebuilds/%{nasm_version}/nasm-%{nasm_version}.tar.xz
|
Source: http://www.nasm.us/pub/nasm/releasebuilds/%{nasm_version}/nasm-%{nasm_version}.tar.xz
|
||||||
URL: http://www.nasm.us/
|
URL: http://www.nasm.us/
|
||||||
BuildRoot: /tmp/rpm-build-nasm
|
BuildRoot: /tmp/rpm-build-nasm
|
||||||
Prefix: %{_prefix}
|
Prefix: %{_prefix}
|
||||||
BuildRequires: perl, asciidoc, xmlto, ghostscript, perl-Font-TTF
|
@@PERLBUILDREQS@@
|
||||||
BuildRequires: adobe-source-sans-pro-fonts, adobe-source-code-pro-fonts
|
BuildRequires: autoconf
|
||||||
BuildRequires: fontconfig, xz
|
BuildRequires: asciidoc
|
||||||
|
BuildRequires: xmlto
|
||||||
|
BuildRequires: xz
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||||
|
|
||||||
%package doc
|
%package doc
|
||||||
Summary: Extensive documentation for NASM
|
Summary: Detailed manual for the Netwide Assembler
|
||||||
Group: Development/Languages
|
BuildArch: noarch
|
||||||
|
BuildRequires: ghostscript
|
||||||
|
BuildRequires: fontconfig
|
||||||
|
BuildRequires: adobe-source-sans-pro-fonts
|
||||||
|
BuildRequires: adobe-source-code-pro-fonts
|
||||||
|
|
||||||
%package rdoff
|
%package rdoff
|
||||||
Summary: Tools for the RDOFF binary format, sometimes used with NASM.
|
Summary: Tools for the RDOFF binary format, sometimes used with NASM.
|
||||||
Group: Development/Tools
|
|
||||||
|
|
||||||
%description
|
%description
|
||||||
NASM is the Netwide Assembler, a free portable assembler for the Intel
|
NASM is the Netwide Assembler, a free portable assembler for the Intel
|
||||||
@ -41,26 +45,18 @@ include linker, library manager, loader, and information dump.
|
|||||||
%setup -q -n nasm-%{nasm_version}
|
%setup -q -n nasm-%{nasm_version}
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%configure --disable-pdf-compression
|
autoreconf
|
||||||
|
%configure --disable-pdf-compression --enable-sections
|
||||||
make %{?_smp_mflags} everything
|
make %{?_smp_mflags} everything
|
||||||
|
xz -9ef doc/nasmdoc.pdf
|
||||||
|
|
||||||
%install
|
%install
|
||||||
rm -rf "$RPM_BUILD_ROOT"
|
rm -rf "%{buildroot}"
|
||||||
mkdir -p "$RPM_BUILD_ROOT"/%{_bindir}
|
mkdir -p "%{buildroot}"/%{_bindir}
|
||||||
mkdir -p "$RPM_BUILD_ROOT"/%{_mandir}/man1
|
mkdir -p "%{buildroot}"/%{_mandir}/man1
|
||||||
mkdir -p "$RPM_BUILD_ROOT"/usr/tempdoc
|
make INSTALLROOT="%{buildroot}" install install_rdf
|
||||||
%makeinstall install_everything docdir="$RPM_BUILD_ROOT"/usr/tempdoc
|
|
||||||
cp -a $RPM_BUILD_ROOT/usr/tempdoc/html \
|
|
||||||
$RPM_BUILD_ROOT/usr/tempdoc/nasmdoc.pdf .
|
|
||||||
xz -9ef nasmdoc.pdf
|
|
||||||
# remove unpackaged files from the buildroot
|
|
||||||
rm -rf $RPM_BUILD_ROOT%{_prefix}/tempdoc
|
|
||||||
|
|
||||||
%clean
|
|
||||||
rm -rf "$RPM_BUILD_ROOT"
|
|
||||||
|
|
||||||
%files
|
%files
|
||||||
%defattr(-,root,root)
|
|
||||||
%doc AUTHORS CHANGES README TODO
|
%doc AUTHORS CHANGES README TODO
|
||||||
%{_bindir}/nasm
|
%{_bindir}/nasm
|
||||||
%{_bindir}/ndisasm
|
%{_bindir}/ndisasm
|
||||||
@ -68,11 +64,9 @@ rm -rf "$RPM_BUILD_ROOT"
|
|||||||
%{_mandir}/man1/ndisasm.1*
|
%{_mandir}/man1/ndisasm.1*
|
||||||
|
|
||||||
%files doc
|
%files doc
|
||||||
%defattr(-,root,root)
|
%doc doc/html doc/nasmdoc.pdf.xz
|
||||||
%doc html nasmdoc.pdf.xz
|
|
||||||
|
|
||||||
%files rdoff
|
%files rdoff
|
||||||
%defattr(-,root,root)
|
|
||||||
%{_bindir}/ldrdf
|
%{_bindir}/ldrdf
|
||||||
%{_bindir}/rdf2bin
|
%{_bindir}/rdf2bin
|
||||||
%{_bindir}/rdf2com
|
%{_bindir}/rdf2com
|
||||||
@ -83,11 +77,7 @@ rm -rf "$RPM_BUILD_ROOT"
|
|||||||
%{_bindir}/rdflib
|
%{_bindir}/rdflib
|
||||||
%{_bindir}/rdx
|
%{_bindir}/rdx
|
||||||
%{_mandir}/man1/ldrdf.1*
|
%{_mandir}/man1/ldrdf.1*
|
||||||
%{_mandir}/man1/rdf2bin.1*
|
%{_mandir}/man1/rd*.1*
|
||||||
%{_mandir}/man1/rdf2com.1*
|
|
||||||
%{_mandir}/man1/rdf2ihx.1*
|
# This is the upstream spec file; the change log is in git
|
||||||
%{_mandir}/man1/rdf2ith.1*
|
%changelog
|
||||||
%{_mandir}/man1/rdf2srec.1*
|
|
||||||
%{_mandir}/man1/rdfdump.1*
|
|
||||||
%{_mandir}/man1/rdflib.1*
|
|
||||||
%{_mandir}/man1/rdx.1*
|
|
||||||
|
3
nasm.spec.sed
Normal file
3
nasm.spec.sed
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# Replace @@PERLBUILDREQS@@ with the file perlbreq.si
|
||||||
|
/@@PERLBUILDREQS@@/{r perlbreq.si
|
||||||
|
d}
|
171
nasmlib/path.c
Normal file
171
nasmlib/path.c
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
/* ----------------------------------------------------------------------- *
|
||||||
|
*
|
||||||
|
* Copyright 2017 The NASM Authors - All Rights Reserved
|
||||||
|
* See the file AUTHORS included with the NASM distribution for
|
||||||
|
* the specific copyright holders.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following
|
||||||
|
* conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * 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 COPYRIGHT HOLDERS AND
|
||||||
|
* 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 COPYRIGHT OWNER OR
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* ----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* path.c - host operating system specific pathname manipulation functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "compiler.h"
|
||||||
|
#include "nasmlib.h"
|
||||||
|
#include "error.h"
|
||||||
|
|
||||||
|
#if defined(unix) || defined(__unix) || defined(__unix__)
|
||||||
|
# define separators "/"
|
||||||
|
# define cleandirend "/"
|
||||||
|
# define catsep '/'
|
||||||
|
# define leaveonclean 1
|
||||||
|
# define curdir "."
|
||||||
|
#elif defined(__MSDOS__) || defined(__WINDOWS__) || \
|
||||||
|
defined(__OS2__) || defined(_WIN16) || defined(_WIN32)
|
||||||
|
# define separators "/\\:"
|
||||||
|
# define cleandirend "/\\"
|
||||||
|
# define catsep '\\'
|
||||||
|
# define leaveonclean 2 /* Leave \\ at the start alone */
|
||||||
|
# define curdir "."
|
||||||
|
#elif defined(Macintosh) /* MacOS classic? */
|
||||||
|
# define separators ":"
|
||||||
|
# define curdir ":"
|
||||||
|
# define catsep ':'
|
||||||
|
# define cleandirend ":"
|
||||||
|
# define leaveonclean 0
|
||||||
|
# define leave_leading 1
|
||||||
|
#elif defined(__VMS)
|
||||||
|
/*
|
||||||
|
* VMS filenames may have ;version at the end. Assume we should count that
|
||||||
|
* as part of the filename anyway.
|
||||||
|
*/
|
||||||
|
# define separators ":]"
|
||||||
|
# define curdir "[]"
|
||||||
|
#else
|
||||||
|
/* No idea what to do here, do nothing. Feel free to add new ones. */
|
||||||
|
# define curdir ""
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is an inline, because most compilers can greatly simplify this
|
||||||
|
* for a fixed string, like we have here.
|
||||||
|
*/
|
||||||
|
static inline bool ismatch(const char *charset, char ch)
|
||||||
|
{
|
||||||
|
const char *p;
|
||||||
|
|
||||||
|
for (p = charset; *p; p++) {
|
||||||
|
if (ch == *p)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *first_filename_char(const char *path)
|
||||||
|
{
|
||||||
|
#ifdef separators
|
||||||
|
const char *p = path + strlen(path);
|
||||||
|
|
||||||
|
while (p > path) {
|
||||||
|
if (!ismatch(separators, p[-1]))
|
||||||
|
return p;
|
||||||
|
p--;
|
||||||
|
}
|
||||||
|
|
||||||
|
return p;
|
||||||
|
#else
|
||||||
|
return path;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the filename portion of a PATH as a new string */
|
||||||
|
char *nasm_basename(const char *path)
|
||||||
|
{
|
||||||
|
return nasm_strdup(first_filename_char(path));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the directory name portion of a PATH as a new string */
|
||||||
|
char *nasm_dirname(const char *path)
|
||||||
|
{
|
||||||
|
const char *p = first_filename_char(path);
|
||||||
|
const char *p0 = p;
|
||||||
|
(void)p0; /* Don't warn if unused */
|
||||||
|
|
||||||
|
if (p == path)
|
||||||
|
return nasm_strdup(curdir);
|
||||||
|
|
||||||
|
#ifdef cleandirend
|
||||||
|
while (p > path+leaveonclean) {
|
||||||
|
if (ismatch(cleandirend, p[-1]))
|
||||||
|
break;
|
||||||
|
p--;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef leave_leading
|
||||||
|
/* If the directory contained ONLY separators, leave as-is */
|
||||||
|
if (p == path+leaveonclean)
|
||||||
|
p = p0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return nasm_strndup(path, p-path);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Concatenate a directory path and a filename. Note that this function
|
||||||
|
* currently does NOT handle the case where file itself contains
|
||||||
|
* directory components (except on Unix platforms, because it is trivial.)
|
||||||
|
*/
|
||||||
|
char *nasm_catfile(const char *dir, const char *file)
|
||||||
|
{
|
||||||
|
#ifndef catsep
|
||||||
|
return nasm_strcat(dir, file);
|
||||||
|
#else
|
||||||
|
size_t dl = strlen(dir);
|
||||||
|
size_t fl = strlen(file);
|
||||||
|
char *p;
|
||||||
|
bool dosep = true;
|
||||||
|
|
||||||
|
if (!dl || ismatch(separators, dir[dl-1])) {
|
||||||
|
/* No separator necessary */
|
||||||
|
dosep = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = nasm_malloc(dl + fl + dosep + 1);
|
||||||
|
|
||||||
|
memcpy(p, dir, dl);
|
||||||
|
p += dl;
|
||||||
|
if (dosep)
|
||||||
|
*p++ = catsep;
|
||||||
|
|
||||||
|
memcpy(p, file, fl+1);
|
||||||
|
|
||||||
|
return p;
|
||||||
|
#endif
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
/* ----------------------------------------------------------------------- *
|
/* ----------------------------------------------------------------------- *
|
||||||
*
|
*
|
||||||
* Copyright 1996-2009 The NASM Authors - All Rights Reserved
|
* Copyright 1996-2017 The NASM Authors - All Rights Reserved
|
||||||
* See the file AUTHORS included with the NASM distribution for
|
* See the file AUTHORS included with the NASM distribution for
|
||||||
* the specific copyright holders.
|
* the specific copyright holders.
|
||||||
*
|
*
|
||||||
@ -149,6 +149,19 @@ void saa_wbytes(struct SAA *s, const void *data, size_t len)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Writes a string, *including* the final null, to the specified SAA,
|
||||||
|
* and return the number of bytes written.
|
||||||
|
*/
|
||||||
|
size_t saa_wcstring(struct SAA *s, const char *str)
|
||||||
|
{
|
||||||
|
size_t bytes = strlen(str) + 1;
|
||||||
|
|
||||||
|
saa_wbytes(s, str, bytes);
|
||||||
|
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|
||||||
void saa_rewind(struct SAA *s)
|
void saa_rewind(struct SAA *s)
|
||||||
{
|
{
|
||||||
s->rblk = s->blk_ptrs;
|
s->rblk = s->blk_ptrs;
|
||||||
|
@ -2493,7 +2493,7 @@ static void stabs_linenum(const char *filename, int32_t linenumber, int32_t segt
|
|||||||
{
|
{
|
||||||
(void)segto;
|
(void)segto;
|
||||||
if (!stabs_filename) {
|
if (!stabs_filename) {
|
||||||
stabs_filename = (char *)nasm_malloc(strlen(filename) + 1);
|
stabs_filename = nasm_malloc(strlen(filename) + 1);
|
||||||
strcpy(stabs_filename, filename);
|
strcpy(stabs_filename, filename);
|
||||||
} else {
|
} else {
|
||||||
if (strcmp(stabs_filename, filename)) {
|
if (strcmp(stabs_filename, filename)) {
|
||||||
@ -2503,7 +2503,7 @@ static void stabs_linenum(const char *filename, int32_t linenumber, int32_t segt
|
|||||||
|
|
||||||
/* why not nasm_free(stabs_filename); we're done with the old one */
|
/* why not nasm_free(stabs_filename); we're done with the old one */
|
||||||
|
|
||||||
stabs_filename = (char *)nasm_malloc(strlen(filename) + 1);
|
stabs_filename = nasm_malloc(strlen(filename) + 1);
|
||||||
strcpy(stabs_filename, filename);
|
strcpy(stabs_filename, filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2521,7 +2521,7 @@ static void stabs_output(int type, void *param)
|
|||||||
if (!(sects[s->section]->flags & SHF_EXECINSTR))
|
if (!(sects[s->section]->flags & SHF_EXECINSTR))
|
||||||
return; /* line info is only collected for executable sections */
|
return; /* line info is only collected for executable sections */
|
||||||
numlinestabs++;
|
numlinestabs++;
|
||||||
el = (struct linelist *)nasm_malloc(sizeof(struct linelist));
|
el = nasm_malloc(sizeof(struct linelist));
|
||||||
el->info.offset = s->offset;
|
el->info.offset = s->offset;
|
||||||
el->info.section = s->section;
|
el->info.section = s->section;
|
||||||
el->info.name = s->name;
|
el->info.name = s->name;
|
||||||
@ -2553,7 +2553,7 @@ static void stabs_generate(void)
|
|||||||
|
|
||||||
ptr = stabslines;
|
ptr = stabslines;
|
||||||
|
|
||||||
allfiles = (char **)nasm_zalloc(numlinestabs * sizeof(char *));
|
allfiles = nasm_zalloc(numlinestabs * sizeof(char *));
|
||||||
numfiles = 0;
|
numfiles = 0;
|
||||||
while (ptr) {
|
while (ptr) {
|
||||||
if (numfiles == 0) {
|
if (numfiles == 0) {
|
||||||
@ -2572,7 +2572,7 @@ static void stabs_generate(void)
|
|||||||
ptr = ptr->next;
|
ptr = ptr->next;
|
||||||
}
|
}
|
||||||
strsize = 1;
|
strsize = 1;
|
||||||
fileidx = (int *)nasm_malloc(numfiles * sizeof(int));
|
fileidx = nasm_malloc(numfiles * sizeof(int));
|
||||||
for (i = 0; i < numfiles; i++) {
|
for (i = 0; i < numfiles; i++) {
|
||||||
fileidx[i] = strsize;
|
fileidx[i] = strsize;
|
||||||
strsize += strlen(allfiles[i]) + 1;
|
strsize += strlen(allfiles[i]) + 1;
|
||||||
@ -2590,10 +2590,10 @@ static void stabs_generate(void)
|
|||||||
* the sourcefiles changes each line, which would mean 1 SOL, 1 SYMLIN per line
|
* the sourcefiles changes each line, which would mean 1 SOL, 1 SYMLIN per line
|
||||||
* plus one "ending" entry
|
* plus one "ending" entry
|
||||||
*/
|
*/
|
||||||
sbuf = (uint8_t *)nasm_malloc((numlinestabs * 2 + 4) *
|
sbuf = nasm_malloc((numlinestabs * 2 + 4) *
|
||||||
sizeof(struct stabentry));
|
sizeof(struct stabentry));
|
||||||
ssbuf = (uint8_t *)nasm_malloc(strsize);
|
ssbuf = nasm_malloc(strsize);
|
||||||
rbuf = (uint8_t *)nasm_malloc(numlinestabs * (is_elf64() ? 16 : 8) * (2 + 3));
|
rbuf = nasm_malloc(numlinestabs * (is_elf64() ? 16 : 8) * (2 + 3));
|
||||||
rptr = rbuf;
|
rptr = rbuf;
|
||||||
|
|
||||||
for (i = 0; i < numfiles; i++)
|
for (i = 0; i < numfiles; i++)
|
||||||
@ -3318,7 +3318,7 @@ static void dwarf_findfile(const char * fname)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* add file name to end of list */
|
/* add file name to end of list */
|
||||||
dwarf_clist = (struct linelist *)nasm_malloc(sizeof(struct linelist));
|
dwarf_clist = nasm_malloc(sizeof(struct linelist));
|
||||||
dwarf_numfiles++;
|
dwarf_numfiles++;
|
||||||
dwarf_clist->line = dwarf_numfiles;
|
dwarf_clist->line = dwarf_numfiles;
|
||||||
dwarf_clist->filename = nasm_malloc(strlen(fname) + 1);
|
dwarf_clist->filename = nasm_malloc(strlen(fname) + 1);
|
||||||
@ -3357,7 +3357,7 @@ static void dwarf_findsect(const int index)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* add entry to end of list */
|
/* add entry to end of list */
|
||||||
dwarf_csect = (struct sectlist *)nasm_malloc(sizeof(struct sectlist));
|
dwarf_csect = nasm_malloc(sizeof(struct sectlist));
|
||||||
dwarf_nsections++;
|
dwarf_nsections++;
|
||||||
dwarf_csect->psaa = plinep = saa_init(1L);
|
dwarf_csect->psaa = plinep = saa_init(1L);
|
||||||
dwarf_csect->line = 1;
|
dwarf_csect->line = 1;
|
||||||
|
@ -1784,7 +1784,7 @@ static void macho_dbg_generate(void)
|
|||||||
size_t saa_len = 0, high_addr = 0, total_len = 0;
|
size_t saa_len = 0, high_addr = 0, total_len = 0;
|
||||||
struct section *p_section = NULL;
|
struct section *p_section = NULL;
|
||||||
/* calculated at debug_str and referenced at debug_info */
|
/* calculated at debug_str and referenced at debug_info */
|
||||||
uint32_t producer_str_offset = 0, module_str_offset = 0;
|
uint32_t producer_str_offset = 0, module_str_offset = 0, path_str_offset = 0;
|
||||||
|
|
||||||
/* debug section defines */
|
/* debug section defines */
|
||||||
{
|
{
|
||||||
@ -1797,9 +1797,9 @@ static void macho_dbg_generate(void)
|
|||||||
|
|
||||||
/* dw section walk to find high_addr and total_len */
|
/* dw section walk to find high_addr and total_len */
|
||||||
{
|
{
|
||||||
struct dw_sect_list *p_sect = dw_head_sect;
|
struct dw_sect_list *p_sect;
|
||||||
uint32_t idx = 0;
|
|
||||||
for(; idx < dw_num_sects; idx++) {
|
list_for_each(p_sect, dw_head_sect) {
|
||||||
uint64_t offset = get_section_by_index(p_sect->section)->size;
|
uint64_t offset = get_section_by_index(p_sect->section)->size;
|
||||||
struct SAA *p_linep = p_sect->psaa;
|
struct SAA *p_linep = p_sect->psaa;
|
||||||
|
|
||||||
@ -1811,16 +1811,14 @@ static void macho_dbg_generate(void)
|
|||||||
|
|
||||||
total_len += p_linep->datalen;
|
total_len += p_linep->datalen;
|
||||||
high_addr += offset;
|
high_addr += offset;
|
||||||
p_sect = p_sect->next;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* debug line */
|
/* debug line */
|
||||||
{
|
{
|
||||||
struct file_list *p_file = dw_head_list;
|
struct file_list *p_file;
|
||||||
struct dw_sect_list *p_sect = dw_head_sect;
|
struct dw_sect_list *p_sect;
|
||||||
size_t linep_off = 0;
|
size_t linep_off, buf_size;
|
||||||
uint32_t idx = 0, buf_size = 0;
|
|
||||||
struct SAA *p_lines = saa_init(1L);
|
struct SAA *p_lines = saa_init(1L);
|
||||||
nasm_assert(p_lines != NULL);
|
nasm_assert(p_lines != NULL);
|
||||||
|
|
||||||
@ -1846,12 +1844,11 @@ static void macho_dbg_generate(void)
|
|||||||
saa_write8(p_lines, 1); /* std opcode 12 length */
|
saa_write8(p_lines, 1); /* std opcode 12 length */
|
||||||
saa_write8(p_lines, 0); /* end of table */
|
saa_write8(p_lines, 0); /* end of table */
|
||||||
|
|
||||||
for(idx = 0; idx < dw_num_files; idx++) {
|
list_for_each(p_file, dw_head_list) {
|
||||||
saa_wbytes(p_lines, p_file->file_name, (int32_t)(strlen(p_file->file_name) +1));
|
saa_wcstring(p_lines, p_file->file_name);
|
||||||
saa_write8(p_lines, 0); /* directory */
|
saa_write8(p_lines, 0); /* directory */
|
||||||
saa_write8(p_lines, 0); /* time */
|
saa_write8(p_lines, 0); /* time */
|
||||||
saa_write8(p_lines, 0); /* size */
|
saa_write8(p_lines, 0); /* size */
|
||||||
p_file = p_file->next;
|
|
||||||
}
|
}
|
||||||
saa_write8(p_lines, 0); /* end of table */
|
saa_write8(p_lines, 0); /* end of table */
|
||||||
|
|
||||||
@ -1868,7 +1865,7 @@ static void macho_dbg_generate(void)
|
|||||||
p_buf += linep_off;
|
p_buf += linep_off;
|
||||||
saa_free(p_lines);
|
saa_free(p_lines);
|
||||||
|
|
||||||
for(idx = 0; idx < dw_num_sects; idx++) {
|
list_for_each(p_sect, dw_head_sect) {
|
||||||
struct SAA *p_linep = p_sect->psaa;
|
struct SAA *p_linep = p_sect->psaa;
|
||||||
saa_len = p_linep->datalen;
|
saa_len = p_linep->datalen;
|
||||||
saa_rnbytes(p_linep, p_buf, saa_len);
|
saa_rnbytes(p_linep, p_buf, saa_len);
|
||||||
@ -1884,9 +1881,9 @@ static void macho_dbg_generate(void)
|
|||||||
/* string section */
|
/* string section */
|
||||||
{
|
{
|
||||||
struct file_list *p_file = dw_head_list;
|
struct file_list *p_file = dw_head_list;
|
||||||
uint32_t idx = 0;
|
|
||||||
struct SAA *p_str = saa_init(1L);
|
struct SAA *p_str = saa_init(1L);
|
||||||
nasm_assert(p_str != NULL);
|
struct SAA *p_path_str = saa_init(1L);
|
||||||
|
nasm_assert((p_str != NULL) && (p_path_str != NULL));
|
||||||
|
|
||||||
p_section = get_section_by_name("__DWARF", "__debug_str");
|
p_section = get_section_by_name("__DWARF", "__debug_str");
|
||||||
nasm_assert(p_section != NULL);
|
nasm_assert(p_section != NULL);
|
||||||
@ -1894,19 +1891,33 @@ static void macho_dbg_generate(void)
|
|||||||
producer_str_offset = 0;
|
producer_str_offset = 0;
|
||||||
saa_wbytes(p_str, nasm_signature, strlen(nasm_signature) + 1);
|
saa_wbytes(p_str, nasm_signature, strlen(nasm_signature) + 1);
|
||||||
|
|
||||||
module_str_offset = producer_str_offset + strlen(nasm_signature) + 1;
|
module_str_offset = path_str_offset = producer_str_offset + strlen(nasm_signature) + 1;
|
||||||
for(; idx < dw_num_files; idx++) {
|
|
||||||
saa_wbytes(p_str, p_file->file_name, (int32_t)(strlen(p_file->file_name) + 1));
|
list_for_each(p_file, dw_head_list) {
|
||||||
p_file = p_file->next;
|
char *cur_path = nasm_realpath(p_file->file_name);
|
||||||
|
char *cur_file = nasm_basename(cur_path);
|
||||||
|
char *cur_dir = nasm_dirname(cur_path);
|
||||||
|
|
||||||
|
saa_wcstring(p_str, cur_file);
|
||||||
|
saa_wcstring(p_path_str, cur_dir);
|
||||||
|
|
||||||
|
nasm_free(cur_path);
|
||||||
|
nasm_free(cur_file);
|
||||||
|
nasm_free(cur_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
saa_len = p_str->datalen;
|
saa_len = p_str->datalen;
|
||||||
|
path_str_offset += saa_len;
|
||||||
p_buf = nasm_malloc(saa_len);
|
p_buf = nasm_malloc(saa_len);
|
||||||
saa_rnbytes(p_str, p_buf, saa_len);
|
saa_rnbytes(p_str, p_buf, saa_len);
|
||||||
macho_output(p_section->index, p_buf, OUT_RAWDATA, saa_len, NO_SEG, 0);
|
macho_output(p_section->index, p_buf, OUT_RAWDATA, saa_len, NO_SEG, 0);
|
||||||
|
|
||||||
saa_free(p_str);
|
saa_free(p_str);
|
||||||
|
|
||||||
|
saa_len = p_path_str->datalen;
|
||||||
|
p_buf = nasm_malloc(saa_len);
|
||||||
|
saa_rnbytes(p_path_str, p_buf, saa_len);
|
||||||
|
macho_output(p_section->index, p_buf, OUT_RAWDATA, saa_len, NO_SEG, 0);
|
||||||
|
saa_free(p_path_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* debug info */
|
/* debug info */
|
||||||
@ -1927,6 +1938,7 @@ static void macho_dbg_generate(void)
|
|||||||
saa_write32(p_info, producer_str_offset); /* offset from string table for DW_AT_producer */
|
saa_write32(p_info, producer_str_offset); /* offset from string table for DW_AT_producer */
|
||||||
saa_write16(p_info, DW_LANG_Mips_Assembler); /* DW_AT_language */
|
saa_write16(p_info, DW_LANG_Mips_Assembler); /* DW_AT_language */
|
||||||
saa_write32(p_info, module_str_offset); /* offset from string table for DW_AT_name */
|
saa_write32(p_info, module_str_offset); /* offset from string table for DW_AT_name */
|
||||||
|
saa_write32(p_info, path_str_offset); /* offset from string table for DW_AT_comp_dir */
|
||||||
saa_write32(p_info, 0); /* DW_AT_stmt_list */
|
saa_write32(p_info, 0); /* DW_AT_stmt_list */
|
||||||
|
|
||||||
if (ofmt == &of_macho64) {
|
if (ofmt == &of_macho64) {
|
||||||
@ -1980,6 +1992,9 @@ static void macho_dbg_generate(void)
|
|||||||
saa_write8(p_abbrev, DW_AT_name);
|
saa_write8(p_abbrev, DW_AT_name);
|
||||||
saa_write8(p_abbrev, DW_FORM_strp);
|
saa_write8(p_abbrev, DW_FORM_strp);
|
||||||
|
|
||||||
|
saa_write8(p_abbrev, DW_AT_comp_dir);
|
||||||
|
saa_write8(p_abbrev, DW_FORM_strp);
|
||||||
|
|
||||||
saa_write8(p_abbrev, DW_AT_stmt_list);
|
saa_write8(p_abbrev, DW_AT_stmt_list);
|
||||||
saa_write8(p_abbrev, DW_FORM_data4);
|
saa_write8(p_abbrev, DW_FORM_data4);
|
||||||
|
|
||||||
@ -2026,16 +2041,14 @@ static void macho_dbg_linenum(const char *file_name, int32_t line_num, int32_t s
|
|||||||
|
|
||||||
if(!dw_cur_list || strcmp(file_name, dw_cur_list->file_name)) {
|
if(!dw_cur_list || strcmp(file_name, dw_cur_list->file_name)) {
|
||||||
if(dw_head_list) {
|
if(dw_head_list) {
|
||||||
struct file_list *match = dw_head_list;
|
struct file_list *match;
|
||||||
uint32_t idx = 0;
|
|
||||||
|
|
||||||
for (; idx < dw_num_files; idx++ ) {
|
list_for_each(match, dw_head_list) {
|
||||||
if(!(strcmp(file_name, match->file_name))) {
|
if(!(strcmp(file_name, match->file_name))) {
|
||||||
dw_cur_list = match;
|
dw_cur_list = match;
|
||||||
need_new_list = false;
|
need_new_list = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
match = match->next;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user