summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/include/clang/Basic/TargetInfo.h16
-rw-r--r--clang/lib/Basic/Targets.cpp8
2 files changed, 18 insertions, 6 deletions
diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h
index c804b2d0364..acb5f726eaf 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -797,6 +797,22 @@ public:
Features[Name] = Enabled;
}
+ /// \brief Add user defined features to the feature set while
+ /// possibly diagnosing incompatibilities.
+ ///
+ /// \return False on error.
+ virtual bool handleUserFeatures(llvm::StringMap<bool> &Features,
+ std::vector<std::string> &UserFeatures,
+ DiagnosticsEngine &Diags) {
+ for (const auto &F : UserFeatures) {
+ const char *Name = F.c_str();
+ // Apply the feature via the target.
+ bool Enabled = Name[0] == '+';
+ setFeatureEnabled(Features, Name + 1, Enabled);
+ }
+ return true;
+ }
+
/// \brief Perform initialization based on the user configured
/// set of features (e.g., +sse4).
///
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index b78e2817f0e..5c4a016b554 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -7565,12 +7565,8 @@ TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Target->initDefaultFeatures(Features);
// Apply the user specified deltas.
- for (const auto &F : Opts->FeaturesAsWritten) {
- const char *Name = F.c_str();
- // Apply the feature via the target.
- bool Enabled = Name[0] == '+';
- Target->setFeatureEnabled(Features, Name + 1, Enabled);
- }
+ if (!Target->handleUserFeatures(Features, Opts->FeaturesAsWritten, Diags))
+ return nullptr;
// Add the features to the compile options.
//
OpenPOWER on IntegriCloud