Source file src/internal/abi/symtab.go
1 // Copyright 2023 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package abi 6 7 // PCLnTabMagic is the version at the start of the PC/line table. 8 // This is the start of the .pclntab section, and is also runtime.pcHeader. 9 // The magic numbers are chosen such that reading the value with 10 // a different endianness does not result in the same value. 11 // That lets us the magic number to determine the endianness. 12 type PCLnTabMagic uint32 13 14 const ( 15 // Initial PCLnTabMagic value used in Go 1.2 through Go 1.15. 16 Go12PCLnTabMagic PCLnTabMagic = 0xfffffffb 17 // PCLnTabMagic value used in Go 1.16 through Go 1.17. 18 // Several fields added to header (CL 241598). 19 Go116PCLnTabMagic PCLnTabMagic = 0xfffffffa 20 // PCLnTabMagic value used in Go 1.18 through Go 1.19. 21 // Entry PC of func data changed from address to offset (CL 351463). 22 Go118PCLnTabMagic PCLnTabMagic = 0xfffffff0 23 // PCLnTabMagic value used in Go 1.20 and later. 24 // A ":" was added to generated symbol names (#37762). 25 Go120PCLnTabMagic PCLnTabMagic = 0xfffffff1 26 27 // CurrentPCLnTabMagic is the value emitted by the current toolchain. 28 // This is written by the linker to the pcHeader and read by the 29 // runtime and debug/gosym (and external tools like Delve). 30 // 31 // Change this value when updating the pclntab version. 32 // Changing this exported value is OK because is an 33 // internal package. 34 CurrentPCLnTabMagic = Go120PCLnTabMagic 35 ) 36 37 // A FuncFlag records bits about a function, passed to the runtime. 38 type FuncFlag uint8 39 40 const ( 41 // FuncFlagTopFrame indicates a function that appears at the top of its stack. 42 // The traceback routine stop at such a function and consider that a 43 // successful, complete traversal of the stack. 44 // Examples of TopFrame functions include goexit, which appears 45 // at the top of a user goroutine stack, and mstart, which appears 46 // at the top of a system goroutine stack. 47 FuncFlagTopFrame FuncFlag = 1 << iota 48 49 // FuncFlagSPWrite indicates a function that writes an arbitrary value to SP 50 // (any write other than adding or subtracting a constant amount). 51 // The traceback routines cannot encode such changes into the 52 // pcsp tables, so the function traceback cannot safely unwind past 53 // SPWrite functions. Stopping at an SPWrite function is considered 54 // to be an incomplete unwinding of the stack. In certain contexts 55 // (in particular garbage collector stack scans) that is a fatal error. 56 FuncFlagSPWrite 57 58 // FuncFlagAsm indicates that a function was implemented in assembly. 59 FuncFlagAsm 60 ) 61 62 // A FuncID identifies particular functions that need to be treated 63 // specially by the runtime. 64 // Note that in some situations involving plugins, there may be multiple 65 // copies of a particular special runtime function. 66 type FuncID uint8 67 68 const ( 69 // If you add a FuncID, you probably also want to add an entry to the map in 70 // ../../cmd/internal/objabi/funcid.go 71 72 FuncIDNormal FuncID = iota // not a special function 73 FuncID_abort 74 FuncID_asmcgocall 75 FuncID_asyncPreempt 76 FuncID_cgocallback 77 FuncID_corostart 78 FuncID_debugCallV2 79 FuncID_gcBgMarkWorker 80 FuncID_goexit 81 FuncID_gogo 82 FuncID_gopanic 83 FuncID_handleAsyncEvent 84 FuncID_mcall 85 FuncID_morestack 86 FuncID_mstart 87 FuncID_panicwrap 88 FuncID_rt0_go 89 FuncID_runtime_main 90 FuncID_runFinalizers 91 FuncID_runCleanups 92 FuncID_sigpanic 93 FuncID_systemstack 94 FuncID_systemstack_switch 95 FuncIDWrapper // any autogenerated code (hash/eq algorithms, method wrappers, etc.) 96 ) 97 98 // ArgsSizeUnknown is set in Func.argsize to mark all functions 99 // whose argument size is unknown (C vararg functions, and 100 // assembly code without an explicit specification). 101 // This value is generated by the compiler, assembler, or linker. 102 const ArgsSizeUnknown = -0x80000000 103 104 // IDs for PCDATA and FUNCDATA tables in Go binaries. 105 // 106 // These must agree with ../../../runtime/funcdata.h. 107 const ( 108 PCDATA_UnsafePoint = 0 109 PCDATA_StackMapIndex = 1 110 PCDATA_InlTreeIndex = 2 111 PCDATA_ArgLiveIndex = 3 112 PCDATA_PanicBounds = 4 113 114 FUNCDATA_ArgsPointerMaps = 0 115 FUNCDATA_LocalsPointerMaps = 1 116 FUNCDATA_StackObjects = 2 117 FUNCDATA_InlTree = 3 118 FUNCDATA_OpenCodedDeferInfo = 4 119 FUNCDATA_ArgInfo = 5 120 FUNCDATA_ArgLiveInfo = 6 121 FUNCDATA_WrapInfo = 7 122 ) 123 124 // Special values for the PCDATA_UnsafePoint table. 125 const ( 126 UnsafePointSafe = -1 // Safe for async preemption 127 UnsafePointUnsafe = -2 // Unsafe for async preemption 128 129 // UnsafePointRestart1(2) apply on a sequence of instructions, within 130 // which if an async preemption happens, we should back off the PC 131 // to the start of the sequence when resuming. 132 // We need two so we can distinguish the start/end of the sequence 133 // in case that two sequences are next to each other. 134 UnsafePointRestart1 = -3 135 UnsafePointRestart2 = -4 136 137 // Like UnsafePointRestart1, but back to function entry if async preempted. 138 UnsafePointRestartAtEntry = -5 139 ) 140 141 const MINFUNC = 16 // minimum size for a function 142 143 const FuncTabBucketSize = 256 * MINFUNC // size of bucket in the pc->func lookup table 144