Anonymous Namespace - Bug 15302

I investigated bug 15302, which is described as:

“LLDB does not print ‘anonymous namespace’ prefix for variable names (if inferior built with GCC on Linux)”

What I found was that the GCC dwarf data does not contain a mangled name for a variable defined in an anonymous namespace, unlike clang. LLDB VariableObject depends on the mangled name to identify the anonymous namespace for a variable, so in the test case it does no print the (anonymous namespace) prefix. I checked the dwarf data using dwarfdump and nm. In the case of dwarfdump the variable is a child of the anonymous namespace but there is no mangled name, but when I use nm to dump the symbols it displays the mangled name. I am not sure if this means nm is generating the name or getting the symbol from somewhere else.

I am looking for suggestions on how to resolve this, should LLDB be inferring the namespace from the hierarchy somehow or should GCC be outputting the mangled symbol?

Alex

I investigated bug 15302, which is described as:

"LLDB does not print 'anonymous namespace' prefix for variable names (if inferior built with GCC on Linux)"

What I found was that the GCC dwarf data does not contain a mangled name for a variable defined in an anonymous namespace, unlike clang. LLDB VariableObject depends on the mangled name to identify the anonymous namespace for a variable, so in the test case it does no print the (anonymous namespace) prefix. I checked the dwarf data using dwarfdump and nm. In the case of dwarfdump the variable is a child of the anonymous namespace but there is no mangled name, but when I use nm to dump the symbols it displays the mangled name. I am not sure if this means nm is generating the name or getting the symbol from somewhere else.

nm only looks at the symbol table and the symbol table will contain only the mangled name for the variable.

I am looking for suggestions on how to resolve this, should LLDB be inferring the namespace from the hierarchy somehow or should GCC be outputting the mangled symbol?

I believe GCC should emit a mangled name. The problem is you can have:

namespace {
    class Foo {
        static int g_foo;
    }
}

If GCC doesn't emit the full mangled named, then we don't want to have to have code that knows how to follow the decl context of g_foo back up and create names for everything with proper scoping and decorations.

Greg

Yeah, I would try to solve this by looking at .symtab, which is where nm
gets the mangled name. I doubt gcc will start emitting linkage names into
dwarf soon enough to be useful. The dwarf linkage name might also be
missing due to -gline-tables-only / -gmlt type flags.

Thanks for information and the suggestions guys. I am looking into another issue right now but I may come back to this later and will followup at that time.

  • Alex