summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Christopher <echristo@gmail.com>2015-08-28 02:13:58 +0000
committerEric Christopher <echristo@gmail.com>2015-08-28 02:13:58 +0000
commitef1e295a8c15c5f446b6defad1142d14cd705394 (patch)
treed2ebd5768e20487d97da20a608574fdbdebee482
parentf9c19da03a2f56da38a05ad6c126da49c1fafd58 (diff)
downloadbcm5719-llvm-ef1e295a8c15c5f446b6defad1142d14cd705394.tar.gz
bcm5719-llvm-ef1e295a8c15c5f446b6defad1142d14cd705394.zip
Merge the two feature map setting functions into a single function
and replace all callers. llvm-svn: 246259
-rw-r--r--clang/include/clang/Basic/TargetInfo.h9
-rw-r--r--clang/lib/Basic/Targets.cpp63
-rw-r--r--clang/lib/CodeGen/CGCall.cpp3
3 files changed, 42 insertions, 33 deletions
diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h
index b05d8669139..9db319ac2f0 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -742,8 +742,13 @@ public:
/// \brief Initialize the map with the default set of target features for the
/// CPU this should include all legal feature strings on the target.
- virtual void initDefaultFeatures(llvm::StringMap<bool> &Features,
- StringRef CPU) const {}
+ ///
+ /// \return False on error (invalid features).
+ virtual bool initFeatureMap(llvm::StringMap<bool> &Features,
+ DiagnosticsEngine &Diags, StringRef CPU,
+ std::vector<std::string> &FAW) const {
+ return handleUserFeatures(Features, FAW, Diags);
+ }
/// \brief Get the ABI currently in use.
virtual StringRef getABI() const { return StringRef(); }
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index eee181e7214..76da995665f 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -863,8 +863,9 @@ public:
void getTargetDefines(const LangOptions &Opts,
MacroBuilder &Builder) const override;
- void initDefaultFeatures(llvm::StringMap<bool> &Features,
- StringRef CPU) const override;
+ bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
+ StringRef CPU,
+ std::vector<std::string> &FAW) const override;
bool handleTargetFeatures(std::vector<std::string> &Features,
DiagnosticsEngine &Diags) override;
@@ -1050,37 +1051,32 @@ bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
}
bool PPCTargetInfo::handleUserFeatures(llvm::StringMap<bool> &Features,
- std::vector<std::string> &UserFeatures,
+ std::vector<std::string> &FAW,
DiagnosticsEngine &Diags) const {
-
// Handle explicit options being passed to the compiler here: if we've
// explicitly turned off vsx and turned on power8-vector or direct-move then
// go ahead and error since the customer has expressed a somewhat incompatible
// set of options.
- if (std::find(UserFeatures.begin(), UserFeatures.end(), "-vsx") !=
- UserFeatures.end()) {
- if (std::find(UserFeatures.begin(), UserFeatures.end(), "+power8-vector") !=
- UserFeatures.end()) {
+ if (std::find(FAW.begin(), FAW.end(), "-vsx") != FAW.end()) {
+ if (std::find(FAW.begin(), FAW.end(), "+power8-vector") != FAW.end()) {
Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
<< "-mno-vsx";
return false;
}
- if (std::find(UserFeatures.begin(), UserFeatures.end(), "+direct-move") !=
- UserFeatures.end()) {
+ if (std::find(FAW.begin(), FAW.end(), "+direct-move") != FAW.end()) {
Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
<< "-mno-vsx";
return false;
}
}
- for (const auto &F : UserFeatures) {
+ for (const auto &F : FAW) {
const char *Name = F.c_str();
// Apply the feature via the target.
bool Enabled = Name[0] == '+';
setFeatureEnabled(Features, Name + 1, Enabled);
}
-
return true;
}
@@ -1263,8 +1259,9 @@ void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
// __NO_FPRS__
}
-void PPCTargetInfo::initDefaultFeatures(llvm::StringMap<bool> &Features,
- StringRef CPU) const {
+bool PPCTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
+ DiagnosticsEngine &Diags, StringRef CPU,
+ std::vector<std::string> &FAW) const {
Features["altivec"] = llvm::StringSwitch<bool>(CPU)
.Case("7400", true)
.Case("g4", true)
@@ -1307,6 +1304,8 @@ void PPCTargetInfo::initDefaultFeatures(llvm::StringMap<bool> &Features,
.Case("pwr8", true)
.Case("pwr7", true)
.Default(false);
+
+ return handleUserFeatures(Features, FAW, Diags);
}
bool PPCTargetInfo::hasFeature(StringRef Feature) const {
@@ -2371,11 +2370,12 @@ public:
setFeatureEnabledImpl(Features, Name, Enabled);
}
// This exists purely to cut down on the number of virtual calls in
- // initDefaultFeatures which calls this repeatedly.
+ // initFeatureMap which calls this repeatedly.
static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
StringRef Name, bool Enabled);
- void initDefaultFeatures(llvm::StringMap<bool> &Features,
- StringRef CPU) const override;
+ bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
+ StringRef CPU,
+ std::vector<std::string> &FAW) const override;
bool hasFeature(StringRef Feature) const override;
bool handleTargetFeatures(std::vector<std::string> &Features,
DiagnosticsEngine &Diags) override;
@@ -2501,8 +2501,9 @@ bool X86TargetInfo::setFPMath(StringRef Name) {
return false;
}
-void X86TargetInfo::initDefaultFeatures(llvm::StringMap<bool> &Features,
- StringRef CPU) const {
+bool X86TargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
+ DiagnosticsEngine &Diags, StringRef CPU,
+ std::vector<std::string> &FAW) const {
// FIXME: This *really* should not be here.
// X86_64 always has SSE2.
@@ -2678,6 +2679,7 @@ void X86TargetInfo::initDefaultFeatures(llvm::StringMap<bool> &Features,
setFeatureEnabledImpl(Features, "cx16", true);
break;
}
+ return handleUserFeatures(Features, FAW, Diags);
}
void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
@@ -4397,8 +4399,9 @@ public:
}
// FIXME: This should be based on Arch attributes, not CPU names.
- void initDefaultFeatures(llvm::StringMap<bool> &Features,
- StringRef CPU) const override {
+ bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
+ StringRef CPU,
+ std::vector<std::string> &FAW) const override {
if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
Features["vfp2"] = true;
else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
@@ -4430,6 +4433,7 @@ public:
CPU == "sc300" || CPU == "cortex-r4" || CPU == "cortex-r4f") {
Features["hwdiv"] = true;
}
+ return handleUserFeatures(Features, FAW, Diags);
}
bool handleTargetFeatures(std::vector<std::string> &Features,
@@ -5841,14 +5845,16 @@ public:
return CPUKnown;
}
- void initDefaultFeatures(llvm::StringMap<bool> &Features,
- StringRef CPU) const override {
+ bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
+ StringRef CPU,
+ std::vector<std::string> &FAW) const override {
if (CPU == "zEC12")
Features["transactional-execution"] = true;
if (CPU == "z13") {
Features["transactional-execution"] = true;
Features["vector"] = true;
}
+ return handleUserFeatures(Features, FAW, Diags);
}
bool handleTargetFeatures(std::vector<std::string> &Features,
@@ -6209,12 +6215,14 @@ public:
.Default(false);
}
const std::string& getCPU() const { return CPU; }
- void initDefaultFeatures(llvm::StringMap<bool> &Features,
- StringRef CPU) const override {
+ bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
+ StringRef CPU,
+ std::vector<std::string> &FAW) const override {
if (CPU == "octeon")
Features["mips64r2"] = Features["cnmips"] = true;
else
Features[CPU] = true;
+ return handleUserFeatures(Features, FAW, Diags);
}
void getTargetDefines(const LangOptions &Opts,
@@ -7500,10 +7508,7 @@ TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
// Compute the default target features, we need the target to handle this
// because features may have dependencies on one another.
llvm::StringMap<bool> Features;
- Target->initDefaultFeatures(Features, Opts->CPU);
-
- // Apply the user specified deltas.
- if (!Target->handleUserFeatures(Features, Opts->FeaturesAsWritten, Diags))
+ if (!Target->initFeatureMap(Features, Diags, Opts->CPU, Opts->FeaturesAsWritten))
return nullptr;
// Add the features to the compile options.
diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp
index d5997e51180..fac25168631 100644
--- a/clang/lib/CodeGen/CGCall.cpp
+++ b/clang/lib/CodeGen/CGCall.cpp
@@ -1538,8 +1538,7 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
// the default or a new one from the target attribute string. Then we'll
// use the passed in features (FeaturesAsWritten) along with the new ones
// from the attribute.
- getTarget().initDefaultFeatures(FeatureMap, TargetCPU);
- getTarget().handleUserFeatures(FeatureMap, FnFeatures, Diags);
+ getTarget().initFeatureMap(FeatureMap, Diags, TargetCPU, FnFeatures);
// Produce the canonical string for this set of features.
std::vector<std::string> Features;
OpenPOWER on IntegriCloud