Reapply: Teach SROA how to update debug info for fragmented variables.
authorAdrian Prantl <aprantl@apple.com>
Tue, 20 Jan 2015 19:42:22 +0000 (19:42 +0000)
committerAdrian Prantl <aprantl@apple.com>
Tue, 20 Jan 2015 19:42:22 +0000 (19:42 +0000)
commita65da70a54e586bc29bde4943d246b74b4922d80
tree9f9a24b4974f5ad730c22a3a8c200b89969eb62d
parent46846844ee01e12904fa2f4b0179f2eadf524d57
Reapply: Teach SROA how to update debug info for fragmented variables.
This reapplies r225379.

ChangeLog:
- The assertion that this commit previously ran into about the inability
  to handle indirect variables has since been removed and the backend
  can handle this now.
- Testcases were upgrade to the new MDLocation format.
- Instead of keeping a DebugDeclares map, we now use
  llvm::FindAllocaDbgDeclare().

Original commit message follows.

Debug info: Teach SROA how to update debug info for fragmented variables.
This allows us to generate debug info for extremely advanced code such as

 typedef struct { long int a; int b;} S;

 int foo(S s) {
   return s.b;
 }

which at -O1 on x86_64 is codegen'd into

 define i32 @foo(i64 %s.coerce0, i32 %s.coerce1) #0 {
   ret i32 %s.coerce1, !dbg !24
 }

with this patch we emit the following debug info for this

 TAG_formal_parameter [3]
   AT_location( 0x00000000
                0x0000000000000000 - 0x0000000000000006: rdi, piece 0x00000008, rsi, piece 0x00000004
                0x0000000000000006 - 0x0000000000000008: rdi, piece 0x00000008, rax, piece 0x00000004 )
                AT_name( "s" )
                AT_decl_file( "/Volumes/Data/llvm/_build.ninja.release/test.c" )

Thanks to chandlerc, dblaikie, and echristo for their feedback on all
previous iterations of this patch!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@226598 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/Scalar/SROA.cpp
test/DebugInfo/X86/array2.ll
test/DebugInfo/X86/sroasplit-1.ll [new file with mode: 0644]
test/DebugInfo/X86/sroasplit-2.ll [new file with mode: 0644]
test/DebugInfo/X86/sroasplit-3.ll [new file with mode: 0644]