summaryrefslogtreecommitdiffstats
path: root/contrib/binutils
diff options
context:
space:
mode:
authorian <ian@FreeBSD.org>2014-08-01 20:30:24 +0000
committerian <ian@FreeBSD.org>2014-08-01 20:30:24 +0000
commit2c988eff340beb9a8fffd571b4e8810efbeb0e47 (patch)
treeab8809cdae481df9d858551e4d873be2e78a97af /contrib/binutils
parentc93766f95592840a6dda993c17876289e1f3e20d (diff)
downloadFreeBSD-src-2c988eff340beb9a8fffd571b4e8810efbeb0e47.zip
FreeBSD-src-2c988eff340beb9a8fffd571b4e8810efbeb0e47.tar.gz
Teach as(1) to handle the arm .arch_extension pseudo-op, which accepts
the same values as the -march= command line option. Add support for the "sec" extension (security extensions). We've been getting away without support for the sec extension because it's bogusly enabled even on arches where its presence is optional. This support for .arch_extension is being added mainly so that we can use the right directives in our source code, and that helps folks using external toolchains (and will help us when we finally update our toolchain).
Diffstat (limited to 'contrib/binutils')
-rw-r--r--contrib/binutils/gas/config/tc-arm.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/contrib/binutils/gas/config/tc-arm.c b/contrib/binutils/gas/config/tc-arm.c
index 5b970c5..08dbb6f 100644
--- a/contrib/binutils/gas/config/tc-arm.c
+++ b/contrib/binutils/gas/config/tc-arm.c
@@ -3837,6 +3837,7 @@ s_arm_eabi_attribute (int ignored ATTRIBUTE_UNUSED)
#endif /* OBJ_ELF */
static void s_arm_arch (int);
+static void s_arm_arch_extension (int);
static void s_arm_object_arch (int);
static void s_arm_cpu (int);
static void s_arm_fpu (int);
@@ -3891,6 +3892,7 @@ const pseudo_typeS md_pseudo_table[] =
{ "syntax", s_syntax, 0 },
{ "cpu", s_arm_cpu, 0 },
{ "arch", s_arm_arch, 0 },
+ { "arch_extension", s_arm_arch_extension, 0 },
{ "object_arch", s_arm_object_arch, 0 },
{ "fpu", s_arm_fpu, 0 },
#ifdef OBJ_ELF
@@ -20154,6 +20156,7 @@ static const struct arm_option_cpu_value_table arm_extensions[] =
{"xscale", ARM_FEATURE (0, ARM_CEXT_XSCALE)},
{"iwmmxt", ARM_FEATURE (0, ARM_CEXT_IWMMXT)},
{"iwmmxt2", ARM_FEATURE (0, ARM_CEXT_IWMMXT2)},
+ {"sec", ARM_FEATURE (ARM_EXT_V6Z, 0)},
{NULL, ARM_ARCH_NONE}
};
@@ -20738,6 +20741,34 @@ s_arm_arch (int ignored ATTRIBUTE_UNUSED)
ignore_rest_of_line ();
}
+/* Parse a .arch_extension directive. */
+
+static void
+s_arm_arch_extension (int ignored ATTRIBUTE_UNUSED)
+{
+ const struct arm_option_cpu_value_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;
+
+ for (opt = arm_extensions; opt->name != NULL; opt++)
+ if (streq (opt->name, name))
+ {
+ ARM_MERGE_FEATURE_SETS (cpu_variant, cpu_variant, 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 .object_arch directive. */
OpenPOWER on IntegriCloud