<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/96963>96963</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [lldb] Add support for evaluating expressions in anonymous namespaces.
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          mvanotti
      </td>
    </tr>
</table>

<pre>
    I have found that referring to variables inside anonymous namespaces in `lldb` is a bit tricky if not impossible. In particular, if a variable is in an anonymous namespace, it will not be possible to create a breakpoint condition using the variable name as reported by `lldb`.

See the following example:

```c++
#include <stddef.h>
#include <stdio.h>

namespace {

size_t AnonymousVar = 1;

namespace xoo {
size_t AnonymousXooVar = 2;
} // namespace xoo

}  // namespace

namespace foo {

namespace {
size_t FooAnonymousVar = 3;
}  // namespace

}  // namespace foo

int main(int argc, char** argv) {
  __asm__ volatile("nop");

  printf("Hello World! Argc is %d, I'm %s\n", argc, argv[0]);
  if (argc == 10000) {
    // Use all variables to avoid them being optimized out.
    __asm__ volatile("" ::"r"(AnonymousVar));
    __asm__ volatile("" ::"r"(xoo::AnonymousXooVar));
    __asm__ volatile("" ::"r"(foo::FooAnonymousVar));
  }
}
```

Compiled with:

```
$ clang++ -Wall -Wextra -pedantic -std=c++17 -glldb -O0 repro.cc   -o repro
```

And ran with the following python program:

```
#!/usr/bin/python3
import lldb
import os

def main():
  debugger = lldb.SBDebugger.Create()
 debugger.SetAsync(False)

  target_prog = './repro'
  argv = []

  target = debugger.CreateTargetWithFileAndArch(
 target_prog, lldb.LLDB_ARCH_DEFAULT_64BIT
  )

  assert target.IsValid()

  bp = target.BreakpointCreateByName('main')
 error = lldb.SBError()

  process = target.Launch(
 debugger.GetListener(),
    argv,
    [],  # envp
    None,
 None,
    None,
    os.getcwd(),
    0,  # launch_flags
 False,  # stop_at_entry
    error,
  )

  assert error.Success(), error
  assert process.GetState() == lldb.eStateStopped
  assert len(process.threads) == 1
  thread = process.threads[0]
  assert thread.IsValid()
  frames = thread.get_thread_frames()
  assert frames
  frame = frames[0]
  assert frame.IsValid()
 print(frame.line_entry.line)

  bp = target.BreakpointCreateByLocation('repro.cc', 26)
  variable_names = set(['FooAnonymousVar', 'AnonymousVar', 'AnonymousXooVar'])
  variables = [var for var in frame.variables if any([name in var.name for name in variable_names])]
  condition = ' && '.join(f'{var.name} == {var.value}' for var in variables)
  print(f'Setting Breakpoint condition to: {condition}')
  bp.SetCondition(condition)
 thread.StepOutOfFrame(frame)
  assert(process.GetState() == lldb.eStateStopped)
  assert frame.line_entry.line == 26, frame.line_entry.line

if __name__ == '__main__':
 main()
```

```shell
$ python3 ./debug.py 
24
Setting Breakpoint condition to: foo::(anonymous namespace)::FooAnonymousVar == 3 && (anonymous namespace)::AnonymousVar == 1 && (anonymous namespace)::xoo::AnonymousXooVar == 2
error: stopped due to an error evaluating condition of breakpoint 2.1: "foo::(anonymous namespace)::FooAnonymousVar == 3 && (anonymous namespace)::AnonymousVar == 1 && (anonymous namespace)::xoo::AnonymousXooVar == 2"
Couldn't parse conditional expression:
error: <user expression 0>:1:6: expected unqualified-id
foo::(anonymous namespace)::FooAnonymousVar == 3 && (anonymous namespace)::AnonymousVar == 1 && (anonymous namespace)::xoo::AnonymousXooVar == 2
     ^
error: <user expression 0>:1:7: use of undeclared identifier 'anonymous'
foo::(anonymous namespace)::FooAnonymousVar == 3 && (anonymous namespace)::AnonymousVar == 1 && (anonymous namespace)::xoo::AnonymousXooVar == 2
 ^
```

