Blame backends/arm_attrs.c

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