Issue |
141051
|
Summary |
xray incorrectly generates tailcall sled kind as exit kind in aarch64 target
|
Labels |
new issue
|
Assignees |
|
Reporter |
quininer
|
```c
__attribute__ ((noinline))
int fx(unsigned int a) {
return a + 1;
}
int foo(unsigned int a) {
return fx(a);
}
```
Compile the above code using the command
```shell
clang foo.c -shared -O2 -fxray-instrument -fxray-instruction-threshold=1 -fuse-ld=lld -nostdlib
```
output
```asm
000000000001047c <foo>:
1047c: 14000008 b 0x1049c <foo+0x20>
10480: d503201f nop
10484: d503201f nop
10488: d503201f nop
1048c: d503201f nop
10490: d503201f nop
10494: d503201f nop
10498: d503201f nop
1049c: 14000008 b 0x104bc <foo+0x40>
104a0: d503201f nop
104a4: d503201f nop
104a8: d503201f nop
104ac: d503201f nop
104b0: d503201f nop
104b4: d503201f nop
104b8: d503201f nop
104bc: 14000009 b 0x104e0 <fx@plt>
```
You can see that this generates a tail call from function `foo` to function `fx`, but it is reported as exit kind in `xray_instr_map`.
```shell
$ llvm-xray extract a.out --output=-
---
- { id: 1, address: 0x10434, function: 0x10434, kind: function-enter, always-instrument: false, function-name: '', version: 2 }
- { id: 1, address: 0x10458, function: 0x10434, kind: function-exit, always-instrument: false, function-name: '', version: 2 }
- { id: 2, address: 0x1047C, function: 0x1047C, kind: function-enter, always-instrument: false, function-name: '', version: 2 }
- { id: 2, address: 0x1049C, function: 0x1047C, kind: function-exit, always-instrument: false, function-name: '', version: 2 }
...
```
The same code and compiler arguments will correctly generate and report as tailcall kind on x86_64 linux.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs