diff options
Diffstat (limited to 'clang/utils/TableGen/ClangSACheckersEmitter.cpp')
-rw-r--r-- | clang/utils/TableGen/ClangSACheckersEmitter.cpp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/clang/utils/TableGen/ClangSACheckersEmitter.cpp b/clang/utils/TableGen/ClangSACheckersEmitter.cpp index feefbeb41138..00d88274fc38 100644 --- a/clang/utils/TableGen/ClangSACheckersEmitter.cpp +++ b/clang/utils/TableGen/ClangSACheckersEmitter.cpp @@ -53,7 +53,7 @@ static std::string getCheckerFullName(const Record *R) { static std::string getStringValue(const Record &R, StringRef field) { if (StringInit *SI = dyn_cast<StringInit>(R.getValueInit(field))) - return SI->getValue(); + return std::string(SI->getValue()); return std::string(); } @@ -282,6 +282,31 @@ void clang::EmitClangSACheckers(RecordKeeper &Records, raw_ostream &OS) { OS << "\n" "#endif // GET_CHECKER_DEPENDENCIES\n"; + // Emit weak dependencies. + // + // CHECKER_DEPENDENCY(FULLNAME, DEPENDENCY) + // - FULLNAME: The full name of the checker that is supposed to be + // registered first. + // - DEPENDENCY: The full name of the checker FULLNAME weak depends on. + OS << "\n" + "#ifdef GET_CHECKER_WEAK_DEPENDENCIES\n"; + for (const Record *Checker : checkers) { + if (Checker->isValueUnset("WeakDependencies")) + continue; + + for (const Record *Dependency : + Checker->getValueAsListOfDefs("WeakDependencies")) { + OS << "CHECKER_WEAK_DEPENDENCY("; + OS << '\"'; + OS.write_escaped(getCheckerFullName(Checker)) << "\", "; + OS << '\"'; + OS.write_escaped(getCheckerFullName(Dependency)) << '\"'; + OS << ")\n"; + } + } + OS << "\n" + "#endif // GET_CHECKER_WEAK_DEPENDENCIES\n"; + // Emit a package option. // // CHECKER_OPTION(OPTIONTYPE, CHECKERNAME, OPTIONNAME, DESCRIPTION, DEFAULT) |