LLVM 20.0.0git
SubtargetFeature.cpp
Go to the documentation of this file.
1//===- SubtargetFeature.cpp - CPU characteristics Implementation ----------===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8//
9/// \file Implements the SubtargetFeature interface.
10//
11//===----------------------------------------------------------------------===//
12
16#include "llvm/ADT/StringRef.h"
17#include "llvm/Config/llvm-config.h"
19#include "llvm/Support/Debug.h"
22#include <string>
23#include <vector>
24
25using namespace llvm;
26
27/// Splits a string of comma separated items in to a vector of strings.
28void SubtargetFeatures::Split(std::vector<std::string> &V, StringRef S) {
30 S.split(Tmp, ',', -1, false /* KeepEmpty */);
31 V.reserve(Tmp.size());
32 for (StringRef T : Tmp)
33 V.push_back(std::string(T));
34}
35
37 // Don't add empty features.
38 if (!String.empty())
39 // Convert to lowercase, prepend flag if we don't already have a flag.
40 Features.push_back(hasFlag(String) ? String.lower()
41 : (Enable ? "+" : "-") + String.lower());
42}
43
45 const ArrayRef<std::string> OtherFeatures) {
46 Features.insert(Features.cend(), OtherFeatures.begin(), OtherFeatures.end());
47}
48
50 // Break up string into separate features
51 Split(Features, Initial);
52}
53
54std::string SubtargetFeatures::getString() const {
55 return join(Features.begin(), Features.end(), ",");
56}
57
59 for (const auto &F : Features)
60 OS << F << " ";
61 OS << "\n";
62}
63
64#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
66 print(dbgs());
67}
68#endif
69
71 // FIXME: This is an inelegant way of specifying the features of a
72 // subtarget. It would be better if we could encode this information
73 // into the IR.
75 if (Triple.getArch() == Triple::ppc) {
76 // powerpc-apple-*
77 AddFeature("altivec");
78 } else if (Triple.getArch() == Triple::ppc64) {
79 // powerpc64-apple-*
80 AddFeature("64bit");
81 AddFeature("altivec");
82 }
83 }
84}
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition: Compiler.h:622
#define F(x, y, z)
Definition: MD5.cpp:55
raw_pwrite_stream & OS
This file defines the SmallVector class.
This file contains some functions that are useful when dealing with strings.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
iterator end() const
Definition: ArrayRef.h:157
iterator begin() const
Definition: ArrayRef.h:156
size_t size() const
Definition: SmallVector.h:78
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
Definition: StringRef.h:700
static void Split(std::vector< std::string > &V, StringRef S)
Splits a string of comma separated items in to a vector of strings.
void getDefaultSubtargetFeatures(const Triple &Triple)
Adds the default features for the specified target triple.
static bool hasFlag(StringRef Feature)
Determine if a feature has a flag; '+' or '-'.
void print(raw_ostream &OS) const
Prints feature string.
std::string getString() const
Returns features as a string.
SubtargetFeatures(StringRef Initial="")
void AddFeature(StringRef String, bool Enable=true)
Adds Features.
void addFeaturesVector(const ArrayRef< std::string > OtherFeatures)
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
ArchType getArch() const
Get the parsed architecture type of this triple.
Definition: Triple.h:383
VendorType getVendor() const
Get the parsed vendor type of this triple.
Definition: Triple.h:389
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
@ Enable
Enable colors.