| extern void abort (void); |
| |
| void __attribute__((noinline,noreturn)) |
| vec_assert_fail (void) |
| { |
| abort (); |
| } |
| |
| struct ggc_root_tab { |
| void *base; |
| }; |
| |
| typedef struct deferred_access_check {} VEC_deferred_access_check_gc; |
| |
| typedef struct deferred_access { |
| VEC_deferred_access_check_gc* deferred_access_checks; |
| int deferring_access_checks_kind; |
| } deferred_access; |
| |
| typedef struct VEC_deferred_access_base { |
| unsigned num; |
| deferred_access vec[1]; |
| } VEC_deferred_access_base; |
| |
| static __inline__ deferred_access * |
| VEC_deferred_access_base_last (VEC_deferred_access_base *vec_) |
| { |
| (void)((vec_ && vec_->num) ? 0 : (vec_assert_fail (), 0)); |
| return &vec_->vec[vec_->num - 1]; |
| } |
| |
| static __inline__ void |
| VEC_deferred_access_base_pop (VEC_deferred_access_base *vec_) |
| { |
| (void)((vec_->num) ? 0 : (vec_assert_fail (), 0)); |
| --vec_->num; |
| } |
| |
| void __attribute__((noinline)) |
| perform_access_checks (VEC_deferred_access_check_gc* p) |
| { |
| abort (); |
| } |
| |
| typedef struct VEC_deferred_access_gc { |
| VEC_deferred_access_base base; |
| } VEC_deferred_access_gc; |
| |
| static VEC_deferred_access_gc *deferred_access_stack; |
| static unsigned deferred_access_no_check; |
| |
| const struct ggc_root_tab gt_pch_rs_gt_cp_semantics_h[] = { |
| { |
| &deferred_access_no_check |
| } |
| }; |
| |
| void __attribute__((noinline)) pop_to_parent_deferring_access_checks (void) |
| { |
| if (deferred_access_no_check) |
| deferred_access_no_check--; |
| else |
| { |
| VEC_deferred_access_check_gc *checks; |
| deferred_access *ptr; |
| checks = (VEC_deferred_access_base_last(deferred_access_stack ? &deferred_access_stack->base : 0))->deferred_access_checks; |
| VEC_deferred_access_base_pop(deferred_access_stack ? &deferred_access_stack->base : 0); |
| ptr = VEC_deferred_access_base_last(deferred_access_stack ? &deferred_access_stack->base : 0); |
| if (ptr->deferring_access_checks_kind == 0) |
| perform_access_checks (checks); |
| } |
| } |
| |
| int main() |
| { |
| deferred_access_stack = __builtin_malloc (sizeof(VEC_deferred_access_gc) + sizeof(deferred_access) * 8); |
| deferred_access_stack->base.num = 2; |
| deferred_access_stack->base.vec[0].deferring_access_checks_kind = 1; |
| pop_to_parent_deferring_access_checks (); |
| return 0; |
| } |