* config/tc-i386.h (md_end): Define.

(i386_elf_emit_arch_note): Declare.
	(CpuUnknown): Delete.
	* config/tc-i386.c (default_arch): Constify.
	(smallest_imm_type): Remove CpuUnknown test.
	(md_assemble): Don't bother checking cpu_arch_flags non-zero.
	(i386_elf_emit_arch_note): New function.
This commit is contained in:
Alan Modra
2001-11-15 13:19:46 +00:00
parent 0d3afcfcaa
commit a847613f74
3 changed files with 65 additions and 15 deletions

View File

@ -1,5 +1,13 @@
2001-11-15 Alan Modra <amodra@bigpond.net.au> 2001-11-15 Alan Modra <amodra@bigpond.net.au>
* config/tc-i386.h (md_end): Define.
(i386_elf_emit_arch_note): Declare.
(CpuUnknown): Delete.
* config/tc-i386.c (default_arch): Constify.
(smallest_imm_type): Remove CpuUnknown test.
(md_assemble): Don't bother checking cpu_arch_flags non-zero.
(i386_elf_emit_arch_note): New function.
* po/POTFILES.in: Regenerate. * po/POTFILES.in: Regenerate.
2001-11-15 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de> 2001-11-15 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>

View File

@ -77,7 +77,7 @@ static bfd_reloc_code_real_type reloc
#ifndef DEFAULT_ARCH #ifndef DEFAULT_ARCH
#define DEFAULT_ARCH "i386" #define DEFAULT_ARCH "i386"
#endif #endif
static char *default_arch = DEFAULT_ARCH; static const char *default_arch = DEFAULT_ARCH;
/* 'md_assemble ()' gathers together information and puts it into a /* 'md_assemble ()' gathers together information and puts it into a
i386_insn. */ i386_insn. */
@ -539,8 +539,7 @@ static int
smallest_imm_type (num) smallest_imm_type (num)
offsetT num; offsetT num;
{ {
if (cpu_arch_flags != (Cpu086 | Cpu186 | Cpu286 | Cpu386 | Cpu486 | CpuNo64) if (cpu_arch_flags != (Cpu086 | Cpu186 | Cpu286 | Cpu386 | Cpu486 | CpuNo64))
&& !(cpu_arch_flags & (CpuUnknown)))
{ {
/* This code is disabled on the 486 because all the Imm1 forms /* This code is disabled on the 486 because all the Imm1 forms
in the opcode table are slower on the i486. They're the in the opcode table are slower on the i486. They're the
@ -1393,18 +1392,15 @@ md_assemble (line)
} }
/* Check if instruction is supported on specified architecture. */ /* Check if instruction is supported on specified architecture. */
if (cpu_arch_flags != 0) if ((current_templates->start->cpu_flags & ~(Cpu64 | CpuNo64))
& ~(cpu_arch_flags & ~(Cpu64 | CpuNo64)))
{ {
if ((current_templates->start->cpu_flags & ~(Cpu64 | CpuNo64)) as_warn (_("`%s' is not supported on `%s'"),
& ~(cpu_arch_flags & ~(Cpu64 | CpuNo64))) current_templates->start->name, cpu_arch_name);
{ }
as_warn (_("`%s' is not supported on `%s'"), else if ((Cpu386 & ~cpu_arch_flags) && (flag_code != CODE_16BIT))
current_templates->start->name, cpu_arch_name); {
} as_warn (_("use .code16 to ensure correct addressing mode"));
else if ((Cpu386 & ~cpu_arch_flags) && (flag_code != CODE_16BIT))
{
as_warn (_("use .code16 to ensure correct addressing mode"));
}
} }
/* Check for rep/repne without a string instruction. */ /* Check for rep/repne without a string instruction. */
@ -4661,6 +4657,48 @@ i386_target_format ()
} }
#endif /* OBJ_MAYBE_ more than one */ #endif /* OBJ_MAYBE_ more than one */
#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF))
void i386_elf_emit_arch_note ()
{
if (OUTPUT_FLAVOR == bfd_target_elf_flavour
&& cpu_arch_name != NULL)
{
char *p;
asection *seg = now_seg;
subsegT subseg = now_subseg;
Elf_Internal_Note i_note;
Elf_External_Note e_note;
asection *note_secp;
int len;
/* Create the .note section. */
note_secp = subseg_new (".note", 0);
bfd_set_section_flags (stdoutput,
note_secp,
SEC_HAS_CONTENTS | SEC_READONLY);
/* Process the arch string. */
len = strlen (cpu_arch_name);
i_note.namesz = len + 1;
i_note.descsz = 0;
i_note.type = NT_ARCH;
p = frag_more (sizeof (e_note.namesz));
md_number_to_chars (p, (valueT) i_note.namesz, sizeof (e_note.namesz));
p = frag_more (sizeof (e_note.descsz));
md_number_to_chars (p, (valueT) i_note.descsz, sizeof (e_note.descsz));
p = frag_more (sizeof (e_note.type));
md_number_to_chars (p, (valueT) i_note.type, sizeof (e_note.type));
p = frag_more (len + 1);
strcpy (p, cpu_arch_name);
frag_align (2, 0, 0);
subseg_set (seg, subseg);
}
}
#endif
#endif /* BFD_ASSEMBLER */ #endif /* BFD_ASSEMBLER */
symbolS * symbolS *

View File

@ -111,6 +111,11 @@ extern const char *i386_target_format PARAMS ((void));
#endif #endif
#endif #endif
#if (defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF))
#define md_end i386_elf_emit_arch_note
extern void i386_elf_emit_arch_note PARAMS ((void));
#endif
#else /* ! BFD_ASSEMBLER */ #else /* ! BFD_ASSEMBLER */
/* COFF STUFF */ /* COFF STUFF */
@ -293,7 +298,6 @@ typedef struct
#define CpuSSE 0x1000 /* Streaming SIMD extensions required */ #define CpuSSE 0x1000 /* Streaming SIMD extensions required */
#define CpuSSE2 0x2000 /* Streaming SIMD extensions 2 required */ #define CpuSSE2 0x2000 /* Streaming SIMD extensions 2 required */
#define Cpu3dnow 0x4000 /* 3dnow! support required */ #define Cpu3dnow 0x4000 /* 3dnow! support required */
#define CpuUnknown 0x8000 /* The CPU is unknown, be on the safe side. */
/* These flags are set by gas depending on the flag_code. */ /* These flags are set by gas depending on the flag_code. */
#define Cpu64 0x4000000 /* 64bit support required */ #define Cpu64 0x4000000 /* 64bit support required */