Squashed 'third_party/elfutils/' content from commit 555e15e

Change-Id: I61cde98949e47e5c8c09c33260de17f30921be79
git-subtree-dir: third_party/elfutils
git-subtree-split: 555e15ebe8bf1eb33d00747173cfc80cc65648a4
diff --git a/backends/arm_attrs.c b/backends/arm_attrs.c
new file mode 100644
index 0000000..6842b77
--- /dev/null
+++ b/backends/arm_attrs.c
@@ -0,0 +1,241 @@
+/* Object attribute tags for ARM.
+   Copyright (C) 2009 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+#include <dwarf.h>
+
+#define BACKEND arm_
+#include "libebl_CPU.h"
+
+#define KNOWN_VALUES(...) do				\
+  {							\
+    static const char *table[] = { __VA_ARGS__ };	\
+    if (value < sizeof table / sizeof table[0])		\
+      *value_name = table[value];			\
+  } while (0)
+
+bool
+arm_check_object_attribute (Ebl *ebl __attribute__ ((unused)),
+			    const char *vendor, int tag, uint64_t value,
+			    const char **tag_name, const char **value_name)
+{
+  if (!strcmp (vendor, "aeabi"))
+    switch (tag)
+      {
+      case 4:
+	*tag_name = "CPU_raw_name";
+	return true;
+      case 5:
+	*tag_name = "CPU_name";
+	return true;
+      case 6:
+	*tag_name = "CPU_arch";
+	KNOWN_VALUES ("Pre-v4",
+		      "v4",
+		      "v4T",
+		      "v5T",
+		      "v5TE",
+		      "v5TEJ",
+		      "v6",
+		      "v6KZ",
+		      "v6T2",
+		      "v6K",
+		      "v7",
+		      "v6-M",
+		      "v6S-M");
+	return true;
+      case 7:
+	*tag_name = "CPU_arch_profile";
+	switch (value)
+	  {
+	  case 'A':
+	    *value_name = "Application";
+	    break;
+	  case 'R':
+	    *value_name = "Realtime";
+	    break;
+	  case 'M':
+	    *value_name = "Microcontroller";
+	    break;
+	  }
+	return true;
+      case 8:
+	*tag_name = "ARM_ISA_use";
+	KNOWN_VALUES ("No", "Yes");
+	return true;
+      case 9:
+	*tag_name = "THUMB_ISA_use";
+	KNOWN_VALUES ("No", "Thumb-1", "Thumb-2");
+	return true;
+      case 10:
+	*tag_name = "VFP_arch";
+	KNOWN_VALUES ("No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16");
+	return true;
+      case 11:
+	*tag_name = "WMMX_arch";
+	KNOWN_VALUES ("No", "WMMXv1", "WMMXv2");
+	return true;
+      case 12:
+	*tag_name = "Advanced_SIMD_arch";
+	KNOWN_VALUES ("No", "NEONv1");
+	return true;
+      case 13:
+	*tag_name = "PCS_config";
+	KNOWN_VALUES ("None",
+		      "Bare platform",
+		      "Linux application",
+		      "Linux DSO",
+		      "PalmOS 2004",
+		      "PalmOS (reserved)",
+		      "SymbianOS 2004",
+		      "SymbianOS (reserved)");
+	return true;
+      case 14:
+	*tag_name = "ABI_PCS_R9_use";
+	KNOWN_VALUES ("V6", "SB", "TLS", "Unused");
+	return true;
+      case 15:
+	*tag_name = "ABI_PCS_RW_data";
+	KNOWN_VALUES ("Absolute", "PC-relative", "SB-relative", "None");
+	return true;
+      case 16:
+	*tag_name = "ABI_PCS_RO_data";
+	KNOWN_VALUES ("Absolute", "PC-relative", "None");
+	return true;
+      case 17:
+	*tag_name = "ABI_PCS_GOT_use";
+	KNOWN_VALUES ("None", "direct", "GOT-indirect");
+	return true;
+      case 18:
+	*tag_name = "ABI_PCS_wchar_t";
+	return true;
+      case 19:
+	*tag_name = "ABI_FP_rounding";
+	KNOWN_VALUES ("Unused", "Needed");
+	return true;
+      case 20:
+	*tag_name = "ABI_FP_denormal";
+	KNOWN_VALUES ("Unused", "Needed", "Sign only");
+	return true;
+      case 21:
+	*tag_name = "ABI_FP_exceptions";
+	KNOWN_VALUES ("Unused", "Needed");
+	return true;
+      case 22:
+	*tag_name = "ABI_FP_user_exceptions";
+	KNOWN_VALUES ("Unused", "Needed");
+	return true;
+      case 23:
+	*tag_name = "ABI_FP_number_model";
+	KNOWN_VALUES ("Unused", "Finite", "RTABI", "IEEE 754");
+	return true;
+      case 24:
+	*tag_name = "ABI_align8_needed";
+	KNOWN_VALUES ("No", "Yes", "4-byte");
+	return true;
+      case 25:
+	*tag_name = "ABI_align8_preserved";
+	KNOWN_VALUES ("No", "Yes, except leaf SP", "Yes");
+	return true;
+      case 26:
+	*tag_name = "ABI_enum_size";
+	KNOWN_VALUES ("Unused", "small", "int", "forced to int");
+	return true;
+      case 27:
+	*tag_name = "ABI_HardFP_use";
+	KNOWN_VALUES ("as VFP_arch", "SP only", "DP only", "SP and DP");
+	return true;
+      case 28:
+	*tag_name = "ABI_VFP_args";
+	KNOWN_VALUES ("AAPCS", "VFP registers", "custom");
+	return true;
+      case 29:
+	*tag_name = "ABI_WMMX_args";
+	KNOWN_VALUES ("AAPCS", "WMMX registers", "custom");
+	return true;
+      case 30:
+	*tag_name = "ABI_optimization_goals";
+	KNOWN_VALUES ("None",
+		      "Prefer Speed",
+		      "Aggressive Speed",
+		      "Prefer Size",
+		      "Aggressive Size",
+		      "Prefer Debug",
+		      "Aggressive Debug");
+	return true;
+      case 31:
+	*tag_name = "ABI_FP_optimization_goals";
+	KNOWN_VALUES ("None",
+		      "Prefer Speed",
+		      "Aggressive Speed",
+		      "Prefer Size",
+		      "Aggressive Size",
+		      "Prefer Accuracy",
+		      "Aggressive Accuracy");
+	return true;
+      case 34:
+	*tag_name = "CPU_unaligned_access";
+	KNOWN_VALUES ("None", "v6");
+	return true;
+      case 36:
+	*tag_name = "VFP_HP_extension";
+	KNOWN_VALUES ("Not Allowed", "Allowed");
+	return true;
+      case 38:
+	*tag_name = "ABI_FP_16bit_format";
+	KNOWN_VALUES ("None", "IEEE 754", "Alternative Format");
+	return true;
+      case 64:
+	*tag_name = "nodefaults";
+	return true;
+      case 65:
+	*tag_name = "also_compatible_with";
+	return true;
+      case 66:
+	*tag_name = "T2EE_use";
+	KNOWN_VALUES ("Not Allowed", "Allowed");
+	return true;
+      case 67:
+	*tag_name = "conformance";
+	return true;
+      case 68:
+	*tag_name = "Virtualization_use";
+	KNOWN_VALUES ("Not Allowed", "Allowed");
+	return true;
+      case 70:
+	*tag_name = "MPextension_use";
+	KNOWN_VALUES ("Not Allowed", "Allowed");
+	return true;
+      }
+
+  return false;
+}