summaryrefslogtreecommitdiff
path: root/vendor/github.com/bytedance/sonic/loader/funcdata_go116.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/bytedance/sonic/loader/funcdata_go116.go')
-rw-r--r--vendor/github.com/bytedance/sonic/loader/funcdata_go116.go160
1 files changed, 36 insertions, 124 deletions
diff --git a/vendor/github.com/bytedance/sonic/loader/funcdata_go116.go b/vendor/github.com/bytedance/sonic/loader/funcdata_go116.go
index 508268e7d..1dfe2297d 100644
--- a/vendor/github.com/bytedance/sonic/loader/funcdata_go116.go
+++ b/vendor/github.com/bytedance/sonic/loader/funcdata_go116.go
@@ -20,9 +20,9 @@
package loader
import (
- `encoding`
`os`
`unsafe`
+ `sort`
`github.com/bytedance/sonic/internal/rt`
)
@@ -171,99 +171,7 @@ type compilationUnit struct {
fileNames []string
}
-// func name table format:
-// nameOff[0] -> namePartA namePartB namePartC \x00
-// nameOff[1] -> namePartA namePartB namePartC \x00
-// ...
-func makeFuncnameTab(funcs []Func) (tab []byte, offs []int32) {
- offs = make([]int32, len(funcs))
- offset := 0
-
- for i, f := range funcs {
- offs[i] = int32(offset)
-
- a, b, c := funcNameParts(f.Name)
- tab = append(tab, a...)
- tab = append(tab, b...)
- tab = append(tab, c...)
- tab = append(tab, 0)
- offset += len(a) + len(b) + len(c) + 1
- }
-
- return
-}
-
-// CU table format:
-// cuOffsets[0] -> filetabOffset[0] filetabOffset[1] ... filetabOffset[len(CUs[0].fileNames)-1]
-// cuOffsets[1] -> filetabOffset[len(CUs[0].fileNames)] ... filetabOffset[len(CUs[0].fileNames) + len(CUs[1].fileNames)-1]
-// ...
-//
-// file name table format:
-// filetabOffset[0] -> CUs[0].fileNames[0] \x00
-// ...
-// filetabOffset[len(CUs[0]-1)] -> CUs[0].fileNames[len(CUs[0].fileNames)-1] \x00
-// ...
-// filetabOffset[SUM(CUs,fileNames)-1] -> CUs[len(CU)-1].fileNames[len(CUs[len(CU)-1].fileNames)-1] \x00
-func makeFilenametab(cus []compilationUnit) (cutab []uint32, filetab []byte, cuOffsets []uint32) {
- cuOffsets = make([]uint32, len(cus))
- cuOffset := 0
- fileOffset := 0
-
- for i, cu := range cus {
- cuOffsets[i] = uint32(cuOffset)
-
- for _, name := range cu.fileNames {
- cutab = append(cutab, uint32(fileOffset))
-
- fileOffset += len(name) + 1
- filetab = append(filetab, name...)
- filetab = append(filetab, 0)
- }
-
- cuOffset += len(cu.fileNames)
- }
-
- return
-}
-
-func writeFuncdata(out *[]byte, funcs []Func) (fstart int, funcdataOffs [][]uint32) {
- fstart = len(*out)
- *out = append(*out, byte(0))
- offs := uint32(1)
-
- funcdataOffs = make([][]uint32, len(funcs))
- for i, f := range funcs {
-
- var writer = func(fd encoding.BinaryMarshaler) {
- var ab []byte
- var err error
- if fd != nil {
- ab, err = fd.MarshalBinary()
- if err != nil {
- panic(err)
- }
- funcdataOffs[i] = append(funcdataOffs[i], offs)
- } else {
- ab = []byte{0}
- funcdataOffs[i] = append(funcdataOffs[i], _INVALID_FUNCDATA_OFFSET)
- }
- *out = append(*out, ab...)
- offs += uint32(len(ab))
- }
-
- writer(f.ArgsPointerMaps)
- writer(f.LocalsPointerMaps)
- writer(f.StackObjects)
- writer(f.InlTree)
- writer(f.OpenCodedDeferInfo)
- writer(f.ArgInfo)
- writer(f.ArgLiveInfo)
- writer(f.WrapInfo)
- }
- return
-}
-
-func makeFtab(funcs []_func, lastFuncSize uint32) (ftab []funcTab, pclntabSize int64, startLocations []uint32) {
+func makeFtab(funcs []_func, maxpc uintptr) (ftab []funcTab, pclntabSize int64, startLocations []uint32) {
// Allocate space for the pc->func table. This structure consists of a pc offset
// and an offset to the func structure. After that, we have a single pc
// value that marks the end of the last function in the binary.
@@ -283,14 +191,13 @@ func makeFtab(funcs []_func, lastFuncSize uint32) (ftab []funcTab, pclntabSize i
}
// Final entry of table is just end pc offset.
- lastFunc := funcs[len(funcs)-1]
- ftab = append(ftab, funcTab{lastFunc.entry + uintptr(lastFuncSize), 0})
+ ftab = append(ftab, funcTab{maxpc, 0})
return
}
// Pcln table format: [...]funcTab + [...]_Func
-func makePclntable(size int64, startLocations []uint32, funcs []_func, lastFuncSize uint32, pcdataOffs [][]uint32, funcdataAddr uintptr, funcdataOffs [][]uint32) (pclntab []byte) {
+func makePclntable(size int64, startLocations []uint32, funcs []_func, maxpc uintptr, pcdataOffs [][]uint32, funcdataAddr uintptr, funcdataOffs [][]uint32) (pclntab []byte) {
pclntab = make([]byte, size, size)
// write a map of pc->func info offsets
@@ -301,8 +208,7 @@ func makePclntable(size int64, startLocations []uint32, funcs []_func, lastFuncS
offs += 16
}
// Final entry of table is just end pc offset.
- lastFunc := funcs[len(funcs)-1]
- byteOrder.PutUint64(pclntab[offs:offs+8], uint64(lastFunc.entry)+uint64(lastFuncSize))
+ byteOrder.PutUint64(pclntab[offs:offs+8], uint64(maxpc))
offs += 8
// write func info table
@@ -374,21 +280,22 @@ func writeFindfunctab(out *[]byte, ftab []funcTab) (start int) {
tab := make([]findfuncbucket, 0, nbuckets)
var s, e = 0, 0
for i := 0; i<int(nbuckets); i++ {
- var pc = min + uintptr((i+1)*_BUCKETSIZE)
- // find the end func of the bucket
- for ; e < len(ftab)-1 && ftab[e+1].entry <= pc; e++ {}
// store the start func of the bucket
var fb = findfuncbucket{idx: uint32(s)}
+ // find the last e-th func of the bucket
+ var pc = min + uintptr((i+1)*_BUCKETSIZE)
+ for ; e < len(ftab)-1 && ftab[e+1].entry <= pc; e++ {}
+
for j := 0; j<_SUBBUCKETS && (i*_SUBBUCKETS+j)<int(n); j++ {
- pc = min + uintptr(i*_BUCKETSIZE) + uintptr((j+1)*_SUB_BUCKETSIZE)
- var ss = s
- // find the end func of the subbucket
- for ; ss < len(ftab)-1 && ftab[ss+1].entry <= pc; ss++ {}
// store the start func of the subbucket
fb._SUBBUCKETS[j] = byte(uint32(s) - fb.idx)
- s = ss
+
+ // find the s-th end func of the subbucket
+ pc = min + uintptr(i*_BUCKETSIZE) + uintptr((j+1)*_SUB_BUCKETSIZE)
+ for ; s < len(ftab)-1 && ftab[s+1].entry <= pc; s++ {}
}
+
s = e
tab = append(tab, fb)
}
@@ -401,15 +308,20 @@ func writeFindfunctab(out *[]byte, ftab []funcTab) (start int) {
return
}
-func makeModuledata(name string, filenames []string, funcs []Func, text []byte) (mod *moduledata) {
+func makeModuledata(name string, filenames []string, funcsp *[]Func, text []byte) (mod *moduledata) {
mod = new(moduledata)
mod.modulename = name
+ // sort funcs by entry
+ funcs := *funcsp
+ sort.Slice(funcs, func(i, j int) bool {
+ return funcs[i].EntryOff < funcs[j].EntryOff
+ })
+ *funcsp = funcs
+
// make filename table
cu := make([]string, 0, len(filenames))
- for _, f := range filenames {
- cu = append(cu, f)
- }
+ cu = append(cu, filenames...)
cutab, filetab, cuOffs := makeFilenametab([]compilationUnit{{cu}})
mod.cutab = cutab
mod.filetab = filetab
@@ -428,9 +340,16 @@ func makeModuledata(name string, filenames []string, funcs []Func, text []byte)
// make it executable
mprotect(addr, size)
+ // assign addresses
+ mod.text = addr
+ mod.etext = addr + uintptr(size)
+ mod.minpc = addr
+ mod.maxpc = addr + uintptr(len(text))
+
// make pcdata table
// NOTICE: _func only use offset to index pcdata, thus no need mmap() pcdata
- pctab, pcdataOffs, _funcs := makePctab(funcs, addr, cuOffs, nameOffs)
+ cuOff := cuOffs[0]
+ pctab, pcdataOffs, _funcs := makePctab(funcs, addr, cuOff, nameOffs)
mod.pctab = pctab
// write func data
@@ -440,8 +359,7 @@ func makeModuledata(name string, filenames []string, funcs []Func, text []byte)
fstart, funcdataOffs := writeFuncdata(&cache, funcs)
// make pc->func (binary search) func table
- lastFuncsize := funcs[len(funcs)-1].TextSize
- ftab, pclntSize, startLocations := makeFtab(_funcs, lastFuncsize)
+ ftab, pclntSize, startLocations := makeFtab(_funcs, mod.maxpc)
mod.ftab = ftab
// write pc->func (modmap) findfunc table
@@ -455,15 +373,9 @@ func makeModuledata(name string, filenames []string, funcs []Func, text []byte)
funcdataAddr := uintptr(rt.IndexByte(cache, fstart))
// make pclnt table
- pclntab := makePclntable(pclntSize, startLocations, _funcs, lastFuncsize, pcdataOffs, funcdataAddr, funcdataOffs)
+ pclntab := makePclntable(pclntSize, startLocations, _funcs, mod.maxpc, pcdataOffs, funcdataAddr, funcdataOffs)
mod.pclntable = pclntab
- // assign addresses
- mod.text = addr
- mod.etext = addr + uintptr(size)
- mod.minpc = addr
- mod.maxpc = addr + uintptr(len(text))
-
// make pc header
mod.pcHeader = &pcHeader {
magic : _Magic,
@@ -487,7 +399,7 @@ func makeModuledata(name string, filenames []string, funcs []Func, text []byte)
// makePctab generates pcdelta->valuedelta tables for functions,
// and returns the table and the entry offset of every kind pcdata in the table.
-func makePctab(funcs []Func, addr uintptr, cuOffset []uint32, nameOffset []int32) (pctab []byte, pcdataOffs [][]uint32, _funcs []_func) {
+func makePctab(funcs []Func, addr uintptr, cuOffset uint32, nameOffset []int32) (pctab []byte, pcdataOffs [][]uint32, _funcs []_func) {
_funcs = make([]_func, len(funcs))
// Pctab offsets of 0 are considered invalid in the runtime. We respect
@@ -538,7 +450,7 @@ func makePctab(funcs []Func, addr uintptr, cuOffset []uint32, nameOffset []int32
_f.deferreturn = f.DeferReturn
// NOTICE: _func.pcdata is always as [PCDATA_UnsafePoint(0) : PCDATA_ArgLiveIndex(3)]
_f.npcdata = uint32(_N_PCDATA)
- _f.cuOffset = cuOffset[i]
+ _f.cuOffset = cuOffset
_f.funcID = f.ID
_f.nfuncdata = uint8(_N_FUNCDATA)
}
@@ -546,4 +458,4 @@ func makePctab(funcs []Func, addr uintptr, cuOffset []uint32, nameOffset []int32
return
}
-func registerFunction(name string, pc uintptr, textSize uintptr, fp int, args int, size uintptr, argptrs uintptr, localptrs uintptr) {} \ No newline at end of file
+func registerFunction(name string, pc uintptr, textSize uintptr, fp int, args int, size uintptr, argptrs uintptr, localptrs uintptr) {}