diff options
author | Yaxun (Sam) Liu <yaxun.liu@amd.com> | 2020-06-25 10:03:31 -0400 |
---|---|---|
committer | Yaxun (Sam) Liu <yaxun.liu@amd.com> | 2020-06-25 23:17:08 -0400 |
commit | ed398c3ca404f9ec50b134863a227555a9e374df (patch) | |
tree | 7bc5cfef2092eacecf16dd6d4339d779071476cf /clang/lib | |
parent | e0c02dc9800ebd317d1369848f4e74c8f783533a (diff) | |
download | llvm-ed398c3ca404f9ec50b134863a227555a9e374df.zip llvm-ed398c3ca404f9ec50b134863a227555a9e374df.tar.gz llvm-ed398c3ca404f9ec50b134863a227555a9e374df.tar.bz2 |
[NFC] Extract unifyTargetFeatures
Differential Revision: https://reviews.llvm.org/D82579
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Driver/ToolChains/Clang.cpp | 20 | ||||
-rw-r--r-- | clang/lib/Driver/ToolChains/CommonArgs.cpp | 25 | ||||
-rw-r--r-- | clang/lib/Driver/ToolChains/CommonArgs.h | 10 |
3 files changed, 37 insertions, 18 deletions
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index d908e00..8903641 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -374,25 +374,9 @@ static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple, ve::getVETargetFeatures(D, Args, Features); } - // Find the last of each feature. - llvm::StringMap<unsigned> LastOpt; - for (unsigned I = 0, N = Features.size(); I < N; ++I) { - StringRef Name = Features[I]; - assert(Name[0] == '-' || Name[0] == '+'); - LastOpt[Name.drop_front(1)] = I; - } - - for (unsigned I = 0, N = Features.size(); I < N; ++I) { - // If this feature was overridden, ignore it. - StringRef Name = Features[I]; - llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name.drop_front(1)); - assert(LastI != LastOpt.end()); - unsigned Last = LastI->second; - if (Last != I) - continue; - + for (auto Feature : unifyTargetFeatures(Features)) { CmdArgs.push_back(IsAux ? "-aux-target-feature" : "-target-feature"); - CmdArgs.push_back(Name.data()); + CmdArgs.push_back(Feature.data()); } } diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 2a9d7e3..976db3f 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -84,6 +84,31 @@ void tools::handleTargetFeaturesGroup(const ArgList &Args, } } +std::vector<StringRef> +tools::unifyTargetFeatures(const std::vector<StringRef> &Features) { + std::vector<StringRef> UnifiedFeatures; + // Find the last of each feature. + llvm::StringMap<unsigned> LastOpt; + for (unsigned I = 0, N = Features.size(); I < N; ++I) { + StringRef Name = Features[I]; + assert(Name[0] == '-' || Name[0] == '+'); + LastOpt[Name.drop_front(1)] = I; + } + + for (unsigned I = 0, N = Features.size(); I < N; ++I) { + // If this feature was overridden, ignore it. + StringRef Name = Features[I]; + llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name.drop_front(1)); + assert(LastI != LastOpt.end()); + unsigned Last = LastI->second; + if (Last != I) + continue; + + UnifiedFeatures.push_back(Name); + } + return UnifiedFeatures; +} + void tools::addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs, const char *ArgName, const char *EnvVar) { const char *DirList = ::getenv(EnvVar); diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h b/clang/lib/Driver/ToolChains/CommonArgs.h index c7d695e..29dedec 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.h +++ b/clang/lib/Driver/ToolChains/CommonArgs.h @@ -106,10 +106,20 @@ void AddTargetFeature(const llvm::opt::ArgList &Args, std::string getCPUName(const llvm::opt::ArgList &Args, const llvm::Triple &T, bool FromAs = false); +/// Iterate \p Args and convert -mxxx to +xxx and -mno-xxx to -xxx and +/// append it to \p Features. +/// +/// Note: Since \p Features may contain default values before calling +/// this function, or may be appended with entries to override arguments, +/// entries in \p Features are not unique. void handleTargetFeaturesGroup(const llvm::opt::ArgList &Args, std::vector<StringRef> &Features, llvm::opt::OptSpecifier Group); +/// If there are multiple +xxx or -xxx features, keep the last one. +std::vector<StringRef> +unifyTargetFeatures(const std::vector<StringRef> &Features); + /// Handles the -save-stats option and returns the filename to save statistics /// to. SmallString<128> getStatsFileName(const llvm::opt::ArgList &Args, |