| // Copyright 2023 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package abi |
| |
| // PCLnTabMagic is the version at the start of the PC/line table. |
| // This is the start of the .pclntab section, and is also runtime.pcHeader. |
| // The magic numbers are chosen such that reading the value with |
| // a different endianness does not result in the same value. |
| // That lets us the magic number to determine the endianness. |
| type PCLnTabMagic uint32 |
| |
| const ( |
| // Initial PCLnTabMagic value used in Go 1.2 through Go 1.15. |
| Go12PCLnTabMagic PCLnTabMagic = 0xfffffffb |
| // PCLnTabMagic value used in Go 1.16 through Go 1.17. |
| // Several fields added to header (CL 241598). |
| Go116PCLnTabMagic PCLnTabMagic = 0xfffffffa |
| // PCLnTabMagic value used in Go 1.18 through Go 1.19. |
| // Entry PC of func data changed from address to offset (CL 351463). |
| Go118PCLnTabMagic PCLnTabMagic = 0xfffffff0 |
| // PCLnTabMagic value used in Go 1.20 and later. |
| // A ":" was added to generated symbol names (#37762). |
| Go120PCLnTabMagic PCLnTabMagic = 0xfffffff1 |
| |
| // CurrentPCLnTabMagic is the value emitted by the current toolchain. |
| // This is written by the linker to the pcHeader and read by the |
| // runtime and debug/gosym (and external tools like Delve). |
| // |
| // Change this value when updating the pclntab version. |
| // Changing this exported value is OK because is an |
| // internal package. |
| CurrentPCLnTabMagic = Go120PCLnTabMagic |
| ) |
| |
| // A FuncFlag records bits about a function, passed to the runtime. |
| type FuncFlag uint8 |
| |
| const ( |
| // FuncFlagTopFrame indicates a function that appears at the top of its stack. |
| // The traceback routine stop at such a function and consider that a |
| // successful, complete traversal of the stack. |
| // Examples of TopFrame functions include goexit, which appears |
| // at the top of a user goroutine stack, and mstart, which appears |
| // at the top of a system goroutine stack. |
| FuncFlagTopFrame FuncFlag = 1 << iota |
| |
| // FuncFlagSPWrite indicates a function that writes an arbitrary value to SP |
| // (any write other than adding or subtracting a constant amount). |
| // The traceback routines cannot encode such changes into the |
| // pcsp tables, so the function traceback cannot safely unwind past |
| // SPWrite functions. Stopping at an SPWrite function is considered |
| // to be an incomplete unwinding of the stack. In certain contexts |
| // (in particular garbage collector stack scans) that is a fatal error. |
| FuncFlagSPWrite |
| |
| // FuncFlagAsm indicates that a function was implemented in assembly. |
| FuncFlagAsm |
| ) |
| |
| // A FuncID identifies particular functions that need to be treated |
| // specially by the runtime. |
| // Note that in some situations involving plugins, there may be multiple |
| // copies of a particular special runtime function. |
| type FuncID uint8 |
| |
| const ( |
| // If you add a FuncID, you probably also want to add an entry to the map in |
| // ../../cmd/internal/objabi/funcid.go |
| |
| FuncIDNormal FuncID = iota // not a special function |
| FuncID_abort |
| FuncID_asmcgocall |
| FuncID_asyncPreempt |
| FuncID_cgocallback |
| FuncID_corostart |
| FuncID_debugCallV2 |
| FuncID_gcBgMarkWorker |
| FuncID_goexit |
| FuncID_gogo |
| FuncID_gopanic |
| FuncID_handleAsyncEvent |
| FuncID_mcall |
| FuncID_morestack |
| FuncID_mstart |
| FuncID_panicwrap |
| FuncID_rt0_go |
| FuncID_runtime_main |
| FuncID_runFinalizers |
| FuncID_runCleanups |
| FuncID_sigpanic |
| FuncID_systemstack |
| FuncID_systemstack_switch |
| FuncIDWrapper // any autogenerated code (hash/eq algorithms, method wrappers, etc.) |
| ) |
| |
| // ArgsSizeUnknown is set in Func.argsize to mark all functions |
| // whose argument size is unknown (C vararg functions, and |
| // assembly code without an explicit specification). |
| // This value is generated by the compiler, assembler, or linker. |
| const ArgsSizeUnknown = -0x80000000 |
| |
| // IDs for PCDATA and FUNCDATA tables in Go binaries. |
| // |
| // These must agree with ../../../runtime/funcdata.h. |
| const ( |
| PCDATA_UnsafePoint = 0 |
| PCDATA_StackMapIndex = 1 |
| PCDATA_InlTreeIndex = 2 |
| PCDATA_ArgLiveIndex = 3 |
| PCDATA_PanicBounds = 4 |
| |
| FUNCDATA_ArgsPointerMaps = 0 |
| FUNCDATA_LocalsPointerMaps = 1 |
| FUNCDATA_StackObjects = 2 |
| FUNCDATA_InlTree = 3 |
| FUNCDATA_OpenCodedDeferInfo = 4 |
| FUNCDATA_ArgInfo = 5 |
| FUNCDATA_ArgLiveInfo = 6 |
| FUNCDATA_WrapInfo = 7 |
| ) |
| |
| // Special values for the PCDATA_UnsafePoint table. |
| const ( |
| UnsafePointSafe = -1 // Safe for async preemption |
| UnsafePointUnsafe = -2 // Unsafe for async preemption |
| |
| // UnsafePointRestart1(2) apply on a sequence of instructions, within |
| // which if an async preemption happens, we should back off the PC |
| // to the start of the sequence when resuming. |
| // We need two so we can distinguish the start/end of the sequence |
| // in case that two sequences are next to each other. |
| UnsafePointRestart1 = -3 |
| UnsafePointRestart2 = -4 |
| |
| // Like UnsafePointRestart1, but back to function entry if async preempted. |
| UnsafePointRestartAtEntry = -5 |
| ) |
| |
| const MINFUNC = 16 // minimum size for a function |
| |
| const FuncTabBucketSize = 256 * MINFUNC // size of bucket in the pc->func lookup table |