ankurrj7 wrote:

Pushed one more fix for the RDBMS-style cases we found.

The issue was not just "macro coverage" by itself. The continuation region we 
create after a call starts out without a source start, and later it can inherit 
an end location from the surrounding region. In a few real shapes that 
inherited end was stale:

```c
p = alloc();
if (!p)
  return 2;

if (ret) {
  f();
  return 1;
}
```

and also in the cleanup macro cases where a call continuation is followed by 
repeated function-like cleanup macros.

When the region was popped, that stale inherited end could make the mapping 
range go out of source order after macro/include unnesting. That is what was 
tripping the coverage mapping assertion.

The fix now does two things:

* If a call-continuation region does not have its own end, it looks for the 
closest enclosing end location that still stays in source order after the same 
unnesting that `popRegions()` will do. So we avoid blindly using a parent end 
that belongs to an older source range.
* For function-like macro continuations, the new region starts at the macro 
invocation location. I limited that only to call-continuation regions. I had a 
broader version first, but that changed existing macro mapping 
(`switchmacro.c`), so this keeps the change scoped to the new continuation 
regions.

I added coverage-mapping regressions for both the plain guard case and the 
repeated cleanup macro case.

Validation I ran after the final version:

```text
ninja -C /scratch/ankurraj/clang_experiment_23/build/cov-broad-build clang 
llvm-cov llvm-profdata
git diff --check
git-clang-format --diff HEAD ...
llvm-lit -sv clang/test/CoverageMapping/call-continuations.c \
  clang/test/CoverageMapping/call-continuations-tight.c \
  clang/test/Profile/call-continuations.c \
  clang/test/Driver/coverage-call-continuations.c \
  clang/test/CoverageMapping/terminate-statements.cpp \
  clang/test/CoverageMapping/switchmacro.c
llvm-lit -sv clang/test/CoverageMapping
```

The focused lit set passed, full `clang/test/CoverageMapping` passed `77/77`, 
and I also reran the local RDBMS scenario matrix plus the scratch reducer cases 
we collected from the failures.


https://github.com/llvm/llvm-project/pull/201079
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to