r241267 - Refactored ARMTargetInfo in order to use the API of llvm/lib/Support/TargetParser.cpp

Rafael EspĂ­ndola rafael.espindola at gmail.com
Thu Jul 2 08:15:16 PDT 2015


I reverted this to fix the bots:

http://lab.llvm.org:8011/builders/clang-x86_64-ubuntu-gdb-75/builds/23181/steps/check-all/logs/FAIL%3A%20Clang%3A%3Aarm-atomics-m0.c

On 2 July 2015 at 10:21, Alexandros Lamprineas
<alexandros.lamprineas at arm.com> wrote:
> Author: alelab01
> Date: Thu Jul  2 09:21:40 2015
> New Revision: 241267
>
> URL: http://llvm.org/viewvc/llvm-project?rev=241267&view=rev
> Log:
> Refactored ARMTargetInfo in order to use the API of llvm/lib/Support/TargetParser.cpp
> for extracting target specific information.
>
> Change-Id: Ia0b83ecdb8d9223f9c4ef38dd9206969f78e53f3
>
> Modified:
>     cfe/trunk/lib/Basic/Targets.cpp
>
> Modified: cfe/trunk/lib/Basic/Targets.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=241267&r1=241266&r2=241267&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Basic/Targets.cpp (original)
> +++ cfe/trunk/lib/Basic/Targets.cpp Thu Jul  2 09:21:40 2015
> @@ -3996,8 +3996,14 @@ class ARMTargetInfo : public TargetInfo
>      FP_Neon
>    } FPMath;
>
> +  unsigned ArchISA;
> +  unsigned ArchKind;
> +  unsigned ArchProfile;
> +  unsigned ArchVersion;
> +
>    unsigned FPU : 5;
>
> +  unsigned ShouldUseInlineAtomic : 1;
>    unsigned IsAAPCS : 1;
>    unsigned IsThumb : 1;
>    unsigned HWDiv : 2;
> @@ -4019,37 +4025,6 @@ class ARMTargetInfo : public TargetInfo
>
>    static const Builtin::Info BuiltinInfo[];
>
> -  static bool shouldUseInlineAtomic(const llvm::Triple &T) {
> -    StringRef ArchName = T.getArchName();
> -    if (T.getArch() == llvm::Triple::arm ||
> -        T.getArch() == llvm::Triple::armeb) {
> -      StringRef VersionStr;
> -      if (ArchName.startswith("armv"))
> -        VersionStr = ArchName.substr(4, 1);
> -      else if (ArchName.startswith("armebv"))
> -        VersionStr = ArchName.substr(6, 1);
> -      else
> -        return false;
> -      unsigned Version;
> -      if (VersionStr.getAsInteger(10, Version))
> -        return false;
> -      return Version >= 6;
> -    }
> -    assert(T.getArch() == llvm::Triple::thumb ||
> -           T.getArch() == llvm::Triple::thumbeb);
> -    StringRef VersionStr;
> -    if (ArchName.startswith("thumbv"))
> -      VersionStr = ArchName.substr(6, 1);
> -    else if (ArchName.startswith("thumbebv"))
> -      VersionStr = ArchName.substr(8, 1);
> -    else
> -      return false;
> -    unsigned Version;
> -    if (VersionStr.getAsInteger(10, Version))
> -      return false;
> -    return Version >= 7;
> -  }
> -
>    void setABIAAPCS() {
>      IsAAPCS = true;
>
> @@ -4148,6 +4123,28 @@ class ARMTargetInfo : public TargetInfo
>      // FIXME: Override "preferred align" for double and long long.
>    }
>
> +  void setArchInfo(StringRef ArchName) {
> +    ArchISA     = llvm::ARMTargetParser::parseArchISA(ArchName);
> +    ArchKind    = llvm::ARMTargetParser::parseArch(ArchName);
> +    ArchProfile = llvm::ARMTargetParser::parseArchProfile(ArchName);
> +    ArchVersion = llvm::ARMTargetParser::parseArchVersion(ArchName);
> +
> +    ShouldUseInlineAtomic = (ArchISA == llvm::ARM::IK_ARM   && ArchVersion >= 6) ||
> +                            (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
> +
> +    // Cortex M does not support 8 byte atomics, while general Thumb2 does.
> +    if (ArchProfile == llvm::ARM::PK_M) {
> +      MaxAtomicPromoteWidth = 32;
> +      if (ShouldUseInlineAtomic)
> +        MaxAtomicInlineWidth = 32;
> +    }
> +    else {
> +      MaxAtomicPromoteWidth = 64;
> +      if (ShouldUseInlineAtomic)
> +        MaxAtomicInlineWidth = 64;
> +    }
> +  }
> +
>  public:
>    ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
>        : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
> @@ -4163,12 +4160,21 @@ public:
>        break;
>      }
>
> +    // if subArch is not specified Arc Info is based on the default CPU
> +    if (Triple.getSubArch() == llvm::Triple::SubArchType::NoSubArch) {
> +      unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
> +      setArchInfo(llvm::ARMTargetParser::getArchName(ArchKind));
> +    }
> +    else
> +      setArchInfo(Triple.getArchName());
> +
>      // {} in inline assembly are neon specifiers, not assembly variant
>      // specifiers.
>      NoAsmVariants = true;
>
> -    // FIXME: Should we just treat this as a feature?
> -    IsThumb = getTriple().getArchName().startswith("thumb");
> +    // FIXME: this should be updated also when calling setCPU
> +    // currently causes regressions
> +    IsThumb = (ArchISA == llvm::ARM::IK_THUMB);
>
>      // FIXME: This duplicates code from the driver that sets the -target-abi
>      // option - this code is used if -target-abi isn't passed and should
> @@ -4213,11 +4219,6 @@ public:
>      // ARM targets default to using the ARM C++ ABI.
>      TheCXXABI.set(TargetCXXABI::GenericARM);
>
> -    // ARM has atomics up to 8 bytes
> -    MaxAtomicPromoteWidth = 64;
> -    if (shouldUseInlineAtomic(getTriple()))
> -      MaxAtomicInlineWidth = 64;
> -
>      // Do force alignment of members that follow zero length bitfields.  If
>      // the alignment of the zero-length bitfield is greater than the member
>      // that follows it, `bar', `bar' will be aligned as the  type of the
> @@ -4247,11 +4248,6 @@ public:
>
>    // FIXME: This should be based on Arch attributes, not CPU names.
>    void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
> -    StringRef ArchName = getTriple().getArchName();
> -    unsigned ArchKind = llvm::ARMTargetParser::parseArch(ArchName);
> -    bool IsV8 = (ArchKind == llvm::ARM::AK_ARMV8A ||
> -                 ArchKind == llvm::ARM::AK_ARMV8_1A);
> -
>      if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
>        Features["vfp2"] = true;
>      else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
> @@ -4276,7 +4272,7 @@ public:
>        Features["hwdiv-arm"] = true;
>        Features["crc"] = true;
>        Features["crypto"] = true;
> -    } else if (CPU == "cortex-r5" || CPU == "cortex-r7" || IsV8) {
> +    } else if (CPU == "cortex-r5" || CPU == "cortex-r7" || ArchVersion == 8) {
>        Features["hwdiv"] = true;
>        Features["hwdiv-arm"] = true;
>      } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
> @@ -4359,26 +4355,14 @@ public:
>          .Case("hwdiv-arm", HWDiv & HWDivARM)
>          .Default(false);
>    }
> -  const char *getCPUDefineSuffix(StringRef Name) const {
> -    if(Name == "generic") {
> -      auto subarch = getTriple().getSubArch();
> -      switch (subarch) {
> -        case llvm::Triple::SubArchType::ARMSubArch_v8_1a:
> -          return "8_1A";
> -        default:
> -          break;
> -      }
> -    }
> -
> -    unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(Name);
> -    if (ArchKind == llvm::ARM::AK_INVALID)
> -      return "";
> -
> +  const char *getCPUAttr() const {
> +    const char *CPUAttr;
>      // For most sub-arches, the build attribute CPU name is enough.
>      // For Cortex variants, it's slightly different.
>      switch(ArchKind) {
>      default:
> -      return llvm::ARMTargetParser::getCPUAttr(ArchKind);
> +      CPUAttr = llvm::ARMTargetParser::getCPUAttr(ArchKind);
> +      return CPUAttr ? CPUAttr : "" ;
>      case llvm::ARM::AK_ARMV6M:
>      case llvm::ARM::AK_ARMV6SM:
>        return "6M";
> @@ -4398,23 +4382,8 @@ public:
>        return "8_1A";
>      }
>    }
> -  const char *getCPUProfile(StringRef Name) const {
> -    if(Name == "generic") {
> -      auto subarch = getTriple().getSubArch();
> -      switch (subarch) {
> -        case llvm::Triple::SubArchType::ARMSubArch_v8_1a:
> -          return "A";
> -        default:
> -          break;
> -      }
> -    }
> -
> -    unsigned CPUArch = llvm::ARMTargetParser::parseCPUArch(Name);
> -    if (CPUArch == llvm::ARM::AK_INVALID)
> -      return "";
> -
> -    StringRef ArchName = llvm::ARMTargetParser::getArchName(CPUArch);
> -    switch(llvm::ARMTargetParser::parseArchProfile(ArchName)) {
> +  const char *getCPUProfile() const {
> +    switch(ArchProfile) {
>        case llvm::ARM::PK_A:
>          return "A";
>        case llvm::ARM::PK_R:
> @@ -4426,35 +4395,28 @@ public:
>      }
>    }
>    bool setCPU(const std::string &Name) override {
> -    if (!getCPUDefineSuffix(Name))
> +    unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(Name);
> +
> +    if (ArchKind == llvm::ARM::AK_INVALID)
>        return false;
>
> -    // Cortex M does not support 8 byte atomics, while general Thumb2 does.
> -    StringRef Profile = getCPUProfile(Name);
> -    if (Profile == "M" && MaxAtomicInlineWidth) {
> -      MaxAtomicPromoteWidth = 32;
> -      MaxAtomicInlineWidth = 32;
> -    }
> +    setArchInfo(llvm::ARMTargetParser::getArchName(ArchKind));
>
>      CPU = Name;
>      return true;
>    }
>    bool setFPMath(StringRef Name) override;
> -  bool supportsThumb(StringRef ArchName, StringRef CPUArch,
> -                     unsigned CPUArchVer) const {
> -    return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
> -           (CPUArch.find('M') != StringRef::npos);
> -  }
> -  bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
> -                      unsigned CPUArchVer) const {
> -    // We check both CPUArchVer and ArchName because when only triple is
> -    // specified, the default CPU is arm1136j-s.
> -    return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
> -           ArchName.endswith("v8.1a") ||
> -           ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
> +  bool supportsThumb(StringRef CPUAttr) const {
> +    return CPUAttr.count('T') || ArchVersion >= 6;
> +  }
> +  bool supportsThumb2(StringRef CPUAttr) const {
> +    return CPUAttr.equals("6T2") || ArchVersion >= 7;
>    }
>    void getTargetDefines(const LangOptions &Opts,
>                          MacroBuilder &Builder) const override {
> +    StringRef CPUAttr    = getCPUAttr();
> +    StringRef CPUProfile = getCPUProfile();
> +
>      // Target identification.
>      Builder.defineMacro("__arm");
>      Builder.defineMacro("__arm__");
> @@ -4462,19 +4424,12 @@ public:
>      // Target properties.
>      Builder.defineMacro("__REGISTER_PREFIX__", "");
>
> -    StringRef CPUArch = getCPUDefineSuffix(CPU);
> -    unsigned int CPUArchVer;
> -    if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
> -      llvm_unreachable("Invalid char for architecture version number");
> -    Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
> +    Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
>
>      // ACLE 6.4.1 ARM/Thumb instruction set architecture
> -    StringRef CPUProfile = getCPUProfile(CPU);
> -    StringRef ArchName = getTriple().getArchName();
> -
>      // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
> -    Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
> -    if (CPUArch[0] >= '8') {
> +    Builder.defineMacro("__ARM_ARCH", std::to_string(ArchVersion));
> +    if (ArchVersion >= 8) {
>        Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
>        Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
>      }
> @@ -4488,9 +4443,9 @@ public:
>      // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
>      // Thumb ISA (including v6-M).  It is set to 2 if the core supports the
>      // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
> -    if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
> +    if (supportsThumb2(CPUAttr))
>        Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
> -    else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
> +    else if (supportsThumb(CPUAttr))
>        Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
>
>      // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
> @@ -4515,7 +4470,7 @@ public:
>      // FIXME: It's more complicated than this and we don't really support
>      // interworking.
>      // Windows on ARM does not "support" interworking
> -    if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
> +    if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
>        Builder.defineMacro("__THUMB_INTERWORK__");
>
>      if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
> @@ -4538,7 +4493,7 @@ public:
>      if (IsThumb) {
>        Builder.defineMacro("__THUMBEL__");
>        Builder.defineMacro("__thumb__");
> -      if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
> +      if (supportsThumb2(CPUAttr))
>          Builder.defineMacro("__thumb2__");
>      }
>      if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
> @@ -4561,7 +4516,7 @@ public:
>      // the VFP define, hence the soft float and arch check. This is subtly
>      // different from gcc, we follow the intent which was that it should be set
>      // when Neon instructions are actually available.
> -    if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
> +    if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
>        Builder.defineMacro("__ARM_NEON");
>        Builder.defineMacro("__ARM_NEON__");
>      }
> @@ -4578,18 +4533,18 @@ public:
>      if (Crypto)
>        Builder.defineMacro("__ARM_FEATURE_CRYPTO");
>
> -    if (CPUArchVer >= 6 && CPUArch != "6M") {
> +    if (ArchVersion >= 6 && CPUAttr != "6M") {
>        Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
>        Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
>        Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
>        Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
>      }
>
> -    bool is5EOrAbove = (CPUArchVer >= 6 ||
> -                        (CPUArchVer == 5 &&
> -                         CPUArch.find('E') != StringRef::npos));
> -    bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
> -    if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch  == "7EM"))
> +    bool is5EOrAbove = (ArchVersion >= 6 ||
> +                       (ArchVersion == 5 && CPUAttr.count('E')));
> +    // FIXME: We are not getting all 32-bit ARM architectures
> +    bool is32Bit = (!IsThumb || supportsThumb2(CPUAttr));
> +    if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUAttr  == "7EM"))
>        Builder.defineMacro("__ARM_FEATURE_DSP");
>    }
>    void getTargetBuiltins(const Builtin::Info *&Records,
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list