Miscellaneous routines (GNU Compiler Collection (GCC) Internals)

### 3.6 Miscellaneous runtime library routines ¶

#### 3.6.1 Cache control functions ¶

Runtime Function: `void` __clear_cache `(char *beg, char *end)` ¶

  This function clears the instruction cache between beg and end.

#### 3.6.2 Split stack functions and variables ¶

Runtime Function: `void *` __splitstack_find `(void *segment_arg, void *sp, size_t len, void **next_segment, void **next_sp, void **initial_sp)` ¶

  When using `-fsplit-stack`, this call may be used to iterate over the stack segments. It may be called like this:

        void *next_segment = NULL;
        void *next_sp = NULL;
        void *initial_sp = NULL;
        void *stack;
        size_t stack_size;
        while ((stack = __splitstack_find (next_segment, next_sp,
                                           &stack_size, &next_segment,
                                           &next_sp, &initial_sp))
               != NULL)
          {
            /* Stack segment starts at stack and is
               stack_size bytes long.  */
          }

  There is no way to iterate over the stack segments of a different thread. However, what is permitted is for one thread to call this with the segment_arg and sp arguments NULL, to pass next_segment, next_sp, and initial_sp to a different thread, and then to suspend one way or another. A different thread may run the subsequent `__splitstack_find` iterations. Of course, this will only work if the first thread is suspended while the second thread is calling `__splitstack_find`. If not, the second thread could be looking at the stack while it is changing, and anything could happen.

Variable: __morestack_segments ¶
Variable: __morestack_current_segment ¶
Variable: __morestack_initial_sp ¶

  Internal variables used by the `-fsplit-stack` implementation.