diff options
author | David Spickett <david.spickett@linaro.org> | 2024-10-21 11:49:45 +0000 |
---|---|---|
committer | David Spickett <david.spickett@linaro.org> | 2024-10-21 11:54:54 +0000 |
commit | c47df3e8c8f47bab8a8302757c50710e0e1c43fb (patch) | |
tree | bbbf34fc7f3dda37c49c890e97b53313faa8c88c /clang/lib/Basic/FileManager.cpp | |
parent | df02bcc81d5099d60c2ec037edf8eaeb66456319 (diff) | |
download | llvm-c47df3e8c8f47bab8a8302757c50710e0e1c43fb.zip llvm-c47df3e8c8f47bab8a8302757c50710e0e1c43fb.tar.gz llvm-c47df3e8c8f47bab8a8302757c50710e0e1c43fb.tar.bz2 |
[lldb][test] Make vector operator[] return T& to workaround Arm codegen issue
Since https://github.com/llvm/llvm-project/pull/109628 landed, this test
has been failing on 32-bit Arm.
This is due to a codegen problem (whether added or uncovered by the change,
not known) where the trap instruction is placed after the frame pointer
and link register are restored.
https://github.com/llvm/llvm-project/issues/113154
So the code was:
```
std::__1::vector<int>::operator[](unsigned int):
sub sp, sp, #8
str r0, [sp, #4]
str r1, [sp]
add sp, sp, #8
.inst 0xe7ffdefe
bx lr
```
When lldb saw the trap, the PC was inside operator[] but the frame
information actually pointed to g.
This bug only happens for leaf functions so adding a return type
works around it:
```
std::__1::vector<int>::operator[](unsigned int):
push {r11, lr}
mov r11, sp
sub sp, sp, #8
str r0, [sp, #4]
str r1, [sp]
mov sp, r11
pop {r11, lr}
.inst 0xe7ffdefe
bx lr
```
(and operator[] should return T& anyway)
Now the PC location and frame information should match and the
test passes.
Diffstat (limited to 'clang/lib/Basic/FileManager.cpp')
0 files changed, 0 insertions, 0 deletions