Skip to content

Commit

Permalink
Add Driver utility support for running an analysis pass
Browse files Browse the repository at this point in the history
  • Loading branch information
MikePopoloski committed Feb 13, 2025
1 parent 877b805 commit 2d4b809
Show file tree
Hide file tree
Showing 11 changed files with 78 additions and 46 deletions.
5 changes: 4 additions & 1 deletion bindings/python/CompBindings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,10 @@ void registerCompilation(py::module_& m) {
.def("createOptionBag", &Driver::createOptionBag)
.def("createCompilation", &Driver::createCompilation)
.def("reportParseDiags", &Driver::reportParseDiags)
.def("reportCompilation", &Driver::reportCompilation, "compilation"_a, "quiet"_a);
.def("reportCompilation", &Driver::reportCompilation, "compilation"_a, "quiet"_a)
.def("runAnalysis", &Driver::runAnalysis, "compilation"_a)
.def("reportDiagnostics", &Driver::reportDiagnostics, "quiet"_a)
.def("runFullCompilation", &Driver::runFullCompilation, "quiet"_a = false);

py::class_<SourceOptions>(m, "SourceOptions")
.def(py::init<>())
Expand Down
24 changes: 20 additions & 4 deletions include/slang/driver/Driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,7 @@ namespace slang::driver {
/// if (!driver.parseCommandLine(someStr)) { ...error }
/// if (!driver.processOptions()) { ...error }
/// if (!driver.parseAllSources()) { ...error }
///
/// auto compilation = driver.createCompilation();
/// if (!driver.reportCompilation(*compilation)) { ...error }
/// if (!driver.runFullCompilation()) { ...error }
/// else { ...success }
/// @endcode
///
Expand Down Expand Up @@ -336,8 +334,26 @@ class SLANG_EXPORT Driver {
/// @brief Reports the result of compilation.
///
/// If @a quiet is set to true, non-essential output will be suppressed.
void reportCompilation(ast::Compilation& compilation, bool quiet);

/// @brief Runs analysis on a compilation and reports the results.
///
/// @note The compilation will be frozen after this call.
void runAnalysis(ast::Compilation& compilation);

/// @brief Reports all diagnostics to output.
///
/// If @a quiet is set to true, non-essential output will be suppressed.
/// @returns true if compilation succeeded and false if errors were encountered.
[[nodiscard]] bool reportDiagnostics(bool quiet);

/// @brief Runs a full compilation pass and reports the results.
///
/// This is a helper method that calls @a createCompilation, @a reportCompilation,
/// @a runAnalysis, and @a reportDiagnostics in sequence.
///
/// @returns true if compilation succeeded and false if errors were encountered.
[[nodiscard]] bool reportCompilation(ast::Compilation& compilation, bool quiet);
[[nodiscard]] bool runFullCompilation(bool quiet = false);

private:
bool parseUnitListing(std::string_view text);
Expand Down
23 changes: 22 additions & 1 deletion source/driver/Driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <BS_thread_pool.hpp>
#include <fmt/color.h>

#include "slang/analysis/AnalysisManager.h"
#include "slang/ast/symbols/CompilationUnitSymbols.h"
#include "slang/ast/symbols/InstanceSymbols.h"
#include "slang/diagnostics/DeclarationsDiags.h"
Expand Down Expand Up @@ -876,7 +877,7 @@ bool Driver::reportParseDiags() {
return diagEngine.getNumErrors() == 0;
}

bool Driver::reportCompilation(Compilation& compilation, bool quiet) {
void Driver::reportCompilation(Compilation& compilation, bool quiet) {
if (!quiet) {
auto topInstances = compilation.getRoot().topInstances;
if (!topInstances.empty()) {
Expand All @@ -889,7 +890,20 @@ bool Driver::reportCompilation(Compilation& compilation, bool quiet) {

for (auto& diag : compilation.getAllDiagnostics())
diagEngine.issue(diag);
}

void Driver::runAnalysis(ast::Compilation& compilation) {
compilation.getAllDiagnostics();
compilation.freeze();

analysis::AnalysisManager analysisManager(options.numThreads.value_or(0));
analysisManager.analyze(compilation);

for (auto& diag : analysisManager.getDiagnostics())
diagEngine.issue(diag);
}

bool Driver::reportDiagnostics(bool quiet) {
bool hasDiagsStdout = false;
bool succeeded = diagEngine.getNumErrors() == 0;

Expand Down Expand Up @@ -929,6 +943,13 @@ bool Driver::reportCompilation(Compilation& compilation, bool quiet) {
return succeeded;
}

bool Driver::runFullCompilation(bool quiet) {
auto compilation = createCompilation();
reportCompilation(*compilation, quiet);
runAnalysis(*compilation);
return reportDiagnostics(quiet);
}

bool Driver::parseUnitListing(std::string_view text) {
CommandLine unitCmdLine;
std::vector<std::string> includes;
Expand Down
46 changes: 14 additions & 32 deletions tests/unittests/DriverTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -321,9 +321,7 @@ TEST_CASE("Driver full compilation") {
CHECK(driver.parseCommandLine(args));
CHECK(driver.processOptions());
CHECK(driver.parseAllSources());

auto compilation = driver.createCompilation();
CHECK(driver.reportCompilation(*compilation, false));
CHECK(driver.runFullCompilation());
CHECK(stdoutContains("Build succeeded"));
}

Expand All @@ -339,9 +337,7 @@ TEST_CASE("Driver full compilation with defines and param overrides") {
CHECK(driver.parseCommandLine(args));
CHECK(driver.processOptions());
CHECK(driver.parseAllSources());

auto compilation = driver.createCompilation();
CHECK(driver.reportCompilation(*compilation, false));
CHECK(driver.runFullCompilation());
CHECK(stdoutContains("Build succeeded"));
}

Expand All @@ -364,9 +360,7 @@ TEST_CASE("Driver setting a bunch of compilation options") {
CHECK(driver.parseCommandLine(args));
CHECK(driver.processOptions());
CHECK(driver.parseAllSources());

auto compilation = driver.createCompilation();
CHECK(driver.reportCompilation(*compilation, false));
CHECK(driver.runFullCompilation());
CHECK(stdoutContains("Build succeeded"));
}
}
Expand All @@ -383,9 +377,7 @@ TEST_CASE("Driver failed compilation") {
CHECK(driver.parseCommandLine(args));
CHECK(driver.processOptions());
CHECK(driver.parseAllSources());

auto compilation = driver.createCompilation();
CHECK(!driver.reportCompilation(*compilation, false));
CHECK(!driver.runFullCompilation());
CHECK(stdoutContains("Build failed"));
CHECK(stdoutContains("1 error, 1 warning"));
}
Expand All @@ -400,9 +392,7 @@ TEST_CASE("Driver command files") {
CHECK(driver.parseCommandLine(args));
CHECK(driver.processOptions());
CHECK(driver.parseAllSources());

auto compilation = driver.createCompilation();
CHECK(driver.reportCompilation(*compilation, false));
CHECK(driver.runFullCompilation());
CHECK(stdoutContains("Build succeeded"));
}

Expand Down Expand Up @@ -443,9 +433,7 @@ TEST_CASE("Driver allow defines to be inherited to lib files") {
CHECK(driver.parseCommandLine(args));
CHECK(driver.processOptions());
CHECK(driver.parseAllSources());

auto compilation = driver.createCompilation();
CHECK(driver.reportCompilation(*compilation, false));
CHECK(driver.runFullCompilation());
CHECK(stdoutContains("Build succeeded"));
}

Expand Down Expand Up @@ -499,9 +487,7 @@ TEST_CASE("Driver suppress warnings by path") {
CHECK(driver.parseCommandLine(args));
CHECK(driver.processOptions());
CHECK(driver.parseAllSources());

auto compilation = driver.createCompilation();
CHECK(driver.reportCompilation(*compilation, false));
CHECK(driver.runFullCompilation());
CHECK(stdoutContains("Build succeeded"));
CHECK(stdoutContains("0 errors, 0 warnings"));
}
Expand All @@ -518,9 +504,7 @@ TEST_CASE("Driver suppress macro warnings by path") {
CHECK(driver.parseCommandLine(args));
CHECK(driver.processOptions());
CHECK(driver.parseAllSources());

auto compilation = driver.createCompilation();
CHECK(driver.reportCompilation(*compilation, false));
CHECK(driver.runFullCompilation());
CHECK(stdoutContains("Build succeeded"));
CHECK(stdoutContains("0 errors, 0 warnings"));
}
Expand Down Expand Up @@ -610,9 +594,7 @@ TEST_CASE("Driver library map in compilation") {
CHECK(driver.parseCommandLine(args));
CHECK(driver.processOptions());
CHECK(driver.parseAllSources());

auto compilation = driver.createCompilation();
CHECK(driver.reportCompilation(*compilation, false));
CHECK(driver.runFullCompilation());
CHECK(stdoutContains("Build succeeded"));
CHECK(stdoutContains("0 errors, 2 warnings"));
}
Expand Down Expand Up @@ -657,7 +639,8 @@ TEST_CASE("Driver separate unit listing") {
CHECK(driver.parseAllSources());

auto compilation = driver.createCompilation();
CHECK(driver.reportCompilation(*compilation, false));
driver.reportCompilation(*compilation, false);
CHECK(driver.reportDiagnostics(false));
CHECK(stdoutContains("Build succeeded"));

auto& root = compilation->getRoot();
Expand Down Expand Up @@ -693,7 +676,8 @@ TEST_CASE("Driver customize default lib name") {
CHECK(driver.parseAllSources());

auto compilation = driver.createCompilation();
CHECK(driver.reportCompilation(*compilation, false));
driver.reportCompilation(*compilation, false);
CHECK(driver.reportDiagnostics(false));
CHECK(stdoutContains("Build succeeded"));

auto& root = compilation->getRoot();
Expand Down Expand Up @@ -722,9 +706,7 @@ TEST_CASE("Driver JSON diag output") {
CHECK(driver.parseCommandLine(args));
CHECK(driver.processOptions());
CHECK(driver.parseAllSources());

auto compilation = driver.createCompilation();
CHECK(driver.reportCompilation(*compilation, true));
CHECK(driver.runFullCompilation(true));
CHECK(stdoutContains(R"({
"severity": "warning",
"message": "no top-level modules found in design",
Expand Down
6 changes: 4 additions & 2 deletions tests/unittests/ast/ConfigTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ TEST_CASE("Driver library default ordering") {
CHECK(driver.parseAllSources());

auto compilation = driver.createCompilation();
CHECK(driver.reportCompilation(*compilation, false));
driver.reportCompilation(*compilation, false);
CHECK(driver.reportDiagnostics(false));

auto& m = compilation->getRoot().lookupName<InstanceSymbol>("top.m");
CHECK(m.getDefinition().sourceLibrary.name == "lib1");
Expand All @@ -77,7 +78,8 @@ TEST_CASE("Driver library explicit ordering") {
CHECK(driver.parseAllSources());

auto compilation = driver.createCompilation();
CHECK(driver.reportCompilation(*compilation, false));
driver.reportCompilation(*compilation, false);
CHECK(driver.reportDiagnostics(false));

auto& m = compilation->getRoot().lookupName<InstanceSymbol>("top.m");
CHECK(m.getDefinition().sourceLibrary.name == "lib2");
Expand Down
4 changes: 3 additions & 1 deletion tools/driver/slang_main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,9 @@ int driverMain(int argc, TArgs argv) {
{
TimeTraceScope timeScope("elaboration"sv, ""sv);
auto compilation = driver.createCompilation();
ok &= driver.reportCompilation(*compilation, quiet == true);
driver.reportCompilation(*compilation, quiet == true);

ok &= driver.reportDiagnostics(quiet == true);

if (astJsonFile) {
printJson(*compilation, *astJsonFile, astJsonScopes,
Expand Down
4 changes: 3 additions & 1 deletion tools/hier/hier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,9 @@ int main(int argc, char** argv) {
}
}));
}
ok &= driver.reportCompilation(*compilation, /* quiet */ false);

driver.reportCompilation(*compilation, /* quiet */ false);
ok &= driver.reportDiagnostics(/* quiet */ false);

return ok ? 0 : 3;
}
3 changes: 2 additions & 1 deletion tools/netlist/netlist.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,8 @@ int main(int argc, char** argv) {
bool ok = driver.parseAllSources();

auto compilation = driver.createCompilation();
ok &= driver.reportCompilation(*compilation, *quiet);
driver.reportCompilation(*compilation, *quiet);
ok &= driver.reportDiagnostics(*quiet);

if (!ok) {
return ok;
Expand Down
3 changes: 2 additions & 1 deletion tools/reflect/src/reflect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@ int main(int argc, char** argv) {
SLANG_TRY {
compilation_ok = driver.parseAllSources();
compilation = driver.createCompilation();
compilation_ok &= driver.reportCompilation(*compilation, true);
driver.reportCompilation(*compilation, true);
compilation_ok &= driver.reportDiagnostics(true);
}
SLANG_CATCH(const std::exception& e) {
#if __cpp_exceptions
Expand Down
3 changes: 2 additions & 1 deletion tools/threadtest/threadtest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ int main(int argc, char** argv) {
}

auto compilation = driver.createCompilation();
if (!driver.reportCompilation(*compilation, true))
driver.reportCompilation(*compilation, true);
if (!driver.reportDiagnostics(true))
return 2;

compilation->freeze();
Expand Down
3 changes: 2 additions & 1 deletion tools/tidy/src/tidy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,8 @@ int main(int argc, char** argv) {
SLANG_TRY {
compilationOk = driver.parseAllSources();
compilation = driver.createCompilation();
compilationOk &= driver.reportCompilation(*compilation, true);
driver.reportCompilation(*compilation, true);
compilationOk &= driver.reportDiagnostics(true);
}
SLANG_CATCH(const std::exception& e) {
#if __cpp_exceptions
Expand Down

0 comments on commit 2d4b809

Please sign in to comment.