internal/cmd/deadcode: a command to report dead code in Go programs

This CL adds a command to report functions that are unreachable
from the main functions of applications and tests.

It uses the Rapid Type Analysis (RTA) algorithm to
compute reachability, and reports all functions referenced
by the SSA representation that were not found to be
reachable, grouped by package and sorted by position.

Also, a basic integration test.

Change-Id: Ide78b4e22d4f4066bf901e2d676e5058ca132827
Reviewed-on: https://go-review.googlesource.com/c/tools/+/507738
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Alan Donovan <adonovan@google.com>
Reviewed-by: Robert Findley <rfindley@google.com>
gopls-CI: kokoro <noreply+kokoro@google.com>
diff --git a/internal/cmd/deadcode/doc.go b/internal/cmd/deadcode/doc.go
new file mode 100644
index 0000000..cdd24e9
--- /dev/null
+++ b/internal/cmd/deadcode/doc.go
@@ -0,0 +1,58 @@
+// Copyright 2023 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+/*
+The deadcode command reports unreachable functions in Go programs.
+
+Usage: deadcode [flags] package...
+
+The deadcode command loads a Go program from source then uses Rapid
+Type Analysis (RTA) to build a call graph of all the functions
+reachable from the program's main function. Any functions that are not
+reachable are reported as dead code, grouped by package.
+
+Packages are expressed in the notation of 'go list' (or other
+underlying build system if you are using an alternative
+golang.org/x/go/packages driver). Only executable (main) packages are
+considered starting points for the analysis.
+
+The -test flag causes it to analyze test executables too. Tests
+sometimes make use of functions that would otherwise appear to be dead
+code, and public API functions reported as dead with -test indicate
+possible gaps in your test coverage. Bear in mind that an Example test
+function without an "Output:" comment is merely documentation:
+it is dead code, and does not contribute coverage.
+
+The -filter flag restricts results to packages that match the provided
+regular expression; its default value is the module name of the first
+package. Use -filter= to display all results.
+
+Example: show all dead code within the gopls module:
+
+	$ deadcode -test golang.org/x/tools/gopls/...
+
+The analysis can soundly analyze dynamic calls though func values,
+interface methods, and reflection. However, it does not currently
+understand the aliasing created by //go:linkname directives, so it
+will fail to recognize that calls to a linkname-annotated function
+with no body in fact dispatch to the function named in the annotation.
+This may result in the latter function being spuriously reported as dead.
+
+In any case, just because a function is reported as dead does not mean
+it is unconditionally safe to delete it. For example, a dead function
+may be referenced (by another dead function), and a dead method may be
+required to satisfy an interface (that is never called).
+Some judgement is required.
+
+The analysis is valid only for a single GOOS/GOARCH/-tags configuration,
+so a function reported as dead may be live in a different configuration.
+Consider running the tool once for each configuration of interest.
+Use the -line flag to emit a line-oriented output that makes it
+easier to compute the intersection of results across all runs.
+
+THIS TOOL IS EXPERIMENTAL and its interface may change.
+At some point it may be published at cmd/deadcode.
+In the meantime, please give us feedback at github.com/golang/go/issues.
+*/
+package main