diff options
Diffstat (limited to 'contrib/llvm/lib/Object/ELFObjectFile.cpp')
| -rw-r--r-- | contrib/llvm/lib/Object/ELFObjectFile.cpp | 58 | 
1 files changed, 42 insertions, 16 deletions
| diff --git a/contrib/llvm/lib/Object/ELFObjectFile.cpp b/contrib/llvm/lib/Object/ELFObjectFile.cpp index 9fb3a55ac7b1..c7b715793048 100644 --- a/contrib/llvm/lib/Object/ELFObjectFile.cpp +++ b/contrib/llvm/lib/Object/ELFObjectFile.cpp @@ -1,9 +1,8 @@  //===- ELFObjectFile.cpp - ELF object file implementation -----------------===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception  //  //===----------------------------------------------------------------------===//  // @@ -36,6 +35,16 @@  using namespace llvm;  using namespace object; +const EnumEntry<unsigned> llvm::object::ElfSymbolTypes[NumElfSymbolTypes] = { +    {"None", "NOTYPE", ELF::STT_NOTYPE}, +    {"Object", "OBJECT", ELF::STT_OBJECT}, +    {"Function", "FUNC", ELF::STT_FUNC}, +    {"Section", "SECTION", ELF::STT_SECTION}, +    {"File", "FILE", ELF::STT_FILE}, +    {"Common", "COMMON", ELF::STT_COMMON}, +    {"TLS", "TLS", ELF::STT_TLS}, +    {"GNU_IFunc", "IFUNC", ELF::STT_GNU_IFUNC}}; +  ELFObjectFileBase::ELFObjectFileBase(unsigned int Type, MemoryBufferRef Source)      : ObjectFile(Type, Source) {} @@ -139,8 +148,7 @@ SubtargetFeatures ELFObjectFileBase::getMIPSFeatures() const {  SubtargetFeatures ELFObjectFileBase::getARMFeatures() const {    SubtargetFeatures Features;    ARMAttributeParser Attributes; -  std::error_code EC = getBuildAttributes(Attributes); -  if (EC) +  if (Error E = getBuildAttributes(Attributes))      return SubtargetFeatures();    // both ARMv7-M and R have to support thumb hardware div @@ -186,9 +194,9 @@ SubtargetFeatures ELFObjectFileBase::getARMFeatures() const {      default:        break;      case ARMBuildAttrs::Not_Allowed: -      Features.AddFeature("vfp2", false); -      Features.AddFeature("vfp3", false); -      Features.AddFeature("vfp4", false); +      Features.AddFeature("vfp2d16sp", false); +      Features.AddFeature("vfp3d16sp", false); +      Features.AddFeature("vfp4d16sp", false);        break;      case ARMBuildAttrs::AllowFPv2:        Features.AddFeature("vfp2"); @@ -222,6 +230,24 @@ SubtargetFeatures ELFObjectFileBase::getARMFeatures() const {      }    } +  if (Attributes.hasAttribute(ARMBuildAttrs::MVE_arch)) { +    switch(Attributes.getAttributeValue(ARMBuildAttrs::MVE_arch)) { +    default: +      break; +    case ARMBuildAttrs::Not_Allowed: +      Features.AddFeature("mve", false); +      Features.AddFeature("mve.fp", false); +      break; +    case ARMBuildAttrs::AllowMVEInteger: +      Features.AddFeature("mve.fp", false); +      Features.AddFeature("mve"); +      break; +    case ARMBuildAttrs::AllowMVEIntegerAndFloat: +      Features.AddFeature("mve.fp"); +      break; +    } +  } +    if (Attributes.hasAttribute(ARMBuildAttrs::DIV_use)) {      switch(Attributes.getAttributeValue(ARMBuildAttrs::DIV_use)) {      default: @@ -270,8 +296,7 @@ void ELFObjectFileBase::setARMSubArch(Triple &TheTriple) const {      return;    ARMAttributeParser Attributes; -  std::error_code EC = getBuildAttributes(Attributes); -  if (EC) +  if (Error E = getBuildAttributes(Attributes))      return;    std::string Triple; @@ -370,12 +395,13 @@ ELFObjectFileBase::getPltAddresses() const {    }    if (!Plt || !RelaPlt || !GotPlt)      return {}; -  StringRef PltContents; -  if (Plt->getContents(PltContents)) +  Expected<StringRef> PltContents = Plt->getContents(); +  if (!PltContents) { +    consumeError(PltContents.takeError());      return {}; -  ArrayRef<uint8_t> PltBytes((const uint8_t *)PltContents.data(), -                             Plt->getSize()); -  auto PltEntries = MIA->findPltEntries(Plt->getAddress(), PltBytes, +  } +  auto PltEntries = MIA->findPltEntries(Plt->getAddress(), +                                        arrayRefFromStringRef(*PltContents),                                          GotPlt->getAddress(), Triple);    // Build a map from GOT entry virtual address to PLT entry virtual address.    DenseMap<uint64_t, uint64_t> GotToPlt; | 
