diff options
| author | Michael Pratt <mpratt@google.com> | 2022-09-09 12:29:48 -0400 |
|---|---|---|
| committer | Michael Pratt <mpratt@google.com> | 2022-09-30 20:05:02 +0000 |
| commit | 8a0cf719a626ebd1ec11531ebaeacccbd19178ec (patch) | |
| tree | 496fb6048814eed229ef362972705905e935b3f5 | |
| parent | 33738ddd0a99991459d3bf215004e4327c2f8af2 (diff) | |
| download | go-8a0cf719a626ebd1ec11531ebaeacccbd19178ec.tar.xz | |
cmd/link/internal/ld: panic if inlined functions missing FuncInfo
All inlined functions are Go functions, and thus should be capable of
having a FuncInfo. Missing FuncInfo is likely indication of a compiler
bug that dropped the symbol too early, failing to add it to the symbol
list used for writing output. I believe all existing cases have been
fixed; this check will prevent regressions.
The exception is -linkshared mode. There symbols are loaded from the
shared library, and the FuncInfo is not available. This is a bug, as it
can result in incorrect the FuncID in inlinedCall, but it is very
involved to fix.
For #54959.
For #55954.
Change-Id: Ib0dc4f1ea62525b55f68604d6013ff33223fdcdd
Reviewed-on: https://go-review.googlesource.com/c/go/+/429637
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Michael Pratt <mpratt@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
| -rw-r--r-- | src/cmd/link/internal/ld/pcln.go | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 2a1e15cddb..2f13a24e04 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -171,7 +171,18 @@ func genInlTreeSym(ctxt *Link, cu *sym.CompilationUnit, fi loader.FuncInfo, arch var funcID objabi.FuncID if inlFunc.Valid() { funcID = inlFunc.FuncID() + } else if !ctxt.linkShared { + // Inlined functions are always Go functions, and thus + // must have FuncInfo. + // + // Unfortunately, with -linkshared, the inlined + // function may be external symbols (from another + // shared library), and we don't load FuncInfo from the + // shared library. We will report potentially incorrect + // FuncID in this case. See https://go.dev/issue/55954. + panic(fmt.Sprintf("inlined function %s missing func info", ldr.SymName(call.Func))) } + // Construct runtime.inlinedCall value. const size = 12 inlTreeSym.SetUint8(arch, int64(i*size+0), uint8(funcID)) |
