diff options
-rw-r--r-- | docs/CompilerWriterInfo.rst | 4 | ||||
-rw-r--r-- | include/llvm/Object/ELF.h | 186 | ||||
-rw-r--r-- | include/llvm/Object/ELF_ARM.h | 339 | ||||
-rw-r--r-- | lib/Target/ARM/ARMAsmPrinter.cpp | 16 | ||||
-rw-r--r-- | lib/Target/ARM/ARMBuildAttrs.h | 131 | ||||
-rw-r--r-- | test/Object/Inputs/arm-attributes.elf-arm | bin | 1128 -> 0 bytes | |||
-rw-r--r-- | test/Object/Inputs/trivial-object-test.elf-arm | bin | 662 -> 0 bytes | |||
-rw-r--r-- | tools/llvm-readobj/ELFDumper.cpp | 63 | ||||
-rw-r--r-- | tools/llvm-readobj/ObjDumper.h | 1 | ||||
-rw-r--r-- | tools/llvm-readobj/llvm-readobj.cpp | 6 |
10 files changed, 140 insertions, 606 deletions
diff --git a/docs/CompilerWriterInfo.rst b/docs/CompilerWriterInfo.rst index 35a283ba86..e9a7bc876a 100644 --- a/docs/CompilerWriterInfo.rst +++ b/docs/CompilerWriterInfo.rst @@ -18,9 +18,7 @@ ARM * `ARM documentation <http://www.arm.com/documentation/>`_ (`Processor Cores <http://www.arm.com/documentation/ARMProcessor_Cores/>`_ Cores) -* `ELF ABI <http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044e/IHI0044E_aaelf.pdf>`_ - -* `Addenda to the ARM ABI <http://infocenter.arm.com/help/topic/com.arm.doc.ihi0045d/IHI0045D_ABI_addenda.pdf>`_ +* `ABI <http://www.arm.com/products/DevTools/ABI.html>`_ * `ARM C Language Extensions <http://infocenter.arm.com/help/topic/com.arm.doc.ihi0053a/IHI0053A_acle.pdf>`_ diff --git a/include/llvm/Object/ELF.h b/include/llvm/Object/ELF.h index 908d8b1db1..eb2390ab5d 100644 --- a/include/llvm/Object/ELF.h +++ b/include/llvm/Object/ELF.h @@ -19,13 +19,11 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/ADT/Triple.h" -#include "llvm/Object/ELF_ARM.h" #include "llvm/Object/ObjectFile.h" #include "llvm/Support/Casting.h" #include "llvm/Support/ELF.h" #include "llvm/Support/Endian.h" #include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/LEB128.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/raw_ostream.h" #include <algorithm> @@ -603,7 +601,6 @@ private: const Elf_Shdr *dot_gnu_version_sec; // .gnu.version const Elf_Shdr *dot_gnu_version_r_sec; // .gnu.version_r const Elf_Shdr *dot_gnu_version_d_sec; // .gnu.version_d - const Elf_Shdr *dot_arm_attributes_sec; // .ARM.attributes // Pointer to SONAME entry in dynamic string table // This is set the first time getLoadName is called. @@ -646,11 +643,6 @@ private: const Elf_Shdr *getRelSection(DataRefImpl Rel) const { return getSection(Rel.w.b); } - // Helper to read a single ARM attribute at the given pointer and return the - // read pointer moved forward to the next attribute location. - uintptr_t readARMSingleAttribute(uintptr_t ReadPtr, - ARMBuildAttrs::ARMGenericBuildAttrInfo &Attrs, - SmallVector<unsigned, 16> &TagSet) const; public: bool isRelocationHasAddend(DataRefImpl Rel) const; @@ -846,18 +838,6 @@ public: return v->getType() == getELFType(ELFT::TargetEndianness == support::little, ELFT::Is64Bits); } - - /// \brief Read the ARM build attributes of this object file. - /// \param Attrs The attributes container to put the attribute values. - /// \param TagsSet A list of attribute tags that were read. - error_code readARMBuildAttributes( - ARMBuildAttrs::ARMGenericBuildAttrInfo &Attrs, - SmallVector<unsigned, 16> &TagsSet) const; - - /// \brief Checks if an ARM build attributes section exists. - bool hasARMBuildAttributes() const { - return dot_arm_attributes_sec ? true : false; - } }; // Iterate through the version definitions, and place each Elf_Verdef @@ -2350,7 +2330,6 @@ ELFObjectFile<ELFT>::ELFObjectFile(MemoryBuffer *Object, error_code &ec) , dot_gnu_version_sec(0) , dot_gnu_version_r_sec(0) , dot_gnu_version_d_sec(0) - , dot_arm_attributes_sec(0) , dt_soname(0) { @@ -2442,13 +2421,6 @@ ELFObjectFile<ELFT>::ELFObjectFile(MemoryBuffer *Object, error_code &ec) dot_gnu_version_r_sec = sh; break; } - case ELF::SHT_ARM_ATTRIBUTES: { - if (dot_arm_attributes_sec != NULL) - // FIXME: Proper error handling. - report_fatal_error("More than one .arm.attributes section!"); - dot_arm_attributes_sec = sh; - break; - } } ++sh; } @@ -2998,164 +2970,6 @@ static inline error_code GetELFSymbolVersion(const ObjectFile *Obj, llvm_unreachable("Object passed to GetELFSymbolVersion() is not ELF"); } -template<class ELFT> -error_code ELFObjectFile<ELFT>::readARMBuildAttributes( - ARMBuildAttrs::ARMGenericBuildAttrInfo &Attrs, - SmallVector<unsigned, 16> &TagsSet) const { - if (getArch() != Triple::arm) - return object_error::invalid_file_type; - if (!dot_arm_attributes_sec) - return object_error::parse_failed; - - const char *SecStart = (const char*)base() + - dot_arm_attributes_sec->sh_offset; - const char *SecEnd = SecStart + dot_arm_attributes_sec->sh_size; - char format_version = *SecStart; - if (format_version != ARMBuildAttrs::Format_Version) - return object_error::parse_failed; - - uintptr_t SSectionPtr = (uintptr_t)SecStart + 1; - uintptr_t ReadPtr = SSectionPtr; - // Begin reading section after format-version byte - while (ReadPtr < (uintptr_t)SecEnd) { - // Read a subsection, starting with: <section-length> "vendor-name" - // For now, we only care about the "aeabi" pseudo-vendor subsection. - uint32_t SSectionLen = *(Elf_Word*)ReadPtr; - ReadPtr += sizeof(uint32_t); - StringRef Vendor((char*)(ReadPtr)); - ReadPtr += Vendor.size() + 1; // Vendor string + NUL byte - - if (Vendor != "aeabi") { - SSectionPtr += SSectionLen; - ReadPtr = SSectionPtr; - continue; //skip to the next sub-section - } - - bool FoundFileTag = false; - uintptr_t SSSectionPtr = ReadPtr; - uint32_t SSSectionLen = *(Elf_Word*)ReadPtr; - // Found aeabi subsection, now find the File scope tag. - while (ReadPtr < SSectionPtr + SSectionLen) { - unsigned n = 0; - uint64_t Tag = decodeULEB128((uint8_t*)ReadPtr, &n); - ReadPtr += n; - SSSectionLen = *(Elf_Word*)ReadPtr; - if (Tag == ARMBuildAttrs::File) { - FoundFileTag = true; - break; - } - // We only handle File scope attributes, skip ahead to the next - // sub-subsection. - SSSectionPtr += SSSectionLen; - ReadPtr = SSSectionPtr; - } - - if (!FoundFileTag) - return object_error::parse_failed; - - ReadPtr += sizeof(uint32_t); - while (ReadPtr < SSSectionPtr + SSSectionLen) { - // Read any number of attributes. - // Attributes are pairs of <uleb128, uleb128> or <uleb128, NTBS>. - ReadPtr = readARMSingleAttribute(ReadPtr, Attrs, TagsSet); - } - Attrs.setValid(true); - } - return object_error::success; -} - -#define SWITCH_ARM_ATTR_READ_ULEB(X) case ARMBuildAttrs::X: \ - UlebValue = decodeULEB128((uint8_t*)ReadPtr, &n); \ - ReadPtr += n; \ - Attrs.Tag_##X = UlebValue; \ - TagsSet.push_back(tag); \ - break; - -template<class ELFT> -uintptr_t ELFObjectFile<ELFT>::readARMSingleAttribute(uintptr_t ReadPtr, - ARMBuildAttrs::ARMGenericBuildAttrInfo &Attrs, - SmallVector<unsigned, 16> &TagsSet) const { - // The ABI says that tags in the range 0-63 must be handled by tools. - unsigned n = 0; - uint64_t tagInt = decodeULEB128((uint8_t*)ReadPtr, &n); - ARMBuildAttrs::AttrType tag = (ARMBuildAttrs::AttrType)tagInt; - ReadPtr += n; - uint64_t UlebValue = 0; - StringRef StrValue; - switch (tag) { - case ARMBuildAttrs::CPU_arch: // uleb128 - UlebValue = decodeULEB128((uint8_t*)ReadPtr, &n); - ReadPtr += n; - Attrs.Tag_CPU_arch = (ARMBuildAttrs::CPUArch)UlebValue; - TagsSet.push_back(tag); - break; - case ARMBuildAttrs::CPU_raw_name: // NTBS - StrValue = (char*)ReadPtr; - Attrs.Tag_CPU_raw_name = StrValue; - TagsSet.push_back(ARMBuildAttrs::CPU_raw_name); - ReadPtr += StrValue.size() + 1; - break; - case ARMBuildAttrs::CPU_name: //NTBS - StrValue = (char*)ReadPtr; - Attrs.Tag_CPU_name = StrValue; - TagsSet.push_back(ARMBuildAttrs::CPU_name); - ReadPtr += StrValue.size() + 1; - break; - case ARMBuildAttrs::CPU_arch_profile: // uleb128 - UlebValue = decodeULEB128((uint8_t*)ReadPtr, &n); - ReadPtr += n; - Attrs.Tag_CPU_arch_profile = - (ARMBuildAttrs::CPUArchProfile)UlebValue; - TagsSet.push_back(tag); - break; - SWITCH_ARM_ATTR_READ_ULEB(ARM_ISA_use) - SWITCH_ARM_ATTR_READ_ULEB(THUMB_ISA_use) - SWITCH_ARM_ATTR_READ_ULEB(FP_arch) - SWITCH_ARM_ATTR_READ_ULEB(WMMX_arch) - SWITCH_ARM_ATTR_READ_ULEB(Advanced_SIMD_arch) - SWITCH_ARM_ATTR_READ_ULEB(FP_HP_extension) - SWITCH_ARM_ATTR_READ_ULEB(CPU_unaligned_access) - SWITCH_ARM_ATTR_READ_ULEB(MPextension_use) - SWITCH_ARM_ATTR_READ_ULEB(DIV_use) - SWITCH_ARM_ATTR_READ_ULEB(T2EE_use) - SWITCH_ARM_ATTR_READ_ULEB(Virtualization_use) - SWITCH_ARM_ATTR_READ_ULEB(ABI_optimization_goals) - SWITCH_ARM_ATTR_READ_ULEB(ABI_FP_optimization_goals) - SWITCH_ARM_ATTR_READ_ULEB(PCS_config) - SWITCH_ARM_ATTR_READ_ULEB(ABI_PCS_R9_use) - SWITCH_ARM_ATTR_READ_ULEB(ABI_PCS_RW_data) - SWITCH_ARM_ATTR_READ_ULEB(ABI_PCS_RO_data) - SWITCH_ARM_ATTR_READ_ULEB(ABI_PCS_GOT_use) - SWITCH_ARM_ATTR_READ_ULEB(ABI_PCS_wchar_t) - SWITCH_ARM_ATTR_READ_ULEB(ABI_enum_size) - SWITCH_ARM_ATTR_READ_ULEB(ABI_align8_needed) - SWITCH_ARM_ATTR_READ_ULEB(ABI_align8_preserved) - SWITCH_ARM_ATTR_READ_ULEB(ABI_FP_rounding) - SWITCH_ARM_ATTR_READ_ULEB(ABI_FP_denormal) - SWITCH_ARM_ATTR_READ_ULEB(ABI_FP_number_model) - SWITCH_ARM_ATTR_READ_ULEB(ABI_FP_exceptions) - SWITCH_ARM_ATTR_READ_ULEB(ABI_FP_user_exceptions) - SWITCH_ARM_ATTR_READ_ULEB(ABI_HardFP_use) - SWITCH_ARM_ATTR_READ_ULEB(ABI_VFP_args) - default: - // Unhandled build attribute tag, according to the spec we should be able - // to infer the type of the value from (tag % 2) and skip over it. - if (tag & 0x1) { - // Value should be a null terminated byte string - StrValue = (char*)ReadPtr; - ReadPtr += StrValue.size() + 1; - } else { - // Value should be a uleb128 - UlebValue = decodeULEB128((uint8_t*)ReadPtr, &n); - ReadPtr += n; - } - break; - } - return ReadPtr; -} -#undef SWITCH_ARM_ATTR_READ_ULEB - - /// This function returns the hash value for a symbol in the .dynsym section /// Name of the API remains consistent as specified in the libelf /// REF : http://www.sco.com/developers/gabi/latest/ch5.dynamic.html#hash diff --git a/include/llvm/Object/ELF_ARM.h b/include/llvm/Object/ELF_ARM.h deleted file mode 100644 index d1fab2aa20..0000000000 --- a/include/llvm/Object/ELF_ARM.h +++ /dev/null @@ -1,339 +0,0 @@ -//===-- ELF_ARM.h - ARM ELF ABI ---------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file contains enumerations and support routines for ARM build attributes -// as defined in ARM ABI addenda document (ABI release 2.08). -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_OBJECT_ELF_ARM_H -#define LLVM_OBJECT_ELF_ARM_H - -#include "llvm/ADT/SmallVector.h" -#include "llvm/Support/Endian.h" - -namespace llvm { - -namespace ARMBuildAttrs { -enum SpecialAttr { - // This is for the .cpu asm attr. It translates into one or more - // AttrType (below) entries in the .ARM.attributes section in the ELF. - SEL_CPU -}; - -enum AttrType { - // Rest correspond to ELF/.ARM.attributes - File = 1, - Section = 2, - Symbol = 3, - CPU_raw_name = 4, - CPU_name = 5, - CPU_arch = 6, - CPU_arch_profile = 7, - ARM_ISA_use = 8, - THUMB_ISA_use = 9, - FP_arch = 10, - WMMX_arch = 11, - Advanced_SIMD_arch = 12, - PCS_config = 13, - ABI_PCS_R9_use = 14, - ABI_PCS_RW_data = 15, - ABI_PCS_RO_data = 16, - ABI_PCS_GOT_use = 17, - ABI_PCS_wchar_t = 18, - ABI_FP_rounding = 19, - ABI_FP_denormal = 20, - ABI_FP_exceptions = 21, - ABI_FP_user_exceptions = 22, - ABI_FP_number_model = 23, - ABI_align8_needed = 24, - ABI_align8_preserved = 25, - ABI_enum_size = 26, - ABI_HardFP_use = 27, - ABI_VFP_args = 28, - ABI_WMMX_args = 29, - ABI_optimization_goals = 30, - ABI_FP_optimization_goals = 31, - compatibility = 32, - CPU_unaligned_access = 34, - FP_HP_extension = 36, - ABI_FP_16bit_format = 38, - MPextension_use = 42, // was 70, 2.08 ABI - DIV_use = 44, - nodefaults = 64, - also_compatible_with = 65, - T2EE_use = 66, - conformance = 67, - Virtualization_use = 68, - MPextension_use_old = 70 -}; - -// Magic numbers for .ARM.attributes -enum AttrMagic { - Format_Version = 0x41 -}; - -// Legal Values for CPU_arch, (=6), uleb128 -enum CPUArch { - Pre_v4 = 0, - v4 = 1, // e.g. SA110 - v4T = 2, // e.g. ARM7TDMI - v5T = 3, // e.g. ARM9TDMI - v5TE = 4, // e.g. ARM946E_S - v5TEJ = 5, // e.g. ARM926EJ_S - v6 = 6, // e.g. ARM1136J_S - v6KZ = 7, // e.g. ARM1176JZ_S - v6T2 = 8, // e.g. ARM1156T2F_S - v6K = 9, // e.g. ARM1136J_S - v7 = 10, // e.g. Cortex A8, Cortex M3 - v6_M = 11, // e.g. Cortex M1 - v6S_M = 12, // v6_M with the System extensions - v7E_M = 13, // v7_M with DSP extensions - v8 -}; - -enum CPUArchProfile { // (=7), uleb128 - Not_Applicable = 0, // pre v7, or cross-profile code - ApplicationProfile = (0x41), // 'A' (e.g. for Cortex A8) - RealTimeProfile = (0x52), // 'R' (e.g. for Cortex R4) - MicroControllerProfile = (0x4D), // 'M' (e.g. for Cortex M3) - SystemProfile = (0x53) // 'S' Application or real-time profile -}; - -// The following have a lot of common use cases -enum { - //ARMISAUse (=8), uleb128 and THUMBISAUse (=9), uleb128 - Not_Allowed = 0, - Allowed = 1 -}; - -enum { - // FP_arch (=10), uleb128 (formerly Tag_VFP_arch = 10) - AllowFPv2 = 2, // v2 FP ISA permitted (implies use of the v1 FP ISA) - AllowFPv3A = 3, // v3 FP ISA permitted (implies use of the v2 FP ISA) - AllowFPv3B = 4, // v3 FP ISA permitted, but only D0-D15, S0-S31 - AllowFPv4A = 5, // v4 FP ISA permitted (implies use of v3 FP ISA) - AllowFPv4B = 6, // v4 FP ISA was permitted, but only D0-D15, S0-S31 - AllowV8FP = 7, // ARMv8-A FP ISA permitted - AllowV8FPB = 8 // ARMv8-A FP ISA permitted, but only D0-D15, S0-D31 -}; - -enum { - // Tag_THUMB_ISA_use, (=9), uleb128 - AllowThumb32 = 2 // 32-bit Thumb (implies 16-bit instructions) -}; - -enum { - // Tag_WMMX_arch, (=11), uleb128 - AllowWMMXv1 = 1, // The user permitted this entity to use WMMX v1 - AllowWMMXv2 = 2 // The user permitted this entity to use WMMX v2 -}; - -enum { - // Tag_ABI_FP_denormal, (=20), uleb128 - MightFlushToZero = 0, // Denormal numbers might be flushed to (+) zero - IEEE754Denormal = 1 , // Depends on IEEE 754 denormal numbers - PreserveFPSign = 2 // Sign when flushed-to-zero is preserved -}; - -enum { - // Tag_ABI_FP_number_model, (=23), uleb128 - AllowNormal = 1, // Use IEEE 754 format normal numbers only - AllowRTABI = 2, // numbers, infinities, and one quiet NaN (see [RTABI]) - AllowIEE754 = 3 // this code to use all the IEEE 754-defined FP encodings -}; - -enum { - // Tag_ABI_FP_rounding, (=19), uleb128 - FPRoundingNearest = 0, // Use the IEEE 754 round to nearest rounding mode - FPRoundingRuntime = 1 // Choose the IEEE 754 rounding mode at run time -}; - -enum { - // Tag_DIV_use, (=44), uleb128 - AllowDIVThumb = 0, // Allow SDIV, UDIV on Thumb ISA, e.g. Cortex R4 or M3 - NotAllowedDIV = 1, // Disallow SDIV and UDIV - AllowDIVv7a = 2 // Allow SDIV, UDIV on v7-a with integer div extension -}; - -enum { - // Tag_Virtualization_use, (=42), uleb128 - TrustZone = 1, // Use of the TrustZone extension was permitted - VirtExts = 2, // Use of virtualization extensions (HVC, ERET) permitted - TrustZoneVirtExts = 3 // TrustZone and virtualization extensions permitted -}; - -enum { - // Tag_PCS_config, (=13), uleb128 - PCS_none = 0, // No standard configuration used, or no information recorded - PCS_bare = 1, // Bare platform configuration - PCS_linux = 2, // Linux application configuration - PCS_linux_dso = 3, // Linux DSO configuration - PCS_palm_2004 = 4, // Palm OS 2004 configuration - PCS_palm_future = 5, // Reserved to future Palm OS configuration - PCS_symbian_2004 = 6, // Symbian OS 2004 configuration - PCS_symbian_future = 7 // Reserved to future Symbian OS configuration -}; - -enum { - // Tag_ABI_PCS_R9_use, (=14), uleb128 - PCS_R9_normal = 0, // R9 used as V6 (just another callee-saved register, - // implied by omitting the tag) - PCS_R9_SB = 1, // R9 used as SB, a global Static Base register - PCS_R9_TLS = 2, // R9 used as a Thread Local Storage (TLS) pointer - PCS_R9_none = 3 // R9 not used at all by code associated with - // the attributed entity. -}; - -enum { - // Tag_ABI_PCS_RW_data, (=15), uleb128 - PCS_RW_data_abs = 0, // RW static data permitted to be addressed absolutely - PCS_RW_data_pcrel = 1, // RW static data was only permitted to be - // addressed PC-relative. - PCS_RW_data_sbrel = 2, // RW static data was only permitted to be addressed - // SB-relative. - PCS_RW_data_none = 3 // No permission to use RW static data -}; - -enum { - // Tag_ABI_PCS_RO_data, (=16), uleb128 - PCS_RO_data_abs = 0, // RO static data permitted to be addressed absolutely - PCS_RO_data_pcrel = 1, // RO static data was only permitted to be - // addressed PC-relative. - PCS_RO_data_none = 2 // No permission to use RO static data -}; - -enum { - // Tag_ABI_PCS_GOT_use, (=17), uleb128 - PCS_GOT_none = 0, // No permission to import static data - PCS_GOT_direct = 1, // Permission to address imported data directly - PCS_GOT_indirect = 2 // The user permitted this entity to address imported - // data indirectly (e.g. via a GOT) -}; - -enum { - // Tag_ABI_PCS_wchar_t, (=18), uleb128 - PCS_wchar_t_disallowed = 0, // The user prohibited the use of wchar_t - PCS_wchar_t_2 = 2, // The user intended the size of wchar_t to be 2 - PCS_wchar_t_4 = 4 // The user intended the size of wchar_t to be 4 -}; - -enum { - // Tag_ABI_enum_size, (=26), uleb128 - PCS_enum_size = 1, // Enum values occupy the smallest container big enough - // to hold all their values. - PCS_enum_size_32 = 2, // The user intended Enum containers to be 32-bit - PCS_enum_size_abi32 = 3 // The user intended that every enumeration visible - // across an ABI-complying interface contains a value needing 32 bits to - // encode it; other enums can be containerized. -}; - -enum { - // Tag_ABI_align_needed, (=24), uleb128 - PCS_Align_needed_disallowed = 0, // The user did not permit code to depend - // the alignment of 8-byte data or data with extended (>8-byte) alignment. - PCS_Align_needed_8 = 1, // Code was permitted to depend on the 8-byte - // alignment of 8-byte data items. - PCS_Align_needed_4 = 2, // Code was permitted to depend on the 4-byte - // alignment of 8-byte data items. - PCS_Align_needed_res = 3 // Reserved - // OR: n (in 4..12) Code was permitted to depend on the 8-byte alignment of - // 8-byte data items and the alignment of data items having up to 2^n byte - // extended alignment. -}; - -enum { - // Tag_ABI_align_preserved, (=25), uleb128 - PCS_Align_preserved_none = 0, // The user did not require code to preserve - // 8-byte alignment of 8-byte data objects. - PCS_Align_preserved_8 = 1, // Code was required to preserve 8-byte alignment - // of 8-byte data objects. - PCS_Align_preserved_8sp = 2, // Code was required to preserve 8-byte - // alignment of 8-byte data objects and to ensure (SP MOD 8) = 0 at all - // instruction boundaries (not just at function calls). - PCS_Align_preserved_res = 3 // Reserved - // OR: n (in 4..12) Code was required to preserve the alignments of case 2 - // and the alignment of data items having up to 2^n byte extended alignment -}; - -enum { - // Tag_ABI_HardFP_use, (=27), uleb128 - HardFPImplied = 0, // FP use should be implied by Tag_FP_arch - HardFP_SP_VFP = 1, // Use only SP FP instructions - HardFP_Reserved = 2, // Reserved - HardFP_ImpliedDup = 3 // Deprecated duplicate of the default HardFPImplied -}; - -enum { - // Tag_ABI_VFP_args, (=28), uleb128 - VFPArgs_base = 0, // FP parameter/result passing using AAPCS, base variant - VFPArgs_VFP = 1, // FP parameter/result passing using AAPCS, VFP variant - VFPArgs_toolchain = 2, // FP parameter/result passing to conform to tool - // chain-specific conventions - VFPArgs_baseVFP = 3 // FP parameter/result passing using both base and VFP - //variants. Did not permit non-variadic functions to pass FP params/results. -}; - -/// Contains build ARM aeabi attribute values. -class ARMGenericBuildAttrInfo { -public: - ARMGenericBuildAttrInfo() - : Valid(false) {} - - CPUArch Tag_CPU_arch; - CPUArchProfile Tag_CPU_arch_profile; - std::string Tag_CPU_raw_name; - std::string Tag_CPU_name; - unsigned Tag_ARM_ISA_use; - unsigned Tag_THUMB_ISA_use; - unsigned Tag_FP_arch; - unsigned Tag_WMMX_arch; - unsigned Tag_Advanced_SIMD_arch; - unsigned Tag_FP_HP_extension; - unsigned Tag_CPU_unaligned_access; - unsigned Tag_MPextension_use; - unsigned Tag_DIV_use; - unsigned Tag_T2EE_use; - unsigned Tag_Virtualization_use; - unsigned Tag_ABI_optimization_goals; - unsigned Tag_ABI_FP_optimization_goals; - - //PCS/ABI attributes - unsigned Tag_PCS_config; - unsigned Tag_ABI_PCS_R9_use; - unsigned Tag_ABI_PCS_RW_data; - unsigned Tag_ABI_PCS_RO_data; - unsigned Tag_ABI_PCS_GOT_use; - unsigned Tag_ABI_PCS_wchar_t; - unsigned Tag_ABI_enum_size; - unsigned Tag_ABI_align8_needed; - unsigned Tag_ABI_align8_preserved; - - //FP - unsigned Tag_ABI_FP_rounding; - unsigned Tag_ABI_FP_denormal; - unsigned Tag_ABI_FP_number_model; - unsigned Tag_ABI_FP_exceptions; - unsigned Tag_ABI_FP_user_exceptions; - unsigned Tag_ABI_HardFP_use; - unsigned Tag_ABI_VFP_args; - -private: - bool Valid; - -public: - /// Indicates whether this instance contains valid or default values. - bool isValid() { return Valid; } - void setValid(bool v) { Valid = v; } -}; - -} -} // llvm - -#endif // LLVM_OBJECT_ELF_ARM_H diff --git a/lib/Target/ARM/ARMAsmPrinter.cpp b/lib/Target/ARM/ARMAsmPrinter.cpp index 2d5dca5c04..13ec208793 100644 --- a/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/ARMAsmPrinter.cpp @@ -15,6 +15,7 @@ #define DEBUG_TYPE "asm-printer" #include "ARMAsmPrinter.h" #include "ARM.h" +#include "ARMBuildAttrs.h" #include "ARMConstantPoolValue.h" #include "ARMMachineFunctionInfo.h" #include "ARMTargetMachine.h" @@ -43,7 +44,6 @@ #include "llvm/MC/MCSectionMachO.h" #include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCSymbol.h" -#include "llvm/Object/ELF_ARM.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ELF.h" @@ -90,7 +90,7 @@ namespace { break; /* GAS requires .fpu to be emitted regardless of EABI attribute */ case ARMBuildAttrs::Advanced_SIMD_arch: - case ARMBuildAttrs::FP_arch: + case ARMBuildAttrs::VFP_arch: Streamer.EmitRawText(StringRef("\t.fpu ") + String.lower()); break; } @@ -798,24 +798,24 @@ void ARMAsmPrinter::emitAttributes() { /* VFPv4 + .fpu */ if (Subtarget->hasVFP4()) { - AttrEmitter->EmitAttribute(ARMBuildAttrs::FP_arch, + AttrEmitter->EmitAttribute(ARMBuildAttrs::VFP_arch, ARMBuildAttrs::AllowFPv4A); if (emitFPU) - AttrEmitter->EmitTextAttribute(ARMBuildAttrs::FP_arch, "vfpv4"); + AttrEmitter->EmitTextAttribute(ARMBuildAttrs::VFP_arch, "vfpv4"); /* VFPv3 + .fpu */ } else if (Subtarget->hasVFP3()) { - AttrEmitter->EmitAttribute(ARMBuildAttrs::FP_arch, + AttrEmitter->EmitAttribute(ARMBuildAttrs::VFP_arch, ARMBuildAttrs::AllowFPv3A); if (emitFPU) - AttrEmitter->EmitTextAttribute(ARMBuildAttrs::FP_arch, "vfpv3"); + AttrEmitter->EmitTextAttribute(ARMBuildAttrs::VFP_arch, "vfpv3"); /* VFPv2 + .fpu */ } else if (Subtarget->hasVFP2()) { - AttrEmitter->EmitAttribute(ARMBuildAttrs::FP_arch, + AttrEmitter->EmitAttribute(ARMBuildAttrs::VFP_arch, ARMBuildAttrs::AllowFPv2); if (emitFPU) - AttrEmitter->EmitTextAttribute(ARMBuildAttrs::FP_arch, "vfpv2"); + AttrEmitter->EmitTextAttribute(ARMBuildAttrs::VFP_arch, "vfpv2"); } /* TODO: ARMBuildAttrs::Allowed is not completely accurate, diff --git a/lib/Target/ARM/ARMBuildAttrs.h b/lib/Target/ARM/ARMBuildAttrs.h new file mode 100644 index 0000000000..11bd6a4a8d --- /dev/null +++ b/lib/Target/ARM/ARMBuildAttrs.h @@ -0,0 +1,131 @@ +//===-- ARMBuildAttrs.h - ARM Build Attributes ------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file contains enumerations and support routines for ARM build attributes +// as defined in ARM ABI addenda document (ABI release 2.08). +// +//===----------------------------------------------------------------------===// + +#ifndef __TARGET_ARMBUILDATTRS_H__ +#define __TARGET_ARMBUILDATTRS_H__ + +namespace ARMBuildAttrs { + enum SpecialAttr { + // This is for the .cpu asm attr. It translates into one or more + // AttrType (below) entries in the .ARM.attributes section in the ELF. + SEL_CPU + }; + + enum AttrType { + // Rest correspond to ELF/.ARM.attributes + File = 1, + Section = 2, + Symbol = 3, + CPU_raw_name = 4, + CPU_name = 5, + CPU_arch = 6, + CPU_arch_profile = 7, + ARM_ISA_use = 8, + THUMB_ISA_use = 9, + VFP_arch = 10, + WMMX_arch = 11, + Advanced_SIMD_arch = 12, + PCS_config = 13, + ABI_PCS_R9_use = 14, + ABI_PCS_RW_data = 15, + ABI_PCS_RO_data = 16, + ABI_PCS_GOT_use = 17, + ABI_PCS_wchar_t = 18, + ABI_FP_rounding = 19, + ABI_FP_denormal = 20, + ABI_FP_exceptions = 21, + ABI_FP_user_exceptions = 22, + ABI_FP_number_model = 23, + ABI_align8_needed = 24, + ABI_align8_preserved = 25, + ABI_enum_size = 26, + ABI_HardFP_use = 27, + ABI_VFP_args = 28, + ABI_WMMX_args = 29, + ABI_optimization_goals = 30, + ABI_FP_optimization_goals = 31, + compatibility = 32, + CPU_unaligned_access = 34, + VFP_HP_extension = 36, + ABI_FP_16bit_format = 38, + MPextension_use = 42, // was 70, 2.08 ABI + DIV_use = 44, + nodefaults = 64, + also_compatible_with = 65, + T2EE_use = 66, + conformance = 67, + Virtualization_use = 68, + MPextension_use_old = 70 + }; + + // Magic numbers for .ARM.attributes + enum AttrMagic { + Format_Version = 0x41 + }; + + // Legal Values for CPU_arch, (=6), uleb128 + enum CPUArch { + Pre_v4 = 0, + v4 = 1, // e.g. SA110 + v4T = 2, // e.g. ARM7TDMI + v5T = 3, // e.g. ARM9TDMI + v5TE = 4, // e.g. ARM946E_S + v5TEJ = 5, // e.g. ARM926EJ_S + v6 = 6, // e.g. ARM1136J_S + v6KZ = 7, // e.g. ARM1176JZ_S + v6T2 = 8, // e.g. ARM1156T2F_S + v6K = 9, // e.g. ARM1136J_S + v7 = 10, // e.g. Cortex A8, Cortex M3 + v6_M = 11, // e.g. Cortex M1 + v6S_M = 12, // v6_M with the System extensions + v7E_M = 13 // v7_M with DSP extensions + }; + + enum CPUArchProfile { // (=7), uleb128 + Not_Applicable = 0, // pre v7, or cross-profile code + ApplicationProfile = (0x41), // 'A' (e.g. for Cortex A8) + RealTimeProfile = (0x52), // 'R' (e.g. for Cortex R4) + MicroControllerProfile = (0x4D), // 'M' (e.g. for Cortex M3) + SystemProfile = (0x53) // 'S' Application or real-time profile + }; + + // The following have a lot of common use cases + enum { + //ARMISAUse (=8), uleb128 and THUMBISAUse (=9), uleb128 + Not_Allowed = 0, + Allowed = 1, + + // FP_arch (=10), uleb128 (formerly Tag_VFP_arch = 10) + AllowFPv2 = 2, // v2 FP ISA permitted (implies use of the v1 FP ISA) + AllowFPv3A = 3, // v3 FP ISA permitted (implies use of the v2 FP ISA) + AllowFPv3B = 4, // v3 FP ISA permitted, but only D0-D15, S0-S31 + AllowFPv4A = 5, // v4 FP ISA permitted (implies use of v3 FP ISA) + AllowFPv4B = 6, // v4 FP ISA was permitted, but only D0-D15, S0-S31 + + // Tag_WMMX_arch, (=11), uleb128 + AllowThumb32 = 2, // 32-bit Thumb (implies 16-bit instructions) + + // Tag_WMMX_arch, (=11), uleb128 + AllowWMMXv1 = 2, // The user permitted this entity to use WMMX v2 + + // Tag_ABI_FP_denormal, (=20), uleb128 + PreserveFPSign = 2, // sign when flushed-to-zero is preserved + + // Tag_ABI_FP_number_model, (=23), uleb128 + AllowRTABI = 2, // numbers, infinities, and one quiet NaN (see [RTABI]) + AllowIEE754 = 3 // this code to use all the IEEE 754-defined FP encodings + }; +} + +#endif // __TARGET_ARMBUILDATTRS_H__ diff --git a/test/Object/Inputs/arm-attributes.elf-arm b/test/Object/Inputs/arm-attributes.elf-arm Binary files differdeleted file mode 100644 index 69855d6ea0..0000000000 --- a/test/Object/Inputs/arm-attributes.elf-arm +++ /dev/null diff --git a/test/Object/Inputs/trivial-object-test.elf-arm b/test/Object/Inputs/trivial-object-test.elf-arm Binary files differdeleted file mode 100644 index adfe96ca6a..0000000000 --- a/test/Object/Inputs/trivial-object-test.elf-arm +++ /dev/null diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp index 6fa9026399..ea1b83f32f 100644 --- a/tools/llvm-readobj/ELFDumper.cpp +++ b/tools/llvm-readobj/ELFDumper.cpp @@ -51,7 +51,6 @@ public: virtual void printDynamicTable() LLVM_OVERRIDE; virtual void printNeededLibraries() LLVM_OVERRIDE; virtual void printProgramHeaders() LLVM_OVERRIDE; - virtual void printARMBuildAttributes() LLVM_OVERRIDE; private: typedef ELFObjectFile<ELFT> ELFO; @@ -859,65 +858,3 @@ void ELFDumper<ELFT>::printProgramHeaders() { W.printNumber("Alignment", PI->p_align); } } - -#define LLVM_READOBJ_ARMATTR_NUMCASE(X) case ARMBuildAttrs::X: \ - W.printNumber(" Tag_" #X, BuildAttrs.Tag_##X); \ - break; \ - -#define LLVM_READOBJ_ARMATTR_STRCASE(X) case ARMBuildAttrs::X: \ - W.printString(" Tag_" #X, BuildAttrs.Tag_##X); \ - break; \ - -template<class ELFT> -void ELFDumper<ELFT>::printARMBuildAttributes() { - if (Obj->getArch() != Triple::arm || !Obj->hasARMBuildAttributes()) - return; - ARMBuildAttrs::ARMGenericBuildAttrInfo BuildAttrs; - SmallVector<unsigned, 16> AttrsRead; - error_code EC = Obj->readARMBuildAttributes(BuildAttrs, AttrsRead); - if (error(EC)) - return; - - DictScope D(W, "ARMBuildAttributes"); - - for (SmallVector<unsigned, 16>::iterator I = AttrsRead.begin(), - E = AttrsRead.end(); I != E; ++I) { - switch (*I) { - LLVM_READOBJ_ARMATTR_STRCASE(CPU_name) - LLVM_READOBJ_ARMATTR_STRCASE(CPU_raw_name) - LLVM_READOBJ_ARMATTR_NUMCASE(CPU_arch) - LLVM_READOBJ_ARMATTR_NUMCASE(CPU_arch_profile) - LLVM_READOBJ_ARMATTR_NUMCASE(ARM_ISA_use) - LLVM_READOBJ_ARMATTR_NUMCASE(THUMB_ISA_use) - LLVM_READOBJ_ARMATTR_NUMCASE(FP_arch) - LLVM_READOBJ_ARMATTR_NUMCASE(WMMX_arch) - LLVM_READOBJ_ARMATTR_NUMCASE(Advanced_SIMD_arch) - LLVM_READOBJ_ARMATTR_NUMCASE(PCS_config) - LLVM_READOBJ_ARMATTR_NUMCASE(ABI_PCS_R9_use) - LLVM_READOBJ_ARMATTR_NUMCASE(ABI_PCS_RW_data) - LLVM_READOBJ_ARMATTR_NUMCASE(ABI_PCS_RO_data) - LLVM_READOBJ_ARMATTR_NUMCASE(ABI_PCS_GOT_use) - LLVM_READOBJ_ARMATTR_NUMCASE(ABI_PCS_wchar_t) - LLVM_READOBJ_ARMATTR_NUMCASE(ABI_FP_rounding) - LLVM_READOBJ_ARMATTR_NUMCASE(ABI_FP_denormal) - LLVM_READOBJ_ARMATTR_NUMCASE(ABI_FP_exceptions) - LLVM_READOBJ_ARMATTR_NUMCASE(ABI_FP_user_exceptions) - LLVM_READOBJ_ARMATTR_NUMCASE(ABI_FP_number_model) - LLVM_READOBJ_ARMATTR_NUMCASE(ABI_align8_needed) - LLVM_READOBJ_ARMATTR_NUMCASE(ABI_align8_preserved) - LLVM_READOBJ_ARMATTR_NUMCASE(ABI_enum_size) - LLVM_READOBJ_ARMATTR_NUMCASE(ABI_HardFP_use) - LLVM_READOBJ_ARMATTR_NUMCASE(ABI_VFP_args) - LLVM_READOBJ_ARMATTR_NUMCASE(CPU_unaligned_access) - LLVM_READOBJ_ARMATTR_NUMCASE(FP_HP_extension) - LLVM_READOBJ_ARMATTR_NUMCASE(MPextension_use) - LLVM_READOBJ_ARMATTR_NUMCASE(DIV_use) - LLVM_READOBJ_ARMATTR_NUMCASE(T2EE_use) - LLVM_READOBJ_ARMATTR_NUMCASE(Virtualization_use) - LLVM_READOBJ_ARMATTR_NUMCASE(ABI_optimization_goals) - LLVM_READOBJ_ARMATTR_NUMCASE(ABI_FP_optimization_goals) - default: - break; - } - } -} diff --git a/tools/llvm-readobj/ObjDumper.h b/tools/llvm-readobj/ObjDumper.h index 9a8f0c157a..6918e28cb9 100644 --- a/tools/llvm-readobj/ObjDumper.h +++ b/tools/llvm-readobj/ObjDumper.h @@ -39,7 +39,6 @@ public: virtual void printDynamicTable() { } virtual void printNeededLibraries() { } virtual void printProgramHeaders() { } - virtual void printARMBuildAttributes() { } protected: StreamWriter& W; diff --git a/tools/llvm-readobj/llvm-readobj.cpp b/tools/llvm-readobj/llvm-readobj.cpp index d5eb85429c..2e95b6b551 100644 --- a/tools/llvm-readobj/llvm-readobj.cpp +++ b/tools/llvm-readobj/llvm-readobj.cpp @@ -128,10 +128,6 @@ namespace opts { // -expand-relocs cl::opt<bool> ExpandRelocs("expand-relocs", cl::desc("Expand each shown relocation to multiple lines")); - - // -arm-buildattrs - cl::opt<bool> ArmBuildAttrs("arm-buildattrs", - cl::desc("Display ARM ELF build attributes")); } // namespace opts namespace llvm { @@ -225,8 +221,6 @@ static void dumpObject(const ObjectFile *Obj) { Dumper->printNeededLibraries(); if (opts::ProgramHeaders) Dumper->printProgramHeaders(); - if (opts::ArmBuildAttrs) - Dumper->printARMBuildAttributes(); } |