github.com/prattmic/llgo-embedded@v0.0.0-20150820070356-41cfecea0e1e/third_party/gofrontend/libgo/runtime/mgc0.h (about)

     1  // Copyright 2012 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  // Garbage collector (GC)
     6  
     7  // GC instruction opcodes.
     8  //
     9  // The opcode of an instruction is followed by zero or more
    10  // arguments to the instruction.
    11  //
    12  // Meaning of arguments:
    13  //   off      Offset (in bytes) from the start of the current object
    14  //   objgc    Pointer to GC info of an object
    15  //   objgcrel Offset to GC info of an object
    16  //   len      Length of an array
    17  //   elemsize Size (in bytes) of an element
    18  //   size     Size (in bytes)
    19  //
    20  // NOTE: There is a copy of these in ../reflect/type.go.
    21  // They must be kept in sync.
    22  enum {
    23  	GC_END,         // End of object, loop or subroutine. Args: none
    24  	GC_PTR,         // A typed pointer. Args: (off, objgc)
    25  	GC_APTR,        // Pointer to an arbitrary object. Args: (off)
    26  	GC_ARRAY_START, // Start an array with a fixed length. Args: (off, len, elemsize)
    27  	GC_ARRAY_NEXT,  // The next element of an array. Args: none
    28  	GC_CALL,        // Call a subroutine. Args: (off, objgcrel)
    29  	GC_CHAN_PTR,    // Go channel. Args: (off, ChanType*)
    30  	GC_STRING,      // Go string. Args: (off)
    31  	GC_EFACE,       // interface{}. Args: (off)
    32  	GC_IFACE,       // interface{...}. Args: (off)
    33  	GC_SLICE,       // Go slice. Args: (off, objgc)
    34  	GC_REGION,      // A region/part of the current object. Args: (off, size, objgc)
    35  
    36  	GC_NUM_INSTR,   // Number of instruction opcodes
    37  };
    38  
    39  enum {
    40  	// Size of GC's fixed stack.
    41  	//
    42  	// The current GC implementation permits:
    43  	//  - at most 1 stack allocation because of GC_CALL
    44  	//  - at most GC_STACK_CAPACITY allocations because of GC_ARRAY_START
    45  	GC_STACK_CAPACITY = 8,	
    46  };
    47  
    48  enum {
    49  	ScanStackByFrames = 1,
    50  	IgnorePreciseGC = 0,
    51  
    52  	// Four bits per word (see #defines below).
    53  	wordsPerBitmapWord = sizeof(void*)*8/4,
    54  	bitShift = sizeof(void*)*8/4,
    55  };
    56  
    57  // Bits in per-word bitmap.
    58  // #defines because enum might not be able to hold the values.
    59  //
    60  // Each word in the bitmap describes wordsPerBitmapWord words
    61  // of heap memory.  There are 4 bitmap bits dedicated to each heap word,
    62  // so on a 64-bit system there is one bitmap word per 16 heap words.
    63  // The bits in the word are packed together by type first, then by
    64  // heap location, so each 64-bit bitmap word consists of, from top to bottom,
    65  // the 16 bitMarked bits for the corresponding heap words,
    66  // then the 16 bitScan/bitBlockBoundary bits, then the 16 bitAllocated bits.
    67  // This layout makes it easier to iterate over the bits of a given type.
    68  //
    69  // The bitmap starts at mheap.arena_start and extends *backward* from
    70  // there.  On a 64-bit system the off'th word in the arena is tracked by
    71  // the off/16+1'th word before mheap.arena_start.  (On a 32-bit system,
    72  // the only difference is that the divisor is 8.)
    73  //
    74  // To pull out the bits corresponding to a given pointer p, we use:
    75  //
    76  //	off = p - (uintptr*)mheap.arena_start;  // word offset
    77  //	b = (uintptr*)mheap.arena_start - off/wordsPerBitmapWord - 1;
    78  //	shift = off % wordsPerBitmapWord
    79  //	bits = *b >> shift;
    80  //	/* then test bits & bitAllocated, bits & bitMarked, etc. */
    81  //
    82  #define bitAllocated		((uintptr)1<<(bitShift*0))	/* block start; eligible for garbage collection */
    83  #define bitScan			((uintptr)1<<(bitShift*1))	/* when bitAllocated is set */
    84  #define bitMarked		((uintptr)1<<(bitShift*2))	/* when bitAllocated is set */
    85  #define bitBlockBoundary	((uintptr)1<<(bitShift*1))	/* when bitAllocated is NOT set - mark for FlagNoGC objects */
    86  
    87  #define bitMask (bitAllocated | bitScan | bitMarked)