funcdata_go121.go raw

   1  //go:build go1.21 && !go1.23
   2  // +build go1.21,!go1.23
   3  
   4  /*
   5   * Copyright 2021 ByteDance Inc.
   6   *
   7   * Licensed under the Apache License, Version 2.0 (the "License");
   8   * you may not use this file except in compliance with the License.
   9   * You may obtain a copy of the License at
  10   *
  11   *     http://www.apache.org/licenses/LICENSE-2.0
  12   *
  13   * Unless required by applicable law or agreed to in writing, software
  14   * distributed under the License is distributed on an "AS IS" BASIS,
  15   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16   * See the License for the specific language governing permissions and
  17   * limitations under the License.
  18   */
  19  
  20  package loader
  21  
  22  import (
  23      `unsafe`
  24      `github.com/bytedance/sonic/loader/internal/rt`
  25  )
  26  
  27  const (
  28      _Magic uint32 = 0xFFFFFFF1
  29  )
  30  
  31  type moduledata struct {
  32      pcHeader     *pcHeader
  33      funcnametab  []byte
  34      cutab        []uint32
  35      filetab      []byte
  36      pctab        []byte
  37      pclntable    []byte
  38      ftab         []funcTab
  39      findfunctab  uintptr
  40      minpc, maxpc uintptr // first func address, last func address + last func size
  41  
  42      text, etext           uintptr // start/end of text, (etext-text) must be greater than MIN_FUNC
  43      noptrdata, enoptrdata uintptr
  44      data, edata           uintptr
  45      bss, ebss             uintptr
  46      noptrbss, enoptrbss   uintptr
  47      covctrs, ecovctrs     uintptr
  48      end, gcdata, gcbss    uintptr
  49      types, etypes         uintptr
  50      rodata                uintptr
  51      gofunc                uintptr // go.func.* is actual funcinfo object in image
  52  
  53      textsectmap []textSection // see runtime/symtab.go: textAddr()
  54      typelinks   []int32 // offsets from types
  55      itablinks   []*rt.GoItab
  56  
  57      ptab []ptabEntry
  58  
  59      pluginpath string
  60      pkghashes  []modulehash
  61  
  62      // This slice records the initializing tasks that need to be
  63  	// done to start up the program. It is built by the linker.
  64  	inittasks []unsafe.Pointer
  65  
  66      modulename   string
  67      modulehashes []modulehash
  68  
  69      hasmain uint8 // 1 if module contains the main function, 0 otherwise
  70  
  71      gcdatamask, gcbssmask bitVector
  72  
  73      typemap map[int32]*rt.GoType // offset to *_rtype in previous module
  74  
  75      bad bool // module failed to load and should be ignored
  76  
  77      next *moduledata
  78  }
  79  
  80  type _func struct {
  81      entryOff uint32 // start pc, as offset from moduledata.text/pcHeader.textStart
  82      nameOff  int32  // function name, as index into moduledata.funcnametab.
  83  
  84      args        int32  // in/out args size
  85      deferreturn uint32 // offset of start of a deferreturn call instruction from entry, if any.
  86  
  87      pcsp      uint32 
  88      pcfile    uint32
  89      pcln      uint32
  90      npcdata   uint32
  91      cuOffset  uint32 // runtime.cutab offset of this function's CU
  92      startLine int32  // line number of start of function (func keyword/TEXT directive)
  93      funcID    uint8 // set for certain special runtime functions
  94      flag      uint8
  95      _         [1]byte // pad
  96      nfuncdata uint8   // 
  97      
  98      // The end of the struct is followed immediately by two variable-length
  99      // arrays that reference the pcdata and funcdata locations for this
 100      // function.
 101  
 102      // pcdata contains the offset into moduledata.pctab for the start of
 103      // that index's table. e.g.,
 104      // &moduledata.pctab[_func.pcdata[_PCDATA_UnsafePoint]] is the start of
 105      // the unsafe point table.
 106      //
 107      // An offset of 0 indicates that there is no table.
 108      //
 109      // pcdata [npcdata]uint32
 110  
 111      // funcdata contains the offset past moduledata.gofunc which contains a
 112      // pointer to that index's funcdata. e.g.,
 113      // *(moduledata.gofunc +  _func.funcdata[_FUNCDATA_ArgsPointerMaps]) is
 114      // the argument pointer map.
 115      //
 116      // An offset of ^uint32(0) indicates that there is no entry.
 117      //
 118      // funcdata [nfuncdata]uint32
 119  }
 120