187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===- ARMELFAttributeData.h ----------------------------------------------===//
287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//
387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//                     The MCLinker Project
487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//
587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// This file is distributed under the University of Illinois Open Source
687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// License. See LICENSE.TXT for details.
787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//
887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef TARGET_ARM_ARMELFATTRIBUTEDATA_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define TARGET_ARM_ARMELFATTRIBUTEDATA_H_
1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/ELFAttributeData.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/ELFAttributeValue.h"
1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <map>
1687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <string>
1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesnamespace mcld {
1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class ARMELFAttributeData
2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines *  \brief ARMELFAttributeData handles public ("aeabi") attributes subsection in
2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines *  ARM ELF.
2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines *
2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */
2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass ARMELFAttributeData : public ELFAttributeData {
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
2787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  enum Tag {
2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    // 0-3 are generic and are defined in ELFAttributeData.
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_CPU_raw_name = 4,
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_CPU_name = 5,
3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_CPU_arch = 6,
3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_CPU_arch_profile = 7,
3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ARM_ISA_use = 8,
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_THUMB_ISA_use = 9,
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_FP_arch = 10,
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_WMMX_arch = 11,
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_Advanced_SIMD_arch = 12,
3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_PCS_config = 13,
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_PCS_R9_use = 14,
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_PCS_RW_data = 15,
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_PCS_RO_data = 16,
4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_PCS_GOT_use = 17,
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_PCS_wchar_t = 18,
4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_FP_rounding = 19,
4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_FP_denormal = 20,
4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_FP_exceptions = 21,
4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_FP_user_exceptions = 22,
4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_FP_number_model = 23,
4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_align_needed = 24,
5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_align_preserved = 25,
5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_enum_size = 26,
5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_HardFP_use = 27,
5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_VFP_args = 28,
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_WMMX_args = 29,
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_optimization_goals = 30,
5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_FP_optimization_goals = 31,
5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_compatibility = 32,
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines
5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_CPU_unaligned_access = 34,
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_FP_HP_extension = 36,
6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines
6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_FP_16bit_format = 38,
6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines
6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_MPextension_use = 42,
6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines
6737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_DIV_use = 44,
6837b74a387bb3993387029859c2d9d051c41c724eStephen Hines
6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_nodefaults = 64,
7037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_also_compatible_with = 65,
7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_T2EE_use = 66,
7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_conformance = 67,
7337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_Virtualization_use = 68,
7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines
7537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_MPextension_use_legacy = 70,
7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    Tag_Max = Tag_MPextension_use_legacy,
7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    // Alias
8037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_VFP_arch = Tag_FP_arch,
8137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_align8_needed = Tag_ABI_align_needed,
8237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_ABI_align8_preserved = Tag_ABI_align_preserved,
8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Tag_VFP_HP_extension = Tag_FP_HP_extension
8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // For Tag_CPU_arch
8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  enum {
8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    CPU_Arch_ARM_Pre_V4,
8937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    CPU_Arch_ARM_V4,     // e.g., SA110
9037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    CPU_Arch_ARM_V4T,    // e.g., ARM7TDMI
9137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    CPU_Arch_ARM_V5T,    // e.g., ARM9TDMI
9237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    CPU_Arch_ARM_V5TE,   // e.g., ARM946E-S
9337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    CPU_Arch_ARM_V5TEJ,  // e.g., ARM926EJ-S
9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    CPU_Arch_ARM_V6,     // e.g., ARM1136J-S
9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    CPU_Arch_ARM_V6KZ,   // e.g., ARM1176JZ-S
9637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    CPU_Arch_ARM_V6T2,   // e.g., ARM1156T2F-S
9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    CPU_Arch_ARM_V6K,    // e.g., ARM1136J-S
9837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    CPU_Arch_ARM_V7,     // e.g., Cortex A8, Cortex M3
9937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    CPU_Arch_ARM_V6_M,   // e.g., Cortex M1
10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    CPU_Arch_ARM_V6S_M,  // e.g., v6-M with the value of System extensions
10137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    CPU_Arch_ARM_V7E_M,  // e.g., v7-M with DSP extensions
10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    CPU_Arch_ARM_V8,
10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    CPU_Arch_Max = CPU_Arch_ARM_V8,
10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    // This is a pseudo-architecture to describe an architecture mixed with
10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    // the subset of armv4t and armv6-m. This never appears in the value of
10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    // Tag_CPU_arch.
10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    CPU_Arch_ARM_V4T_Plus_V6_M = (CPU_Arch_Max + 1),
11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    CPU_Arch_Plus_Pseudo_Max = CPU_Arch_ARM_V4T_Plus_V6_M,
11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // For Tag_CPU_arch_profile
11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  enum {
11637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Arch_Profile_None = 0,
11737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Arch_Profile_Application = 'A',
11837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Arch_Profile_Realtime = 'R',
11937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Arch_Profile_Microcontroller = 'M',
12037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Arch_Profile_RealOrApp = 'S'
12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
12387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // For Tag_ABI_enum_size
12487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  enum {
12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    Enum_Unused,
12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    Enum_Smallest_Container,
12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    Enum_32bit_Container,
12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    Enum_Containerized_As_Possible
12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
13187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // For Tag_ABI_PCS_R9_use
13237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  enum { R9_V6, R9_SB, R9_TLS, R9_Unused };
13387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
13487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // For Tag_ABI_PCS_RW_data
13587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  enum {
13687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    RW_data_Absolute,
13787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    RW_data_PC_Relative,
13887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    RW_data_SB_Relative,
13987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    RW_data_unused
14087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
14187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
14237b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
14387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // ARM [ABI-addenda], 2.2.2: A public attributes subsection is named aeabi.
14487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  ARMELFAttributeData()
14537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      : ELFAttributeData("aeabi"),
14637b74a387bb3993387029859c2d9d051c41c724eStephen Hines        m_CurrentCPUArch(-1),
14737b74a387bb3993387029859c2d9d051c41c724eStephen Hines        m_DIVUseInitialized(false),
14837b74a387bb3993387029859c2d9d051c41c724eStephen Hines        m_HardFPUseInitialized(false) {}
14987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
15037b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
15137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual const ELFAttributeValue* getAttributeValue(TagType pTag) const;
15287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
15337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual std::pair<ELFAttributeValue*, bool> getOrCreateAttributeValue(
15437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      TagType pTag);
15587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
15637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual bool preMerge(const Input& pInput) {
15787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    // Reset states.
15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    m_CPUArch = -1;
15987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    m_CPUName.clear();
16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    m_CPURawName.clear();
16187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    m_SecondaryCPUArch = -1;
16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    m_VFPArgs = -1;
16387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    m_FPArch = -1;
16487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    m_HardFPUse = -1;
16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    m_MPextensionUse = -1;
16687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    m_DIVUse = -1;
16787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    return true;
16887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  }
16987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
17037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual bool merge(const LinkerConfig& pConfig,
17137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                     const Input& pInput,
17237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                     TagType pTag,
17337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                     const ELFAttributeValue& pInAttr);
17487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
17537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual bool postMerge(const LinkerConfig& pConfig, const Input& pInput);
17687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
17787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  virtual size_t sizeOutput() const;
17887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
17937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  virtual size_t emit(char* pBuf) const;
18087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1810dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  virtual bool usingThumb() const;
1820dea6bc96bb52346737966839ac68644f7939f58Stephen Hines
1830dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  virtual bool usingThumb2() const;
1840dea6bc96bb52346737966839ac68644f7939f58Stephen Hines
18537b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
18687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// GetAttributeValueType - obtain the value type of the indicated tag.
18787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  static unsigned int GetAttributeValueType(TagType pTag);
18887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
18937b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
19087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // The storage for known tags which is indexed by the tag
19187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  ELFAttributeValue m_Attrs[Tag_Max + 1];
19287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
19387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // The storage for unknown tags
19487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef std::map<TagType, ELFAttributeValue> UnknownAttrsMap;
19587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  UnknownAttrsMap m_UnknownAttrs;
19687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
19787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // This is a cache for the current output architecture calculate from of
19887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // Tag_CPU_arch and Tag_also_compatible_with.
19987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  int m_CurrentCPUArch;
20087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
20187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // Value of Tag_DIV_use and Tag_ABI_HardFP_use requires further examination
20287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // for the every time adding to the output. These booleans are initialized to
20387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // false and set to true until the corresponding attribute is initialized.
20487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool m_DIVUseInitialized;
20587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool m_HardFPUseInitialized;
20687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
20787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // These attributes have dependency with each other. During the merge, we
20887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // record their attribute values in the associated variables as follows and
20987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // process them in postmerge() (when all other attributes are settled down.)
21087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
21187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // Record the value of input Tag_CPU_arch.
21287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  int m_CPUArch;
21387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
21487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // Record the value of input Tag_CPU_name.
21587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  std::string m_CPUName;
21687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
21787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // Record the value of input Tag_CPU_raw_name.
21887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  std::string m_CPURawName;
21987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
22087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // Record the value of input Tag_FP_arch.
22187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  int m_FPArch;
22287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
22387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // Record the value of input Tag_ABI_HardFP_use.
22487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  int m_HardFPUse;
22587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
22687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // Record the value of input Tag_also_compatible_with.
22787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  int m_SecondaryCPUArch;
22887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
22987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // Record the value of input Tag_ABI_VFP_args.
23087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  int m_VFPArgs;
23187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
23237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  // Record the value of input Tag_MPextension_use and
23337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  // Tag_MPextension_use_legacy.
23487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  int m_MPextensionUse;
23587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
23687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // Record the value of input Tag_DIV_use.
23787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  int m_DIVUse;
23887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines};
23987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
24037b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
24187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
24237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // TARGET_ARM_ARMELFATTRIBUTEDATA_H_
243