<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/150440>150440</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [coverage] support source-based static destructor coverage
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          justincady
      </td>
    </tr>
</table>

<pre>
    It appears executed static destructors are not reported for code coverage:

```
// coverage.cc
#include <cstdio>

struct C {
  C() {
   printf("ctor called\n");
  }
  ~C() {
   printf("dtor called\n");
  }
};

static C c;

int main() {
 printf("main\n");
  return 0;
}
```

```
# build-cxx.sh
/usr/bin/clang++ --version | /bin/grep "clang version"
/usr/bin/clang++ -fprofile-instr-generate -fcoverage-mapping coverage.cc -o coverage
./coverage
/usr/bin/llvm-profdata merge -sparse default.profraw -o default.profdata
/usr/bin/llvm-cov show ./coverage -instr-profile=default.profdata
```

```
$ ./build-cxx.sh coverage.cc
clang version 22.0.0
ctor called
main
dtor called
    1| |#include <cstdio>
    2|       |
    3|       |struct C {
    4| 1|  C() {
    5|      1|   printf("ctor called\n");
    6|      1|  }
 7|      0|  ~C() {
    8|      0|   printf("dtor called\n");
    9| 0|  }
   10|       |};
   11|       |
   12|       |static C c;
   13| |
   14|      1|int main() {
   15|      1|  printf("main\n");
 16|      1|  return 0;
   17|      1|}
```

I believe this is because `~C()` runs _after_ static destruction triggers coverage output to be written via `__llvm_profile_write_file` (checked with GDB).

It seems this was fixed for gcov (`--coverage`) years ago:

- https://github.com/llvm/llvm-project/issues/37750
- https://reviews.llvm.org/D82253

@MaskRay could we extend this fix to source-based code coverage?
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJycVs1y4ygQfhp86ZIKoT_7oINjr7fmsJd9AReClsyMLFSAbOeyz74FUhTbyWSmJqVKQvPRP1__ALdWtT1iRfIXku9XfHQnbarvo3WqF1y-rmotX6tvDvgwIDcW8IZidCjBOu6UAInWmVE4bSxwg9BrBwYHbTym0QaElghCX9DwFkm6JTR8BZ0_uiXsQNhhwcRCBGGqetGNEoGkO2GdVJqkf02nJ5OwA1K-ELoF2BG2JmyzrGEwqndNkDLvHAjedShJvusJY4RtSDohSbkPf__7UoX8tQr_OwiCf4GbHYhFpHoHZ676Ryv3NsLuB-UG3Wh6oLOiydQ9ec9cplCPqpORuN1ie5roHa0h7FB76wfR8b4l7IWwF4iiCxqrdA-k3MECaQ0O4InzUJgh3q2vlTWD0Y3qMFK9dSZqsUfDHULUvKU2OvNhUH17n2uI9Ht50G3stb4vn-x13eUceTOSOw5nNC1CZAduLILEho-di_224Vev917kT_xEodAXsCd9hXvjMIcxB0XS_WfavspEFvTdZ-Opxh_4BcZiGvuT9_VKt6Es6FY-CAEAkpCzcvfzTvEo5lHTj8dOwvRB-KGbADIPCAY-thbky-kJ8fvNBlA8nZ3br1zENPz3sRth_QT5_f4E2PgT9N4gQEIfmXlrX7-VfEJawp5Ie2xxj0jfMjIts4dYPx8AAMkznb-cCckziY8zwovLB8SnU-Mb1NgpvCC4k7KgLNQo-GgRSEHf-CcFBTP2Fo68cWiOz1Pf160zqm3R2KW4QY9uGB04DTXC1SjnsIeL4l7z8ehb7jh31dHv4jE0WEGBsLU4ofiBEq7KneDv_Qthm3h22IFFPNvJ3yu30KjbfMm0voW9ywWNomV8FNQz_RruLd7q5fKJ4OTcYP06XD2tcqexjoU-zxPhbtJ8R-EIOyhrR7SEHdKyzOknOgxeFF5t7M_F2rSEHfZrxvJ0ngwZ_YfbH__yVxB67CRcEfDmsJdTOI26eb6sHo3AqOYW5fPNeVjJKpWbdMNXWCVlnqZlkmyS1alaU6xriQlbZw3PizoTSLMmydOC0aLEcqUqRllOS5YleZrSMs7TdV4wmjaJTEWT1ySjeOaqW9xfhYCrJKdZRlcdr7Gz4ZHAWI9XCLu-KPP9ylSBq3psLclop6x7Z2HllOvC62KJI9-DHQf_QHiM9sN7Ygl9NZqu-vOMzTFcKvZ_AAAA___Ym5h9">