From: Alexander Kornienko Date: Thu, 27 Feb 2014 14:47:37 +0000 (+0000) Subject: Re-apply r200853, which should not crash after Clang plugins were converted to loadab... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=106a28c770d2e2ef2cab1528391569680901f967;p=oota-llvm.git Re-apply r200853, which should not crash after Clang plugins were converted to loadable modules in r201256. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202404 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Support/CommandLine.h b/include/llvm/Support/CommandLine.h index 4e0b4512465..8d84f3f6dfe 100644 --- a/include/llvm/Support/CommandLine.h +++ b/include/llvm/Support/CommandLine.h @@ -149,8 +149,8 @@ private: public: OptionCategory(const char *const Name, const char *const Description = 0) : Name(Name), Description(Description) { registerCategory(); } - const char *getName() { return Name; } - const char *getDescription() { return Description; } + const char *getName() const { return Name; } + const char *getDescription() const { return Description; } }; // The general Option Category (used as default category). diff --git a/lib/Support/CommandLine.cpp b/lib/Support/CommandLine.cpp index 7b2a4d0270f..e1317a25986 100644 --- a/lib/Support/CommandLine.cpp +++ b/lib/Support/CommandLine.cpp @@ -36,7 +36,6 @@ #include #include #include -#include using namespace llvm; using namespace cl; @@ -126,8 +125,21 @@ static ManagedStatic RegisteredOptionCategories; // Initialise the general option category. OptionCategory llvm::cl::GeneralCategory("General options"); +struct HasName { + HasName(StringRef Name) : Name(Name) {} + bool operator()(const OptionCategory *Category) const { + return Name == Category->getName(); + } + StringRef Name; +}; + void OptionCategory::registerCategory() { + assert(std::count_if(RegisteredOptionCategories->begin(), + RegisteredOptionCategories->end(), + HasName(getName())) == 0 && + "Duplicate option categories"); + RegisteredOptionCategories->insert(this); } @@ -1506,7 +1518,6 @@ protected: virtual void printOptions(StrOptionPairVector &Opts, size_t MaxArgLen) { std::vector SortedCategories; std::map > CategorizedOptions; - std::set CategoryNames; // Collect registered option categories into vector in preparation for // sorting. @@ -1514,11 +1525,6 @@ protected: E = RegisteredOptionCategories->end(); I != E; ++I) { SortedCategories.push_back(*I); - // FIXME: Move this check to OptionCategory::registerCategory after the - // problem with analyzer plugins linking to llvm/Support and causing - // assertion on the duplicate llvm::cl::GeneralCategory is solved. - assert(CategoryNames.insert((*I)->getName()).second && - "Duplicate option categories"); } // Sort the different option categories alphabetically.