Add support to the RX toolchain to restrict the use of string instructions.
bfd * elf32-rx.c (describe_flags): Report the settings of the string insn using bits. (rx_elf_merge_private_bfd_data): Handle merging of the string insn using bits. bin * readelf.c (get_machine_flags): Report the setting of the string insn using bits. gas * config/tc-rx.c (enum options): Add OPTION_DISALLOW_STRING_INSNS. (md_longopts): Add -mno-allow-string-insns. (md_parse_option): Handle -mno-allow-string-insns. (md_show_usage): Mention -mno-allow-string-insns. (rx_note_string_insn_use): New function. Produces an error message if a string insn is used when it is not allowed. * config/rx-parse.y (SCMPU): Call rx_note_string_insn_use. (SMOVU, SMOVB, SMOVF, SUNTIL, SWHILE, RMPA): Likewise. * config/rx-defs.h (rx_note_string_insn_use): Prototype. * doc/c-rx.texi: Document -mno-allow-string-insns. elf * rx.h (E_FLAG_RX_SINSNS_SET): New bit in e_flags field. (E_FLAG_RX_SINSNS_YES): Likewise. (E_FLAG_RX_SINSNS_MASK): New define.
This commit is contained in:
parent
5a2d4533e2
commit
3525236c57
11 changed files with 96 additions and 9 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2015-04-09 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* elf32-rx.c (describe_flags): Report the settings of the string
|
||||||
|
insn using bits.
|
||||||
|
(rx_elf_merge_private_bfd_data): Handle merging of the string insn
|
||||||
|
using bits.
|
||||||
|
|
||||||
2015-04-08 H.J. Lu <hongjiu.lu@intel.com>
|
2015-04-08 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* compress.c (bfd_compress_section_contents): Work around a GCC
|
* compress.c (bfd_compress_section_contents): Work around a GCC
|
||||||
|
|
|
@ -3086,6 +3086,9 @@ describe_flags (flagword flags)
|
||||||
else
|
else
|
||||||
strcat (buf, ", GCC ABI");
|
strcat (buf, ", GCC ABI");
|
||||||
|
|
||||||
|
if (flags & E_FLAG_RX_SINSNS_SET)
|
||||||
|
strcat (buf, flags & E_FLAG_RX_SINSNS_YES ? ", uses String instructions" : ", bans String instructions");
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3112,8 +3115,22 @@ rx_elf_merge_private_bfd_data (bfd * ibfd, bfd * obfd)
|
||||||
{
|
{
|
||||||
flagword known_flags;
|
flagword known_flags;
|
||||||
|
|
||||||
|
if (old_flags & E_FLAG_RX_SINSNS_SET)
|
||||||
|
{
|
||||||
|
if ((new_flags & E_FLAG_RX_SINSNS_SET) == 0)
|
||||||
|
{
|
||||||
|
new_flags &= ~ E_FLAG_RX_SINSNS_MASK;
|
||||||
|
new_flags |= (old_flags & E_FLAG_RX_SINSNS_MASK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (new_flags & E_FLAG_RX_SINSNS_SET)
|
||||||
|
{
|
||||||
|
old_flags &= ~ E_FLAG_RX_SINSNS_MASK;
|
||||||
|
old_flags |= (new_flags & E_FLAG_RX_SINSNS_MASK);
|
||||||
|
}
|
||||||
|
|
||||||
known_flags = E_FLAG_RX_ABI | E_FLAG_RX_64BIT_DOUBLES
|
known_flags = E_FLAG_RX_ABI | E_FLAG_RX_64BIT_DOUBLES
|
||||||
| E_FLAG_RX_DSP | E_FLAG_RX_PID;
|
| E_FLAG_RX_DSP | E_FLAG_RX_PID | E_FLAG_RX_SINSNS_MASK;
|
||||||
|
|
||||||
if ((old_flags ^ new_flags) & known_flags)
|
if ((old_flags ^ new_flags) & known_flags)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2015-04-09 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* readelf.c (get_machine_flags): Report the setting of the string
|
||||||
|
insn using bits.
|
||||||
|
|
||||||
2015-04-08 H.J. Lu <hongjiu.lu@intel.com>
|
2015-04-08 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* objcopy.c (do_debug_sections): Add compress_zlib,
|
* objcopy.c (do_debug_sections): Add compress_zlib,
|
||||||
|
|
|
@ -3274,6 +3274,9 @@ get_machine_flags (unsigned e_flags, unsigned e_machine)
|
||||||
strcat (buf, ", pid");
|
strcat (buf, ", pid");
|
||||||
if (e_flags & E_FLAG_RX_ABI)
|
if (e_flags & E_FLAG_RX_ABI)
|
||||||
strcat (buf, ", RX ABI");
|
strcat (buf, ", RX ABI");
|
||||||
|
if (e_flags & E_FLAG_RX_SINSNS_SET)
|
||||||
|
strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
|
||||||
|
? ", uses String instructions" : ", bans String instructions");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EM_S390:
|
case EM_S390:
|
||||||
|
|
|
@ -1,3 +1,16 @@
|
||||||
|
2015-04-09 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* config/tc-rx.c (enum options): Add OPTION_DISALLOW_STRING_INSNS.
|
||||||
|
(md_longopts): Add -mno-allow-string-insns.
|
||||||
|
(md_parse_option): Handle -mno-allow-string-insns.
|
||||||
|
(md_show_usage): Mention -mno-allow-string-insns.
|
||||||
|
(rx_note_string_insn_use): New function. Produces an error
|
||||||
|
message if a string insn is used when it is not allowed.
|
||||||
|
* config/rx-parse.y (SCMPU): Call rx_note_string_insn_use.
|
||||||
|
(SMOVU, SMOVB, SMOVF, SUNTIL, SWHILE, RMPA): Likewise.
|
||||||
|
* config/rx-defs.h (rx_note_string_insn_use): Prototype.
|
||||||
|
* doc/c-rx.texi: Document -mno-allow-string-insns.
|
||||||
|
|
||||||
2015-04-08 H.J. Lu <hongjiu.lu@intel.com>
|
2015-04-08 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* as.c (show_usage): Update --compress-debug-sections.
|
* as.c (show_usage): Update --compress-debug-sections.
|
||||||
|
|
|
@ -62,6 +62,7 @@ extern void rx_linkrelax_imm (int);
|
||||||
extern void rx_linkrelax_branch (void);
|
extern void rx_linkrelax_branch (void);
|
||||||
extern int rx_parse (void);
|
extern int rx_parse (void);
|
||||||
extern int rx_wrap (void);
|
extern int rx_wrap (void);
|
||||||
|
extern void rx_note_string_insn_use (void);
|
||||||
|
|
||||||
extern char * rx_lex_start;
|
extern char * rx_lex_start;
|
||||||
extern char * rx_lex_end;
|
extern char * rx_lex_end;
|
||||||
|
|
|
@ -500,27 +500,27 @@ statement :
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
| SCMPU
|
| SCMPU
|
||||||
{ B2 (0x7f, 0x83); }
|
{ B2 (0x7f, 0x83); rx_note_string_insn_use (); }
|
||||||
| SMOVU
|
| SMOVU
|
||||||
{ B2 (0x7f, 0x87); }
|
{ B2 (0x7f, 0x87); rx_note_string_insn_use (); }
|
||||||
| SMOVB
|
| SMOVB
|
||||||
{ B2 (0x7f, 0x8b); }
|
{ B2 (0x7f, 0x8b); rx_note_string_insn_use (); }
|
||||||
| SMOVF
|
| SMOVF
|
||||||
{ B2 (0x7f, 0x8f); }
|
{ B2 (0x7f, 0x8f); rx_note_string_insn_use (); }
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
| SUNTIL bwl
|
| SUNTIL bwl
|
||||||
{ B2 (0x7f, 0x80); F ($2, 14, 2); }
|
{ B2 (0x7f, 0x80); F ($2, 14, 2); rx_note_string_insn_use (); }
|
||||||
| SWHILE bwl
|
| SWHILE bwl
|
||||||
{ B2 (0x7f, 0x84); F ($2, 14, 2); }
|
{ B2 (0x7f, 0x84); F ($2, 14, 2); rx_note_string_insn_use (); }
|
||||||
| SSTR bwl
|
| SSTR bwl
|
||||||
{ B2 (0x7f, 0x88); F ($2, 14, 2); }
|
{ B2 (0x7f, 0x88); F ($2, 14, 2); }
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
| RMPA bwl
|
| RMPA bwl
|
||||||
{ B2 (0x7f, 0x8c); F ($2, 14, 2); }
|
{ B2 (0x7f, 0x8c); F ($2, 14, 2); rx_note_string_insn_use (); }
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,7 @@ enum options
|
||||||
OPTION_USES_GCC_ABI,
|
OPTION_USES_GCC_ABI,
|
||||||
OPTION_USES_RX_ABI,
|
OPTION_USES_RX_ABI,
|
||||||
OPTION_CPU,
|
OPTION_CPU,
|
||||||
|
OPTION_DISALLOW_STRING_INSNS,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define RX_SHORTOPTS ""
|
#define RX_SHORTOPTS ""
|
||||||
|
@ -99,7 +100,8 @@ struct option md_longopts[] =
|
||||||
{"mint-register", required_argument, NULL, OPTION_INT_REGS},
|
{"mint-register", required_argument, NULL, OPTION_INT_REGS},
|
||||||
{"mgcc-abi", no_argument, NULL, OPTION_USES_GCC_ABI},
|
{"mgcc-abi", no_argument, NULL, OPTION_USES_GCC_ABI},
|
||||||
{"mrx-abi", no_argument, NULL, OPTION_USES_RX_ABI},
|
{"mrx-abi", no_argument, NULL, OPTION_USES_RX_ABI},
|
||||||
{"mcpu",required_argument,NULL,OPTION_CPU},
|
{"mcpu", required_argument, NULL, OPTION_CPU},
|
||||||
|
{"mno-allow-string-insns", no_argument, NULL, OPTION_DISALLOW_STRING_INSNS},
|
||||||
{NULL, no_argument, NULL, 0}
|
{NULL, no_argument, NULL, 0}
|
||||||
};
|
};
|
||||||
size_t md_longopts_size = sizeof (md_longopts);
|
size_t md_longopts_size = sizeof (md_longopts);
|
||||||
|
@ -173,6 +175,10 @@ md_parse_option (int c ATTRIBUTE_UNUSED, char * arg ATTRIBUTE_UNUSED)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
case OPTION_DISALLOW_STRING_INSNS:
|
||||||
|
elf_flags |= E_FLAG_RX_SINSNS_SET | E_FLAG_RX_SINSNS_NO;
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -192,6 +198,7 @@ md_show_usage (FILE * stream)
|
||||||
fprintf (stream, _(" --mpid\n"));
|
fprintf (stream, _(" --mpid\n"));
|
||||||
fprintf (stream, _(" --mint-register=<value>\n"));
|
fprintf (stream, _(" --mint-register=<value>\n"));
|
||||||
fprintf (stream, _(" --mcpu=<rx100|rx200|rx600|rx610>\n"));
|
fprintf (stream, _(" --mcpu=<rx100|rx200|rx600|rx610>\n"));
|
||||||
|
fprintf (stream, _(" --mno-allow-string-insns"));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -2623,6 +2630,14 @@ tc_gen_reloc (asection * sec ATTRIBUTE_UNUSED, fixS * fixp)
|
||||||
return reloc;
|
return reloc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
rx_note_string_insn_use (void)
|
||||||
|
{
|
||||||
|
if ((elf_flags & E_FLAG_RX_SINSNS_MASK) == (E_FLAG_RX_SINSNS_SET | E_FLAG_RX_SINSNS_NO))
|
||||||
|
as_bad (_("Use of an RX string instruction detected in a file being assembled without string instruction support"));
|
||||||
|
elf_flags |= E_FLAG_RX_SINSNS_SET | E_FLAG_RX_SINSNS_YES;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set the ELF specific flags. */
|
/* Set the ELF specific flags. */
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -112,6 +112,21 @@ This option tells the assembler the target CPU type. Currently the
|
||||||
cpu names. Attempting to assemble an instruction not supported by the
|
cpu names. Attempting to assemble an instruction not supported by the
|
||||||
indicated cpu type will result in an error message being generated.
|
indicated cpu type will result in an error message being generated.
|
||||||
|
|
||||||
|
@cindex @samp{-mno-allow-string-insns}
|
||||||
|
@item -mno-allow-string-insns
|
||||||
|
This option tells the assembler to mark the object file that it is
|
||||||
|
building as one that does not use the string instructions
|
||||||
|
@code{SMOVF}, @code{SCMPU}, @code {SMOVB}, @code{SMOVU}, @code{SUNTIL}
|
||||||
|
@code {SWHILE} or the @code {RMPA} instruction. In addition the mark
|
||||||
|
tells the linker to complain if an attempt is made to link the binary
|
||||||
|
with another one that does use any of these instructions.
|
||||||
|
|
||||||
|
Note - the inverse of this option, @code{-mallow-string-insns}, is
|
||||||
|
not needed. The assembler automatically detects the use of the
|
||||||
|
the instructions in the source code and labels the resulting
|
||||||
|
object file appropriately. If no string instructions are detected
|
||||||
|
then the object file is labelled as being one that can be linked with
|
||||||
|
either string-using or string-banned object files.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@node RX-Modifiers
|
@node RX-Modifiers
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
2015-04-09 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* rx.h (E_FLAG_RX_SINSNS_SET): New bit in e_flags field.
|
||||||
|
(E_FLAG_RX_SINSNS_YES): Likewise.
|
||||||
|
(E_FLAG_RX_SINSNS_MASK): New define.
|
||||||
|
|
||||||
2015-04-03 H.J. Lu <hongjiu.lu@intel.com>
|
2015-04-03 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* external.h (Elf32_External_Chdr): New.
|
* external.h (Elf32_External_Chdr): New.
|
||||||
|
|
|
@ -120,6 +120,11 @@ END_RELOC_NUMBERS (R_RX_max)
|
||||||
#define E_FLAG_RX_PID (1 << 2) /* Unofficial - DJ */
|
#define E_FLAG_RX_PID (1 << 2) /* Unofficial - DJ */
|
||||||
#define E_FLAG_RX_ABI (1 << 3) /* Binary passes stacked arguments using natural alignment. Unofficial - NC. */
|
#define E_FLAG_RX_ABI (1 << 3) /* Binary passes stacked arguments using natural alignment. Unofficial - NC. */
|
||||||
|
|
||||||
|
#define E_FLAG_RX_SINSNS_SET (1 << 6) /* Set if bit-5 is significant. */
|
||||||
|
#define E_FLAG_RX_SINSNS_YES (1 << 7) /* Set if string instructions are used in the binary. */
|
||||||
|
#define E_FLAG_RX_SINSNS_NO 0 /* Bit-5 if this binary must not be linked with a string instruction using binary. */
|
||||||
|
#define E_FLAG_RX_SINSNS_MASK (3 << 6) /* Mask of bits used to determine string instruction use. */
|
||||||
|
|
||||||
/* These define the addend field of R_RX_RH_RELAX relocations. */
|
/* These define the addend field of R_RX_RH_RELAX relocations. */
|
||||||
#define RX_RELAXA_IMM6 0x00000010 /* Imm8/16/24/32 at bit offset 6. */
|
#define RX_RELAXA_IMM6 0x00000010 /* Imm8/16/24/32 at bit offset 6. */
|
||||||
#define RX_RELAXA_IMM12 0x00000020 /* Imm8/16/24/32 at bit offset 12. */
|
#define RX_RELAXA_IMM12 0x00000020 /* Imm8/16/24/32 at bit offset 12. */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue