------- Additional Comments From pinskia at gcc dot gnu dot org  2005-01-21 
02:11 -------
This is as reduced as I can get it (80 lines):
typedef unsigned int size_t;
extern void __assert_fail () __attribute__ ((__noreturn__));
typedef unsigned int uintptr_t;
extern int __mf_heuristic_check (uintptr_t, uintptr_t);
struct __mf_options
{
  unsigned adapt_cache;
  enum {  mode_nop, mode_check } mudflap_mode;
};
extern enum __mf_state_enum __mf_state;
extern int __mf_starting_p;
extern struct __mf_options __mf_opts;
typedef struct __mf_object { unsigned read_count, write_count, liveness; } 
__mf_object_t;
unsigned __mf_find_objects (uintptr_t ptr_low, uintptr_t ptr_high,
                                   __mf_object_t **objs, unsigned max_objs);
void __mf_adapt_cache (void);

void __mfu_check (void *ptr, size_t sz, int type)
{
  int judgement = 0;
  uintptr_t ptr_low = (uintptr_t) ptr;
  uintptr_t ptr_high = (sz ? (((uintptr_t) ptr) <= (~ (uintptr_t) 0)-(sz)+1
     ? ((uintptr_t) ptr)+((uintptr_t) sz) - 1 : (~ (uintptr_t) 0)) :
     ((uintptr_t) ptr));
 switch (__mf_opts.mudflap_mode)
    {
    case mode_nop:
    break;
    case mode_check:
      {
        unsigned heuristics = 0;
        static unsigned adapt_count;
        adapt_count ++;
        if ((__builtin_expect (!!(__mf_opts.adapt_cache > 0
            && adapt_count > __mf_opts.adapt_cache), 0)))
          {
            adapt_count = 0;
            __mf_adapt_cache ();
          }
        while (judgement == 0)
          {
            extern void __real_free (void *p);
            __mf_object_t* ovr_obj[1];
            unsigned obj_count;
            __mf_object_t** all_ovr_obj = ((void *)0);
            __mf_object_t** dealloc_me = ((void *)0);
            unsigned i;
            obj_count = __mf_find_objects (ptr_low, ptr_high, ovr_obj, 1);
            if ((__builtin_expect (!!(obj_count > 1), 0)))
              {
                extern void * __real_malloc (size_t c);
                unsigned n;
                all_ovr_obj = __real_malloc ((sizeof (__mf_object_t *) * 
obj_count));
                n = __mf_find_objects (ptr_low, ptr_high, all_ovr_obj, 
obj_count);
                ((void) (__builtin_expect (!!(n == obj_count), 1) ? 0
                             : (__assert_fail (), 0)));
                dealloc_me = all_ovr_obj;
              }
            else
              {
                all_ovr_obj = ovr_obj;
                dealloc_me = ((void *)0);
              }
            for (i = 0; i < obj_count; i++)
              {
                __mf_object_t *obj = all_ovr_obj[i];
                ((void) (__builtin_expect (!!(obj != ((void *)0)), 1) ? 0
                          : (__assert_fail (), 0)));
                if (type == 0)
                  obj->read_count ++;
              }
            if (dealloc_me != ((void *)0))
              __real_free (dealloc_me);
            if (heuristics++ < 2)
              judgement = __mf_heuristic_check (ptr_low, ptr_high);
          }
      }
    }
}


-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
     Ever Confirmed|                            |1
   Last reconfirmed|0000-00-00 00:00:00         |2005-01-21 02:11:18
               date|                            |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19556

Reply via email to