Skip to content

Commit

Permalink
[clang][dataflow] HTML logger: Mark iterations that have converged. (#…
Browse files Browse the repository at this point in the history
…68204)

I've eliminated the `logText("Block converged")` call entirely because

a) These logs are associated with an individual `CFGElement`, while
convergence
   should be associated with a block, and

b) The log message was being associated with the wrong block:
`recordState()`
dumps all of the pending log messages, but `blockConverged()` is called
after
   the last `recordState()` call for a given block, so that the "Block
converged" log message was being associated with the first element of
the
   _next_ block to be processed.

Example:


![image](https://github.com/llvm/llvm-project/assets/29098113/6a19095c-2dbb-4771-9485-e8e45c9d26fb)
  • Loading branch information
martinboehme committed Oct 4, 2023
1 parent cf80def commit 2be7c65
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 8 deletions.
20 changes: 12 additions & 8 deletions clang/lib/Analysis/FlowSensitive/HTMLLogger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ class HTMLLogger : public Logger {
const CFGBlock *Block;
unsigned Iter;
bool PostVisit;
bool Converged;
};

StreamFactory Streams;
Expand All @@ -159,8 +160,8 @@ class HTMLLogger : public Logger {
const ControlFlowContext *CFG;
// Timeline of iterations of CFG block visitation.
std::vector<Iteration> Iters;
// Number of times each CFG block has been seen.
llvm::DenseMap<const CFGBlock *, llvm::SmallVector<Iteration>> BlockIters;
// Indexes in `Iters` of the iterations for each block.
llvm::DenseMap<const CFGBlock *, llvm::SmallVector<size_t>> BlockIters;
// The messages logged in the current context but not yet written.
std::string ContextLogs;
// The number of elements we have visited within the current CFG block.
Expand Down Expand Up @@ -207,6 +208,7 @@ class HTMLLogger : public Logger {
JOS->attribute("block", blockID(E.Block->getBlockID()));
JOS->attribute("iter", E.Iter);
JOS->attribute("post_visit", E.PostVisit);
JOS->attribute("converged", E.Converged);
});
}
});
Expand All @@ -222,10 +224,10 @@ class HTMLLogger : public Logger {
}

void enterBlock(const CFGBlock &B, bool PostVisit) override {
llvm::SmallVector<Iteration> &BIter = BlockIters[&B];
llvm::SmallVector<size_t> &BIter = BlockIters[&B];
unsigned IterNum = BIter.size() + 1;
BIter.push_back({&B, IterNum, PostVisit});
Iters.push_back({&B, IterNum, PostVisit});
BIter.push_back(Iters.size());
Iters.push_back({&B, IterNum, PostVisit, /*Converged=*/false});
ElementIndex = 0;
}
void enterElement(const CFGElement &E) override {
Expand Down Expand Up @@ -290,7 +292,7 @@ class HTMLLogger : public Logger {
}
});
}
void blockConverged() override { logText("Block converged"); }
void blockConverged() override { Iters.back().Converged = true; }

void logText(llvm::StringRef S) override {
ContextLogs.append(S.begin(), S.end());
Expand All @@ -301,13 +303,15 @@ class HTMLLogger : public Logger {
// Write the CFG block details.
// Currently this is just the list of elements in execution order.
// FIXME: an AST dump would be a useful view, too.
void writeBlock(const CFGBlock &B, llvm::ArrayRef<Iteration> ItersForB) {
void writeBlock(const CFGBlock &B, llvm::ArrayRef<size_t> ItersForB) {
JOS->attributeObject(blockID(B.getBlockID()), [&] {
JOS->attributeArray("iters", [&] {
for (const auto &Iter : ItersForB) {
for (size_t IterIdx : ItersForB) {
const Iteration &Iter = Iters[IterIdx];
JOS->object([&] {
JOS->attribute("iter", Iter.Iter);
JOS->attribute("post_visit", Iter.PostVisit);
JOS->attribute("converged", Iter.Converged);
});
}
});
Expand Down
2 changes: 2 additions & 0 deletions clang/lib/Analysis/FlowSensitive/HTMLLogger.html
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
{{entry.block}}
<template data-if="entry.post_visit">(post-visit)</template>
<template data-if="!entry.post_visit">({{entry.iter}})</template>
<template data-if="entry.converged"> &#x2192;&#x7c;<!--Rightwards arrow, vertical line--></template>
</div>
</template>
</section>
Expand All @@ -62,6 +63,7 @@
<a class="chooser {{selection.bb}}:{{iter.iter}}" data-iter="{{selection.bb}}:{{iter.iter}}">
<template data-if="iter.post_visit">Post-visit</template>
<template data-if="!iter.post_visit">Iteration {{iter.iter}}</template>
<template data-if="iter.converged"> &#x2192;&#x7c;<!--Rightwards arrow, vertical line--></template>
</a>
</template>
</div>
Expand Down

0 comments on commit 2be7c65

Please sign in to comment.