Debug info: Teach SROA how to update debug info for fragmented variables.
authorAdrian Prantl <aprantl@apple.com>
Mon, 22 Dec 2014 22:26:00 +0000 (22:26 +0000)
committerAdrian Prantl <aprantl@apple.com>
Mon, 22 Dec 2014 22:26:00 +0000 (22:26 +0000)
commite5ca21a2df48e3b3246629b141ea27eb69d7b643
treec54c0b7f0759598c943677a3227d5a63f2909064
parenta834d6a4bba7433473fb28ac95083493c225dfd3
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@224739 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]