Skip to content

Commit

Permalink
rewrite struct Module and struct CodeReloc
Browse files Browse the repository at this point in the history
  • Loading branch information
pkujhd committed Jun 9, 2020
1 parent 730e37c commit bdc1a9b
Show file tree
Hide file tree
Showing 14 changed files with 137 additions and 147 deletions.
1 change: 1 addition & 0 deletions const.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ const (
IntSize = int(unsafe.Sizeof(int(0)))
_FuncSize = int(unsafe.Sizeof(_func{}))
ItabSize = int(unsafe.Sizeof(itab{}))
FindFuncBucketSize = int(unsafe.Sizeof(findfuncbucket{}))
INVALID_HANDLE_VALUE = ^uintptr(0)
INVALID_OFFSET = int(-1)
)
Expand Down
6 changes: 3 additions & 3 deletions dymcode.1.12.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ const (
// Update cmd/link/internal/sym/AbiSymKindToSymKind for new SymKind values.
)

func addStackObject(code *CodeReloc, fi *funcData, seg *segment, symPtr map[string]uintptr) {
_addStackObject(code, fi, seg, symPtr)
func addStackObject(codereloc *CodeReloc, funcdata *funcData, seg *segment, symPtr map[string]uintptr) {
_addStackObject(codereloc, funcdata, seg, symPtr)
}

func addDeferReturn(code *CodeReloc, fi *funcData, seg *segment) {
func addDeferReturn(codereloc *CodeReloc, funcdata *funcData, seg *segment) {
}
21 changes: 11 additions & 10 deletions dymcode.1.14.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,23 +56,24 @@ const (

)

func addStackObject(code *CodeReloc, fi *funcData, seg *segment, symPtr map[string]uintptr) {
_addStackObject(code, fi, seg, symPtr)
func addStackObject(codereloc *CodeReloc, funcdata *funcData, seg *segment, symPtr map[string]uintptr) {
_addStackObject(codereloc, funcdata, seg, symPtr)
}

func addDeferReturn(code *CodeReloc, fi *funcData, seg *segment) {
if len(fi.funcdata) > _FUNCDATA_OpenCodedDeferInfo && fi.funcdata[_FUNCDATA_OpenCodedDeferInfo] != 0xFFFFFFFF {
sym := code.SymMap[fi.name]
func addDeferReturn(codereloc *CodeReloc, funcdata *funcData, seg *segment) {
if len(funcdata.Func.FuncData) > _FUNCDATA_OpenCodedDeferInfo &&
codereloc.stkmaps[funcdata.Func.FuncData[_FUNCDATA_OpenCodedDeferInfo].Sym.Name] != nil {
sym := codereloc.SymMap[funcdata.Name]
for _, r := range sym.Reloc {
if r.Sym == code.SymMap[RUNTIME_DEFERRETURN] {
if r.Sym == codereloc.SymMap[RUNTIME_DEFERRETURN] {
//../cmd/link/internal/ld/pcln.go:pclntab
switch code.Arch {
switch codereloc.Arch {
case ARCH_386, ARCH_AMD64:
fi.deferreturn = uint32(r.Offset) - uint32(sym.Offset) - 1
funcdata.deferreturn = uint32(r.Offset) - uint32(sym.Offset) - 1
case ARCH_ARM32, ARCH_ARM64:
fi.deferreturn = uint32(r.Offset) - uint32(sym.Offset)
funcdata.deferreturn = uint32(r.Offset) - uint32(sym.Offset)
default:
seg.errors += fmt.Sprintf("not support arch:%s\n", code.Arch)
seg.errors += fmt.Sprintf("not support arch:%s\n", codereloc.Arch)
}
break
}
Expand Down
4 changes: 2 additions & 2 deletions dymcode.1.8.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ const (
SDWARFINFO
)

func addStackObject(code *CodeReloc, fi *funcData, seg *segment, symPtr map[string]uintptr) {
func addStackObject(codereloc *CodeReloc, funcdata *funcData, seg *segment, symPtr map[string]uintptr) {
}

func addDeferReturn(code *CodeReloc, fi *funcData, seg *segment) {
func addDeferReturn(codereloc *CodeReloc, funcdata *funcData, seg *segment) {
}
4 changes: 2 additions & 2 deletions dymcode.1.9.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ const (
// Update cmd/link/internal/sym/AbiSymKindToSymKind for new SymKind values.
)

func addStackObject(code *CodeReloc, fi *funcData, seg *segment, symPtr map[string]uintptr) {
func addStackObject(codereloc *CodeReloc, funcdata *funcData, seg *segment, symPtr map[string]uintptr) {
}

func addDeferReturn(code *CodeReloc, fi *funcData, seg *segment) {
func addDeferReturn(codereloc *CodeReloc, funcdata *funcData, seg *segment) {
}
83 changes: 41 additions & 42 deletions dymcode.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,18 +54,17 @@ type CodeReloc struct {
Data []byte
Mod Module
SymMap map[string]*SymData
GCObjs map[string]uintptr
stkmaps map[string][]byte
FileMap map[string]int
Arch string
}

type CodeModule struct {
Syms map[string]uintptr
CodeByte []byte
Module *moduledata
pcfuncdata []findfuncbucket
stkmaps [][]byte
itabs map[string]*itabSym
Syms map[string]uintptr
CodeByte []byte
Module *moduledata
stkmaps map[string][]byte
itabs map[string]*itabSym
}

type itabSym struct {
Expand Down Expand Up @@ -409,66 +408,66 @@ func relocate(code *CodeReloc, symPtr map[string]uintptr, codeModule *CodeModule
}
}

func addFuncTab(module *moduledata, i, offset int, code *CodeReloc, seg *segment, symPtr map[string]uintptr) int {
module.ftab[i].entry = uintptr(seg.symAddrs[code.Mod.funcinfo[i].name])
func addFuncTab(module *moduledata, i int, pclnOff *int, codereloc *CodeReloc, seg *segment, symPtr map[string]uintptr) {
module.ftab[i].entry = uintptr(seg.symAddrs[codereloc.Mod.funcdata[i].Name])

offset = alignof(offset, PtrSize)
offset := alignof(*pclnOff, PtrSize)
module.ftab[i].funcoff = uintptr(offset)
fi := code.Mod.funcinfo[i]
fi.entry = module.ftab[i].entry

funcdata := make([]uintptr, len(fi.funcdata))
copy(funcdata, fi.funcdata)
for i, v := range fi.funcdata {
if code.Mod.stkmaps[v] != nil {
funcdata[i] = (uintptr)(unsafe.Pointer(&(code.Mod.stkmaps[v][0])))
funcdata := codereloc.Mod.funcdata[i]
funcdata.entry = module.ftab[i].entry

data := make([]uintptr, len(funcdata.Func.FuncData))
for k, symbol := range funcdata.Func.FuncData {
if codereloc.stkmaps[symbol.Sym.Name] != nil {
data[k] = (uintptr)(unsafe.Pointer(&(codereloc.stkmaps[symbol.Sym.Name][0])))
} else {
funcdata[i] = (uintptr)(0)
data[k] = (uintptr)(0)
}
}

addStackObject(code, &fi, seg, symPtr)
addDeferReturn(code, &fi, seg)
addStackObject(codereloc, &funcdata, seg, symPtr)
addDeferReturn(codereloc, &funcdata, seg)

copy2Slice(module.pclntable[offset:], uintptr(unsafe.Pointer(&fi._func)), _FuncSize)
copy2Slice(module.pclntable[offset:], uintptr(unsafe.Pointer(&funcdata._func)), _FuncSize)
offset += _FuncSize

if len(fi.pcdata) > 0 {
size := int(int32(unsafe.Sizeof(fi.pcdata[0])) * fi.npcdata)
copy2Slice(module.pclntable[offset:], uintptr(unsafe.Pointer(&fi.pcdata[0])), size)
offset += size
pcln := uint32(funcdata.pcln) + uint32(funcdata.Func.PCLine.Size)
for k := 0; k < len(funcdata.Func.PCData); k++ {
binary.LittleEndian.PutUint32(module.pclntable[offset:], pcln)
pcln += uint32(funcdata.Func.PCData[k].Size)
offset += Uint32Size
}

offset = alignof(offset, PtrSize)
funcDataSize := int(PtrSize * fi.nfuncdata)
copy2Slice(module.pclntable[offset:], uintptr(unsafe.Pointer(&funcdata[0])), funcDataSize)
funcDataSize := int(PtrSize * funcdata.nfuncdata)
copy2Slice(module.pclntable[offset:], uintptr(unsafe.Pointer(&data[0])), funcDataSize)
offset += funcDataSize

return offset
*pclnOff = offset
}

func buildModule(code *CodeReloc, symPtr map[string]uintptr, codeModule *CodeModule, seg *segment) {
func buildModule(codereloc *CodeReloc, symPtr map[string]uintptr, codeModule *CodeModule, seg *segment) {
var module moduledata
module.ftab = make([]functab, len(code.Mod.ftab))
copy(module.ftab, code.Mod.ftab)
pclnOff := len(code.Mod.pclntable)
module.pclntable = make([]byte, len(code.Mod.pclntable)+
(_FuncSize+128)*len(code.Mod.ftab))
copy(module.pclntable, code.Mod.pclntable)
module.findfunctab = (uintptr)(unsafe.Pointer(&code.Mod.pcfunc[0]))
module.ftab = make([]functab, len(codereloc.Mod.funcdata))
pclnOff := len(codereloc.Mod.pclntable)
module.pclntable = make([]byte, 4*len(codereloc.Mod.pclntable))
copy(module.pclntable, codereloc.Mod.pclntable)
module.minpc = uintptr(seg.codeBase)
module.maxpc = uintptr(seg.dataBase)
module.filetab = code.Mod.filetab
module.filetab = codereloc.Mod.filetab
module.typemap = make(map[typeOff]uintptr)
module.types = uintptr(seg.codeBase)
module.etypes = uintptr(seg.codeBase + seg.maxLength)
module.text = uintptr(seg.codeBase)
module.etext = uintptr(seg.codeBase + len(code.Code))
codeModule.pcfuncdata = code.Mod.pcfunc // hold reference
codeModule.stkmaps = code.Mod.stkmaps
module.etext = uintptr(seg.codeBase + len(codereloc.Code))
codeModule.stkmaps = codereloc.stkmaps // hold reference
for i := range module.ftab {
pclnOff = addFuncTab(&module, i, pclnOff, code, seg, symPtr)
addFuncTab(&module, i, &pclnOff, codereloc, seg, symPtr)
}
pclnOff = alignof(pclnOff, PtrSize)
module.findfunctab = (uintptr)(unsafe.Pointer(&module.pclntable[pclnOff]))
copy2Slice(module.pclntable[pclnOff:], module.findfunctab, len(codereloc.Mod.pcfunc)*FindFuncBucketSize)
pclnOff += len(codereloc.Mod.pcfunc) * FindFuncBucketSize
module.pclntable = module.pclntable[:pclnOff]
module.ftab = append(module.ftab, functab{})
for i := len(module.ftab) - 1; i > 0; i-- {
Expand Down
10 changes: 5 additions & 5 deletions module.1.10.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,16 +74,16 @@ type _func struct {
nfuncdata int32
}

func init_func(curSym *goobj.Sym, curSymOffset, nameOff, spOff, pcfileOff, pclnOff int) _func {
func init_func(symbol *goobj.Sym, symOff, nameOff, spOff, pcfileOff, pclnOff int) _func {
fdata := _func{
entry: uintptr(curSymOffset),
entry: uintptr(symOff),
nameoff: int32(nameOff),
args: int32(curSym.Func.Args),
args: int32(symbol.Func.Args),
pcsp: int32(spOff),
pcfile: int32(pcfileOff),
pcln: int32(pclnOff),
npcdata: int32(len(curSym.Func.PCData)),
nfuncdata: int32(len(curSym.Func.FuncData)),
npcdata: int32(len(symbol.Func.PCData)),
nfuncdata: int32(len(symbol.Func.FuncData)),
}
return fdata
}
12 changes: 6 additions & 6 deletions module.1.12.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,17 +85,17 @@ type _func struct {
nfuncdata uint8
}

func init_func(curSym *goobj.Sym, curSymOffset, nameOff, spOff, pcfileOff, pclnOff int) _func {
func init_func(symbol *goobj.Sym, symOff, nameOff, spOff, pcfileOff, pclnOff int) _func {
fdata := _func{
entry: uintptr(curSymOffset),
entry: uintptr(symOff),
nameoff: int32(nameOff),
args: int32(curSym.Func.Args),
args: int32(symbol.Func.Args),
pcsp: int32(spOff),
pcfile: int32(pcfileOff),
pcln: int32(pclnOff),
npcdata: int32(len(curSym.Func.PCData)),
funcID: funcID(objabi.GetFuncID(curSym.Name, strings.TrimLeft(curSym.Func.File[0], FILE_SYM_PREFIX))),
nfuncdata: uint8(len(curSym.Func.FuncData)),
npcdata: int32(len(symbol.Func.PCData)),
funcID: funcID(objabi.GetFuncID(symbol.Name, strings.TrimLeft(symbol.Func.File[0], FILE_SYM_PREFIX))),
nfuncdata: uint8(len(symbol.Func.FuncData)),
}
return fdata
}
12 changes: 6 additions & 6 deletions module.1.13.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,17 +86,17 @@ type _func struct {
nfuncdata uint8
}

func init_func(curSym *goobj.Sym, curSymOffset, nameOff, spOff, pcfileOff, pclnOff int) _func {
func init_func(symbol *goobj.Sym, symOff, nameOff, spOff, pcfileOff, pclnOff int) _func {
fdata := _func{
entry: uintptr(curSymOffset),
entry: uintptr(symOff),
nameoff: int32(nameOff),
args: int32(curSym.Func.Args),
args: int32(symbol.Func.Args),
pcsp: int32(spOff),
pcfile: int32(pcfileOff),
pcln: int32(pclnOff),
npcdata: int32(len(curSym.Func.PCData)),
funcID: funcID(objabi.GetFuncID(curSym.Name, strings.TrimLeft(curSym.Func.File[0], FILE_SYM_PREFIX))),
nfuncdata: uint8(len(curSym.Func.FuncData)),
npcdata: int32(len(symbol.Func.PCData)),
funcID: funcID(objabi.GetFuncID(symbol.Name, strings.TrimLeft(symbol.Func.File[0], FILE_SYM_PREFIX))),
nfuncdata: uint8(len(symbol.Func.FuncData)),
}
return fdata
}
12 changes: 6 additions & 6 deletions module.1.14.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,18 +91,18 @@ type _func struct {
nfuncdata uint8 // must be last
}

func init_func(curSym *goobj.Sym, curSymOffset, nameOff, spOff, pcfileOff, pclnOff int) _func {
func init_func(symbol *goobj.Sym, symOff, nameOff, spOff, pcfileOff, pclnOff int) _func {
fdata := _func{
entry: uintptr(curSymOffset),
entry: uintptr(symOff),
nameoff: int32(nameOff),
args: int32(curSym.Func.Args),
args: int32(symbol.Func.Args),
deferreturn: uint32(0),
pcsp: int32(spOff),
pcfile: int32(pcfileOff),
pcln: int32(pclnOff),
npcdata: int32(len(curSym.Func.PCData)),
funcID: funcID(objabi.GetFuncID(curSym.Name, strings.TrimLeft(curSym.Func.File[0], FILE_SYM_PREFIX))),
nfuncdata: uint8(len(curSym.Func.FuncData)),
npcdata: int32(len(symbol.Func.PCData)),
funcID: funcID(objabi.GetFuncID(symbol.Name, strings.TrimLeft(symbol.Func.File[0], FILE_SYM_PREFIX))),
nfuncdata: uint8(len(symbol.Func.FuncData)),
}
return fdata
}
10 changes: 5 additions & 5 deletions module.1.8.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,16 +72,16 @@ type _func struct {
nfuncdata int32
}

func init_func(curSym *goobj.Sym, curSymOffset, nameOff, spOff, pcfileOff, pclnOff int) _func {
func init_func(symbol *goobj.Sym, symOff, nameOff, spOff, pcfileOff, pclnOff int) _func {
fdata := _func{
entry: uintptr(curSymOffset),
entry: uintptr(symOff),
nameoff: int32(nameOff),
args: int32(curSym.Func.Args),
args: int32(symbol.Func.Args),
pcsp: int32(spOff),
pcfile: int32(pcfileOff),
pcln: int32(pclnOff),
npcdata: int32(len(curSym.Func.PCData)),
nfuncdata: int32(len(curSym.Func.FuncData)),
npcdata: int32(len(symbol.Func.PCData)),
nfuncdata: int32(len(symbol.Func.FuncData)),
}
return fdata
}
Loading

0 comments on commit bdc1a9b

Please sign in to comment.