Skip to content

Commit c47df3e

Browse files
committed
[lldb][test] Make vector operator[] return T& to workaround Arm codegen issue
Since llvm/llvm-project#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/llvm-project#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.
1 parent df02bcc commit c47df3e

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

lldb/test/Shell/Recognizer/Inputs/verbose_trap-in-stl.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
namespace std {
22
inline namespace __1 {
33
template <typename T> struct vector {
4-
void operator[](unsigned) { __builtin_verbose_trap("Bounds error", "out-of-bounds access"); }
4+
T& operator[](unsigned) { __builtin_verbose_trap("Bounds error", "out-of-bounds access"); }
55
};
66
} // namespace __1
77
} // namespace std

0 commit comments

Comments
 (0)