x86: Extend assembler to generate GNU property notes
Add -mx86-used-note=[yes|no] option to generate (or not) GNU property notes with GNU_PROPERTY_X86_FEATURE_2_USED and GNU_PROPERTY_X86_ISA_1_USED properties. If the assembly input contains no instructions, set the GNU_PROPERTY_X86_UINT32_VALID bit in GNU_PROPERTY_X86_FEATURE_2_USED property. Add a --enable-x86-used-note configure time option to set the default behavior. Set the default if the configure option is not used to "no". * NEWS: Mention -mx86-used-note=[no|yes]. * configure.ac: Add --enable-x86-used-note. Define DEFAULT_X86_USED_NOTE. * config.in: Regenerated. * configure: Likewise. * config/tc-i386.c (x86_isa_1_used): New. (x86_feature_2_used): Likewise. (x86_used_note): Likewise. (_i386_insn): Add has_regmmx, has_regxmm, has_regymm and has_regzmm. (build_modrm_byte): Set i.has_regmmx, i.has_regzmm. i.has_regymm and i.has_regxmm. (x86_cleanup): New function. (output_insn): Update x86_isa_1_used and x86_feature_2_used. (OPTION_X86_USED_NOTE): New. (md_longopts): Add -mx86-used-note=. (md_parse_option): Handle OPTION_X86_USED_NOTE. (md_show_usage): Display -mx86-used-note=. * config/tc-i386.h (x86_cleanup): New prototype. (md_cleanup): New. * doc/c-i386.texi: Document -mx86-used-note=.
This commit is contained in:
parent
0cb8eedc91
commit
b4a3a7b44c
8 changed files with 385 additions and 14 deletions
|
@ -1,3 +1,27 @@
|
||||||
|
2018-08-31 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
* NEWS: Mention -mx86-used-note=[no|yes].
|
||||||
|
* configure.ac: Add --enable-x86-used-note. Define
|
||||||
|
DEFAULT_X86_USED_NOTE.
|
||||||
|
* config.in: Regenerated.
|
||||||
|
* configure: Likewise.
|
||||||
|
* config/tc-i386.c (x86_isa_1_used): New.
|
||||||
|
(x86_feature_2_used): Likewise.
|
||||||
|
(x86_used_note): Likewise.
|
||||||
|
(_i386_insn): Add has_regmmx, has_regxmm, has_regymm and
|
||||||
|
has_regzmm.
|
||||||
|
(build_modrm_byte): Set i.has_regmmx, i.has_regzmm.
|
||||||
|
i.has_regymm and i.has_regxmm.
|
||||||
|
(x86_cleanup): New function.
|
||||||
|
(output_insn): Update x86_isa_1_used and x86_feature_2_used.
|
||||||
|
(OPTION_X86_USED_NOTE): New.
|
||||||
|
(md_longopts): Add -mx86-used-note=.
|
||||||
|
(md_parse_option): Handle OPTION_X86_USED_NOTE.
|
||||||
|
(md_show_usage): Display -mx86-used-note=.
|
||||||
|
* config/tc-i386.h (x86_cleanup): New prototype.
|
||||||
|
(md_cleanup): New.
|
||||||
|
* doc/c-i386.texi: Document -mx86-used-note=.
|
||||||
|
|
||||||
2018-08-30 Jose E. Marchesi <jose.marchesi@oracle.com>
|
2018-08-30 Jose E. Marchesi <jose.marchesi@oracle.com>
|
||||||
|
|
||||||
* testsuite/gas/sparc/leon.d: Disassemble v8 code also in sparc64
|
* testsuite/gas/sparc/leon.d: Disassemble v8 code also in sparc64
|
||||||
|
|
5
gas/NEWS
5
gas/NEWS
|
@ -1,5 +1,10 @@
|
||||||
-*- text -*-
|
-*- text -*-
|
||||||
|
|
||||||
|
* Add -mx86-used-note=[yes|no] option to generate (or not) x86 GNU property
|
||||||
|
notes. Add a --enable-x86-used-note configure time option to set the
|
||||||
|
default behavior. Set the default if the configure option is not used
|
||||||
|
to "no".
|
||||||
|
|
||||||
* Add support for the MIPS Loongson EXTensions R2 (EXT2) instructions.
|
* Add support for the MIPS Loongson EXTensions R2 (EXT2) instructions.
|
||||||
|
|
||||||
* Add support for the MIPS Loongson EXTensions (EXT) instructions.
|
* Add support for the MIPS Loongson EXTensions (EXT) instructions.
|
||||||
|
|
|
@ -50,6 +50,10 @@
|
||||||
/* Define to 1 if you want to generate x86 relax relocations by default. */
|
/* Define to 1 if you want to generate x86 relax relocations by default. */
|
||||||
#undef DEFAULT_GENERATE_X86_RELAX_RELOCATIONS
|
#undef DEFAULT_GENERATE_X86_RELAX_RELOCATIONS
|
||||||
|
|
||||||
|
/* Define to 1 if you want to generate GNU x86 used ISA and feature properties
|
||||||
|
by default. */
|
||||||
|
#undef DEFAULT_X86_USED_NOTE
|
||||||
|
|
||||||
/* Supported emulations. */
|
/* Supported emulations. */
|
||||||
#undef EMULATIONS
|
#undef EMULATIONS
|
||||||
|
|
||||||
|
|
|
@ -188,6 +188,13 @@ static void s_bss (int);
|
||||||
#endif
|
#endif
|
||||||
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
|
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
|
||||||
static void handle_large_common (int small ATTRIBUTE_UNUSED);
|
static void handle_large_common (int small ATTRIBUTE_UNUSED);
|
||||||
|
|
||||||
|
/* GNU_PROPERTY_X86_ISA_1_USED. */
|
||||||
|
static unsigned int x86_isa_1_used;
|
||||||
|
/* GNU_PROPERTY_X86_FEATURE_2_USED. */
|
||||||
|
static unsigned int x86_feature_2_used;
|
||||||
|
/* Generate x86 used ISA and feature properties. */
|
||||||
|
static unsigned int x86_used_note = DEFAULT_X86_USED_NOTE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const char *default_arch = DEFAULT_ARCH;
|
static const char *default_arch = DEFAULT_ARCH;
|
||||||
|
@ -332,6 +339,18 @@ struct _i386_insn
|
||||||
unsigned int prefixes;
|
unsigned int prefixes;
|
||||||
unsigned char prefix[MAX_PREFIXES];
|
unsigned char prefix[MAX_PREFIXES];
|
||||||
|
|
||||||
|
/* Has MMX register operands. */
|
||||||
|
bfd_boolean has_regmmx;
|
||||||
|
|
||||||
|
/* Has XMM register operands. */
|
||||||
|
bfd_boolean has_regxmm;
|
||||||
|
|
||||||
|
/* Has YMM register operands. */
|
||||||
|
bfd_boolean has_regymm;
|
||||||
|
|
||||||
|
/* Has ZMM register operands. */
|
||||||
|
bfd_boolean has_regzmm;
|
||||||
|
|
||||||
/* RM and SIB are the modrm byte and the sib byte where the
|
/* RM and SIB are the modrm byte and the sib byte where the
|
||||||
addressing modes of this insn are encoded. */
|
addressing modes of this insn are encoded. */
|
||||||
modrm_byte rm;
|
modrm_byte rm;
|
||||||
|
@ -7054,6 +7073,21 @@ build_modrm_byte (void)
|
||||||
{
|
{
|
||||||
i.rm.reg = i.op[dest].regs->reg_num;
|
i.rm.reg = i.op[dest].regs->reg_num;
|
||||||
i.rm.regmem = i.op[source].regs->reg_num;
|
i.rm.regmem = i.op[source].regs->reg_num;
|
||||||
|
if (i.op[dest].regs->reg_type.bitfield.regmmx
|
||||||
|
|| i.op[source].regs->reg_type.bitfield.regmmx)
|
||||||
|
i.has_regmmx = TRUE;
|
||||||
|
else if (i.op[dest].regs->reg_type.bitfield.regsimd
|
||||||
|
|| i.op[source].regs->reg_type.bitfield.regsimd)
|
||||||
|
{
|
||||||
|
if (i.types[dest].bitfield.zmmword
|
||||||
|
|| i.types[source].bitfield.zmmword)
|
||||||
|
i.has_regzmm = TRUE;
|
||||||
|
else if (i.types[dest].bitfield.ymmword
|
||||||
|
|| i.types[source].bitfield.ymmword)
|
||||||
|
i.has_regymm = TRUE;
|
||||||
|
else
|
||||||
|
i.has_regxmm = TRUE;
|
||||||
|
}
|
||||||
if ((i.op[dest].regs->reg_flags & RegRex) != 0)
|
if ((i.op[dest].regs->reg_flags & RegRex) != 0)
|
||||||
i.rex |= REX_R;
|
i.rex |= REX_R;
|
||||||
if ((i.op[dest].regs->reg_flags & RegVRex) != 0)
|
if ((i.op[dest].regs->reg_flags & RegVRex) != 0)
|
||||||
|
@ -7393,17 +7427,32 @@ build_modrm_byte (void)
|
||||||
unsigned int vex_reg = ~0;
|
unsigned int vex_reg = ~0;
|
||||||
|
|
||||||
for (op = 0; op < i.operands; op++)
|
for (op = 0; op < i.operands; op++)
|
||||||
if (i.types[op].bitfield.reg
|
{
|
||||||
|| i.types[op].bitfield.regmmx
|
if (i.types[op].bitfield.reg
|
||||||
|| i.types[op].bitfield.regsimd
|
|| i.types[op].bitfield.regbnd
|
||||||
|| i.types[op].bitfield.regbnd
|
|| i.types[op].bitfield.regmask
|
||||||
|| i.types[op].bitfield.regmask
|
|| i.types[op].bitfield.sreg2
|
||||||
|| i.types[op].bitfield.sreg2
|
|| i.types[op].bitfield.sreg3
|
||||||
|| i.types[op].bitfield.sreg3
|
|| i.types[op].bitfield.control
|
||||||
|| i.types[op].bitfield.control
|
|| i.types[op].bitfield.debug
|
||||||
|| i.types[op].bitfield.debug
|
|| i.types[op].bitfield.test)
|
||||||
|| i.types[op].bitfield.test)
|
break;
|
||||||
break;
|
if (i.types[op].bitfield.regsimd)
|
||||||
|
{
|
||||||
|
if (i.types[op].bitfield.zmmword)
|
||||||
|
i.has_regzmm = TRUE;
|
||||||
|
else if (i.types[op].bitfield.ymmword)
|
||||||
|
i.has_regymm = TRUE;
|
||||||
|
else
|
||||||
|
i.has_regxmm = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i.types[op].bitfield.regmmx)
|
||||||
|
{
|
||||||
|
i.has_regmmx = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (vex_3_sources)
|
if (vex_3_sources)
|
||||||
op = dest;
|
op = dest;
|
||||||
|
@ -7783,12 +7832,219 @@ output_interseg_jump (void)
|
||||||
md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
|
md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
|
||||||
|
void
|
||||||
|
x86_cleanup (void)
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
asection *seg = now_seg;
|
||||||
|
subsegT subseg = now_subseg;
|
||||||
|
asection *sec;
|
||||||
|
unsigned int alignment, align_size_1;
|
||||||
|
unsigned int isa_1_descsz, feature_2_descsz, descsz;
|
||||||
|
unsigned int isa_1_descsz_raw, feature_2_descsz_raw;
|
||||||
|
unsigned int padding;
|
||||||
|
|
||||||
|
if (!IS_ELF || !x86_used_note)
|
||||||
|
return;
|
||||||
|
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_UINT32_VALID;
|
||||||
|
x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X86;
|
||||||
|
|
||||||
|
/* The .note.gnu.property section layout:
|
||||||
|
|
||||||
|
Field Length Contents
|
||||||
|
---- ---- ----
|
||||||
|
n_namsz 4 4
|
||||||
|
n_descsz 4 The note descriptor size
|
||||||
|
n_type 4 NT_GNU_PROPERTY_TYPE_0
|
||||||
|
n_name 4 "GNU"
|
||||||
|
n_desc n_descsz The program property array
|
||||||
|
.... .... ....
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Create the .note.gnu.property section. */
|
||||||
|
sec = subseg_new (NOTE_GNU_PROPERTY_SECTION_NAME, 0);
|
||||||
|
bfd_set_section_flags (stdoutput, sec,
|
||||||
|
(SEC_ALLOC
|
||||||
|
| SEC_LOAD
|
||||||
|
| SEC_DATA
|
||||||
|
| SEC_HAS_CONTENTS
|
||||||
|
| SEC_READONLY));
|
||||||
|
|
||||||
|
if (get_elf_backend_data (stdoutput)->s->elfclass == ELFCLASS64)
|
||||||
|
{
|
||||||
|
align_size_1 = 7;
|
||||||
|
alignment = 3;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
align_size_1 = 3;
|
||||||
|
alignment = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
bfd_set_section_alignment (stdoutput, sec, alignment);
|
||||||
|
elf_section_type (sec) = SHT_NOTE;
|
||||||
|
|
||||||
|
/* GNU_PROPERTY_X86_ISA_1_USED: 4-byte type + 4-byte data size
|
||||||
|
+ 4-byte data */
|
||||||
|
isa_1_descsz_raw = 4 + 4 + 4;
|
||||||
|
/* Align GNU_PROPERTY_X86_ISA_1_USED. */
|
||||||
|
isa_1_descsz = (isa_1_descsz_raw + align_size_1) & ~align_size_1;
|
||||||
|
|
||||||
|
feature_2_descsz_raw = isa_1_descsz;
|
||||||
|
/* GNU_PROPERTY_X86_FEATURE_2_USED: 4-byte type + 4-byte data size
|
||||||
|
+ 4-byte data */
|
||||||
|
feature_2_descsz_raw += 4 + 4 + 4;
|
||||||
|
/* Align GNU_PROPERTY_X86_FEATURE_2_USED. */
|
||||||
|
feature_2_descsz = ((feature_2_descsz_raw + align_size_1)
|
||||||
|
& ~align_size_1);
|
||||||
|
|
||||||
|
descsz = feature_2_descsz;
|
||||||
|
/* Section size: n_namsz + n_descsz + n_type + n_name + n_descsz. */
|
||||||
|
p = frag_more (4 + 4 + 4 + 4 + descsz);
|
||||||
|
|
||||||
|
/* Write n_namsz. */
|
||||||
|
md_number_to_chars (p, (valueT) 4, 4);
|
||||||
|
|
||||||
|
/* Write n_descsz. */
|
||||||
|
md_number_to_chars (p + 4, (valueT) descsz, 4);
|
||||||
|
|
||||||
|
/* Write n_type. */
|
||||||
|
md_number_to_chars (p + 4 * 2, (valueT) NT_GNU_PROPERTY_TYPE_0, 4);
|
||||||
|
|
||||||
|
/* Write n_name. */
|
||||||
|
memcpy (p + 4 * 3, "GNU", 4);
|
||||||
|
|
||||||
|
/* Write 4-byte type. */
|
||||||
|
md_number_to_chars (p + 4 * 4,
|
||||||
|
(valueT) GNU_PROPERTY_X86_ISA_1_USED, 4);
|
||||||
|
|
||||||
|
/* Write 4-byte data size. */
|
||||||
|
md_number_to_chars (p + 4 * 5, (valueT) 4, 4);
|
||||||
|
|
||||||
|
/* Write 4-byte data. */
|
||||||
|
md_number_to_chars (p + 4 * 6, (valueT) x86_isa_1_used, 4);
|
||||||
|
|
||||||
|
/* Zero out paddings. */
|
||||||
|
padding = isa_1_descsz - isa_1_descsz_raw;
|
||||||
|
if (padding)
|
||||||
|
memset (p + 4 * 7, 0, padding);
|
||||||
|
|
||||||
|
/* Write 4-byte type. */
|
||||||
|
md_number_to_chars (p + isa_1_descsz + 4 * 4,
|
||||||
|
(valueT) GNU_PROPERTY_X86_FEATURE_2_USED, 4);
|
||||||
|
|
||||||
|
/* Write 4-byte data size. */
|
||||||
|
md_number_to_chars (p + isa_1_descsz + 4 * 5, (valueT) 4, 4);
|
||||||
|
|
||||||
|
/* Write 4-byte data. */
|
||||||
|
md_number_to_chars (p + isa_1_descsz + 4 * 6,
|
||||||
|
(valueT) x86_feature_2_used, 4);
|
||||||
|
|
||||||
|
/* Zero out paddings. */
|
||||||
|
padding = feature_2_descsz - feature_2_descsz_raw;
|
||||||
|
if (padding)
|
||||||
|
memset (p + isa_1_descsz + 4 * 7, 0, padding);
|
||||||
|
|
||||||
|
/* We probably can't restore the current segment, for there likely
|
||||||
|
isn't one yet... */
|
||||||
|
if (seg && subseg)
|
||||||
|
subseg_set (seg, subseg);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
output_insn (void)
|
output_insn (void)
|
||||||
{
|
{
|
||||||
fragS *insn_start_frag;
|
fragS *insn_start_frag;
|
||||||
offsetT insn_start_off;
|
offsetT insn_start_off;
|
||||||
|
|
||||||
|
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
|
||||||
|
if (IS_ELF && x86_used_note)
|
||||||
|
{
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpucmov)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_CMOV;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpusse)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpusse2)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE2;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpusse3)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE3;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpussse3)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSSE3;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpusse4_1)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_1;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpusse4_2)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_2;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpuavx)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpuavx2)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX2;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpufma)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_FMA;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpuavx512f)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512F;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpuavx512cd)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512CD;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpuavx512er)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512ER;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpuavx512pf)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512PF;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpuavx512vl)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512VL;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpuavx512dq)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512DQ;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpuavx512bw)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512BW;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpuavx512_4fmaps)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpuavx512_4vnniw)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpuavx512_bitalg)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BITALG;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpuavx512ifma)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_IFMA;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpuavx512vbmi)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpuavx512_vbmi2)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpuavx512_vnni)
|
||||||
|
x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VNNI;
|
||||||
|
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpu8087
|
||||||
|
|| i.tm.cpu_flags.bitfield.cpu287
|
||||||
|
|| i.tm.cpu_flags.bitfield.cpu387
|
||||||
|
|| i.tm.cpu_flags.bitfield.cpu687
|
||||||
|
|| i.tm.cpu_flags.bitfield.cpufisttp)
|
||||||
|
x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87;
|
||||||
|
/* Don't set GNU_PROPERTY_X86_FEATURE_2_MMX for prefetchtXXX nor
|
||||||
|
Xfence instructions. */
|
||||||
|
if (i.tm.base_opcode != 0xf18
|
||||||
|
&& i.tm.base_opcode != 0xf0d
|
||||||
|
&& i.tm.base_opcode != 0xfae
|
||||||
|
&& (i.has_regmmx
|
||||||
|
|| i.tm.cpu_flags.bitfield.cpummx
|
||||||
|
|| i.tm.cpu_flags.bitfield.cpua3dnow
|
||||||
|
|| i.tm.cpu_flags.bitfield.cpua3dnowa))
|
||||||
|
x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX;
|
||||||
|
if (i.has_regxmm)
|
||||||
|
x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM;
|
||||||
|
if (i.has_regymm)
|
||||||
|
x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM;
|
||||||
|
if (i.has_regzmm)
|
||||||
|
x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpufxsr)
|
||||||
|
x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpuxsave)
|
||||||
|
x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpuxsaveopt)
|
||||||
|
x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT;
|
||||||
|
if (i.tm.cpu_flags.bitfield.cpuxsavec)
|
||||||
|
x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Tie dwarf2 debug info to the address at the start of the insn.
|
/* Tie dwarf2 debug info to the address at the start of the insn.
|
||||||
We can't do this after the insn has been output as the current
|
We can't do this after the insn has been output as the current
|
||||||
frag may have been closed off. eg. by frag_var. */
|
frag may have been closed off. eg. by frag_var. */
|
||||||
|
@ -10581,6 +10837,7 @@ const char *md_shortopts = "qnO::";
|
||||||
#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
|
#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
|
||||||
#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
|
#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
|
||||||
#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
|
#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
|
||||||
|
#define OPTION_X86_USED_NOTE (OPTION_MD_BASE + 25)
|
||||||
|
|
||||||
struct option md_longopts[] =
|
struct option md_longopts[] =
|
||||||
{
|
{
|
||||||
|
@ -10592,6 +10849,7 @@ struct option md_longopts[] =
|
||||||
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
|
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
|
||||||
{"x32", no_argument, NULL, OPTION_X32},
|
{"x32", no_argument, NULL, OPTION_X32},
|
||||||
{"mshared", no_argument, NULL, OPTION_MSHARED},
|
{"mshared", no_argument, NULL, OPTION_MSHARED},
|
||||||
|
{"mx86-used-note", required_argument, NULL, OPTION_X86_USED_NOTE},
|
||||||
#endif
|
#endif
|
||||||
{"divide", no_argument, NULL, OPTION_DIVIDE},
|
{"divide", no_argument, NULL, OPTION_DIVIDE},
|
||||||
{"march", required_argument, NULL, OPTION_MARCH},
|
{"march", required_argument, NULL, OPTION_MARCH},
|
||||||
|
@ -10659,6 +10917,17 @@ md_parse_option (int c, const char *arg)
|
||||||
case OPTION_MSHARED:
|
case OPTION_MSHARED:
|
||||||
shared = 1;
|
shared = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OPTION_X86_USED_NOTE:
|
||||||
|
if (strcasecmp (arg, "yes") == 0)
|
||||||
|
x86_used_note = 1;
|
||||||
|
else if (strcasecmp (arg, "no") == 0)
|
||||||
|
x86_used_note = 0;
|
||||||
|
else
|
||||||
|
as_fatal (_("invalid -mx86-used-note= option: `%s'"), arg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
|
#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
|
||||||
|| defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
|
|| defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
|
||||||
|
@ -11196,9 +11465,19 @@ md_show_usage (FILE *stream)
|
||||||
-mnaked-reg don't require `%%' prefix for registers\n"));
|
-mnaked-reg don't require `%%' prefix for registers\n"));
|
||||||
fprintf (stream, _("\
|
fprintf (stream, _("\
|
||||||
-madd-bnd-prefix add BND prefix for all valid branches\n"));
|
-madd-bnd-prefix add BND prefix for all valid branches\n"));
|
||||||
|
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
|
||||||
fprintf (stream, _("\
|
fprintf (stream, _("\
|
||||||
-mshared disable branch optimization for shared code\n"));
|
-mshared disable branch optimization for shared code\n"));
|
||||||
# if defined (TE_PE) || defined (TE_PEP)
|
fprintf (stream, _("\
|
||||||
|
-mx86-used-note=[no|yes] "));
|
||||||
|
if (DEFAULT_X86_USED_NOTE)
|
||||||
|
fprintf (stream, _("(default: yes)\n"));
|
||||||
|
else
|
||||||
|
fprintf (stream, _("(default: no)\n"));
|
||||||
|
fprintf (stream, _("\
|
||||||
|
generate x86 used ISA and feature properties\n"));
|
||||||
|
#endif
|
||||||
|
#if defined (TE_PE) || defined (TE_PEP)
|
||||||
fprintf (stream, _("\
|
fprintf (stream, _("\
|
||||||
-mbig-obj generate big object files\n"));
|
-mbig-obj generate big object files\n"));
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -316,6 +316,11 @@ extern bfd_vma x86_64_section_letter (int, const char **);
|
||||||
#define md_elf_section_letter(LETTER, PTR_MSG) x86_64_section_letter (LETTER, PTR_MSG)
|
#define md_elf_section_letter(LETTER, PTR_MSG) x86_64_section_letter (LETTER, PTR_MSG)
|
||||||
#define md_elf_section_word(STR, LEN) x86_64_section_word (STR, LEN)
|
#define md_elf_section_word(STR, LEN) x86_64_section_word (STR, LEN)
|
||||||
|
|
||||||
|
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
|
||||||
|
extern void x86_cleanup (void);
|
||||||
|
#define md_cleanup() x86_cleanup ()
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef TE_PE
|
#ifdef TE_PE
|
||||||
|
|
||||||
#define O_secrel O_md1
|
#define O_secrel O_md1
|
||||||
|
|
28
gas/configure
vendored
28
gas/configure
vendored
|
@ -808,6 +808,7 @@ enable_compressed_debug_sections
|
||||||
enable_x86_relax_relocations
|
enable_x86_relax_relocations
|
||||||
enable_elf_stt_common
|
enable_elf_stt_common
|
||||||
enable_generate_build_notes
|
enable_generate_build_notes
|
||||||
|
enable_x86_used_note
|
||||||
enable_werror
|
enable_werror
|
||||||
enable_build_warnings
|
enable_build_warnings
|
||||||
with_cpu
|
with_cpu
|
||||||
|
@ -1469,6 +1470,7 @@ Optional Features:
|
||||||
--enable-generate-build-notes
|
--enable-generate-build-notes
|
||||||
generate GNU Build notes if none are provided by the
|
generate GNU Build notes if none are provided by the
|
||||||
input
|
input
|
||||||
|
--enable-x86-used-note generate GNU x86 used ISA and feature properties
|
||||||
--enable-werror treat compile warnings as errors
|
--enable-werror treat compile warnings as errors
|
||||||
--enable-build-warnings enable build-time compiler warnings
|
--enable-build-warnings enable build-time compiler warnings
|
||||||
--disable-nls do not use Native Language Support
|
--disable-nls do not use Native Language Support
|
||||||
|
@ -11335,7 +11337,7 @@ else
|
||||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
||||||
lt_status=$lt_dlunknown
|
lt_status=$lt_dlunknown
|
||||||
cat > conftest.$ac_ext <<_LT_EOF
|
cat > conftest.$ac_ext <<_LT_EOF
|
||||||
#line 11338 "configure"
|
#line 11340 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
|
|
||||||
#if HAVE_DLFCN_H
|
#if HAVE_DLFCN_H
|
||||||
|
@ -11441,7 +11443,7 @@ else
|
||||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
||||||
lt_status=$lt_dlunknown
|
lt_status=$lt_dlunknown
|
||||||
cat > conftest.$ac_ext <<_LT_EOF
|
cat > conftest.$ac_ext <<_LT_EOF
|
||||||
#line 11444 "configure"
|
#line 11446 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
|
|
||||||
#if HAVE_DLFCN_H
|
#if HAVE_DLFCN_H
|
||||||
|
@ -12111,6 +12113,19 @@ esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Decide if the x86 ELF assembler should default to generating GNU x86
|
||||||
|
# used ISA and feature properties.
|
||||||
|
ac_default_generate_x86_used_note=unset
|
||||||
|
# Provide a configuration option to override the default.
|
||||||
|
# Check whether --enable-x86-used-note was given.
|
||||||
|
if test "${enable_x86_used_note+set}" = set; then :
|
||||||
|
enableval=$enable_x86_used_note; case "${enableval}" in
|
||||||
|
yes) ac_default_generate_x86_used_note=1 ;;
|
||||||
|
no) ac_default_generate_x86_used_note=0 ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
using_cgen=no
|
using_cgen=no
|
||||||
|
|
||||||
|
|
||||||
|
@ -13039,6 +13054,15 @@ cat >>confdefs.h <<_ACEOF
|
||||||
_ACEOF
|
_ACEOF
|
||||||
|
|
||||||
|
|
||||||
|
if test ${ac_default_generate_x86_used_note} = unset; then
|
||||||
|
ac_default_generate_x86_used_note=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define DEFAULT_X86_USED_NOTE $ac_default_generate_x86_used_note
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
|
||||||
if test x$ac_default_compressed_debug_sections = xyes ; then
|
if test x$ac_default_compressed_debug_sections = xyes ; then
|
||||||
|
|
||||||
$as_echo "#define DEFAULT_FLAG_COMPRESS_DEBUG 1" >>confdefs.h
|
$as_echo "#define DEFAULT_FLAG_COMPRESS_DEBUG 1" >>confdefs.h
|
||||||
|
|
|
@ -113,6 +113,19 @@ AC_ARG_ENABLE(generate_build_notes,
|
||||||
esac])dnl
|
esac])dnl
|
||||||
|
|
||||||
|
|
||||||
|
# Decide if the x86 ELF assembler should default to generating GNU x86
|
||||||
|
# used ISA and feature properties.
|
||||||
|
ac_default_generate_x86_used_note=unset
|
||||||
|
# Provide a configuration option to override the default.
|
||||||
|
AC_ARG_ENABLE(x86-used-note,
|
||||||
|
AS_HELP_STRING([--enable-x86-used-note],
|
||||||
|
[generate GNU x86 used ISA and feature properties]),
|
||||||
|
[case "${enableval}" in
|
||||||
|
yes) ac_default_generate_x86_used_note=1 ;;
|
||||||
|
no) ac_default_generate_x86_used_note=0 ;;
|
||||||
|
esac])dnl
|
||||||
|
|
||||||
|
|
||||||
using_cgen=no
|
using_cgen=no
|
||||||
|
|
||||||
AM_BINUTILS_WARNINGS
|
AM_BINUTILS_WARNINGS
|
||||||
|
@ -613,6 +626,14 @@ AC_DEFINE_UNQUOTED(DEFAULT_GENERATE_BUILD_NOTES,
|
||||||
[Define to 1 if you want to generate GNU Build attribute notes
|
[Define to 1 if you want to generate GNU Build attribute notes
|
||||||
by default, if none are contained in the input.])
|
by default, if none are contained in the input.])
|
||||||
|
|
||||||
|
if test ${ac_default_generate_x86_used_note} = unset; then
|
||||||
|
ac_default_generate_x86_used_note=0
|
||||||
|
fi
|
||||||
|
AC_DEFINE_UNQUOTED(DEFAULT_X86_USED_NOTE,
|
||||||
|
$ac_default_generate_x86_used_note,
|
||||||
|
[Define to 1 if you want to generate GNU x86 used ISA and feature
|
||||||
|
properties by default.])
|
||||||
|
|
||||||
if test x$ac_default_compressed_debug_sections = xyes ; then
|
if test x$ac_default_compressed_debug_sections = xyes ; then
|
||||||
AC_DEFINE(DEFAULT_FLAG_COMPRESS_DEBUG, 1, [Define if you want compressed debug sections by default.])
|
AC_DEFINE(DEFAULT_FLAG_COMPRESS_DEBUG, 1, [Define if you want compressed debug sections by default.])
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -400,6 +400,15 @@ R_X86_64_REX_GOTPCRELX, in 64-bit mode.
|
||||||
relocations. The default can be controlled by a configure option
|
relocations. The default can be controlled by a configure option
|
||||||
@option{--enable-x86-relax-relocations}.
|
@option{--enable-x86-relax-relocations}.
|
||||||
|
|
||||||
|
@cindex @samp{-mx86-used-note=} option, i386
|
||||||
|
@cindex @samp{-mx86-used-note=} option, x86-64
|
||||||
|
@item -mx86-used-note=@var{no}
|
||||||
|
@itemx -mx86-used-note=@var{yes}
|
||||||
|
These options control whether the assembler should generate
|
||||||
|
GNU_PROPERTY_X86_ISA_1_USED and GNU_PROPERTY_X86_FEATURE_2_USED
|
||||||
|
GNU property notes. The default can be controlled by the
|
||||||
|
@option{--enable-x86-used-note} configure option.
|
||||||
|
|
||||||
@cindex @samp{-mevexrcig=} option, i386
|
@cindex @samp{-mevexrcig=} option, i386
|
||||||
@cindex @samp{-mevexrcig=} option, x86-64
|
@cindex @samp{-mevexrcig=} option, x86-64
|
||||||
@item -mevexrcig=@var{rne}
|
@item -mevexrcig=@var{rne}
|
||||||
|
|
Loading…
Add table
Reference in a new issue