2006-10-31 Paul Brook <paul@codesourcery.com>
gas/ * config/tc-arm.c (object_arch): New variable. (s_arm_object_arch): New function. (md_pseudo_table): Add object_arch. (aeabi_set_public_attributes): Obey object_arch. * doc/c-arm.texi: Document .object_arch.
This commit is contained in:
parent
6e381ba0b0
commit
7a1d4c3893
|
@ -1,3 +1,12 @@
|
||||||
|
2006-10-31 Paul Brook <paul@codesourcery.com>
|
||||||
|
|
||||||
|
gas/
|
||||||
|
* config/tc-arm.c (object_arch): New variable.
|
||||||
|
(s_arm_object_arch): New function.
|
||||||
|
(md_pseudo_table): Add object_arch.
|
||||||
|
(aeabi_set_public_attributes): Obey object_arch.
|
||||||
|
* doc/c-arm.texi: Document .object_arch.
|
||||||
|
|
||||||
2006-10-31 Mei Ligang <ligang@sunnorth.com.cn>
|
2006-10-31 Mei Ligang <ligang@sunnorth.com.cn>
|
||||||
|
|
||||||
* tc-score.c (data_op2): Check invalid operands.
|
* tc-score.c (data_op2): Check invalid operands.
|
||||||
|
|
|
@ -155,6 +155,7 @@ static const arm_feature_set *mcpu_fpu_opt = NULL;
|
||||||
static const arm_feature_set *march_cpu_opt = NULL;
|
static const arm_feature_set *march_cpu_opt = NULL;
|
||||||
static const arm_feature_set *march_fpu_opt = NULL;
|
static const arm_feature_set *march_fpu_opt = NULL;
|
||||||
static const arm_feature_set *mfpu_opt = NULL;
|
static const arm_feature_set *mfpu_opt = NULL;
|
||||||
|
static const arm_feature_set *object_arch = NULL;
|
||||||
|
|
||||||
/* Constants for known architecture features. */
|
/* Constants for known architecture features. */
|
||||||
static const arm_feature_set fpu_default = FPU_DEFAULT;
|
static const arm_feature_set fpu_default = FPU_DEFAULT;
|
||||||
|
@ -3890,6 +3891,7 @@ bad:
|
||||||
#endif /* OBJ_ELF */
|
#endif /* OBJ_ELF */
|
||||||
|
|
||||||
static void s_arm_arch (int);
|
static void s_arm_arch (int);
|
||||||
|
static void s_arm_object_arch (int);
|
||||||
static void s_arm_cpu (int);
|
static void s_arm_cpu (int);
|
||||||
static void s_arm_fpu (int);
|
static void s_arm_fpu (int);
|
||||||
|
|
||||||
|
@ -3943,6 +3945,7 @@ const pseudo_typeS md_pseudo_table[] =
|
||||||
{ "syntax", s_syntax, 0 },
|
{ "syntax", s_syntax, 0 },
|
||||||
{ "cpu", s_arm_cpu, 0 },
|
{ "cpu", s_arm_cpu, 0 },
|
||||||
{ "arch", s_arm_arch, 0 },
|
{ "arch", s_arm_arch, 0 },
|
||||||
|
{ "object_arch", s_arm_object_arch, 0 },
|
||||||
{ "fpu", s_arm_fpu, 0 },
|
{ "fpu", s_arm_fpu, 0 },
|
||||||
#ifdef OBJ_ELF
|
#ifdef OBJ_ELF
|
||||||
{ "word", s_arm_elf_cons, 4 },
|
{ "word", s_arm_elf_cons, 4 },
|
||||||
|
@ -20236,7 +20239,13 @@ aeabi_set_public_attributes (void)
|
||||||
ARM_MERGE_FEATURE_SETS (flags, arm_arch_used, thumb_arch_used);
|
ARM_MERGE_FEATURE_SETS (flags, arm_arch_used, thumb_arch_used);
|
||||||
ARM_MERGE_FEATURE_SETS (flags, flags, *mfpu_opt);
|
ARM_MERGE_FEATURE_SETS (flags, flags, *mfpu_opt);
|
||||||
ARM_MERGE_FEATURE_SETS (flags, flags, selected_cpu);
|
ARM_MERGE_FEATURE_SETS (flags, flags, selected_cpu);
|
||||||
|
/*Allow the user to override the reported architecture. */
|
||||||
|
if (object_arch)
|
||||||
|
{
|
||||||
|
ARM_CLEAR_FEATURE (flags, flags, arm_arch_any);
|
||||||
|
ARM_MERGE_FEATURE_SETS (flags, flags, *object_arch);
|
||||||
|
}
|
||||||
|
|
||||||
tmp = flags;
|
tmp = flags;
|
||||||
arch = 0;
|
arch = 0;
|
||||||
for (p = cpu_arch_ver; p->val; p++)
|
for (p = cpu_arch_ver; p->val; p++)
|
||||||
|
@ -20400,6 +20409,37 @@ s_arm_arch (int ignored ATTRIBUTE_UNUSED)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Parse a .object_arch directive. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
s_arm_object_arch (int ignored ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
const struct arm_arch_option_table *opt;
|
||||||
|
char saved_char;
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
name = input_line_pointer;
|
||||||
|
while (*input_line_pointer && !ISSPACE(*input_line_pointer))
|
||||||
|
input_line_pointer++;
|
||||||
|
saved_char = *input_line_pointer;
|
||||||
|
*input_line_pointer = 0;
|
||||||
|
|
||||||
|
/* Skip the first "all" entry. */
|
||||||
|
for (opt = arm_archs + 1; opt->name != NULL; opt++)
|
||||||
|
if (streq (opt->name, name))
|
||||||
|
{
|
||||||
|
object_arch = &opt->value;
|
||||||
|
*input_line_pointer = saved_char;
|
||||||
|
demand_empty_rest_of_line ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
as_bad (_("unknown architecture `%s'\n"), name);
|
||||||
|
*input_line_pointer = saved_char;
|
||||||
|
ignore_rest_of_line ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Parse a .fpu directive. */
|
/* Parse a .fpu directive. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -585,6 +585,12 @@ for the @option{-mcpu} commandline option.
|
||||||
Select the target architecture. Valid values for @var{name} are the same as
|
Select the target architecture. Valid values for @var{name} are the same as
|
||||||
for the @option{-march} commandline option.
|
for the @option{-march} commandline option.
|
||||||
|
|
||||||
|
@cindex @code{.object_arch} directive, ARM
|
||||||
|
@item .object_arch @var{name}
|
||||||
|
Override the architecture recorded in the EABI object attribute section.
|
||||||
|
Valid values for @var{name} are the same as for the @code{.arch} directive.
|
||||||
|
Typically this is useful when code uses runtime detection of CPU features.
|
||||||
|
|
||||||
@cindex @code{.fpu} directive, ARM
|
@cindex @code{.fpu} directive, ARM
|
||||||
@item .fpu @var{name}
|
@item .fpu @var{name}
|
||||||
Select the floating point unit to assemble for. Valid values for @var{name}
|
Select the floating point unit to assemble for. Valid values for @var{name}
|
||||||
|
|
Loading…
Reference in New Issue