Note that this also happens when using `lldb` from the cli, and you _can_ sometimes omit the anonymous namespace, but it becomes trickier when you have more complex setups like `foo::(anonymous namespace)::bar` and variables whose name collide.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcWEtv4zgS_jXMpRBBpmIrPvjgR3ungaAb2PRM702gpZLNaYrUkpQTz69fFPWw7Dj9wN4aCGKbVfxY_FgvUjgn9xpxwaYrNt3cicYfjF1UR6GN9_JuZ4rT4iMcxBGhNI0uwB-EB4slWiv1HryBo7BS7BQ6kNrJAkFoo0-VaRxoUaGrRR5kwGaxUsWOzWKQDgTspAdvZf7tBLIEbTzIqjbOyZ3CCD5qqIX1Mm-UsIyvSUcMixGC1CD0rdWCtocXqVSA3SH0uGRwblF4JAMsim-1kdpDbnQhvTQaGhf2dcDzWgQMwoHF2liPBexOo81ELN6weNn-f0YMc0ujlHkhJHwVVa2QJcuxHpvF7V_O-Ir-2lGeSJ2rpkBgydr5osAyOrDkwztiacbS8H8gAVi6Gguc_AczD8uerr-EBZZsYMKS1W2AV2POINfT_2NMj8DPCOkGGN8yvoULmIudpxt4o3TbgHJswLvb6yzbGvNmb8mFZd9d9aYCWTBWIk-phNSMP9JXYfc5-Vp-IA9dMr6koSPj87N1AFkmXJVlcDRKeKmQ8UfGuTY145zx-RX9ALWV2pet1h-olIGvxqqC8Qks7T4nz2d8WtDCHxlPK_rl2HStA956sCqYMl3FbLoZLwMUSIw_khqRFHwgjuP4yuyBjT8dglBqFOfegDgaSckAK9ghubmpvazkP1iAaXx0Brm9e8Y5UEQkS8a5DQOP49Mjgy9s_hUgcrgwdOWs_xdo2YNe-dkbUJZuBo-6ivXxOa9NVUuFBbxIf3gvOfRh_wC5Enrfpgq4_0rHcf8VX70VcF9jIbSXOdw7X7Bk02WUSQr3e0pRcP85ptRlTZTnAHBv2l_fMW6pC7BCB9uu0ll98gejobZmb0X1I8MTxieMbxtnGd_uKHC2LUDSBVRFGRVCJh0PGDeGLbDswy5wPYRKgbtmv8c22Akkel5turFoHdJ8N6ed0OtHz-iX7qRzxh-3QjkcVHpkL-wefUbbDOCMpxHj25Y4nvZqFGOtPNTPWxhBXFwa9SVIvkp_2EqFS10sbX4gS9uZo8UpkMPGnp42q2z57_Uf2ebDdvnn05ds9rD6-GXwuusNCOfQ-g4q-uj-EkoWYzJ6xV0dLOwUV0NJbC1dnT6JqiUxbY8gPdOJ1poL7j_QwK1FamtydG680pNo9HjTA0X_Qv8knUeNPRRfnyO2TbCjgY55viYSEkB9rM_CT0bjWfvy1xsxABgX7dHnL8WNleNhDRVMz0ol9p2fQudFnYLzps6Ez1B7ezojYEvP-keHFvSi5yYnzgZLuumXqh2xRNqzH9y9z-vhWDAInr2payyupiukoOpB_MGiKNwIYDL4chCF87vW7krMld8F4S2_Aygt1dfWF1o18vb2a9YKLyd0mJ1ojBJAuvGbdgTZTTNCmaXEHjSU1NgeV_j6y1HyZHJB7WMbKX22DdGyBj4bbaYvo5keWHBIhpAj8_RNeQkIjKc_GO1LXNqV-6vVXJ-ljsJCaSwJqIFudz9q4UsQ-tRaE9peqUk1Ct9p3mhwtI1u0TP95366y57AiIVZSKR_m5DLS7I2XfXwoXls3a4bPQrV0DBNH9k8WDva53CajKfP6D2VqtWt9t5TGacFhqF2gRHWrqb6sB7k_PGsO2h1nvvssf7c-M_l1rZ5smw_r3x3FGQ_Ham3_f_aU3sAYnd9W-Wigy0hC0eWZQPZPM0yyu1ZRjwM1XVUcd_vFIZBd0Clzv1KV-WBimbI7FF9glbMH_qr0g-PaWi6qF-9dc-b3-zJ-p0lZ6f77vRbcyc_Ofe9ZnM4l3azbe5OlqE01FhA0YS7qNBdFUVydhEIObNgyvEdlUeT4Luc_xa8cN53wo0qqLHwdOF3eN6_UICvtUXnKPR6xxyoZMm6cWhHOhDTbThZEk8zUsHXGnO6sTf6v41QspRY3MuuCv4WLA7NBbDph18iiEIdGofkZY0uMFfCYgGyQO2JKEuZYTBuaHp_I9YGxm6mtk_GY_vc5Q_SgVDOwEHUNWoHLwfsX4pGr1qlNVW4LuVKhhu4LuBkGshyoTNwpkIvqeabSvqg987b1a7xID3sMDekHt7I6DzCqgQY3uMqYylWqlrhK7UQTe1AyW9IFv3sIe2EJcPJ0HMP8HIwrnv0yo1SssDorlgkxTyZiztcTNLJfMrj2XR2d1jwcppM57s0xRlO4vluOi9LjHEeP0wfaPROLnjMH-IZT3mcpMk0ink-nc8eHh7jh-lkEhfsIcZKSBUpdawiY_d30rkGF_PZfJbcKbFD5cLzJOcaXyAIKXdMN3d2QXPud83esYdYSefdGcVLr8K7Zjid6QaWRQGuqcP9srzMuOcA6V4V3z5gRneNVYuD97ULtG4Z3-6lPzS7KDcV41tauPu4r635G3PP-DaY6xjftts5Lvj_AgAA___SW3vE">