http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59039
--- Comment #18 from Eric Botcazou <ebotcazou at gcc dot gnu.org> --- > I couldn't find anything in GCC manual. There are a few documented hooks, but this looks quite light indeed, so the sources are probably the best references, i.e. builtins.c and except.c: /* __builtin_longjmp is passed a pointer to an array of five words (not all will be used on all machines). It operates similarly to the C library function of the same name, but is more efficient. Much of the code below is copied from the handling of non-local gotos. */ static void expand_builtin_longjmp (rtx buf_addr, rtx value) { rtx fp, lab, stack, insn, last; enum machine_mode sa_mode = STACK_SAVEAREA_MODE (SAVE_NONLOCAL); void init_eh (void) { [...] #ifdef DONT_USE_BUILTIN_SETJMP #ifdef JMP_BUF_SIZE tmp = size_int (JMP_BUF_SIZE - 1); #else /* Should be large enough for most systems, if it is not, JMP_BUF_SIZE should be defined with the proper value. It will also tend to be larger than necessary for most systems, a more optimal port will define JMP_BUF_SIZE. */ tmp = size_int (FIRST_PSEUDO_REGISTER + 2 - 1); #endif #else /* builtin_setjmp takes a pointer to 5 words. */ tmp = size_int (5 * BITS_PER_WORD / POINTER_SIZE - 1); #endif tmp = build_index_type (tmp); tmp = build_array_type (ptr_type_node, tmp); f_jbuf = build_decl (BUILTINS_LOCATION, FIELD_DECL, get_identifier ("__jbuf"), tmp); #ifdef DONT_USE_BUILTIN_SETJMP /* We don't know what the alignment requirements of the runtime's jmp_buf has. Overestimate. */ DECL_ALIGN (f_jbuf) = BIGGEST_ALIGNMENT; DECL_USER_ALIGN (f_jbuf) = 1; #endif