mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-21 02:24:22 +00:00
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:
@ -49,29 +49,58 @@ struct SpecialCaseList::Entry {
|
||||
}
|
||||
};
|
||||
|
||||
SpecialCaseList::SpecialCaseList() : Entries() {}
|
||||
|
||||
SpecialCaseList::SpecialCaseList(const StringRef Path) {
|
||||
// Validate and open blacklist file.
|
||||
if (Path.empty()) return;
|
||||
OwningPtr<MemoryBuffer> File;
|
||||
if (error_code EC = MemoryBuffer::getFile(Path, File)) {
|
||||
report_fatal_error("Can't open blacklist file: " + Path + ": " +
|
||||
report_fatal_error("Can't open file '" + Path + "': " +
|
||||
EC.message());
|
||||
}
|
||||
|
||||
init(File.get());
|
||||
std::string Error;
|
||||
if (!parse(File.get(), Error))
|
||||
report_fatal_error(Error);
|
||||
}
|
||||
|
||||
SpecialCaseList::SpecialCaseList(const MemoryBuffer *MB) {
|
||||
init(MB);
|
||||
std::string Error;
|
||||
if (!parse(MB, Error))
|
||||
report_fatal_error(Error);
|
||||
}
|
||||
|
||||
void SpecialCaseList::init(const MemoryBuffer *MB) {
|
||||
SpecialCaseList *SpecialCaseList::create(
|
||||
const StringRef Path, std::string &Error) {
|
||||
if (Path.empty())
|
||||
return new SpecialCaseList();
|
||||
OwningPtr<MemoryBuffer> File;
|
||||
if (error_code EC = MemoryBuffer::getFile(Path, File)) {
|
||||
Error = (Twine("Can't open file '") + Path + "': " + EC.message()).str();
|
||||
return 0;
|
||||
}
|
||||
return create(File.get(), Error);
|
||||
}
|
||||
|
||||
SpecialCaseList *SpecialCaseList::create(
|
||||
const MemoryBuffer *MB, std::string &Error) {
|
||||
OwningPtr<SpecialCaseList> SCL(new SpecialCaseList());
|
||||
if (!SCL->parse(MB, Error))
|
||||
return 0;
|
||||
return SCL.take();
|
||||
}
|
||||
|
||||
bool SpecialCaseList::parse(const MemoryBuffer *MB, std::string &Error) {
|
||||
// Iterate through each line in the blacklist file.
|
||||
SmallVector<StringRef, 16> Lines;
|
||||
SplitString(MB->getBuffer(), Lines, "\n\r");
|
||||
StringMap<StringMap<std::string> > Regexps;
|
||||
assert(Entries.empty() &&
|
||||
"parse() should be called on an empty SpecialCaseList");
|
||||
int LineNo = 1;
|
||||
for (SmallVectorImpl<StringRef>::iterator I = Lines.begin(), E = Lines.end();
|
||||
I != E; ++I) {
|
||||
I != E; ++I, ++LineNo) {
|
||||
// Ignore empty lines and lines starting with "#"
|
||||
if (I->empty() || I->startswith("#"))
|
||||
continue;
|
||||
@ -80,7 +109,9 @@ void SpecialCaseList::init(const MemoryBuffer *MB) {
|
||||
StringRef Prefix = SplitLine.first;
|
||||
if (SplitLine.second.empty()) {
|
||||
// Missing ':' in the line.
|
||||
report_fatal_error("malformed blacklist line: " + SplitLine.first);
|
||||
Error = (Twine("Malformed line ") + Twine(LineNo) + ": '" +
|
||||
SplitLine.first + "'").str();
|
||||
return false;
|
||||
}
|
||||
|
||||
std::pair<StringRef, StringRef> SplitRegexp = SplitLine.second.split("=");
|
||||
@ -113,10 +144,11 @@ void SpecialCaseList::init(const MemoryBuffer *MB) {
|
||||
|
||||
// Check that the regexp is valid.
|
||||
Regex CheckRE(Regexp);
|
||||
std::string Error;
|
||||
if (!CheckRE.isValid(Error)) {
|
||||
report_fatal_error("malformed blacklist regex: " + SplitLine.second +
|
||||
": " + Error);
|
||||
std::string REError;
|
||||
if (!CheckRE.isValid(REError)) {
|
||||
Error = (Twine("Malformed regex in line ") + Twine(LineNo) + ": '" +
|
||||
SplitLine.second + "': " + REError).str();
|
||||
return false;
|
||||
}
|
||||
|
||||
// Add this regexp into the proper group by its prefix.
|
||||
@ -135,6 +167,7 @@ void SpecialCaseList::init(const MemoryBuffer *MB) {
|
||||
Entries[I->getKey()][II->getKey()].RegEx = new Regex(II->getValue());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
SpecialCaseList::~SpecialCaseList() {
|
||||
|
Reference in New Issue
Block a user