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
|
||||
*.rej
|
||||
*.s
|
||||
*.si
|
||||
*.swp
|
||||
*.xml
|
||||
.*swo
|
||||
*~
|
||||
\#*
|
||||
.\#*
|
||||
*.bak
|
||||
*.tmp
|
||||
.git-ignore
|
||||
@ -54,6 +56,7 @@ TAGS
|
||||
/macros/macros.c
|
||||
/nasm
|
||||
/ndisasm
|
||||
/nasm.spec
|
||||
/nsis/arch.nsh
|
||||
/nsis/version.nsh
|
||||
/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/md5c.$(O) nasmlib/string.$(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/rbtree.$(O) nasmlib/hashtbl.$(O) \
|
||||
nasmlib/raa.$(O) nasmlib/saa.$(O) \
|
||||
@ -348,6 +349,7 @@ clean:
|
||||
$(RM_F) nasm-*-installer-*.exe
|
||||
$(RM_F) tags TAGS
|
||||
$(RM_F) nsis/arch.nsh
|
||||
$(RM_F) perlbreq.si
|
||||
$(RM_F) $(RDFPROGS) $(RDF2BINLINKS)
|
||||
|
||||
distclean: clean
|
||||
@ -417,8 +419,16 @@ tar: dist
|
||||
|
||||
spec: nasm.spec
|
||||
|
||||
nasm.spec: nasm.spec.in version.sed
|
||||
sed -f version.sed < nasm.spec.in > nasm.spec
|
||||
ALLPERLSRC := $(shell find $(srcdir) -type f -name '*.p[lh]')
|
||||
|
||||
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 -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 \
|
||||
config/unknown.h config/watcom.h include/compiler.h include/error.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 \
|
||||
config/unknown.h config/watcom.h include/compiler.h include/hashtbl.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\md5c.$(O) nasmlib\string.$(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\rbtree.$(O) nasmlib\hashtbl.$(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 \
|
||||
config\watcom.h include\compiler.h include\error.h include\nasmint.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 \
|
||||
config\watcom.h include\compiler.h include\hashtbl.h include\nasmint.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/md5c.$(O) nasmlib/string.$(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/rbtree.$(O) nasmlib/hashtbl.$(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 &
|
||||
config/watcom.h include/compiler.h include/error.h include/nasmint.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 &
|
||||
config/watcom.h include/compiler.h include/hashtbl.h include/nasmint.h &
|
||||
include/nasmlib.h include/perfhash.h
|
||||
|
22
aclocal.m4
vendored
22
aclocal.m4
vendored
@ -9,10 +9,10 @@ AC_DEFUN(PA_ADD_CFLAGS,
|
||||
CFLAGS="$CFLAGS $1"
|
||||
AC_TRY_LINK(AC_INCLUDES_DEFAULT,
|
||||
[printf("Hello, World!\n");],
|
||||
AC_MSG_RESULT([yes])
|
||||
CFLAGS="$pa_add_cflags__old_cflags ifelse([$2],[],[$1],[$2])",
|
||||
AC_MSG_RESULT([no])
|
||||
CFLAGS="$pa_add_cflags__old_cflags")])
|
||||
[AC_MSG_RESULT([yes])
|
||||
CFLAGS="$pa_add_cflags__old_cflags ifelse([$2],[],[$1],[$2])"],
|
||||
[AC_MSG_RESULT([no])
|
||||
CFLAGS="$pa_add_cflags__old_cflags"])])
|
||||
|
||||
dnl --------------------------------------------------------------------------
|
||||
dnl PA_ADD_CLDFLAGS()
|
||||
@ -28,12 +28,12 @@ AC_DEFUN(PA_ADD_CLDFLAGS,
|
||||
LDFLAGS="$LDFLAGS $1"
|
||||
AC_TRY_LINK(AC_INCLUDES_DEFAULT,
|
||||
[printf("Hello, World!\n");],
|
||||
AC_MSG_RESULT([yes])
|
||||
[AC_MSG_RESULT([yes])
|
||||
CFLAGS="$pa_add_cldflags__old_cflags ifelse([$2],[],[$1],[$2])"
|
||||
LDFLAGS="$pa_add_cldflags__old_ldflags ifelse([$2],[],[$1],[$2])",
|
||||
AC_MSG_RESULT([no])
|
||||
LDFLAGS="$pa_add_cldflags__old_ldflags ifelse([$2],[],[$1],[$2])"],
|
||||
[AC_MSG_RESULT([no])
|
||||
CFLAGS="$pa_add_cldflags__old_cflags"
|
||||
LDFLAGS="$pa_add_cldflags__old_ldflags")])
|
||||
LDFLAGS="$pa_add_cldflags__old_ldflags"])])
|
||||
|
||||
dnl --------------------------------------------------------------------------
|
||||
dnl PA_VAR
|
||||
@ -137,14 +137,12 @@ dnl Simpler-to-use versions of AC_ARG_ENABLED, that include the
|
||||
dnl test for $enableval and the AS_HELP_STRING definition
|
||||
dnl --------------------------------------------------------------------------
|
||||
AC_DEFUN(PA_ARG_ENABLED,
|
||||
[AC_ARG_ENABLE([$1],
|
||||
[AS_HELP_STRING([--enable-$1],[$2])], [], [enableval=no])
|
||||
[AC_ARG_ENABLE([$1], [AS_HELP_STRING([--enable-$1],[$2])], [], [enableval=no])
|
||||
AS_IF([test x"$enableval" != xno], [$3], [$4])
|
||||
])
|
||||
|
||||
AC_DEFUN(PA_ARG_DISABLED,
|
||||
[AC_ARG_ENABLE([$1],
|
||||
[AS_HELP_STRING([--disable-$1],[$2])], [], [enableval=yes])
|
||||
[AC_ARG_ENABLE([$1],[AS_HELP_STRING([--disable-$1],[$2])], [], [enableval=yes])
|
||||
AS_IF([test x"$enableval" = xno], [$3], [$4])
|
||||
])
|
||||
|
||||
|
@ -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 be compressed when EVEX is used
|
||||
*/
|
||||
#define IS_MOD_01() (input->eaflags & EAF_BYTEOFFS || \
|
||||
(o >= -128 && o <= 127 && \
|
||||
seg == NO_SEG && !forw_ref && \
|
||||
!(input->eaflags & EAF_WORDOFFS) && \
|
||||
!(ins->rex & REX_EV)) || \
|
||||
(ins->rex & REX_EV && \
|
||||
is_disp8n(input, ins, &output->disp8)))
|
||||
#define IS_MOD_01() (!(input->eaflags & EAF_WORDOFFS) && \
|
||||
(ins->rex & REX_EV ? seg == NO_SEG && !forw_ref && \
|
||||
is_disp8n(input, ins, &output->disp8) : \
|
||||
input->eaflags & EAF_BYTEOFFS || (o >= -128 && \
|
||||
o <= 127 && seg == NO_SEG && !forw_ref)))
|
||||
|
||||
static enum ea_type process_ea(operand *input, ea *output, int bits,
|
||||
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
|
||||
*/
|
||||
lfree->admin.next = (union label *)nasm_malloc(LBLK_SIZE);
|
||||
lfree->admin.next = nasm_malloc(LBLK_SIZE);
|
||||
lfree = lfree->admin.next;
|
||||
init_block(lfree);
|
||||
}
|
||||
@ -424,11 +424,11 @@ int init_labels(void)
|
||||
{
|
||||
hash_init(<ab, HASH_LARGE);
|
||||
|
||||
ldata = lfree = (union label *)nasm_malloc(LBLK_SIZE);
|
||||
ldata = lfree = nasm_malloc(LBLK_SIZE);
|
||||
init_block(lfree);
|
||||
|
||||
perm_head = perm_tail =
|
||||
(struct permts *)nasm_malloc(sizeof(struct permts));
|
||||
nasm_malloc(sizeof(struct permts));
|
||||
|
||||
perm_head->next = NULL;
|
||||
perm_head->size = PERMTS_SIZE;
|
||||
@ -483,7 +483,7 @@ static char *perm_copy(const char *string)
|
||||
|
||||
if (perm_tail->size - perm_tail->usage < len) {
|
||||
perm_tail->next =
|
||||
(struct permts *)nasm_malloc(sizeof(struct permts));
|
||||
nasm_malloc(sizeof(struct permts));
|
||||
perm_tail = perm_tail->next;
|
||||
perm_tail->next = NULL;
|
||||
perm_tail->size = PERMTS_SIZE;
|
||||
|
@ -208,8 +208,9 @@ dnl support function sections
|
||||
dnl
|
||||
PA_ARG_ENABLED([sections],
|
||||
[compile with function/data section support],
|
||||
[PA_ADD_CFLAGS([-ffunction-sections]),
|
||||
PA_ADD_CFLAGS([-fdata-sections])],
|
||||
[PA_ADD_CLDFLAGS([-ffunction-sections])
|
||||
PA_ADD_CLDFLAGS([-fdata-sections])
|
||||
PA_ADD_CLDFLAGS([-Wl,--gc-sections])],
|
||||
[])
|
||||
dnl
|
||||
dnl support LTO
|
||||
|
@ -61,11 +61,26 @@ ul.index {
|
||||
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 {
|
||||
/* Setting an explicit margin to keep the navbar from moving */
|
||||
body {
|
||||
padding: 0;
|
||||
margin: 10px;
|
||||
margin: 8px;
|
||||
}
|
||||
|
||||
/* Link styles */
|
||||
@ -94,7 +109,7 @@ ul.index {
|
||||
ul.navbar {
|
||||
display: block;
|
||||
position: sticky;
|
||||
top: 10px;
|
||||
top: 8px;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
@ -791,31 +791,30 @@ disable it by \c{-w-orphan-labels}.
|
||||
The current \i{warning classes} are:
|
||||
|
||||
\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}
|
||||
being invoked with the wrong number of parameters. This warning
|
||||
class is enabled by default; see \k{mlmacover} for an example of why
|
||||
being invoked with the wrong number of parameters. Enabled by default;
|
||||
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.
|
||||
|
||||
\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
|
||||
contain no instruction but define a label without a trailing colon.
|
||||
NASM warns about this somewhat obscure condition by default;
|
||||
see \k{syntax} for more information.
|
||||
|
||||
\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
|
||||
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.
|
||||
Enabled by default.
|
||||
@ -844,11 +843,11 @@ form of jmp instruction becomes jmp short form.
|
||||
Enabled by default.
|
||||
|
||||
\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
|
||||
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
|
||||
\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
|
||||
\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.
|
||||
Thus, \c{-w+all} enables all available warnings, and \c{-w-all}
|
||||
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{-w+warning-class} and \c{-w-warning-class}, respectively; both
|
||||
syntaxes work identically.
|
||||
|
||||
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
|
||||
(\c{-w+error=}\e{warning-class}); if no \e{warning-class} is specified
|
||||
NASM treats it as \c{-w+error=all}; the same applies to \c{-w-error}
|
||||
or \i\c{-Wno-error}, of course.
|
||||
(\c{-w+error=}\e{warning-class} or \c{-Werror=}\e{warning-class});
|
||||
if no \e{warning-class} is specified NASM treats it as
|
||||
\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
|
||||
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
|
||||
more details about warning classes.
|
||||
|
||||
Warning classes may be enabled with \c{[warning +]\e{warning-class}\c{]}, disabled
|
||||
with \c{[warning -}\e{warning-class}\c{]}, or reset to their original value (as
|
||||
specified on the command line) with \c{[warning *}\e{warning-class}{]}.
|
||||
\b \c{[warning +}\e{warning-class}\c{]} enables warnings for
|
||||
\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
|
||||
\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)
|
||||
|
||||
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
|
||||
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)
|
||||
|
||||
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.
|
||||
|
||||
|
@ -971,11 +971,12 @@ sub html_preamble {
|
||||
print "<h1>", $metadata{'title'}, "</h1>\n";
|
||||
print '<span class="subtitle">', $metadata{'subtitle'}, "</span>\n";
|
||||
print "</div>\n";
|
||||
print "<div class=\"contents\"\n>\n";
|
||||
}
|
||||
|
||||
sub html_postamble {
|
||||
# Closing tags
|
||||
print "</body>\n</html>\n";
|
||||
# Common closing tags
|
||||
print "</div>\n</body>\n</html>\n";
|
||||
}
|
||||
|
||||
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
|
||||
*/
|
||||
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);
|
||||
|
||||
|
@ -38,7 +38,7 @@
|
||||
|
||||
struct RAA;
|
||||
|
||||
struct RAA *raa_init(void);
|
||||
struct RAA * never_null raa_init(void);
|
||||
void raa_free(struct RAA *);
|
||||
int64_t raa_read(struct RAA *, int32_t);
|
||||
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
|
||||
* the specific copyright holders.
|
||||
*
|
||||
@ -66,10 +66,11 @@ struct SAA {
|
||||
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_wstruct(struct SAA *); /* return a structure of elem_len */
|
||||
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_rstruct(struct SAA *); /* return NULL 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
|
||||
Name: nasm
|
||||
Version: @@NASM_MANGLED_VER@@
|
||||
Release: 0
|
||||
Release: 0%{?dist}
|
||||
License: BSD
|
||||
Group: Development/Languages
|
||||
Source: http://www.nasm.us/pub/nasm/releasebuilds/%{nasm_version}/nasm-%{nasm_version}.tar.xz
|
||||
URL: http://www.nasm.us/
|
||||
BuildRoot: /tmp/rpm-build-nasm
|
||||
Prefix: %{_prefix}
|
||||
BuildRequires: perl, asciidoc, xmlto, ghostscript, perl-Font-TTF
|
||||
BuildRequires: adobe-source-sans-pro-fonts, adobe-source-code-pro-fonts
|
||||
BuildRequires: fontconfig, xz
|
||||
@@PERLBUILDREQS@@
|
||||
BuildRequires: autoconf
|
||||
BuildRequires: asciidoc
|
||||
BuildRequires: xmlto
|
||||
BuildRequires: xz
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||
|
||||
%package doc
|
||||
Summary: Extensive documentation for NASM
|
||||
Group: Development/Languages
|
||||
Summary: Detailed manual for the Netwide Assembler
|
||||
BuildArch: noarch
|
||||
BuildRequires: ghostscript
|
||||
BuildRequires: fontconfig
|
||||
BuildRequires: adobe-source-sans-pro-fonts
|
||||
BuildRequires: adobe-source-code-pro-fonts
|
||||
|
||||
%package rdoff
|
||||
Summary: Tools for the RDOFF binary format, sometimes used with NASM.
|
||||
Group: Development/Tools
|
||||
|
||||
%description
|
||||
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}
|
||||
|
||||
%build
|
||||
%configure --disable-pdf-compression
|
||||
autoreconf
|
||||
%configure --disable-pdf-compression --enable-sections
|
||||
make %{?_smp_mflags} everything
|
||||
xz -9ef doc/nasmdoc.pdf
|
||||
|
||||
%install
|
||||
rm -rf "$RPM_BUILD_ROOT"
|
||||
mkdir -p "$RPM_BUILD_ROOT"/%{_bindir}
|
||||
mkdir -p "$RPM_BUILD_ROOT"/%{_mandir}/man1
|
||||
mkdir -p "$RPM_BUILD_ROOT"/usr/tempdoc
|
||||
%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"
|
||||
rm -rf "%{buildroot}"
|
||||
mkdir -p "%{buildroot}"/%{_bindir}
|
||||
mkdir -p "%{buildroot}"/%{_mandir}/man1
|
||||
make INSTALLROOT="%{buildroot}" install install_rdf
|
||||
|
||||
%files
|
||||
%defattr(-,root,root)
|
||||
%doc AUTHORS CHANGES README TODO
|
||||
%{_bindir}/nasm
|
||||
%{_bindir}/ndisasm
|
||||
@ -68,11 +64,9 @@ rm -rf "$RPM_BUILD_ROOT"
|
||||
%{_mandir}/man1/ndisasm.1*
|
||||
|
||||
%files doc
|
||||
%defattr(-,root,root)
|
||||
%doc html nasmdoc.pdf.xz
|
||||
%doc doc/html doc/nasmdoc.pdf.xz
|
||||
|
||||
%files rdoff
|
||||
%defattr(-,root,root)
|
||||
%{_bindir}/ldrdf
|
||||
%{_bindir}/rdf2bin
|
||||
%{_bindir}/rdf2com
|
||||
@ -83,11 +77,7 @@ rm -rf "$RPM_BUILD_ROOT"
|
||||
%{_bindir}/rdflib
|
||||
%{_bindir}/rdx
|
||||
%{_mandir}/man1/ldrdf.1*
|
||||
%{_mandir}/man1/rdf2bin.1*
|
||||
%{_mandir}/man1/rdf2com.1*
|
||||
%{_mandir}/man1/rdf2ihx.1*
|
||||
%{_mandir}/man1/rdf2ith.1*
|
||||
%{_mandir}/man1/rdf2srec.1*
|
||||
%{_mandir}/man1/rdfdump.1*
|
||||
%{_mandir}/man1/rdflib.1*
|
||||
%{_mandir}/man1/rdx.1*
|
||||
%{_mandir}/man1/rd*.1*
|
||||
|
||||
# This is the upstream spec file; the change log is in git
|
||||
%changelog
|
||||
|
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
|
||||
* 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)
|
||||
{
|
||||
s->rblk = s->blk_ptrs;
|
||||
|
@ -2493,7 +2493,7 @@ static void stabs_linenum(const char *filename, int32_t linenumber, int32_t segt
|
||||
{
|
||||
(void)segto;
|
||||
if (!stabs_filename) {
|
||||
stabs_filename = (char *)nasm_malloc(strlen(filename) + 1);
|
||||
stabs_filename = nasm_malloc(strlen(filename) + 1);
|
||||
strcpy(stabs_filename, filename);
|
||||
} else {
|
||||
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 */
|
||||
|
||||
stabs_filename = (char *)nasm_malloc(strlen(filename) + 1);
|
||||
stabs_filename = nasm_malloc(strlen(filename) + 1);
|
||||
strcpy(stabs_filename, filename);
|
||||
}
|
||||
}
|
||||
@ -2521,7 +2521,7 @@ static void stabs_output(int type, void *param)
|
||||
if (!(sects[s->section]->flags & SHF_EXECINSTR))
|
||||
return; /* line info is only collected for executable sections */
|
||||
numlinestabs++;
|
||||
el = (struct linelist *)nasm_malloc(sizeof(struct linelist));
|
||||
el = nasm_malloc(sizeof(struct linelist));
|
||||
el->info.offset = s->offset;
|
||||
el->info.section = s->section;
|
||||
el->info.name = s->name;
|
||||
@ -2553,7 +2553,7 @@ static void stabs_generate(void)
|
||||
|
||||
ptr = stabslines;
|
||||
|
||||
allfiles = (char **)nasm_zalloc(numlinestabs * sizeof(char *));
|
||||
allfiles = nasm_zalloc(numlinestabs * sizeof(char *));
|
||||
numfiles = 0;
|
||||
while (ptr) {
|
||||
if (numfiles == 0) {
|
||||
@ -2572,7 +2572,7 @@ static void stabs_generate(void)
|
||||
ptr = ptr->next;
|
||||
}
|
||||
strsize = 1;
|
||||
fileidx = (int *)nasm_malloc(numfiles * sizeof(int));
|
||||
fileidx = nasm_malloc(numfiles * sizeof(int));
|
||||
for (i = 0; i < numfiles; i++) {
|
||||
fileidx[i] = strsize;
|
||||
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
|
||||
* plus one "ending" entry
|
||||
*/
|
||||
sbuf = (uint8_t *)nasm_malloc((numlinestabs * 2 + 4) *
|
||||
sbuf = nasm_malloc((numlinestabs * 2 + 4) *
|
||||
sizeof(struct stabentry));
|
||||
ssbuf = (uint8_t *)nasm_malloc(strsize);
|
||||
rbuf = (uint8_t *)nasm_malloc(numlinestabs * (is_elf64() ? 16 : 8) * (2 + 3));
|
||||
ssbuf = nasm_malloc(strsize);
|
||||
rbuf = nasm_malloc(numlinestabs * (is_elf64() ? 16 : 8) * (2 + 3));
|
||||
rptr = rbuf;
|
||||
|
||||
for (i = 0; i < numfiles; i++)
|
||||
@ -3318,7 +3318,7 @@ static void dwarf_findfile(const char * fname)
|
||||
}
|
||||
|
||||
/* 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_clist->line = dwarf_numfiles;
|
||||
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 */
|
||||
dwarf_csect = (struct sectlist *)nasm_malloc(sizeof(struct sectlist));
|
||||
dwarf_csect = nasm_malloc(sizeof(struct sectlist));
|
||||
dwarf_nsections++;
|
||||
dwarf_csect->psaa = plinep = saa_init(1L);
|
||||
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;
|
||||
struct section *p_section = NULL;
|
||||
/* 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 */
|
||||
{
|
||||
@ -1797,9 +1797,9 @@ static void macho_dbg_generate(void)
|
||||
|
||||
/* dw section walk to find high_addr and total_len */
|
||||
{
|
||||
struct dw_sect_list *p_sect = dw_head_sect;
|
||||
uint32_t idx = 0;
|
||||
for(; idx < dw_num_sects; idx++) {
|
||||
struct dw_sect_list *p_sect;
|
||||
|
||||
list_for_each(p_sect, dw_head_sect) {
|
||||
uint64_t offset = get_section_by_index(p_sect->section)->size;
|
||||
struct SAA *p_linep = p_sect->psaa;
|
||||
|
||||
@ -1811,16 +1811,14 @@ static void macho_dbg_generate(void)
|
||||
|
||||
total_len += p_linep->datalen;
|
||||
high_addr += offset;
|
||||
p_sect = p_sect->next;
|
||||
}
|
||||
}
|
||||
|
||||
/* debug line */
|
||||
{
|
||||
struct file_list *p_file = dw_head_list;
|
||||
struct dw_sect_list *p_sect = dw_head_sect;
|
||||
size_t linep_off = 0;
|
||||
uint32_t idx = 0, buf_size = 0;
|
||||
struct file_list *p_file;
|
||||
struct dw_sect_list *p_sect;
|
||||
size_t linep_off, buf_size;
|
||||
struct SAA *p_lines = saa_init(1L);
|
||||
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, 0); /* end of table */
|
||||
|
||||
for(idx = 0; idx < dw_num_files; idx++) {
|
||||
saa_wbytes(p_lines, p_file->file_name, (int32_t)(strlen(p_file->file_name) +1));
|
||||
list_for_each(p_file, dw_head_list) {
|
||||
saa_wcstring(p_lines, p_file->file_name);
|
||||
saa_write8(p_lines, 0); /* directory */
|
||||
saa_write8(p_lines, 0); /* time */
|
||||
saa_write8(p_lines, 0); /* size */
|
||||
p_file = p_file->next;
|
||||
}
|
||||
saa_write8(p_lines, 0); /* end of table */
|
||||
|
||||
@ -1868,7 +1865,7 @@ static void macho_dbg_generate(void)
|
||||
p_buf += linep_off;
|
||||
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;
|
||||
saa_len = p_linep->datalen;
|
||||
saa_rnbytes(p_linep, p_buf, saa_len);
|
||||
@ -1884,9 +1881,9 @@ static void macho_dbg_generate(void)
|
||||
/* string section */
|
||||
{
|
||||
struct file_list *p_file = dw_head_list;
|
||||
uint32_t idx = 0;
|
||||
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");
|
||||
nasm_assert(p_section != NULL);
|
||||
@ -1894,19 +1891,33 @@ static void macho_dbg_generate(void)
|
||||
producer_str_offset = 0;
|
||||
saa_wbytes(p_str, nasm_signature, strlen(nasm_signature) + 1);
|
||||
|
||||
module_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));
|
||||
p_file = p_file->next;
|
||||
module_str_offset = path_str_offset = producer_str_offset + strlen(nasm_signature) + 1;
|
||||
|
||||
list_for_each(p_file, dw_head_list) {
|
||||
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;
|
||||
|
||||
path_str_offset += saa_len;
|
||||
p_buf = nasm_malloc(saa_len);
|
||||
saa_rnbytes(p_str, p_buf, saa_len);
|
||||
macho_output(p_section->index, p_buf, OUT_RAWDATA, saa_len, NO_SEG, 0);
|
||||
|
||||
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 */
|
||||
@ -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_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, path_str_offset); /* offset from string table for DW_AT_comp_dir */
|
||||
saa_write32(p_info, 0); /* DW_AT_stmt_list */
|
||||
|
||||
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_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_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_head_list) {
|
||||
struct file_list *match = dw_head_list;
|
||||
uint32_t idx = 0;
|
||||
struct file_list *match;
|
||||
|
||||
for (; idx < dw_num_files; idx++ ) {
|
||||
list_for_each(match, dw_head_list) {
|
||||
if(!(strcmp(file_name, match->file_name))) {
|
||||
dw_cur_list = match;
|
||||
need_new_list = false;
|
||||
break;
|
||||
}
|
||||
match = match->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user