| Jim Laskey | 3fee6a5 | 2005-09-01 21:36:18 +0000 | [diff] [blame] | 1 | //===- SubtargetFeature.cpp - CPU characteristics Implementation ----------===// |
| 2 | // |
| Chandler Carruth | 2946cd7 | 2019-01-19 08:50:56 +0000 | [diff] [blame] | 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| Jim Laskey | 3fee6a5 | 2005-09-01 21:36:18 +0000 | [diff] [blame] | 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | // |
| Matthias Braun | 05e5fd6 | 2017-02-21 01:27:29 +0000 | [diff] [blame] | 9 | /// \file Implements the SubtargetFeature interface. |
| Jim Laskey | 3fee6a5 | 2005-09-01 21:36:18 +0000 | [diff] [blame] | 10 | // |
| 11 | //===----------------------------------------------------------------------===// |
| 12 | |
| Chandler Carruth | 6bda14b | 2017-06-06 11:49:48 +0000 | [diff] [blame] | 13 | #include "llvm/MC/SubtargetFeature.h" |
| Eugene Zelenko | 44d9512 | 2017-02-09 01:09:54 +0000 | [diff] [blame] | 14 | #include "llvm/ADT/SmallVector.h" |
| Benjamin Kramer | 5377ad6 | 2015-05-28 11:45:32 +0000 | [diff] [blame] | 15 | #include "llvm/ADT/StringExtras.h" |
| Eugene Zelenko | 44d9512 | 2017-02-09 01:09:54 +0000 | [diff] [blame] | 16 | #include "llvm/ADT/StringRef.h" |
| 17 | #include "llvm/ADT/Triple.h" |
| Nico Weber | 432a388 | 2018-04-30 14:59:11 +0000 | [diff] [blame] | 18 | #include "llvm/Config/llvm-config.h" |
| Eugene Zelenko | 44d9512 | 2017-02-09 01:09:54 +0000 | [diff] [blame] | 19 | #include "llvm/Support/Compiler.h" |
| David Greene | 24328b9 | 2010-01-05 01:29:36 +0000 | [diff] [blame] | 20 | #include "llvm/Support/Debug.h" |
| Chris Lattner | f31ef09 | 2009-08-23 21:41:43 +0000 | [diff] [blame] | 21 | #include "llvm/Support/raw_ostream.h" |
| Jim Laskey | 3fee6a5 | 2005-09-01 21:36:18 +0000 | [diff] [blame] | 22 | #include <algorithm> |
| Jim Laskey | 3fee6a5 | 2005-09-01 21:36:18 +0000 | [diff] [blame] | 23 | #include <cassert> |
| Eugene Zelenko | 44d9512 | 2017-02-09 01:09:54 +0000 | [diff] [blame] | 24 | #include <cstddef> |
| 25 | #include <cstring> |
| 26 | #include <iterator> |
| 27 | #include <string> |
| 28 | #include <vector> |
| 29 | |
| Jim Laskey | 3fee6a5 | 2005-09-01 21:36:18 +0000 | [diff] [blame] | 30 | using namespace llvm; |
| 31 | |
| Matthias Braun | 05e5fd6 | 2017-02-21 01:27:29 +0000 | [diff] [blame] | 32 | /// Splits a string of comma separated items in to a vector of strings. |
| Craig Topper | 16fc15a | 2019-03-05 18:54:30 +0000 | [diff] [blame] | 33 | void SubtargetFeatures::Split(std::vector<std::string> &V, StringRef S) { |
| Hans Wennborg | 4fa2fd1 | 2014-08-11 02:21:32 +0000 | [diff] [blame] | 34 | SmallVector<StringRef, 3> Tmp; |
| Chandler Carruth | e4405e9 | 2015-09-10 06:12:31 +0000 | [diff] [blame] | 35 | S.split(Tmp, ',', -1, false /* KeepEmpty */); |
| Eric Christopher | addf51d | 2014-05-13 19:55:17 +0000 | [diff] [blame] | 36 | V.assign(Tmp.begin(), Tmp.end()); |
| Jim Laskey | 3fee6a5 | 2005-09-01 21:36:18 +0000 | [diff] [blame] | 37 | } |
| 38 | |
| Craig Topper | f8cfe1d | 2015-03-31 05:52:57 +0000 | [diff] [blame] | 39 | void SubtargetFeatures::AddFeature(StringRef String, bool Enable) { |
| Craig Topper | 28f550b | 2015-03-28 03:24:19 +0000 | [diff] [blame] | 40 | // Don't add empty features. |
| Eric Christopher | 7eba3f9 | 2014-05-06 02:37:26 +0000 | [diff] [blame] | 41 | if (!String.empty()) |
| 42 | // Convert to lowercase, prepend flag if we don't already have a flag. |
| Craig Topper | f8cfe1d | 2015-03-31 05:52:57 +0000 | [diff] [blame] | 43 | Features.push_back(hasFlag(String) ? String.lower() |
| 44 | : (Enable ? "+" : "-") + String.lower()); |
| Jim Laskey | 3fee6a5 | 2005-09-01 21:36:18 +0000 | [diff] [blame] | 45 | } |
| 46 | |
| Craig Topper | 6dc4a8bc | 2014-08-30 16:48:02 +0000 | [diff] [blame] | 47 | SubtargetFeatures::SubtargetFeatures(StringRef Initial) { |
| Chris Lattner | 18a70c3 | 2005-10-23 05:26:26 +0000 | [diff] [blame] | 48 | // Break up string into separate features |
| 49 | Split(Features, Initial); |
| 50 | } |
| 51 | |
| Rafael Espindola | 968af4f | 2011-07-01 04:40:50 +0000 | [diff] [blame] | 52 | std::string SubtargetFeatures::getString() const { |
| Benjamin Kramer | 5377ad6 | 2015-05-28 11:45:32 +0000 | [diff] [blame] | 53 | return join(Features.begin(), Features.end(), ","); |
| Chris Lattner | 18a70c3 | 2005-10-23 05:26:26 +0000 | [diff] [blame] | 54 | } |
| Chris Lattner | 18a70c3 | 2005-10-23 05:26:26 +0000 | [diff] [blame] | 55 | |
| Chris Lattner | f31ef09 | 2009-08-23 21:41:43 +0000 | [diff] [blame] | 56 | void SubtargetFeatures::print(raw_ostream &OS) const { |
| Eric Christopher | 9c92847 | 2014-05-06 21:20:29 +0000 | [diff] [blame] | 57 | for (auto &F : Features) |
| 58 | OS << F << " "; |
| Jim Laskey | 3fee6a5 | 2005-09-01 21:36:18 +0000 | [diff] [blame] | 59 | OS << "\n"; |
| 60 | } |
| 61 | |
| Aaron Ballman | 615eb47 | 2017-10-15 14:32:27 +0000 | [diff] [blame] | 62 | #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) |
| Yaron Keren | eb2a254 | 2016-01-29 20:50:44 +0000 | [diff] [blame] | 63 | LLVM_DUMP_METHOD void SubtargetFeatures::dump() const { |
| David Greene | 24328b9 | 2010-01-05 01:29:36 +0000 | [diff] [blame] | 64 | print(dbgs()); |
| Jim Laskey | 3fee6a5 | 2005-09-01 21:36:18 +0000 | [diff] [blame] | 65 | } |
| Matthias Braun | 8c209aa | 2017-01-28 02:02:38 +0000 | [diff] [blame] | 66 | #endif |
| Viktor Kutuzov | c3e2b6b | 2009-11-18 20:20:05 +0000 | [diff] [blame] | 67 | |
| Evan Cheng | fe6e405 | 2011-06-30 01:53:36 +0000 | [diff] [blame] | 68 | void SubtargetFeatures::getDefaultSubtargetFeatures(const Triple& Triple) { |
| Matthias Braun | 05e5fd6 | 2017-02-21 01:27:29 +0000 | [diff] [blame] | 69 | // FIXME: This is an inelegant way of specifying the features of a |
| 70 | // subtarget. It would be better if we could encode this information |
| 71 | // into the IR. See <rdar://5972456>. |
| Bill Wendling | 508f661 | 2010-05-11 20:46:04 +0000 | [diff] [blame] | 72 | if (Triple.getVendor() == Triple::Apple) { |
| 73 | if (Triple.getArch() == Triple::ppc) { |
| 74 | // powerpc-apple-* |
| 75 | AddFeature("altivec"); |
| 76 | } else if (Triple.getArch() == Triple::ppc64) { |
| 77 | // powerpc64-apple-* |
| 78 | AddFeature("64bit"); |
| 79 | AddFeature("altivec"); |
| Viktor Kutuzov | c3e2b6b | 2009-11-18 20:20:05 +0000 | [diff] [blame] | 80 | } |
| Bill Wendling | a12c1ff | 2010-05-11 00:30:02 +0000 | [diff] [blame] | 81 | } |
| Viktor Kutuzov | c3e2b6b | 2009-11-18 20:20:05 +0000 | [diff] [blame] | 82 | } |