• Heschi Kreinick's avatar
    cmd/link: fix up location lists for dsymutil · 230b0bad
    Heschi Kreinick authored
    LLVM tools, particularly lldb and dsymutil, don't support base address
    selection entries in location lists. When targeting GOOS=darwin,
    mode, have the linker translate location lists to CU-relative form
    instead.
    
    Technically, this isn't necessary when linking internally, as long as
    nobody plans to use anything other than Delve to look at the DWARF. But
    someone might want to use lldb, and it's really confusing when dwarfdump
    shows gibberish for the location entries. The performance cost isn't
    noticeable, so enable it even for internal linking.
    
    Doing this in the linker is a little weird, but it was more expensive in
    the compiler, probably because the compiler is much more stressful to
    the GC. Also, if we decide to only do it for external linking, the
    compiler can't see the link mode.
    
    Benchmark before and after this commit on Mac with -dwarflocationlists=1:
    
    name        old time/op       new time/op       delta
    StdCmd            21.3s ± 1%        21.3s ± 1%    ~     (p=0.310 n=27+27)
    
    Only StdCmd is relevant, because only StdCmd runs the linker. Whatever
    the cost is here, it's not very large.
    
    Change-Id: I200246dedaee4f824966f7551ac95f8d7123d3b1
    Reviewed-on: https://go-review.googlesource.com/89535Reviewed-by: default avatarDavid Chase <drchase@google.com>
    230b0bad
dwarf.go 59.3 KB