blob: c4dd77359b24a023409d72483ae7372f3e7f8e22 [file] [log] [blame]
Jim Laskey3fee6a52005-09-01 21:36:18 +00001//===- SubtargetFeature.cpp - CPU characteristics Implementation ----------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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 Laskey3fee6a52005-09-01 21:36:18 +00006//
7//===----------------------------------------------------------------------===//
8//
Matthias Braun05e5fd62017-02-21 01:27:29 +00009/// \file Implements the SubtargetFeature interface.
Jim Laskey3fee6a52005-09-01 21:36:18 +000010//
11//===----------------------------------------------------------------------===//
12
Chandler Carruth6bda14b2017-06-06 11:49:48 +000013#include "llvm/MC/SubtargetFeature.h"
Eugene Zelenko44d95122017-02-09 01:09:54 +000014#include "llvm/ADT/SmallVector.h"
Benjamin Kramer5377ad62015-05-28 11:45:32 +000015#include "llvm/ADT/StringExtras.h"
Eugene Zelenko44d95122017-02-09 01:09:54 +000016#include "llvm/ADT/StringRef.h"
17#include "llvm/ADT/Triple.h"
Nico Weber432a3882018-04-30 14:59:11 +000018#include "llvm/Config/llvm-config.h"
Eugene Zelenko44d95122017-02-09 01:09:54 +000019#include "llvm/Support/Compiler.h"
David Greene24328b92010-01-05 01:29:36 +000020#include "llvm/Support/Debug.h"
Chris Lattnerf31ef092009-08-23 21:41:43 +000021#include "llvm/Support/raw_ostream.h"
Jim Laskey3fee6a52005-09-01 21:36:18 +000022#include <algorithm>
Jim Laskey3fee6a52005-09-01 21:36:18 +000023#include <cassert>
Eugene Zelenko44d95122017-02-09 01:09:54 +000024#include <cstddef>
25#include <cstring>
26#include <iterator>
27#include <string>
28#include <vector>
29
Jim Laskey3fee6a52005-09-01 21:36:18 +000030using namespace llvm;
31
Matthias Braun05e5fd62017-02-21 01:27:29 +000032/// Splits a string of comma separated items in to a vector of strings.
Craig Topper16fc15a2019-03-05 18:54:30 +000033void SubtargetFeatures::Split(std::vector<std::string> &V, StringRef S) {
Hans Wennborg4fa2fd12014-08-11 02:21:32 +000034 SmallVector<StringRef, 3> Tmp;
Chandler Carruthe4405e92015-09-10 06:12:31 +000035 S.split(Tmp, ',', -1, false /* KeepEmpty */);
Eric Christopheraddf51d2014-05-13 19:55:17 +000036 V.assign(Tmp.begin(), Tmp.end());
Jim Laskey3fee6a52005-09-01 21:36:18 +000037}
38
Craig Topperf8cfe1d2015-03-31 05:52:57 +000039void SubtargetFeatures::AddFeature(StringRef String, bool Enable) {
Craig Topper28f550b2015-03-28 03:24:19 +000040 // Don't add empty features.
Eric Christopher7eba3f92014-05-06 02:37:26 +000041 if (!String.empty())
42 // Convert to lowercase, prepend flag if we don't already have a flag.
Craig Topperf8cfe1d2015-03-31 05:52:57 +000043 Features.push_back(hasFlag(String) ? String.lower()
44 : (Enable ? "+" : "-") + String.lower());
Jim Laskey3fee6a52005-09-01 21:36:18 +000045}
46
Craig Topper6dc4a8bc2014-08-30 16:48:02 +000047SubtargetFeatures::SubtargetFeatures(StringRef Initial) {
Chris Lattner18a70c32005-10-23 05:26:26 +000048 // Break up string into separate features
49 Split(Features, Initial);
50}
51
Rafael Espindola968af4f2011-07-01 04:40:50 +000052std::string SubtargetFeatures::getString() const {
Benjamin Kramer5377ad62015-05-28 11:45:32 +000053 return join(Features.begin(), Features.end(), ",");
Chris Lattner18a70c32005-10-23 05:26:26 +000054}
Chris Lattner18a70c32005-10-23 05:26:26 +000055
Chris Lattnerf31ef092009-08-23 21:41:43 +000056void SubtargetFeatures::print(raw_ostream &OS) const {
Eric Christopher9c928472014-05-06 21:20:29 +000057 for (auto &F : Features)
58 OS << F << " ";
Jim Laskey3fee6a52005-09-01 21:36:18 +000059 OS << "\n";
60}
61
Aaron Ballman615eb472017-10-15 14:32:27 +000062#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
Yaron Kereneb2a2542016-01-29 20:50:44 +000063LLVM_DUMP_METHOD void SubtargetFeatures::dump() const {
David Greene24328b92010-01-05 01:29:36 +000064 print(dbgs());
Jim Laskey3fee6a52005-09-01 21:36:18 +000065}
Matthias Braun8c209aa2017-01-28 02:02:38 +000066#endif
Viktor Kutuzovc3e2b6b2009-11-18 20:20:05 +000067
Evan Chengfe6e4052011-06-30 01:53:36 +000068void SubtargetFeatures::getDefaultSubtargetFeatures(const Triple& Triple) {
Matthias Braun05e5fd62017-02-21 01:27:29 +000069 // 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 Wendling508f6612010-05-11 20:46:04 +000072 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 Kutuzovc3e2b6b2009-11-18 20:20:05 +000080 }
Bill Wendlinga12c1ff2010-05-11 00:30:02 +000081 }
Viktor Kutuzovc3e2b6b2009-11-18 20:20:05 +000082}