We have a handful of places in LLDB where we try to outsmart the logic in Mangled to determine whether a string is mangled or not. There's at least one place (*) where we were getting this wrong and this causes a subtle bug. The cstring_is_mangled is cheap enough that we should always rely on it to determine whether a string is mangled or not.
(*) ObjectFileMachO assumes that a symbol that starts with a double underscore (such as __pthread_kill) is mangled. That's mostly harmless, until you want to use function.name-without-args in your frame format. For this formatter, we call Symbol::GetNameNoArguments() which is a wrapper around Mangled::GetName(Mangled::ePreferDemangledWithoutArguments). The latter will first try using the appropriate language plugin to get the demangled name without arguments, but if that fails, it falls back to returning the demangled name. Because we forced Mangled to treat the symbol as a mangled name while it's not, there's no demangled name, and your frames don't show symbols at all. Alternatively, I could've worked around the issue by checking if we have a demangeld at all, but that's just working around the bug.
why?