aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/link/internal/ld/deadcode2.go
AgeCommit message (Collapse)Author
2020-04-20[dev.link] cmd/link: rename deadcode2 to deadcodeJeremy Faller
deadcode's been completely replaced. Make its death official. Change-Id: I85f1e3968463f216b8bce2fb7217c3b51641939f Reviewed-on: https://go-review.googlesource.com/c/go/+/229002 Run-TryBot: Jeremy Faller <jeremy@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
2020-04-19cmd/link: check for reflect.Value.MethodByName explicitlyCherry Zhang
Currently we only check for reflect.Value.Method. And reflect.Value.MethodByName is covered since it calls reflect.Value.Method internally. But it is brittle to rely on implementation detail of the reflect package. Check for MethodByName explicitly. Change-Id: Ifa8920e997524003dade03abc4fb3c4e64723643 Reviewed-on: https://go-review.googlesource.com/c/go/+/228881 Run-TryBot: Cherry Zhang <cherryyz@google.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
2020-04-18cmd/link: stop checking reflect.Value.Call in deadcode passCherry Zhang
In the linker's deadcode pass, we need to keep a method live if it can be reached through reflection. We do this by marking all exported method live if reflect.Value.Method or reflect.Type.Method is used. Currently we also check for reflect.Value.Call, which is unnecessary because in order to call a method through reflection, the method must be obtained through reflect.Value.Method or reflect.Type.Method, which we already check. Per discussion in https://groups.google.com/d/msg/golang-dev/eG9It63-Bxg/_bnoVy-eAwAJ Thanks Brad, Russ, and Ian for bringing this up. Change-Id: I8e9529a224bb898dbf5752674cc9d155db386c14 Reviewed-on: https://go-review.googlesource.com/c/go/+/228792 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2020-04-01[dev.link] cmd/link: stop marking DWARF constant symbolsCherry Zhang
DWARF constant symbols were always marked and converted to sym.Symbols when DWARF generation uses sym.Symbols. Now that the DWARF generation uses the loader, no need to force-mark them. Change-Id: Ia4032430697cfa901fb4b6d106a483973277ea0a Reviewed-on: https://go-review.googlesource.com/c/go/+/226803 Reviewed-by: Than McIntosh <thanm@google.com> Reviewed-by: Jeremy Faller <jeremy@golang.org>
2020-03-31[dev.link] cmd/link: unify Relocs.Count and len(rs)Cherry Zhang
The Count field in Relocs type is always equal to len(rs). Unify them. Change-Id: Ic77288ea58b61a98482b218e051d81047d0ddd88 Reviewed-on: https://go-review.googlesource.com/c/go/+/226717 Run-TryBot: Cherry Zhang <cherryyz@google.com> Reviewed-by: Than McIntosh <thanm@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
2020-03-30[dev.link] cmd/link: use new-style relocation accessors in LoadFullCherry Zhang
This gives some small speedup: (linking cmd/compile) Loadlibfull 77.8ms ± 6% 68.6ms ± 5% -11.88% (p=0.008 n=5+5) Also convert some Relocs.At to At2, which should have been done earlier. Change-Id: I2a66aeb5857234c6e645e1b23380149cffc8221f Reviewed-on: https://go-review.googlesource.com/c/go/+/226363 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com> Reviewed-by: Jeremy Faller <jeremy@golang.org>
2020-03-16[dev.link] cmd/link: use new relocation accessors in DWARF generationCherry Zhang
This gives some speedup and reduces some allocations: (linking cmd/compile) DwarfGenerateDebugInfo 63.2ms ± 3% 41.7ms ± 3% -34.04% (p=0.008 n=5+5) DwarfGenerateDebugInfo 20.0MB ± 0% 10.1MB ± 0% -49.62% (p=0.008 n=5+5) There are code that modify relocations, which are still using the earlier loader.Reloc slice for now. Change-Id: I3359ba305bf82cc882ae3c0f548d6ccfc8add789 Reviewed-on: https://go-review.googlesource.com/c/go/+/223663 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
2020-03-16[dev.link] cmd/internal/goobj2, cmd/link: experiment new aux symbol accessorsCherry Zhang
Following the previous CLs, do the same for aux symbols. This has some small speedup: (linking cmd/compile) Dostkcheck 41.0ms ± 1% 38.6ms ± 1% -6.00% (p=0.008 n=5+5) Change-Id: Id62b2fc9e4ef1be92e60e4c03faec0a953eee94e Reviewed-on: https://go-review.googlesource.com/c/go/+/222303 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
2020-03-16[dev.link] cmd/internal/goobj2, cmd/link: avoid some repeated offset ↵Cherry Zhang
calculations When iterating relocations, do the offset calculation just once. This gives some speedup: (linking cmd/compile) Deadcode 52.8ms ± 1% 47.6ms ± 1% -10.01% (p=0.008 n=5+5) Dostkcheck 44.2ms ± 1% 41.0ms ± 1% -7.29% (p=0.008 n=5+5) Change-Id: I09e38bc29afc379a81f99e3ee4ff467bc1b5f8a5 Reviewed-on: https://go-review.googlesource.com/c/go/+/222302 Reviewed-by: Than McIntosh <thanm@google.com>
2020-03-13[dev.link] cmd/link: experiment new reloc accessors in deadcode passCherry Zhang
There is a small speedup: (linking cmd/compile) name old time/op new time/op delta Deadcode 57.1ms ± 1% 53.5ms ± 1% -6.44% (p=0.008 n=5+5) With this, we don't need a slice to read the relocations, reduce some allocations. name old alloc/op new alloc/op delta Deadcode 4.16MB ± 0% 3.84MB ± 0% -7.85% (p=0.008 n=5+5) Change-Id: Icd41c05682ba3f293a8cb9d2fe818e39d7276e5a Reviewed-on: https://go-review.googlesource.com/c/go/+/222244 Reviewed-by: Than McIntosh <thanm@google.com>
2020-02-19[dev.link] cmd/link: further reduce unnecessary field readingCherry Zhang
Following CL 218479, there are more places where we don't need to read all the fields. Change-Id: I70889cd3f0514ef2c542317f3fe24f5ef99b41d5 Reviewed-on: https://go-review.googlesource.com/c/go/+/220057 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Jeremy Faller <jeremy@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
2020-02-07[dev.link] cmd/link: only read necessary fields in deadcode passCherry Zhang
Reading unnecessary fields from object file take time, even from memory mapping. In deadcode, we do this a alot, so only read necessary ones. In particular, for relocations, for non-type symbols, we only need their target symbols and reloc types to build the dependency graph, so don't read other fields. This should speed up the deadcode pass. Also cache an object's number of defined package symbols, as it is accessed a lot in resolve. This is a bit ugly from an API point of view. It would be nice if the compiler could figure out some fields are not used so don't fill them. Change-Id: I5c4e9526b8a3b0aead9fa71901a51fb214f013a7 Reviewed-on: https://go-review.googlesource.com/c/go/+/218479 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Jeremy Faller <jeremy@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
2020-02-05[dev.link] cmd/link: remove holes from global index spaceCherry Zhang
In CL 217064, we made symbol's global index unique, but we still reserve index space for each object file, which means we may leave holes in the index space if the symbol is a dup or is overwritten. In this CL, we stop reserving index spaces. Instead, symbols are added one at a time, and only added if it does not already exist. There is no more holes in the index space. Change-Id: I3c4e67163c556ba1198e13065706510dac4692fb Reviewed-on: https://go-review.googlesource.com/c/go/+/217519 Reviewed-by: Than McIntosh <thanm@google.com> Reviewed-by: Jeremy Faller <jeremy@golang.org>
2020-01-31[dev.link] all: merge branch 'master' into dev.linkCherry Zhang
It has been a while we have not done this. Merge conflict resolution: - deleted/rewritten code modified on master - CL 214286, ported in CL 217317 (cmd/internal/obj/objfile.go) - CL 210678, it already includes a fix to new code (cmd/link/internal/ld/deadcode.go) - CL 209317, applied in this CL (cmd/link/internal/loadelf/ldelf.go) Change-Id: Ie927ea6a1d69ce49e8d03e56148cb2725e377876
2019-12-27[dev.link] cmd/link: move new decodesym utility routines to a separate fileThan McIntosh
Relocate the various new functions for decoding type.* symbol payloads (using new loader interfaces) to a new file, as opposed to having them tacked onto the end of deadcode2.go. Change-Id: I830a8d1b63d70d5bcbc213f2388d00e12f009a77 Reviewed-on: https://go-review.googlesource.com/c/go/+/211305 Reviewed-by: Cherry Zhang <cherryyz@google.com>
2019-12-18[dev.link] cmd/link: expand set of symbol attributes in loaderThan McIntosh
Add in a collection of new loader interfaces for getting/setting symbol attributes, e.g. properties that would normally be part of the sym.Symbol "Attr" field. This change also moves references to the loaders 'reachable' bitmap behind a pair of loader methods, so that we a consistent way of accessing symbol attributes overall. It is worth noting that not every symbol attribute is backed by a bitmap; for some infrequently used attributes, a map[Sym]struct{} is used instead. Change-Id: I0010c9cd928d41b4bb6cdf45db4581e11c3c5db3 Reviewed-on: https://go-review.googlesource.com/c/go/+/210778 Run-TryBot: Than McIntosh <thanm@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com> Reviewed-by: Jeremy Faller <jeremy@golang.org>
2019-12-10all: fix a number of misuses of the word "an"Daniel Martí
After golang.org/cl/210124, I wondered if the same error had gone unnoticed elsewhere. I quickly spotted another dozen mistakes after reading through the output of: git grep '\<[Aa]n [bcdfgjklmnpqrtvwyz][a-z]' Many results are false positives for acronyms like "an mtime", since it's pronounced "an em-time". However, the total amount of output isn't that large given how simple the grep pattern is. Change-Id: Iaa2ca69e42f4587a9e3137d6c5ed758887906ca6 Reviewed-on: https://go-review.googlesource.com/c/go/+/210678 Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-by: Zach Jones <zachj1@gmail.com> Reviewed-by: Robert Griesemer <gri@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2019-11-03[dev.link] cmd/link: restore -dumpdep in new deadcode passCherry Zhang
Change-Id: I2e52206a95c9463df5661664726a8b3bbf3ad1fc Reviewed-on: https://go-review.googlesource.com/c/go/+/204825 Reviewed-by: Than McIntosh <thanm@google.com>
2019-11-02[dev.link] cmd/link: use min-heap for work queue for better localityCherry Zhang
In the deadcode pass, we use a work queue for the flood algorithm. Currently this is a simple LIFO queue. In this order, there is poor locality in accessing object files. Since the global indices are assigned in package DAG order, edges are mostly either within a package or from a smaller index to a larger one. (With named symbols, there can be backward edges, but shouldn't be too many.) Using a min-heap for the work queue, we access all symbols in one object, then move to next one. It rarely needs to revisit an object that is already visted. This should result in better locality. Benchmark result from Than (thanks!): name old time/op new time/op delta LinkCompiler 1.74s ±11% 1.61s ± 9% -7.80% (p=0.000 n=20+19) LinkWithoutDebugCompiler 1.27s ±11% 1.15s ± 9% -9.02% (p=0.000 n=20+20) Currently this uses the container/heap package, which uses interface elements. If this allocates too much, we may consider to hand-code the min heap. Change-Id: I216d5291c432fe1f40b0b8f4f1b9d388807bf6c5 Reviewed-on: https://go-review.googlesource.com/c/go/+/204438 Reviewed-by: Jeremy Faller <jeremy@golang.org>
2019-11-01[dev.link] cmd/link: add support to new deadcode for field trackingThan McIntosh
Fix up the new dead code pass to include support for populating the ctxt "Reachparent" map, which is needed to support field tracking. Since we don't have sym.Symbols created at the point where new dead code runs, keep track of reachability using global symbol indices, and then once loader.LoadFull is complete we can translate the index mappings into symbol mappings. The fieldtracking output is unfortunately different relative to master, due to differences in the order in which symbols are encountered in deadcode, but I have eyeballed the results to make sure they look reasonable. Change-Id: I48c7a4597f05c00f15af3bfd37fc15ab4d0017c2 Reviewed-on: https://go-review.googlesource.com/c/go/+/204342 Run-TryBot: Than McIntosh <thanm@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
2019-10-31[dev.link] cmd/link: elf host obj support w/ new obj filesJeremy Faller
Add support for elf host objects with new object file format. Change-Id: Ic5be1953359b9b6b78d9a0b715af69763aefd227 Reviewed-on: https://go-review.googlesource.com/c/go/+/201728 Reviewed-by: Cherry Zhang <cherryyz@google.com> Reviewed-by: Than McIntosh <thanm@google.com>
2019-10-31[dev.link] cmd/link: keep DWARF constant DIE symbols liveCherry Zhang
DWARF constant DIE symbols are not referenced by any other symbol, but are needed by the DWARF pass, where they get linked to the compilation unit. Reenable gdb constant test. Change-Id: If77a0d379d9a6f1591939345bc31b027c2567f22 Reviewed-on: https://go-review.googlesource.com/c/go/+/204397 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
2019-10-31[dev.link] cmd/link: add new slice interface for querying aux symbolsThan McIntosh
Add a new loader.Loader.ReadAuxSyms method that returns a slice containing the ids of the aux symbols for a specified global symbol. This is similar to the new interface recently added that allows you to get back a slice of relocations (as opposed to making calls into the loader for each one). This was idea suggested by Cherry. Compilebench numbers: name old time/op new time/op delta LinkCompiler 1.63s ± 9% 1.57s ± 7% -3.84% (p=0.006 n=20+20) LinkWithoutDebugCompiler 1.15s ±11% 1.11s ±11% ~ (p=0.108 n=20+20) name old user-time/op new user-time/op delta LinkCompiler 1.99s ± 8% 2.00s ±12% ~ (p=0.751 n=19+19) LinkWithoutDebugCompiler 1.14s ±11% 1.19s ±21% ~ (p=0.183 n=20+20) Change-Id: Iab6cbe18419aaa61d9cadb3f626a4515c71f2686 Reviewed-on: https://go-review.googlesource.com/c/go/+/203501 Reviewed-by: Jeremy Faller <jeremy@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
2019-10-25[dev.link] cmd/link: rework relocation handling in new deadcodeThan McIntosh
Do a better job of reading relocations in the new deadcode pass. Specifically, during method type processing, read relocations for the symbol we're working on into a slice, and then pass the slice to helper functions, as opposed to rereading relocs at each stage. Change-Id: I95e3737ae91bb09b4da8e6ee68112ec255ceb0fc Reviewed-on: https://go-review.googlesource.com/c/go/+/201722 Run-TryBot: Than McIntosh <thanm@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
2019-10-17[dev.link] cmd/link: record go.itablink symbols during object file readThan McIntosh
Change the new loader to keep a note of the set of "go.itablink.*" symbols (using a small map), and add a method that clients can use to query whether a given global index corresponds to a "go.itablink.*" sym. This eliminates one instance of raw symbol name reading/matching during new deadcode, which should produce a minor speedup. Change-Id: I5915773a3f33c16099ccd68592dbba783d909bc9 Reviewed-on: https://go-review.googlesource.com/c/go/+/201400 Run-TryBot: Than McIntosh <thanm@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
2019-10-17[dev.link] cmd: add flag to mark gotype symbolsThan McIntosh
Add a flag bit to mark symbols in the new object file as containing Go type information. The use of a flag eliminates the need to do symbol name matching as part of the new dead code elimination pass, which should produce a minor speedup. Change-Id: Iec8700e1139e2c4e310644c0766379865d2d6f82 Reviewed-on: https://go-review.googlesource.com/c/go/+/201399 Run-TryBot: Than McIntosh <thanm@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Jeremy Faller <jeremy@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
2019-10-16[dev.link] cmd/link: add basic shared library support in newobj modeCherry Zhang
This CL adds basic shared library support in newobj mode. This is not complete -- there are still tests in misc/cgo/testshared failing. But at least a simple program works, and some tests there pass. Add the mechanism of loading external symbols with contents. (Before, external symbols are always contentless.) This may potentially be also used for other host objects. Change-Id: I68dbf71e7949cc01ebf37ea159084e798ae16925 Reviewed-on: https://go-review.googlesource.com/c/go/+/201537 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Jeremy Faller <jeremy@golang.org>
2019-10-16[dev.link] cmd/link/internal/objfile: relocate loader to new packageThan McIntosh
Third change of several to update the loader API to reflect the final consensus version of the loader API as described in Cherry's doc. This piece: - move objfile.Loader into its own separate package, and update clients accordingly. This includes a few minor cleanups, including converting a couple of loader-related functions to methods, and privatizing some of the loader methods such as ToGlobal/ToLocal. Change-Id: Iae20585751a45491d8b19dcffc096aadae6bbfc6 Reviewed-on: https://go-review.googlesource.com/c/go/+/200998 Run-TryBot: Than McIntosh <thanm@google.com> Reviewed-by: Jeremy Faller <jeremy@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
2019-10-15[dev.link] cmd/internal/obj, cmd/link: use aux symbol for DWARF symbolsCherry Zhang
Use the auxiliary symbol mechanism to connect the text symbol and its associated DWARF symbols. This way, the linker can track the DWARF symbols from the text symbol, without looking up special names. Currently, in the linker this is only used in the deadcode pass to track which DWARF symbols are used and need to load. Later passes still use name lookup for now. Change-Id: I2fe49f3b1f0ecc1472ae8aa93907cff740022d8d Reviewed-on: https://go-review.googlesource.com/c/go/+/199801 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
2019-10-15[dev.link] cmd/link: create sym.Symbols after deadcode in newobj modeCherry Zhang
With the new object files, now we can run the deadcode pass on indices instead of Symbol structs, so we can delay creating Symbols after the deadcode pass. Then we only need to create reachable symbols. Not create Symbols in LoadNew and LoadRefs, and recombine LoadReloc into LoadFull. Split loadcgo into two parts: the first finds root symbols, the second create Symbols and sets attributes. The first runs before the deadcode pass, while the second runs after. TODO: currently there are still symbols that are not marked reachable but still used. This includes DWARF symbols, file symbols, and type symbols that are referenced by DWARF symbols. We still need to create them (conservatively). Change-Id: I695779c9312be9d49ab1683957ac3e72e1f65a1e Reviewed-on: https://go-review.googlesource.com/c/go/+/199643 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
2019-10-14[dev.link] cmd/link: support reflect.Type.Method tracking in deadcode2Cherry Zhang
When reflect.Type.Method is called, all exported methods from a reachable type need to be conservatively live. When such a function is called, the compiler sets an attribute to the function, and the linker needs to check that attribute. Implement this in the index-based deadcode pass. Unify symbol flags and FuncInfo flags to make things simpler. In particular, the deadcode pass can check the reflectMethod attribute without reading in and decoding FuncInfo. Change-Id: Ibb21e172f2996e899c6efa5551a29d0eca62df67 Reviewed-on: https://go-review.googlesource.com/c/go/+/200099 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
2019-10-14[dev.link] cmd/link: implement live method tracking in deadcode2Cherry Zhang
This essentially replicates the logic of live method tracking and type symbol decoding, rewritten to operate on indices instead of Symbols. TODO: the special handling of reflect.Type.Method has not been implemented. TODO: the symbol name is used too much. It ought to be a better way to do it. Change-Id: I860ee7a506c00833902e4870d15aea698a705dd9 Reviewed-on: https://go-review.googlesource.com/c/go/+/199078 Reviewed-by: Than McIntosh <thanm@google.com>
2019-10-11[dev.link] cmd/link/internal/objfile: update deadcode2 to use new reloc hooksThan McIntosh
Update the new deadcode pass to use the revised loader interface for querying relocations. Remove some of the previous loader relocation methods, since they are no longer used. Change-Id: I08cec4c05793a17698b2674068f64837a5bf4477 Reviewed-on: https://go-review.googlesource.com/c/go/+/200718 Reviewed-by: Cherry Zhang <cherryyz@google.com>
2019-10-10[dev.link] cmd/link: use index for deadcodeCherry Zhang
Switch the deadcode pass to use indices instead of Symbol structures when using new object file format. Delay loading symbol relocations and contents fully after the deadcode pass. The next step is not to create Symbol structures until deadcode is done. Method tracking logic hasn't been implemented. Currently, all methods of a reachable type are live. Change-Id: Iffcd06ff84e6e52bd9eb24d1220d94234d18ab6b Reviewed-on: https://go-review.googlesource.com/c/go/+/198199 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>