//===-- X86TargetParser - Parser for X86 features ---------------*- C++ -*-===// // // 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 // //===----------------------------------------------------------------------===// // // This file implements a target parser to recognise X86 hardware features. // //===----------------------------------------------------------------------===// #ifndef LLVM_TARGETPARSER_X86TARGETPARSER_H #define LLVM_TARGETPARSER_X86TARGETPARSER_H #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringMap.h" #include <array> namespace llvm { template <typename T> class SmallVectorImpl; class StringRef; namespace X86 { // This should be kept in sync with libcc/compiler-rt as its included by clang // as a proxy for what's in libgcc/compiler-rt. enum ProcessorVendors : unsigned { … }; // This should be kept in sync with libcc/compiler-rt as its included by clang // as a proxy for what's in libgcc/compiler-rt. enum ProcessorTypes : unsigned { … }; // This should be kept in sync with libcc/compiler-rt as its included by clang // as a proxy for what's in libgcc/compiler-rt. enum ProcessorSubtypes : unsigned { … }; // This should be kept in sync with libcc/compiler-rt as it should be used // by clang as a proxy for what's in libgcc/compiler-rt. enum ProcessorFeatures { … }; enum CPUKind { … }; /// Parse \p CPU string into a CPUKind. Will only accept 64-bit capable CPUs if /// \p Only64Bit is true. CPUKind parseArchX86(StringRef CPU, bool Only64Bit = false); CPUKind parseTuneCPU(StringRef CPU, bool Only64Bit = false); /// Provide a list of valid CPU names. If \p Only64Bit is true, the list will /// only contain 64-bit capable CPUs. void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values, bool Only64Bit = false); /// Provide a list of valid -mtune names. void fillValidTuneCPUList(SmallVectorImpl<StringRef> &Values, bool Only64Bit = false); /// Get the key feature prioritizing target multiversioning. ProcessorFeatures getKeyFeature(CPUKind Kind); /// Fill in the features that \p CPU supports into \p Features. /// "+" will be append in front of each feature if NeedPlus is true. void getFeaturesForCPU(StringRef CPU, SmallVectorImpl<StringRef> &Features, bool NeedPlus = false); /// Set or clear entries in \p Features that are implied to be enabled/disabled /// by the provided \p Feature. void updateImpliedFeatures(StringRef Feature, bool Enabled, StringMap<bool> &Features); char getCPUDispatchMangling(StringRef Name); bool validateCPUSpecificCPUDispatch(StringRef Name); std::array<uint32_t, 4> getCpuSupportsMask(ArrayRef<StringRef> FeatureStrs); unsigned getFeaturePriority(ProcessorFeatures Feat); } // namespace X86 } // namespace llvm #endif