I spoke with Sean Callanan on this and he suggests you submit a patch where we use "_$" to Phabricator and then we can OK this and get this into LLDB for good. Thanks for looking into this.
Greg > On Oct 25, 2015, at 10:24 PM, Bhushan Attarde <bhushan.atta...@imgtec.com> > wrote: > > Hi Greg, > > I tried using "_$" and "lldb$" as our private prefix, both of these solves > the issue and works fine for MIPS. > > -Regards, > Bhushan > > -----Original Message----- > From: Greg Clayton [mailto:gclay...@apple.com] > Sent: 23 October 2015 22:29 > To: Bhushan Attarde > Cc: lldb-dev@lists.llvm.org > Subject: Re: [lldb-dev] llvm assertion while evaluating expressions for MIPS > on Linux > > What happens if we go with "_$" as our private prefix? Or maybe "lldb$"? > Would this avoid the issue and fix things for MIPS? I would rather us have a > consistent private naming scheme across all architectures. Let me know if you > can try that out and let us know if this works. > > Greg > >> On Oct 23, 2015, at 5:03 AM, Bhushan Attarde <bhushan.atta...@imgtec.com> >> wrote: >> >> Hi Greg, >> >> Thanks for your reply. >> >> There are different temporary symbols for different architectures and file >> formats. >> As far as I could see, llvm::MCAsmInfo class has a member >> "PrivateGlobalPrefix" which specifies this temporary symbol. >> The default value for PrivateGlobalPrefix is 'L' (for ELF it is ".L"). >> The subclasses of llvm::MCAsmInfo sets PrivateGlobalPrefix to whatever value >> they want to use for temporary symbol. >> MIPS sets this to "$". (and X86/ARM uses ".L") >> >> Since the function name "$__lldb_valid_pointer_check" starts with "$" it >> matches with PrivateGlobalPrefix for MIPS and hence it is marked as >> temporary. >> Its fine for all x86/x86_64/arm and arm64 variants because they all use >> symbol other than "$" (i.e ".L") as their PrivateGlobalPrefix. >> >> As you mentioned we cannot remove "$" from function name because it >> may conflict with symbols from system libraries or user binaries, so do you >> think removing C Language linkage from function >> "$__lldb_valid_pointer_check" can be a solution? or do you have a better >> solution to this issue? >> >> Regards, >> Bhushan >> >> >> -----Original Message----- >> From: Greg Clayton [mailto:gclay...@apple.com] >> Sent: 20 October 2015 23:56 >> To: Greg Clayton >> Cc: Bhushan Attarde; lldb-dev@lists.llvm.org >> Subject: Re: [lldb-dev] llvm assertion while evaluating expressions >> for MIPS on Linux >> >> My guess is that there is a different temporary symbol for differing >> architectures and possibly depending on which file format (mach-o or ELF) >> you are targeting. MIPS probably happens to use '$'. I know mach-o files use >> "L" as the temporary symbol prefix, ELF tends to use '.'. Not sure where >> this would be abstracted in LLVM or if it is just built into the assemblers >> directly for each arch... If you can find out where this can be detected >> within LLVM, we can make sure we don't use any temporary prefixes in symbol >> names and work around this issue. We need to make sure that any functions we >> generate and JIT up and insert into the program do not conflict with _any_ >> symbol that could be in any system libraries or user binaries. This is why >> we used '$' in the first place. >> >> Greg >> >>> On Oct 20, 2015, at 11:11 AM, Greg Clayton via lldb-dev >>> <lldb-dev@lists.llvm.org> wrote: >>> >>> 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 >> > _______________________________________________ lldb-dev mailing list lldb-dev@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev