Run write_object_file after errors
This is to fix unitialised memory access when printing listings. Many targets don't initialise parts of insn frags or data frags that have fixups, relying on md_apply_fix to finalise the frag. Which is fine normally, but means we need to run write_object_file after errors, for listings. Otherwise MALLOC_PERTURB_=1 causes errors like: x86_64-linux +FAIL: i386 mpx-inval-1 x86_64-linux +FAIL: i386 inval-equ-1 x86_64-linux +FAIL: i386 x86-64-mpx-inval-1 Running write_object_file after errors requires some tweaking to the testsuite, since we then get extra errors reported from md_apply_fix. gas/ * write.h (subsegs_finish): Delete declaration. * write.c (subsegs_finish): Make static. (write_object_file): Call subsegs_finish from here. Don't print warning and error count here.. * as.c (main): ..do so here instead. Remove dead code for "no object file generated". Split out count strings to better support internationalisation. Don't call subsegs_finish. Tidy setting of "keep_it". Run write_object_file even after errors. (keep_it): Make static. * config/obj-elf.c (elf_frob_symbol): Remove assert. (elf_frob_file_before_adjust): Likewise. gas/testsuite/ * gas/elf/bad-group.s: Use %function. * gas/elf/bad-group.err: Expect correct line number. Allow other errors. * gas/elf/bad-size.err: Allow other errors. Match expected error somewhat more rigorously. * gas/i386/reloc32.l: Allow other errors. * gas/i386/mpx-inval-1.l: Match applied relocs. * gas/i386/x86-64-mpx-inval-1.l: Likewise, and nop padding. * gas/i386/x86-64-mpx-inval-2.l: Match nop padding, and allow other errors. * gas/macros/dot.s: Use .balign. * gas/macros/dot.l: Update alignment output. * gas/symver/symver6.l: Allow other errors.
This commit is contained in:
parent
97d24fbbf5
commit
85024cd8bc
|
@ -1,3 +1,17 @@
|
||||||
|
2014-06-16 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
* write.h (subsegs_finish): Delete declaration.
|
||||||
|
* write.c (subsegs_finish): Make static.
|
||||||
|
(write_object_file): Call subsegs_finish from here. Don't print
|
||||||
|
warning and error count here..
|
||||||
|
* as.c (main): ..do so here instead. Remove dead code for "no
|
||||||
|
object file generated". Split out count strings to better support
|
||||||
|
internationalisation. Don't call subsegs_finish. Tidy setting of
|
||||||
|
"keep_it". Run write_object_file even after errors.
|
||||||
|
(keep_it): Make static.
|
||||||
|
* config/obj-elf.c (elf_frob_symbol): Remove assert.
|
||||||
|
(elf_frob_file_before_adjust): Likewise.
|
||||||
|
|
||||||
2014-06-16 Alan Modra <amodra@gmail.com>
|
2014-06-16 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* config/tc-dlx.c (machine_ip): Move initialisation of the_insn
|
* config/tc-dlx.c (machine_ip): Move initialisation of the_insn
|
||||||
|
|
59
gas/as.c
59
gas/as.c
|
@ -97,7 +97,7 @@ int debug_memory = 0;
|
||||||
int verbose = 0;
|
int verbose = 0;
|
||||||
|
|
||||||
/* Keep the output file. */
|
/* Keep the output file. */
|
||||||
int keep_it = 0;
|
static int keep_it = 0;
|
||||||
|
|
||||||
segT reg_section;
|
segT reg_section;
|
||||||
segT expr_section;
|
segT expr_section;
|
||||||
|
@ -1283,20 +1283,45 @@ main (int argc, char ** argv)
|
||||||
directives from the user or by the backend, emit it now. */
|
directives from the user or by the backend, emit it now. */
|
||||||
cfi_finish ();
|
cfi_finish ();
|
||||||
|
|
||||||
if (seen_at_least_1_file ()
|
keep_it = 0;
|
||||||
&& (flag_always_generate_output || had_errors () == 0))
|
if (seen_at_least_1_file ())
|
||||||
keep_it = 1;
|
{
|
||||||
else
|
int n_warns, n_errs;
|
||||||
keep_it = 0;
|
char warn_msg[50];
|
||||||
|
char err_msg[50];
|
||||||
|
|
||||||
/* This used to be done at the start of write_object_file in
|
write_object_file ();
|
||||||
write.c, but that caused problems when doing listings when
|
|
||||||
keep_it was zero. This could probably be moved above md_end, but
|
|
||||||
I didn't want to risk the change. */
|
|
||||||
subsegs_finish ();
|
|
||||||
|
|
||||||
if (keep_it)
|
n_warns = had_warnings ();
|
||||||
write_object_file ();
|
n_errs = had_errors ();
|
||||||
|
|
||||||
|
if (n_warns == 1)
|
||||||
|
sprintf (warn_msg, _("%d warning"), n_warns);
|
||||||
|
else
|
||||||
|
sprintf (warn_msg, _("%d warnings"), n_warns);
|
||||||
|
if (n_errs == 1)
|
||||||
|
sprintf (err_msg, _("%d error"), n_errs);
|
||||||
|
else
|
||||||
|
sprintf (err_msg, _("%d errors"), n_errs);
|
||||||
|
|
||||||
|
if (flag_fatal_warnings && n_warns != 0)
|
||||||
|
{
|
||||||
|
if (n_errs == 0)
|
||||||
|
as_bad (_("%s, treating warnings as errors"), warn_msg);
|
||||||
|
n_errs += n_warns;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n_errs == 0)
|
||||||
|
keep_it = 1;
|
||||||
|
else if (flag_always_generate_output)
|
||||||
|
{
|
||||||
|
/* The -Z flag indicates that an object file should be generated,
|
||||||
|
regardless of warnings and errors. */
|
||||||
|
keep_it = 1;
|
||||||
|
fprintf (stderr, _("%s, %s, generating bad object file\n"),
|
||||||
|
err_msg, warn_msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fflush (stderr);
|
fflush (stderr);
|
||||||
|
|
||||||
|
@ -1304,19 +1329,13 @@ main (int argc, char ** argv)
|
||||||
listing_print (listing_filename, argv_orig);
|
listing_print (listing_filename, argv_orig);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (flag_fatal_warnings && had_warnings () > 0 && had_errors () == 0)
|
|
||||||
as_bad (_("%d warnings, treating warnings as errors"), had_warnings ());
|
|
||||||
|
|
||||||
if (had_errors () > 0 && ! flag_always_generate_output)
|
|
||||||
keep_it = 0;
|
|
||||||
|
|
||||||
input_scrub_end ();
|
input_scrub_end ();
|
||||||
|
|
||||||
END_PROGRESS (myname);
|
END_PROGRESS (myname);
|
||||||
|
|
||||||
/* Use xexit instead of return, because under VMS environments they
|
/* Use xexit instead of return, because under VMS environments they
|
||||||
may not place the same interpretation on the value given. */
|
may not place the same interpretation on the value given. */
|
||||||
if (had_errors () > 0)
|
if (had_errors () != 0)
|
||||||
xexit (EXIT_FAILURE);
|
xexit (EXIT_FAILURE);
|
||||||
|
|
||||||
/* Only generate dependency file if assembler was successful. */
|
/* Only generate dependency file if assembler was successful. */
|
||||||
|
|
|
@ -2120,7 +2120,9 @@ elf_frob_symbol (symbolS *symp, int *puntp)
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
p = strchr (sy_obj->versioned_name, ELF_VER_CHR);
|
p = strchr (sy_obj->versioned_name, ELF_VER_CHR);
|
||||||
know (p != NULL);
|
if (p == NULL)
|
||||||
|
/* We will have already reported an error about a missing version. */
|
||||||
|
*puntp = TRUE;
|
||||||
|
|
||||||
/* This symbol was given a new name with the .symver directive.
|
/* This symbol was given a new name with the .symver directive.
|
||||||
|
|
||||||
|
@ -2133,14 +2135,15 @@ elf_frob_symbol (symbolS *symp, int *puntp)
|
||||||
symbol. However, it's not clear whether it is the best
|
symbol. However, it's not clear whether it is the best
|
||||||
approach. */
|
approach. */
|
||||||
|
|
||||||
if (! S_IS_DEFINED (symp))
|
else if (! S_IS_DEFINED (symp))
|
||||||
{
|
{
|
||||||
/* Verify that the name isn't using the @@ syntax--this is
|
/* Verify that the name isn't using the @@ syntax--this is
|
||||||
reserved for definitions of the default version to link
|
reserved for definitions of the default version to link
|
||||||
against. */
|
against. */
|
||||||
if (p[1] == ELF_VER_CHR)
|
if (p[1] == ELF_VER_CHR)
|
||||||
{
|
{
|
||||||
as_bad (_("invalid attempt to declare external version name as default in symbol `%s'"),
|
as_bad (_("invalid attempt to declare external version name"
|
||||||
|
" as default in symbol `%s'"),
|
||||||
sy_obj->versioned_name);
|
sy_obj->versioned_name);
|
||||||
*puntp = TRUE;
|
*puntp = TRUE;
|
||||||
}
|
}
|
||||||
|
@ -2403,8 +2406,7 @@ elf_frob_file_before_adjust (void)
|
||||||
|
|
||||||
p = strchr (symbol_get_obj (symp)->versioned_name,
|
p = strchr (symbol_get_obj (symp)->versioned_name,
|
||||||
ELF_VER_CHR);
|
ELF_VER_CHR);
|
||||||
know (p != NULL);
|
if (p != NULL && p[1] == ELF_VER_CHR && p[2] == ELF_VER_CHR)
|
||||||
if (p[1] == ELF_VER_CHR && p[2] == ELF_VER_CHR)
|
|
||||||
{
|
{
|
||||||
size_t l = strlen (&p[3]) + 1;
|
size_t l = strlen (&p[3]) + 1;
|
||||||
memmove (&p[1], &p[3], l);
|
memmove (&p[1], &p[3], l);
|
||||||
|
|
|
@ -1,3 +1,19 @@
|
||||||
|
2014-06-16 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
* gas/elf/bad-group.s: Use %function.
|
||||||
|
* gas/elf/bad-group.err: Expect correct line number. Allow
|
||||||
|
other errors.
|
||||||
|
* gas/elf/bad-size.err: Allow other errors. Match expected
|
||||||
|
error somewhat more rigorously.
|
||||||
|
* gas/i386/reloc32.l: Allow other errors.
|
||||||
|
* gas/i386/mpx-inval-1.l: Match applied relocs.
|
||||||
|
* gas/i386/x86-64-mpx-inval-1.l: Likewise, and nop padding.
|
||||||
|
* gas/i386/x86-64-mpx-inval-2.l: Match nop padding, and allow
|
||||||
|
other errors.
|
||||||
|
* gas/macros/dot.s: Use .balign.
|
||||||
|
* gas/macros/dot.l: Update alignment output.
|
||||||
|
* gas/symver/symver6.l: Allow other errors.
|
||||||
|
|
||||||
2014-06-16 Alan Modra <amodra@gmail.com>
|
2014-06-16 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* gas/vax/elf-rel.d: Update.
|
* gas/vax/elf-rel.d: Update.
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
.*bad-group\.s: Assembler messages:
|
.*bad-group\.s: Assembler messages:
|
||||||
.*bad-group\.s:.* Error: .*
|
.*bad-group\.s:10: Error: .*
|
||||||
|
#pass
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.section .text.startup,"ax",%progbits
|
.section .text.startup,"ax",%progbits
|
||||||
.globl main
|
.globl main
|
||||||
main:
|
main:
|
||||||
.type main, @function
|
.type main, %function
|
||||||
.LFB0:
|
.LFB0:
|
||||||
.section .text.unlikely,"ax",%progbits
|
.section .text.unlikely,"ax",%progbits
|
||||||
.L5:
|
.L5:
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
.*bad-size\.s: Assembler messages:
|
.*bad-size\.s: Assembler messages:
|
||||||
.*bad-size\.s:.* Error: .*
|
#...
|
||||||
|
.*bad-size\.s:.* Error: \.size expression .* does not evaluate to a constant
|
||||||
|
|
|
@ -33,9 +33,9 @@ GAS LISTING .*
|
||||||
.* Error: expecting valid branch instruction after `bnd'
|
.* Error: expecting valid branch instruction after `bnd'
|
||||||
.* Warning: skipping prefixes on this instruction
|
.* Warning: skipping prefixes on this instruction
|
||||||
[ ]*9[ ]+003412
|
[ ]*9[ ]+003412
|
||||||
[ ]*10[ ]+\?\?\?\? F2E200 bnd loop foo
|
[ ]*10[ ]+\?\?\?\? F2E2E9 bnd loop foo
|
||||||
.* Error: expecting valid branch instruction after `bnd'
|
.* Error: expecting valid branch instruction after `bnd'
|
||||||
[ ]*11[ ]+\?\?\?\? 67F2E300 bnd jcxz foo
|
[ ]*11[ ]+\?\?\?\? 67F2E3E5 bnd jcxz foo
|
||||||
.* Error: expecting valid branch instruction after `bnd'
|
.* Error: expecting valid branch instruction after `bnd'
|
||||||
[ ]*12[ ]+
|
[ ]*12[ ]+
|
||||||
[ ]*13[ ]+\.intel_syntax noprefix
|
[ ]*13[ ]+\.intel_syntax noprefix
|
||||||
|
@ -49,7 +49,8 @@ GAS LISTING .*
|
||||||
[ ]*17[ ]+\?\?\?\? EA000000 bnd ljmp 0x1234,xxx
|
[ ]*17[ ]+\?\?\?\? EA000000 bnd ljmp 0x1234,xxx
|
||||||
.* Error: expecting valid branch instruction after `bnd'
|
.* Error: expecting valid branch instruction after `bnd'
|
||||||
[ ]*17[ ]+003412
|
[ ]*17[ ]+003412
|
||||||
[ ]*18[ ]+\?\?\?\? F2E200 bnd loop foo
|
[ ]*18[ ]+\?\?\?\? F2E2CE bnd loop foo
|
||||||
.* Error: expecting valid branch instruction after `bnd'
|
.* Error: expecting valid branch instruction after `bnd'
|
||||||
[ ]*19[ ]+\?\?\?\? 67F2E300 bnd jcxz foo
|
[ ]*19[ ]+\?\?\?\? 67F2E3CA bnd jcxz foo
|
||||||
.* Error: expecting valid branch instruction after `bnd'
|
.* Error: expecting valid branch instruction after `bnd'
|
||||||
|
#pass
|
||||||
|
|
|
@ -65,3 +65,4 @@
|
||||||
.*:159: Error: .*
|
.*:159: Error: .*
|
||||||
.*:160: Error: .*
|
.*:160: Error: .*
|
||||||
.*:161: Error: .*
|
.*:161: Error: .*
|
||||||
|
#pass
|
||||||
|
|
|
@ -17,9 +17,9 @@ GAS LISTING .*
|
||||||
.* Error: expecting valid branch instruction after `bnd'
|
.* Error: expecting valid branch instruction after `bnd'
|
||||||
[ ]*5[ ]+\?\?\?\? 6766F2AB bnd stosw \(%edi\) \# Bad
|
[ ]*5[ ]+\?\?\?\? 6766F2AB bnd stosw \(%edi\) \# Bad
|
||||||
.* Error: expecting valid branch instruction after `bnd'
|
.* Error: expecting valid branch instruction after `bnd'
|
||||||
[ ]*6[ ]+\?\?\?\? F2E200 bnd loop foo
|
[ ]*6[ ]+\?\?\?\? F2E2(00|0A) bnd loop foo
|
||||||
.* Error: expecting valid branch instruction after `bnd'
|
.* Error: expecting valid branch instruction after `bnd'
|
||||||
[ ]*7[ ]+\?\?\?\? F2E300 bnd jrcxz foo
|
[ ]*7[ ]+\?\?\?\? F2E3(00|0D) bnd jrcxz foo
|
||||||
.* Error: expecting valid branch instruction after `bnd'
|
.* Error: expecting valid branch instruction after `bnd'
|
||||||
[ ]*8[ ]+
|
[ ]*8[ ]+
|
||||||
[ ]*9[ ]+\.intel_syntax noprefix
|
[ ]*9[ ]+\.intel_syntax noprefix
|
||||||
|
@ -27,7 +27,8 @@ GAS LISTING .*
|
||||||
.* Error: expecting valid branch instruction after `bnd'
|
.* Error: expecting valid branch instruction after `bnd'
|
||||||
[ ]*11[ ]+\?\?\?\? 6766F2AB bnd stos WORD PTR \[edi] \# Bad
|
[ ]*11[ ]+\?\?\?\? 6766F2AB bnd stos WORD PTR \[edi] \# Bad
|
||||||
.* Error: expecting valid branch instruction after `bnd'
|
.* Error: expecting valid branch instruction after `bnd'
|
||||||
[ ]*12[ ]+\?\?\?\? F2E200 bnd loop foo
|
[ ]*12[ ]+\?\?\?\? F2E2(00|18) bnd loop foo
|
||||||
.* Error: expecting valid branch instruction after `bnd'
|
.* Error: expecting valid branch instruction after `bnd'
|
||||||
[ ]*13[ ]+\?\?\?\? F2E300 bnd jrcxz foo
|
[ ]*13[ ]+\?\?\?\? F2E3(00|1B)( |90) bnd jrcxz foo
|
||||||
.* Error: expecting valid branch instruction after `bnd'
|
.* Error: expecting valid branch instruction after `bnd'
|
||||||
|
#pass
|
||||||
|
|
|
@ -170,4 +170,5 @@ GAS LISTING .*
|
||||||
[ ]*65[ ]+\?\?\?\? 670F1A14 bndldx bnd2, \[1\*ebx\+3\]
|
[ ]*65[ ]+\?\?\?\? 670F1A14 bndldx bnd2, \[1\*ebx\+3\]
|
||||||
.* Error: 32-bit address isn't allowed in 64-bit MPX instructions\.
|
.* Error: 32-bit address isn't allowed in 64-bit MPX instructions\.
|
||||||
[ ]*65[ ]+1D030000
|
[ ]*65[ ]+1D030000
|
||||||
[ ]*65[ ]+00
|
[ ]*65[ ]+00(|909090 )
|
||||||
|
#pass
|
||||||
|
|
|
@ -6,11 +6,11 @@
|
||||||
[ ]*[1-9][0-9]*[ ]+m 4, 2
|
[ ]*[1-9][0-9]*[ ]+m 4, 2
|
||||||
[ ]*[1-9][0-9]*[ ]+> \.data
|
[ ]*[1-9][0-9]*[ ]+> \.data
|
||||||
[ ]*[1-9][0-9]*[ ]+> labelA:labelB:labelC:labelD:x\.y\.z 4\+2
|
[ ]*[1-9][0-9]*[ ]+> labelA:labelB:labelC:labelD:x\.y\.z 4\+2
|
||||||
[ ]*[1-9][0-9]*[ ]+>> \.align 4
|
[ ]*[1-9][0-9]*[ ]+>> \.balign 4
|
||||||
[ ]*[1-9][0-9]*[ ]+\?+[ ]+06 ?06[ ]+>> \.byte 4\+2,4\+2
|
[ ]*[1-9][0-9]*[ ]+\?+[ ]+06 ?06[ ]+>> \.byte 4\+2,4\+2
|
||||||
[ ]*[1-9][0-9]*[ ]+\?+[ ]+00 ?00[ ]+> \.skip 2
|
[ ]*[1-9][0-9]*[ ]+\?+[ ]+00 ?00[ ]+> \.skip 2
|
||||||
[ ]*[1-9][0-9]*[ ]+> labelZ:labelY:labelX:labelW:\.xyz 4-2
|
[ ]*[1-9][0-9]*[ ]+> labelZ:labelY:labelX:labelW:\.xyz 4-2
|
||||||
[ ]*[1-9][0-9]*[ ]+>> \.align 8
|
[ ]*[1-9][0-9]*[ ]+\?+[ ]+00 ?00 ?00 ?00[ ]+>> \.balign 8
|
||||||
[ ]*[1-9][0-9]*[ ]+\?+[ ]+02 ?02[ ]+>> \.byte 4-2,4-2
|
[ ]*[1-9][0-9]*[ ]+\?+[ ]+02 ?02[ ]+>> \.byte 4-2,4-2
|
||||||
[ ]*[1-9][0-9]*[ ]+\?+[ ]+00 ?00 ?00 ?00[ ]+> \.skip 4\*2
|
[ ]*[1-9][0-9]*[ ]+\?+[ ]+00 ?00 ?00 ?00[ ]+> \.skip 4\*2
|
||||||
[ ]*[1-9][0-9]*[ ]+00 ?00 ?00 ?00[ ]*
|
[ ]*[1-9][0-9]*[ ]+00 ?00 ?00 ?00[ ]*
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
.altmacro
|
.altmacro
|
||||||
|
|
||||||
.macro x.y.z val
|
.macro x.y.z val
|
||||||
.align 4
|
.balign 4
|
||||||
.byte val,val
|
.byte val,val
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro .xyz val
|
.macro .xyz val
|
||||||
.align 8
|
.balign 8
|
||||||
.byte val,val
|
.byte val,val
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
.*: Assembler messages:
|
.*: Assembler messages:
|
||||||
.*:7: Error: multiple versions \[`foo@version1'|`foo@@version1'\] for symbol `foo'
|
.*:7: Error: multiple versions \[`foo@version1'|`foo@@version1'\] for symbol `foo'
|
||||||
|
#pass
|
||||||
|
|
27
gas/write.c
27
gas/write.c
|
@ -1692,7 +1692,7 @@ set_symtab (void)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void
|
static void
|
||||||
subsegs_finish (void)
|
subsegs_finish (void)
|
||||||
{
|
{
|
||||||
struct frchain *frchainP;
|
struct frchain *frchainP;
|
||||||
|
@ -1761,33 +1761,12 @@ write_object_file (void)
|
||||||
fragS *fragP; /* Track along all frags. */
|
fragS *fragP; /* Track along all frags. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
subsegs_finish ();
|
||||||
|
|
||||||
#ifdef md_pre_output_hook
|
#ifdef md_pre_output_hook
|
||||||
md_pre_output_hook;
|
md_pre_output_hook;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Do we really want to write it? */
|
|
||||||
{
|
|
||||||
int n_warns, n_errs;
|
|
||||||
n_warns = had_warnings ();
|
|
||||||
n_errs = had_errors ();
|
|
||||||
/* The -Z flag indicates that an object file should be generated,
|
|
||||||
regardless of warnings and errors. */
|
|
||||||
if (flag_always_generate_output)
|
|
||||||
{
|
|
||||||
if (n_warns || n_errs)
|
|
||||||
as_warn (_("%d error%s, %d warning%s, generating bad object file"),
|
|
||||||
n_errs, n_errs == 1 ? "" : "s",
|
|
||||||
n_warns, n_warns == 1 ? "" : "s");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (n_errs)
|
|
||||||
as_fatal (_("%d error%s, %d warning%s, no object file generated"),
|
|
||||||
n_errs, n_errs == 1 ? "" : "s",
|
|
||||||
n_warns, n_warns == 1 ? "" : "s");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef md_pre_relax_hook
|
#ifdef md_pre_relax_hook
|
||||||
md_pre_relax_hook;
|
md_pre_relax_hook;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -169,7 +169,6 @@ extern struct reloc_list* reloc_list;
|
||||||
extern void append (char **charPP, char *fromP, unsigned long length);
|
extern void append (char **charPP, char *fromP, unsigned long length);
|
||||||
extern void record_alignment (segT seg, int align);
|
extern void record_alignment (segT seg, int align);
|
||||||
extern int get_recorded_alignment (segT seg);
|
extern int get_recorded_alignment (segT seg);
|
||||||
extern void subsegs_finish (void);
|
|
||||||
extern void write_object_file (void);
|
extern void write_object_file (void);
|
||||||
extern long relax_frag (segT, fragS *, long);
|
extern long relax_frag (segT, fragS *, long);
|
||||||
extern int relax_segment (struct frag *, segT, int);
|
extern int relax_segment (struct frag *, segT, int);
|
||||||
|
|
Loading…
Reference in New Issue