zturner added a comment.

I've been experimenting with DIA locally and after some investigation I'm not 
sure this is going to be reliable.  Let's say we have a class, we want the decl 
context containing the class.  For example, on line 366.  So we call 
`GetDeclContextContainingSymbol`.  Despite what the MSDN documentation states, 
I'm pretty sure this is going to return a `PDBSymbolExe`.  Worse, there is no 
guarantee that `getLexicalParent()` or `getClassParent()` will return the same 
thing twice.  It all depends on how you obtained the object in the first place.

To make this concrete:

Suppose you find the PDB Global Scope object, enumerate it and you find some 
function called `foo` at address 12345.  If you call `getLexicalParent()` on 
it, it will be the Exe symbol (because the way you obtained it is by calling 
`ExeSymbol->findAllChildren`, so the Exe symbol is the parent).  Now you take 
this address 12345 and call `Session->findSymbolByAddress(12345);`  It returns 
a new symbol **with the same uid** but now suddenly the lexical parent is the 
compiland where the symbol is defined.  I hacked up `llvm-pdbutil` to dump some 
output from a test exe I created, and it outputs this:

  Calling Session->findSymbolByAddress(1752)
  3 `__raise_securityfailure` [Class: <null>, Lexical: 2 (Compiland 
'f:\binaries\Intermediate\vctools\msvcrt.nativeproj_607447030\objd\x86\gs_report.obj')]
  Printing function signature
  1 `` [Class: <null>, Lexical: 4 (Tag 1)]
  Calling Session->getSymbolById(3)
  3 `__raise_securityfailure` [Class: <null>, Lexical: 2 (Compiland 
'f:\binaries\Intermediate\vctools\msvcrt.nativeproj_607447030\objd\x86\gs_report.obj')]
  Enumerating all functions
  3 `__raise_securityfailure` [Class: <null>, Lexical: 4 (Tag 1)]
  5 `_RTC_CheckEsp` [Class: <null>, Lexical: 4 (Tag 1)]

So notice that `__raise_securityfailure` has Lexical Parent of 4 when I 
enumerate functions, but a lexical parent of 2 (the matching compiland) if I 
obtain it by calling `findSymbolByAddress`.

Furthermore, for types, it seems that this method will never return anything 
other than the Exe.  I was not able to find any way to get a symbol 
corresponding to a type record that returned a compiland.


Repository:
  rLLDB LLDB

https://reviews.llvm.org/D51967



_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to