131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- ARMBuildAttrs.h - ARM Build Attributes ------------------*- C++ -*-===//
288ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov//
388ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov//                     The LLVM Compiler Infrastructure
488ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov//
588ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov// This file is distributed under the University of Illinois Open Source
688ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov// License. See LICENSE.TXT for details.
788ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov//
888ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov//===----------------------------------------------------------------------===//
988ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov//
100c85aabfdcfa966c0c348242bad9a7c5fa2f8a14Chris Lattner// This file contains enumerations and support routines for ARM build attributes
11cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola// as defined in ARM ABI addenda document (ABI release 2.08).
1288ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov//
1388ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov//===----------------------------------------------------------------------===//
1488ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov
1588ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov#ifndef __TARGET_ARMBUILDATTRS_H__
1688ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov#define __TARGET_ARMBUILDATTRS_H__
1788ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov
1888ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikovnamespace ARMBuildAttrs {
1917b443df4368acfad853d09858c033c45c468d5cJason W Kim  enum SpecialAttr {
2017b443df4368acfad853d09858c033c45c468d5cJason W Kim    // This is for the .cpu asm attr. It translates into one or more
2117b443df4368acfad853d09858c033c45c468d5cJason W Kim    // AttrType (below) entries in the .ARM.attributes section in the ELF.
2217b443df4368acfad853d09858c033c45c468d5cJason W Kim    SEL_CPU
2317b443df4368acfad853d09858c033c45c468d5cJason W Kim  };
2417b443df4368acfad853d09858c033c45c468d5cJason W Kim
25def9ac48b779a4cb0b1d1486286cda157a2fe86eJason W Kim  enum AttrType {
2617b443df4368acfad853d09858c033c45c468d5cJason W Kim    // Rest correspond to ELF/.ARM.attributes
2788ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    File                      = 1,
2888ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    Section                   = 2,
2988ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    Symbol                    = 3,
3088ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    CPU_raw_name              = 4,
3188ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    CPU_name                  = 5,
3288ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    CPU_arch                  = 6,
3388ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    CPU_arch_profile          = 7,
3488ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ARM_ISA_use               = 8,
3588ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    THUMB_ISA_use             = 9,
3688ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    VFP_arch                  = 10,
3788ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    WMMX_arch                 = 11,
3888ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    Advanced_SIMD_arch        = 12,
3988ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    PCS_config                = 13,
4088ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ABI_PCS_R9_use            = 14,
4188ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ABI_PCS_RW_data           = 15,
4288ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ABI_PCS_RO_data           = 16,
4388ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ABI_PCS_GOT_use           = 17,
4488ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ABI_PCS_wchar_t           = 18,
4588ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ABI_FP_rounding           = 19,
4688ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ABI_FP_denormal           = 20,
4788ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ABI_FP_exceptions         = 21,
4888ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ABI_FP_user_exceptions    = 22,
4988ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ABI_FP_number_model       = 23,
5088ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ABI_align8_needed         = 24,
5188ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ABI_align8_preserved      = 25,
5288ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ABI_enum_size             = 26,
5388ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ABI_HardFP_use            = 27,
5488ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ABI_VFP_args              = 28,
5588ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ABI_WMMX_args             = 29,
5688ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ABI_optimization_goals    = 30,
5788ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ABI_FP_optimization_goals = 31,
5888ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    compatibility             = 32,
5988ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    CPU_unaligned_access      = 34,
6088ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    VFP_HP_extension          = 36,
6188ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    ABI_FP_16bit_format       = 38,
62cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola    MPextension_use           = 42, // was 70, 2.08 ABI
63cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola    DIV_use                   = 44,
6488ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    nodefaults                = 64,
6588ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    also_compatible_with      = 65,
6688ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    T2EE_use                  = 66,
6788ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    conformance               = 67,
6888ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov    Virtualization_use        = 68,
69cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola    MPextension_use_old       = 70
7088ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov  };
7117b443df4368acfad853d09858c033c45c468d5cJason W Kim
7217b443df4368acfad853d09858c033c45c468d5cJason W Kim  // Magic numbers for .ARM.attributes
7317b443df4368acfad853d09858c033c45c468d5cJason W Kim  enum AttrMagic {
7417b443df4368acfad853d09858c033c45c468d5cJason W Kim    Format_Version  = 0x41
7517b443df4368acfad853d09858c033c45c468d5cJason W Kim  };
76cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola
77cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola  // Legal Values for CPU_arch, (=6), uleb128
78cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola  enum CPUArch {
79cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola    Pre_v4       = 0,
80cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola    v4       = 1,   // e.g. SA110
81cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola    v4T      = 2,   // e.g. ARM7TDMI
82cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola    v5T      = 3,   // e.g. ARM9TDMI
83cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola    v5TE     = 4,   // e.g. ARM946E_S
84cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola    v5TEJ    = 5,   // e.g. ARM926EJ_S
85cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola    v6       = 6,   // e.g. ARM1136J_S
86cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola    v6KZ     = 7,   // e.g. ARM1176JZ_S
87cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola    v6T2     = 8,   // e.g. ARM1156T2F_S
88cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola    v6K      = 9,   // e.g. ARM1136J_S
89cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola    v7       = 10,  // e.g. Cortex A8, Cortex M3
90cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola    v6_M     = 11,  // e.g. Cortex M1
91cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola    v6S_M    = 12,  // v6_M with the System extensions
92cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola    v7E_M    = 13   // v7_M with DSP extensions
93cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola  };
94cecbc3d28277ff4916326311cbf87335ed05d106Rafael Espindola
95f009a961caa75465999ef3bc764984d97a7da331Jason W Kim  enum CPUArchProfile { // (=7), uleb128
96f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    Not_Applicable = 0, // pre v7, or cross-profile code
97f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    ApplicationProfile = (0x41), // 'A' (e.g. for Cortex A8)
98f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    RealTimeProfile = (0x52), // 'R' (e.g. for Cortex R4)
99f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    MicroControllerProfile = (0x4D), // 'M' (e.g. for Cortex M3)
100f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    SystemProfile = (0x53) // 'S' Application or real-time profile
101f009a961caa75465999ef3bc764984d97a7da331Jason W Kim  };
102f009a961caa75465999ef3bc764984d97a7da331Jason W Kim
103f009a961caa75465999ef3bc764984d97a7da331Jason W Kim  // The following have a lot of common use cases
104f009a961caa75465999ef3bc764984d97a7da331Jason W Kim  enum {
105f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    //ARMISAUse (=8), uleb128  and THUMBISAUse (=9), uleb128
106f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    Not_Allowed = 0,
107f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    Allowed = 1,
108f009a961caa75465999ef3bc764984d97a7da331Jason W Kim
109f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    // FP_arch (=10), uleb128 (formerly Tag_VFP_arch = 10)
110f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    AllowFPv2  = 2, // v2 FP ISA permitted (implies use of the v1 FP ISA)
111f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    AllowFPv3A = 3, // v3 FP ISA permitted (implies use of the v2 FP ISA)
112f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    AllowFPv3B = 4, // v3 FP ISA permitted, but only D0-D15, S0-S31
113f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    AllowFPv4A = 5, // v4 FP ISA permitted (implies use of v3 FP ISA)
114f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    AllowFPv4B = 6, // v4 FP ISA was permitted, but only D0-D15, S0-S31
115f009a961caa75465999ef3bc764984d97a7da331Jason W Kim
116f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    // Tag_WMMX_arch, (=11), uleb128
117f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    AllowThumb32 = 2, // 32-bit Thumb (implies 16-bit instructions)
118f009a961caa75465999ef3bc764984d97a7da331Jason W Kim
119f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    // Tag_WMMX_arch, (=11), uleb128
120f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    AllowWMMXv1 = 2,  // The user permitted this entity to use WMMX v2
121f009a961caa75465999ef3bc764984d97a7da331Jason W Kim
122f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    // Tag_ABI_FP_denormal, (=20), uleb128
123f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    PreserveFPSign = 2, // sign when flushed-to-zero is preserved
124f009a961caa75465999ef3bc764984d97a7da331Jason W Kim
125f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    // Tag_ABI_FP_number_model, (=23), uleb128
126f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    AllowRTABI = 2,  // numbers, infinities, and one quiet NaN (see [RTABI])
127f009a961caa75465999ef3bc764984d97a7da331Jason W Kim    AllowIEE754 = 3 // this code to use all the IEEE 754-defined FP encodings
128f009a961caa75465999ef3bc764984d97a7da331Jason W Kim  };
12988ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov}
13088ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov
13188ce667003a33e008d9ecc6811584681787e8150Anton Korobeynikov#endif // __TARGET_ARMBUILDATTRS_H__
132