• Heschi Kreinick's avatar
    cmd/link: fix up location lists for dsymutil · f1fc9da3
    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: Ic8ef780d0e263230ce6aa3ca3a32fc9abd750b1e
    Reviewed-on: https://go-review.googlesource.com/97956
    Run-TryBot: Heschi Kreinick <heschi@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarDavid Chase <drchase@google.com>
    f1fc9da3
dwarf.go 59.3 KB