What is this not happening on any other architecture? Is the "$" special for MIPS and not for other architectures? We really don't want to remove the '$' as we want the symbol to be unique. The '$' symbol is fine for all x86/x86_64/arm and arm64 variants...
Greg > On Oct 19, 2015, at 11:30 PM, Bhushan Attarde via lldb-dev > <lldb-dev@lists.llvm.org> wrote: > > Hi, > > I am facing issue (llvm assertion) in evaluating expressions for MIPS on > Linux. > > (lldb) p fooptr(a,b) > lldb: /home/battarde/git/llvm/lib/MC/ELFObjectWriter.cpp:791: void > {anonymous}::ELFObjectWriter::computeSymbolTable(llvm::MCAssembler&, const > llvm::MCAsmLayout&, const SectionIndexMapTy&, const RevGroupMapTy&, > {anonymous}::ELFObjectWriter::SectionOffsetsTy&): Assertion `Local || > !Symbol.isTemporary()' failed. > > I debugged it and found that, LLDB inserts calls to dynamic checker function > for pointer validation at appropriate locations in expression’s IR. > > The issue is that this checker function’s name (hard-coded in LLDB in > lldb\source\Expression\IRDynamicChecks.cpp) starts with “$” i.e > “$__lldb_valid_pointer_check”. > While creating a MCSymbol (MCContext::createSymbol() in > llvm/lib/MC/MCContext.cpp) for this function llvm detects the name starts > with “$” and marks that symbol as ‘temporary’ symbol (PrivateGlobalPrefix is > '$' for MIPS) > Further while computing a symbol table in > ELFObjectWriter::computeSymbolTable() the assertion triggers because this > symbol is 'temporary'. > > I tried couple of things that solves this issue for MIPS. > > 1. Remove '$' from the function name. > 2. Remove "C Language linkage" from the dynamic pointer validation function > i.e the below piece of code in lldb\source\Expression\IRDynamicChecks.cpp > --------------------------------------------------------------------- > static const char g_valid_pointer_check_text[] = > "extern \"C\" void\n" > "$__lldb_valid_pointer_check (unsigned char *$__lldb_arg_ptr)\n" > "{\n" > " unsigned char $__lldb_local_val = *$__lldb_arg_ptr;\n" > "}"; > ---------------------------------------------------------------------- > > becomes > > -------------------------------------------------------------------- > static const char g_valid_pointer_check_text[] = > "void\n" > "$__lldb_valid_pointer_check (unsigned char *$__lldb_arg_ptr)\n" > "{\n" > " unsigned char $__lldb_local_val = *$__lldb_arg_ptr;\n" > "}"; > -------------------------------------------------------------------- > > Removing C Language linkage will enable mangling and will mangle > "$__lldb_valid_pointer_check" to something like > "_Z27$__lldb_valid_pointer_checkPh". > So the mangled name won't start with '$' and the symbol will not be marked as > Temporary and hence assertion won't be triggered. > > Please let me know if there is any better solution to this issue. > > Regards, > Bhushan > _______________________________________________ > lldb-dev mailing list > lldb-dev@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev _______________________________________________ lldb-dev mailing list lldb-dev@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev