[LLVMdev] Adding line table debug information to LLVM on Windows

Timur Iskhodzhanov timurrrr at google.com
Thu Nov 14 07:35:34 PST 2013


Hi David, Eric, LLVM devs,

You've probably heard about AddressSanitizer (ASan) and other
sanitizers based on LLVM. One of the things that makes ASan
not as awesome on Windows as it is on Linux
is the symbolization of the stacks.

Currently, ASan runtime on Windows uses
CaptureStackBackTrace/SymFromAddr/SymGetLineFromAddr64
to unwind and symbolize stacks.  This works like a charm
in-process for stack frames built with CL, but yields
"function+0x0ff537" for frames built with Clang.

I came up with a prototype which emits "old-style debug info" COFF
sections that are sufficient to get function name / filename /
linenumber information.  That's pretty much everything that's required
for ASan to work beautifully in terms of the completeness of error
reports.

Attached is a prototype patch which I've tried on some simple tests,
including some more complex ones with weird #line constructions.
It also works just great on ASan/Win tests without any link/run-time
warnings (I had a bunch of those during development, so I can tell it
works rather than fails silently).

I didn't have time to work on threading the command-line flags into
the AsmPrinter yet, so currently it just replaces DWARF entirely.
Of course, this should be fixed before this lands into trunk.
Currently, one can try this patch by using "clang-cl -Xclang -g ...".
Eventually we should have some dedicated flag for clang-cl.

Can you please take a look at the patch and suggest a good path forward?

I'm very unfamiliar with LLVM CodeGen/MC, so I'm pretty sure I made a
few weird things in the code...  I've also put a few TODOs with
questions and suggestions.

Some general questions:
1) Threading flags from the driver down to CodeGen.
  How do we do that? Should we support all 4 combinations
  of no-info/DWARF/CVLT/both?
  How about "-Zmlt" as the clang-cl flag name? ("minimal line tables")

2) Am I right that DWARF is pretty much the only debug info format
  supported by LLVM/AsmPrinter right now?  Do we want to take
  an effort to come up with a generic debuginfogenerator interface
  to share between DwarfDebug and WinCodeViewLineTables?
  Then AsmPrinter should just hold a SmallVector<DebugInfoEmitter*>
  rather than a pair of DD/DE pointers.

3) How would you suggest to write WinCodeViewLineTables tests
  given that dumpbin is not available everywhere except Windows?
  // Yeah, I should have looked at the DwarfDebug LIT tests and
  // written some; but the prototype development went faster
  // than I expected...

Can you suggest ways to split this patch so it's easier
to review part-by-part before this hits trunk?

Thanks!
--
Timur Iskhodzhanov,
Google
-------------- next part --------------
A non-text attachment was scrubbed...
Name: codeview_linetables.patch
Type: application/octet-stream
Size: 36333 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20131114/0eea4311/attachment.obj>


More information about the llvm-dev mailing list