12 #include "llvm/Support/ThreadPool.h" 21 return llvm::make_error<llvm::StringError>(Message,
22 llvm::inconvertibleErrorCode());
32 class ThreadSafeToolResults :
public ToolResults {
34 void addResult(StringRef Key, StringRef
Value)
override {
35 std::unique_lock<std::mutex> LockGuard(Mutex);
36 Results.addResult(Key, Value);
39 std::vector<std::pair<llvm::StringRef, llvm::StringRef>>
40 AllKVResults()
override {
41 return Results.AllKVResults();
44 void forEachResult(llvm::function_ref<
void(StringRef Key, StringRef Value)>
46 Results.forEachResult(Callback);
50 InMemoryToolResults Results;
58 std::shared_ptr<PCHContainerOperations> PCHContainerOps)
59 : Compilations(Compilations), Results(new ThreadSafeToolResults),
60 Context(Results.get()), ThreadCount(ThreadCount) {}
64 std::shared_ptr<PCHContainerOperations> PCHContainerOps)
65 : OptionsParser(
std::move(Options)),
66 Compilations(OptionsParser->getCompilations()),
67 Results(new ThreadSafeToolResults), Context(Results.get()),
68 ThreadCount(ThreadCount) {}
77 if (Actions.size() != 1)
79 "Only support executing exactly 1 action at this point.");
83 auto AppendError = [&](llvm::Twine Err) {
84 std::unique_lock<std::mutex> LockGuard(TUMutex);
85 ErrorMsg += Err.str();
88 auto Log = [&](llvm::Twine Msg) {
89 std::unique_lock<std::mutex> LockGuard(TUMutex);
90 llvm::errs() << Msg.str() <<
"\n";
95 const std::string TotalNumStr = std::to_string(Files.size());
98 std::unique_lock<std::mutex> LockGuard(TUMutex);
102 auto &Action = Actions.front();
105 llvm::ThreadPool Pool(ThreadCount == 0 ? llvm::hardware_concurrency()
108 for (std::string File : Files) {
110 [&](std::string Path) {
111 Log(
"[" + std::to_string(Count()) +
"/" + TotalNumStr +
112 "] Processing file " + Path);
116 for (
const auto &FileAndContent : OverlayFiles)
117 Tool.mapVirtualFile(FileAndContent.first(),
118 FileAndContent.second);
119 if (Tool.run(Action.first.get()))
120 AppendError(llvm::Twine(
"Failed to run action on ") + Path +
127 if (!ErrorMsg.empty())
130 return llvm::Error::success();
134 "execute-concurrency",
135 llvm::cl::desc(
"The number of threads used to process all files in " 136 "parallel. Set to 0 for hardware concurrency."),
145 "[AllTUsToolExecutorPlugin] Please provide a directory/file path in " 146 "the compilation database.");
147 return llvm::make_unique<AllTUsToolExecutor>(std::move(OptionsParser),
152 static ToolExecutorPluginRegistry::Add<AllTUsToolExecutorPlugin>
153 X(
"all-TUs",
"Runs FrontendActions on all TUs in the compilation database. " 154 "Tool results are stored in memory.");
Dataflow Directional Tag Classes.