From e0974cb6f48fa7b0e74a55077aaeedd98430a191 Mon Sep 17 00:00:00 2001 From: Paul Brook Date: Fri, 8 Sep 2006 22:36:13 +0000 Subject: [PATCH] 2006-09-08 Paul Brook 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. --- ChangeLog.csl | 9 +++++++++ gas/config/tc-arm.c | 42 +++++++++++++++++++++++++++++++++++++++++- gas/doc/c-arm.texi | 6 ++++++ 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/ChangeLog.csl b/ChangeLog.csl index 134cd9843..c3c13d905 100644 --- a/ChangeLog.csl +++ b/ChangeLog.csl @@ -1,3 +1,12 @@ +2006-09-08 Paul Brook + + 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-09-08 Kazu Hirata gas/testsuite/ diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 842e72c48..82492f9d3 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -161,6 +161,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_fpu_opt = NULL; static const arm_feature_set *mfpu_opt = NULL; +static const arm_feature_set *object_arch = NULL; /* Constants for known architecture features. */ static const arm_feature_set fpu_default = FPU_DEFAULT; @@ -3880,6 +3881,7 @@ bad: } static void s_arm_arch (int); +static void s_arm_object_arch (int); static void s_arm_cpu (int); static void s_arm_fpu (int); #endif /* OBJ_ELF */ @@ -3928,6 +3930,7 @@ const pseudo_typeS md_pseudo_table[] = { "unwind_raw", s_arm_unwind_raw, 0 }, { "cpu", s_arm_cpu, 0 }, { "arch", s_arm_arch, 0 }, + { "object_arch", s_arm_object_arch, 0 }, { "fpu", s_arm_fpu, 0 }, { "eabi_attribute", s_arm_eabi_attribute, 0 }, #else @@ -19938,7 +19941,13 @@ aeabi_set_public_attributes (void) 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, 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; arch = 0; for (p = cpu_arch_ver; p->val; p++) @@ -20101,6 +20110,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. */ static void diff --git a/gas/doc/c-arm.texi b/gas/doc/c-arm.texi index e2f1ce4b2..bb0103ad1 100644 --- a/gas/doc/c-arm.texi +++ b/gas/doc/c-arm.texi @@ -612,6 +612,12 @@ for the @option{-mcpu} commandline option. Select the target architecture. Valid values for @var{name} are the same as 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 @item .fpu @var{name} Select the floating point unit to assemble for. Valid values for @var{name} -- 2.11.4.GIT