Debug info: Infrastructure to support debug locations for fragmented
authorAdrian Prantl <aprantl@apple.com>
Fri, 1 Aug 2014 22:11:58 +0000 (22:11 +0000)
committerAdrian Prantl <aprantl@apple.com>
Fri, 1 Aug 2014 22:11:58 +0000 (22:11 +0000)
commitb1416837f97cd1ec212673fb90fab0fb7df6c442
tree22c532dbd53626600d03903704c6911f00e3d9af
parent4184c79975256bbb9d3eec1622b99361770a6644
Debug info: Infrastructure to support debug locations for fragmented
variables (for example, by-value struct arguments passed in registers, or
large integer values split across several smaller registers).
On the IR level, this adds a new type of complex address operation OpPiece
to DIVariable that describes size and offset of a variable fragment.
On the DWARF emitter level, all pieces describing the same variable are
collected, sorted and emitted as DWARF expressions using the DW_OP_piece
and DW_OP_bit_piece operators.

http://reviews.llvm.org/D3373
rdar://problem/15928306

What this patch doesn't do / Future work:
- This patch only adds the backend machinery to make this work, patches
  that change SROA and SelectionDAG's type legalizer to actually create
  such debug info will follow. (http://reviews.llvm.org/D2680)
- Making the DIVariable complex expressions into an argument of dbg.value
  will reduce the memory footprint of the debug metadata.
- The sorting/uniquing of pieces should be moved into DebugLocEntry,
  to facilitate the merging of multi-piece entries.

llvm-svn: 214576
18 files changed:
llvm/docs/SourceLevelDebugging.rst
llvm/include/llvm/CodeGen/AsmPrinter.h
llvm/include/llvm/IR/DIBuilder.h
llvm/include/llvm/IR/DebugInfo.h
llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
llvm/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp
llvm/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.h
llvm/lib/CodeGen/AsmPrinter/DebugLocEntry.h
llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h
llvm/lib/IR/DIBuilder.cpp
llvm/lib/IR/DebugInfo.cpp
llvm/test/DebugInfo/X86/pieces-1.ll [new file with mode: 0644]
llvm/test/DebugInfo/X86/pieces-2.ll [new file with mode: 0644]
llvm/test/DebugInfo/X86/pieces-3.ll [new file with mode: 0644]