Introduce factory methods for SpecialCaseList

Summary:
Doing work in constructors is bad: this change suggests to
call SpecialCaseList::create(Path, Error) instead of
"new SpecialCaseList(Path)". Currently the latter may crash with
report_fatal_error, which is undesirable - sometimes we want to report
the error to user gracefully - for example, if he provides an incorrect
file as an argument of Clang's -fsanitize-blacklist flag.

Reviewers: pcc

Reviewed By: pcc

CC: llvm-commits

Differential Revision: http://llvm-reviews.chandlerc.com/D1327

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188156 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Alexey Samsonov
2013-08-12 07:49:36 +00:00
parent 23331c30ae
commit d976d43f23
3 changed files with 92 additions and 13 deletions

View File

@ -57,8 +57,18 @@ class StringRef;
class SpecialCaseList {
public:
// FIXME: Switch all users to factories and remove these constructors.
SpecialCaseList(const StringRef Path);
SpecialCaseList(const MemoryBuffer *MB);
/// Parses the special case list from a file. If Path is empty, returns
/// an empty special case list. On failure, returns 0 and writes an error
/// message to string.
static SpecialCaseList *create(const StringRef Path, std::string &Error);
/// Parses the special case list from a memory buffer. On failure, returns
/// 0 and writes an error message to string.
static SpecialCaseList *create(const MemoryBuffer *MB, std::string &Error);
~SpecialCaseList();
/// Returns whether either this function or its source file are listed in the
@ -89,10 +99,16 @@ class SpecialCaseList {
bool findCategory(const Module &M, StringRef &Category) const;
private:
SpecialCaseList(SpecialCaseList const &) LLVM_DELETED_FUNCTION;
SpecialCaseList &operator=(SpecialCaseList const &) LLVM_DELETED_FUNCTION;
struct Entry;
StringMap<StringMap<Entry> > Entries;
void init(const MemoryBuffer *MB);
SpecialCaseList();
/// Parses just-constructed SpecialCaseList entries from a memory buffer.
bool parse(const MemoryBuffer *MB, std::string &Error);
bool findCategory(const StringRef Section, const StringRef Query,
StringRef &Category) const;
bool inSectionCategory(const StringRef Section, const StringRef Query,