[PATCH] D78899: [Driver] Add callback to Command execution
Serge Pavlov via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 27 00:29:28 PDT 2020
sepavloff created this revision.
sepavloff added reviewers: rsmith, rjmccall, Eugene.Zelenko.
Herald added a project: clang.
Object of type `Compilation` now can keep a callback that is called
after each execution of `Command`. This must simplify adaptation of
clang in custom distributions and allow facilities like collection of
execution statistics.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D78899
Files:
clang/include/clang/Driver/Compilation.h
clang/lib/Driver/Compilation.cpp
clang/unittests/Driver/ToolChainTest.cpp
Index: clang/unittests/Driver/ToolChainTest.cpp
===================================================================
--- clang/unittests/Driver/ToolChainTest.cpp
+++ clang/unittests/Driver/ToolChainTest.cpp
@@ -259,4 +259,30 @@
EXPECT_STREQ(Res.DriverMode, "--driver-mode=cl");
EXPECT_FALSE(Res.TargetIsValid);
}
+
+TEST(ToolChainTest, PostCallback) {
+ IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
+ IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
+ struct TestDiagnosticConsumer : public DiagnosticConsumer {};
+ DiagnosticsEngine Diags(DiagID, &*DiagOpts, new TestDiagnosticConsumer);
+ IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> InMemoryFileSystem(
+ new llvm::vfs::InMemoryFileSystem);
+
+ // The executable path must not exist.
+ Driver CCDriver("/home/test/bin/clang", "arm-linux-gnueabi", Diags,
+ InMemoryFileSystem);
+ CCDriver.setCheckInputsExist(false);
+ std::unique_ptr<Compilation> CC(
+ CCDriver.BuildCompilation({"/home/test/bin/clang", "foo.cpp"}));
+ bool CallbackHasCalled = false;
+ CC->setPostCallback([&](const Command &C, int Ret) {
+ CallbackHasCalled = true;
+ });
+ const JobList &Jobs = CC->getJobs();
+ auto &CmdCompile = Jobs.getJobs().front();
+ const Command *FailingCmd = nullptr;
+ CC->ExecuteCommand(*CmdCompile, FailingCmd);
+ EXPECT_TRUE(CallbackHasCalled);
+}
+
} // end anonymous namespace.
Index: clang/lib/Driver/Compilation.cpp
===================================================================
--- clang/lib/Driver/Compilation.cpp
+++ clang/lib/Driver/Compilation.cpp
@@ -193,6 +193,8 @@
std::string Error;
bool ExecutionFailed;
int Res = C.Execute(Redirects, &Error, &ExecutionFailed);
+ if (PostCallback)
+ PostCallback(C, Res);
if (!Error.empty()) {
assert(Res && "Error string set with 0 result code!");
getDriver().Diag(diag::err_drv_command_failure) << Error;
Index: clang/include/clang/Driver/Compilation.h
===================================================================
--- clang/include/clang/Driver/Compilation.h
+++ clang/include/clang/Driver/Compilation.h
@@ -115,6 +115,9 @@
/// Optional redirection for stdin, stdout, stderr.
std::vector<Optional<StringRef>> Redirects;
+ /// Callback called after the command has been executed.
+ std::function<void(const Command &, int)> PostCallback;
+
/// Whether we're compiling for diagnostic purposes.
bool ForDiagnostics = false;
@@ -212,6 +215,10 @@
return FailureResultFiles;
}
+ void setPostCallback(const std::function<void(const Command &, int)> &CB) {
+ PostCallback = CB;
+ }
+
/// Returns the sysroot path.
StringRef getSysRoot() const;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D78899.260223.patch
Type: text/x-patch
Size: 2720 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200427/2fe63c5b/attachment-0001.bin>
More information about the cfe-commits
mailing list