<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/56265>56265</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
BOLT: instrumentation looses doubles in virtual overloaded functions
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
dmitriy-philimonov
</td>
</tr>
</table>
<pre>
The small reproducer:
```cpp
#include <stdio.h>
class TProtocol {
public:
virtual bool store(const char *from) = 0;
virtual bool store(float from) = 0;
virtual bool store(double from) = 0;
virtual ~TProtocol() {}
};
class TProtocolText : public TProtocol {
public:
bool store(const char *from) {
printf("CONST CHAR*: '%s'\n", from);
return true;
}
bool store(float from) {
printf("FLOAT: %f\n", from);
return true;
}
bool store(double from) {
printf("DOUBLE: %f\n", from);
return true;
}
};
int main() {
TProtocol *p = new TProtocolText();
p->store("BOLT");
p->store(1.2);
p->store(3.55555555558787870);
delete p;
return 0;
}
```
Compile, run instrumentation:
```shell
$ g++ --version
g++ (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ -O3 main.cc -fno-reorder-blocks-and-partition -Wl,--emit-relocs
$ llvm-bolt --instrument a.out -o a.bolted --instrumentation-file=$HOME/bolt.profile --instrumentation-binpath=$HOME/a.bolted
$ ./a.out
CONST CHAR*: 'BOLT'
DOUBLE: 1.200000
DOUBLE: 3.555556
$ ./a.bolted
CONST CHAR*: 'BOLT'
DOUBLE: 0.000000
DOUBLE: 0.000000
```
As you can see, double passed to virtual functions, magically converts to zero.
* OS: Ubuntu 20.04.4 LTS, EulerOS 2.5
* Affected open source projects: MySQL server.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy9VlmP6jYU_jXhxUqUcSAMDzyETReJmUwho6qPieMQt8aOvMwt_fU9TsIygHrnVmqNRYjP9p3VFLI8TrOaIn3IOUeKNkqWllDlRYkXLrww8eKw26Rp-hMcMUG4LSnyork2JZNB7UXLnnr1TXiuNcrelDSSSI688awjNLbgjJxtoH59MGVszlEhgVkbqaiHn4kU2iBS5wp5OKmUPHh4ApYXKPSi2RcUVFzmBv0LwVICTPpFSW-8PDsKsq0AuDte9AGBHyfRfwhRRv80YChBXYR-InZfidn4BvtpNYoJU7Wo8Tx93WVo_i3ZgqRD4uGxh0faPUZzARwenp9icheN01LUWCWQUZbe8Zxj8hD6Tba-Anm1SZOsgzqq_heQt5XxFZSL9H22Wf5XMO_rCyyjQ87EVTF-Er0qLZw0bXUL-v1zKXayd1YbH9r9FAvwYpZustaZH7A-BT_miYLReT2P3Sd8JFNSTg1FzR2hj9alUS8hOk2y6yjN5aFhnLo8KCsQg75R9kCFyQ2T4n4K6ppyfpqDQ7T38Aw28v0PqrSTaEmnY_DnvbDCWPQUBlEQ-k-2fX2CaYHDIBy6zHSkE5zmqNi-Nk507qg4xCFaKUrRTlbme64oWkkryg4fwF4LEnTCWc00gl05bt1zQxyQhnfjhry0ikDZSoUIGGJiD09RMqdKB1ASNQX1oOE17TSCApULc3RKhDSIflDRir8stzAiXrNktt6ss98QHK3W2etyt0OrdIsS9JZss_X8fZNs0dv79i3dLYMHUUujtkQDQpBfCekrKlVJlV9wSf7Qfi5Kv8mVaQEi_1cYrHPfpwdmgBNY9EUl5x8Hv5DcQCouSUR5IC0cSfjhiLT8RG5j6Fcu_9ECtHxLX5YeXjnOAC5CR3jAXzDR5Kb-JHJSfwEUtKfOep_ZB3O165txx3CZD9AmoVu3531rxLdGes9-2g4U4EM7n88ftk2i0VFaRHLhisuVYT8SG7jOAIuR54uxsoK0Bea4DvmeEfincXSFBy1jtGP9iyoZXKsH6CjdOSx9-7TNEgzRJts5NUvLqUp3CAeji0BSVZS4QMgGqrSvdUjj73Cqna6X4-6XDeBVYDgYlNOonESTfADlxem0jREw3WQbcSk11b170F7i7JgENXBZlWDx7OPAKj6tjWmcQUgO7D0ztS0C4ob8ypVp__B7aPDKtLYU4rMaxTgeDeppDFonlDxVuIjLMp_gMsbFpIxLOi7yOAoHPC8o11NvBH2E3dhuVbgZPFoM2BSGBg5jGLjhEOMoqJ5pgUdFQZ6LeFzFkTcMKfQdDxyOQKr9QE27BrJ7DUTOtNEXIqSU7QWlrTnQn1tTSzUtoQ8VO_pNzTg7SCE_Bi2KaevF38qF7bE">