From c47df3e8c8f47bab8a8302757c50710e0e1c43fb Mon Sep 17 00:00:00 2001 From: David Spickett Date: Mon, 21 Oct 2024 11:49:45 +0000 Subject: [PATCH] [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::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::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. --- lldb/test/Shell/Recognizer/Inputs/verbose_trap-in-stl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lldb/test/Shell/Recognizer/Inputs/verbose_trap-in-stl.cpp b/lldb/test/Shell/Recognizer/Inputs/verbose_trap-in-stl.cpp index 4f01827944e166..20db722ef105da 100644 --- a/lldb/test/Shell/Recognizer/Inputs/verbose_trap-in-stl.cpp +++ b/lldb/test/Shell/Recognizer/Inputs/verbose_trap-in-stl.cpp @@ -1,7 +1,7 @@ namespace std { inline namespace __1 { template 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