[llvm] r181009 - Add support for reading ARM ELF build attributes.

Amara Emerson amara.emerson at gmail.com
Fri May 3 15:13:11 PDT 2013


Hi Manman,

I'm currently investigating this issue, in the meantime I'll xfail the test
temporarily.

Thanks,
Amara


On 3 May 2013 22:13, Manman Ren <mren at apple.com> wrote:

>
>
> This seems to break one of the bots.
> http://lab.llvm.org:8013/builders/clang-x86_64-darwin11-DA/builds/1892
>
> Thanks,
> Manman
>
> On May 3, 2013, at 4:36 AM, Amara Emerson wrote:
>
> > Author: aemerson
> > Date: Fri May  3 06:36:35 2013
> > New Revision: 181009
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=181009&view=rev
> > Log:
> > Add support for reading ARM ELF build attributes.
> >
> > Build attribute sections can now be read if they exist via
> ELFObjectFile, and
> > the llvm-readobj tool has been extended with an option to dump this
> information
> > if requested. Regression tests are also included which exercise these
> features.
> >
> > Also update the docs with a fixed ARM ABI link and a new link to the
> Addenda
> > which provides the build attributes specification.
> >
> > Added:
> >    llvm/trunk/include/llvm/Object/ELF_ARM.h
> >    llvm/trunk/test/Object/Inputs/arm-attributes.elf-arm   (with props)
> >    llvm/trunk/test/Object/Inputs/trivial-object-test.elf-arm   (with
> props)
> >    llvm/trunk/test/Object/readobj-elf-arm-buildattrs.test
> > Removed:
> >    llvm/trunk/lib/Target/ARM/ARMBuildAttrs.h
> > Modified:
> >    llvm/trunk/docs/CompilerWriterInfo.rst
> >    llvm/trunk/include/llvm/Object/ELF.h
> >    llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
> >    llvm/trunk/tools/llvm-readobj/ELFDumper.cpp
> >    llvm/trunk/tools/llvm-readobj/ObjDumper.h
> >    llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp
> >
> > Modified: llvm/trunk/docs/CompilerWriterInfo.rst
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/CompilerWriterInfo.rst?rev=181009&r1=181008&r2=181009&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/docs/CompilerWriterInfo.rst (original)
> > +++ llvm/trunk/docs/CompilerWriterInfo.rst Fri May  3 06:36:35 2013
> > @@ -18,7 +18,9 @@ ARM
> >
> > * `ARM documentation <http://www.arm.com/documentation/>`_ (`Processor
> Cores <http://www.arm.com/documentation/ARMProcessor_Cores/>`_ Cores)
> >
> > -* `ABI <http://www.arm.com/products/DevTools/ABI.html>`_
> > +* `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
> >`_
> >
> > * `ARM C Language Extensions <
> http://infocenter.arm.com/help/topic/com.arm.doc.ihi0053a/IHI0053A_acle.pdf
> >`_
> >
> >
> > Modified: llvm/trunk/include/llvm/Object/ELF.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELF.h?rev=181009&r1=181008&r2=181009&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/Object/ELF.h (original)
> > +++ llvm/trunk/include/llvm/Object/ELF.h Fri May  3 06:36:35 2013
> > @@ -19,11 +19,13 @@
> > #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>
> > @@ -601,6 +603,7 @@ 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.
> > @@ -643,6 +646,11 @@ 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;
> > @@ -838,6 +846,18 @@ 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
> > @@ -2330,6 +2350,7 @@ ELFObjectFile<ELFT>::ELFObjectFile(Memor
> >   , 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)
> >  {
> >
> > @@ -2421,6 +2442,13 @@ ELFObjectFile<ELFT>::ELFObjectFile(Memor
> >       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;
> >   }
> > @@ -2970,6 +2998,164 @@ static inline error_code GetELFSymbolVer
> >   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
> >
> > Added: llvm/trunk/include/llvm/Object/ELF_ARM.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELF_ARM.h?rev=181009&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/Object/ELF_ARM.h (added)
> > +++ llvm/trunk/include/llvm/Object/ELF_ARM.h Fri May  3 06:36:35 2013
> > @@ -0,0 +1,339 @@
> > +//===-- 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
> >
> > Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?rev=181009&r1=181008&r2=181009&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (original)
> > +++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Fri May  3 06:36:35 2013
> > @@ -15,7 +15,6 @@
> > #define DEBUG_TYPE "asm-printer"
> > #include "ARMAsmPrinter.h"
> > #include "ARM.h"
> > -#include "ARMBuildAttrs.h"
> > #include "ARMConstantPoolValue.h"
> > #include "ARMMachineFunctionInfo.h"
> > #include "ARMTargetMachine.h"
> > @@ -44,6 +43,7 @@
> > #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::VFP_arch:
> > +      case ARMBuildAttrs::FP_arch:
> >         Streamer.EmitRawText(StringRef("\t.fpu ") + String.lower());
> >         break;
> >       }
> > @@ -798,24 +798,24 @@ void ARMAsmPrinter::emitAttributes() {
> >
> >   /* VFPv4 + .fpu */
> >   if (Subtarget->hasVFP4()) {
> > -    AttrEmitter->EmitAttribute(ARMBuildAttrs::VFP_arch,
> > +    AttrEmitter->EmitAttribute(ARMBuildAttrs::FP_arch,
> >                                ARMBuildAttrs::AllowFPv4A);
> >     if (emitFPU)
> > -      AttrEmitter->EmitTextAttribute(ARMBuildAttrs::VFP_arch, "vfpv4");
> > +      AttrEmitter->EmitTextAttribute(ARMBuildAttrs::FP_arch, "vfpv4");
> >
> >   /* VFPv3 + .fpu */
> >   } else if (Subtarget->hasVFP3()) {
> > -    AttrEmitter->EmitAttribute(ARMBuildAttrs::VFP_arch,
> > +    AttrEmitter->EmitAttribute(ARMBuildAttrs::FP_arch,
> >                                ARMBuildAttrs::AllowFPv3A);
> >     if (emitFPU)
> > -      AttrEmitter->EmitTextAttribute(ARMBuildAttrs::VFP_arch, "vfpv3");
> > +      AttrEmitter->EmitTextAttribute(ARMBuildAttrs::FP_arch, "vfpv3");
> >
> >   /* VFPv2 + .fpu */
> >   } else if (Subtarget->hasVFP2()) {
> > -    AttrEmitter->EmitAttribute(ARMBuildAttrs::VFP_arch,
> > +    AttrEmitter->EmitAttribute(ARMBuildAttrs::FP_arch,
> >                                ARMBuildAttrs::AllowFPv2);
> >     if (emitFPU)
> > -      AttrEmitter->EmitTextAttribute(ARMBuildAttrs::VFP_arch, "vfpv2");
> > +      AttrEmitter->EmitTextAttribute(ARMBuildAttrs::FP_arch, "vfpv2");
> >   }
> >
> >   /* TODO: ARMBuildAttrs::Allowed is not completely accurate,
> >
> > Removed: llvm/trunk/lib/Target/ARM/ARMBuildAttrs.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMBuildAttrs.h?rev=181008&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/lib/Target/ARM/ARMBuildAttrs.h (original)
> > +++ llvm/trunk/lib/Target/ARM/ARMBuildAttrs.h (removed)
> > @@ -1,131 +0,0 @@
> > -//===-- 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__
> >
> > Added: llvm/trunk/test/Object/Inputs/arm-attributes.elf-arm
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/arm-attributes.elf-arm?rev=181009&view=auto
> >
> ==============================================================================
> > Binary file - no diff available.
> >
> > Propchange: llvm/trunk/test/Object/Inputs/arm-attributes.elf-arm
> >
> ------------------------------------------------------------------------------
> >    svn:mime-type = application/octet-stream
> >
> > Added: llvm/trunk/test/Object/Inputs/trivial-object-test.elf-arm
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/trivial-object-test.elf-arm?rev=181009&view=auto
> >
> ==============================================================================
> > Binary file - no diff available.
> >
> > Propchange: llvm/trunk/test/Object/Inputs/trivial-object-test.elf-arm
> >
> ------------------------------------------------------------------------------
> >    svn:mime-type = application/octet-stream
> >
> > Added: llvm/trunk/test/Object/readobj-elf-arm-buildattrs.test
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/readobj-elf-arm-buildattrs.test?rev=181009&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/test/Object/readobj-elf-arm-buildattrs.test (added)
> > +++ llvm/trunk/test/Object/readobj-elf-arm-buildattrs.test Fri May  3
> 06:36:35 2013
> > @@ -0,0 +1,46 @@
> > +RUN: llvm-readobj -arm-buildattrs %p/Inputs/trivial-object-test.elf-arm
> \
> > +RUN:         | FileCheck %s -check-prefix=SMALL
> > +RUN: llvm-readobj -arm-buildattrs %p/Inputs/arm-attributes.elf-arm \
> > +RUN:         | FileCheck %s -check-prefix=LARGE
> > +
> > +SMALL: ARMBuildAttributes {
> > +SMALL: Tag_CPU_name: Cortex-A8
> > +SMALL: Tag_CPU_arch: 10
> > +SMALL: Tag_ARM_ISA_use: 1
> > +SMALL: Tag_THUMB_ISA_use: 2
> > +SMALL: Tag_FP_arch: 3
> > +SMALL: Tag_Advanced_SIMD_arch: 1
> > +SMALL: Tag_ABI_FP_denormal: 1
> > +SMALL: Tag_ABI_FP_exceptions: 1
> > +SMALL: Tag_ABI_FP_number_model: 3
> > +SMALL: Tag_ABI_align8_needed: 1
> > +SMALL: Tag_ABI_align8_preserved: 1
> > +SMALL: Tag_ABI_HardFP_use: 3
> > +SMALL: Tag_ABI_VFP_args: 1
> > +SMALL: Tag_DIV_use: 1
> > +SMALL: Tag_Virtualization_use: 1
> > +
> > +LARGE: ARMBuildAttributes {
> > +LARGE: Tag_CPU_name: iwmmxt2
> > +LARGE: Tag_CPU_arch: 4
> > +LARGE: Tag_ARM_ISA_use: 1
> > +LARGE: Tag_THUMB_ISA_use: 1
> > +LARGE: Tag_WMMX_arch: 2
> > +LARGE: Tag_Advanced_SIMD_arch: 1
> > +LARGE: Tag_ABI_PCS_RW_data: 3
> > +LARGE: Tag_ABI_PCS_GOT_use: 2
> > +LARGE: Tag_ABI_PCS_wchar_t: 4
> > +LARGE: Tag_ABI_FP_rounding: 1
> > +LARGE: Tag_ABI_FP_denormal: 1
> > +LARGE: Tag_ABI_FP_exceptions: 1
> > +LARGE: Tag_ABI_FP_number_model: 3
> > +LARGE: Tag_ABI_align8_needed: 1
> > +LARGE: Tag_ABI_align8_preserved: 1
> > +LARGE: Tag_ABI_enum_size: 2
> > +LARGE: Tag_ABI_HardFP_use: 3
> > +LARGE: Tag_ABI_VFP_args: 1
> > +LARGE: Tag_ABI_optimization_goals: 1
> > +LARGE: Tag_CPU_unaligned_access: 1
> > +LARGE: Tag_FP_HP_extension: 1
> > +LARGE: Tag_DIV_use: 1
> > +LARGE: Tag_T2EE_use: 1
> >
> > Modified: llvm/trunk/tools/llvm-readobj/ELFDumper.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/ELFDumper.cpp?rev=181009&r1=181008&r2=181009&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/llvm-readobj/ELFDumper.cpp (original)
> > +++ llvm/trunk/tools/llvm-readobj/ELFDumper.cpp Fri May  3 06:36:35 2013
> > @@ -51,6 +51,7 @@ 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;
> > @@ -858,3 +859,65 @@ void ELFDumper<ELFT>::printProgramHeader
> >     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;
> > +    }
> > +  }
> > +}
> >
> > Modified: llvm/trunk/tools/llvm-readobj/ObjDumper.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/ObjDumper.h?rev=181009&r1=181008&r2=181009&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/llvm-readobj/ObjDumper.h (original)
> > +++ llvm/trunk/tools/llvm-readobj/ObjDumper.h Fri May  3 06:36:35 2013
> > @@ -39,6 +39,7 @@ public:
> >   virtual void printDynamicTable() { }
> >   virtual void printNeededLibraries() { }
> >   virtual void printProgramHeaders() { }
> > +  virtual void printARMBuildAttributes() { }
> >
> > protected:
> >   StreamWriter& W;
> >
> > Modified: llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp?rev=181009&r1=181008&r2=181009&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp (original)
> > +++ llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp Fri May  3 06:36:35
> 2013
> > @@ -128,6 +128,10 @@ 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 {
> > @@ -221,6 +225,8 @@ static void dumpObject(const ObjectFile
> >     Dumper->printNeededLibraries();
> >   if (opts::ProgramHeaders)
> >     Dumper->printProgramHeaders();
> > +  if (opts::ArmBuildAttrs)
> > +    Dumper->printARMBuildAttributes();
> > }
> >
> >
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130503/a528b190/attachment.html>


More information about the llvm-commits mailing list