Skip to content

Commit

Permalink
[lldb][test] Make vector operator[] return T& to workaround Arm codeg…
Browse files Browse the repository at this point in the history
…en issue

Since llvm#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.

llvm#113154

So the code was:
```
std::__1::vector<int>::operator[](unsigned int):
  sub sp, sp, llvm#8
  str r0, [sp, #4]
  str r1, [sp]
  add sp, sp, llvm#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, llvm#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.
  • Loading branch information
DavidSpickett committed Oct 21, 2024
1 parent df02bcc commit c47df3e
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion lldb/test/Shell/Recognizer/Inputs/verbose_trap-in-stl.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
namespace std {
inline namespace __1 {
template <typename T> struct vector {
void operator[](unsigned) { __builtin_verbose_trap("Bounds error", "out-of-bounds access"); }
T& operator[](unsigned) { __builtin_verbose_trap("Bounds error", "out-of-bounds access"); }
};
} // namespace __1
} // namespace std
Expand Down

0 comments on commit c47df3e

Please sign in to comment.