diff --git a/vvp/array.cc b/vvp/array.cc index d481de0c6..21b396c8c 100644 --- a/vvp/array.cc +++ b/vvp/array.cc @@ -92,10 +92,10 @@ struct __vpiArray : public __vpiHandle { struct __vpiScope*scope; const char*name; /* Permanently allocated string */ unsigned array_count; - struct __vpiDecConst first_addr; - struct __vpiDecConst last_addr; - struct __vpiDecConst msb; - struct __vpiDecConst lsb; + __vpiDecConst first_addr; + __vpiDecConst last_addr; + __vpiDecConst msb; + __vpiDecConst lsb; unsigned vals_width; // If this is a net array, nets lists the handles. vpiHandle*nets; @@ -127,7 +127,7 @@ struct __vpiArrayIndex : public __vpiHandle { vpiHandle vpi_index(int idx); free_object_fun_t free_object_fun(void); - struct __vpiDecConst *index; + __vpiDecConst *index; unsigned done; }; @@ -716,7 +716,7 @@ static void vpi_array_var_index_get_value(vpiHandle ref, p_vpi_value vp) vpiHandle array_index_iterate(int code, vpiHandle ref) { - struct __vpiDecConst*obj = dynamic_cast<__vpiDecConst*>(ref); + __vpiDecConst *obj = dynamic_cast<__vpiDecConst*>(ref); assert(obj); if (code == vpiIndex) { @@ -1884,7 +1884,7 @@ void compile_array_cleanup(void) #ifdef CHECK_WITH_VALGRIND void memory_delete(vpiHandle item) { - struct __vpiArray*arr = ARRAY_HANDLE(item); + struct __vpiArray*arr = (struct __vpiArray*) item; if (arr->vals_words) delete [] (arr->vals_words-1); // if (arr->vals4) {} @@ -1905,13 +1905,13 @@ void memory_delete(vpiHandle item) constant_delete(sig->id.index); /* These should only be the real words. */ } else { - assert(arr->nets[idx]->vpi_type->type_code == + assert(arr->nets[idx]->get_type_code() == vpiRealVar); struct __vpiRealVar *sigr = (struct __vpiRealVar *) arr->nets[idx]; constant_delete(sigr->id.index); // Why are only the real words still here? - free(arr->nets[idx]); + delete arr->nets[idx]; } } free(arr->nets); @@ -1919,18 +1919,18 @@ void memory_delete(vpiHandle item) while (arr->vpi_callbacks) { struct __vpiCallback*tmp = arr->vpi_callbacks->next; - delete_vpi_callback(arr->vpi_callbacks); + delete arr->vpi_callbacks; arr->vpi_callbacks = tmp; } - free(arr); + delete arr; } void A_delete(vpiHandle item) { struct __vpiArrayVthrA*obj = (struct __vpiArrayVthrA*) item; if (obj->address_handle) { - switch (obj->address_handle->vpi_type->type_code) { + switch (obj->address_handle->get_type_code()) { case vpiMemoryWord: if (vpi_get(_vpiFromThr, obj->address_handle) == _vpi_at_A) { A_delete(obj->address_handle); @@ -1944,6 +1944,6 @@ void A_delete(vpiHandle item) } } - free(obj); + delete obj; } #endif diff --git a/vvp/delay.cc b/vvp/delay.cc index ba533c89f..b83100914 100644 --- a/vvp/delay.cc +++ b/vvp/delay.cc @@ -1054,7 +1054,7 @@ struct __vpiModPath* vpip_make_modpath(vvp_net_t *net) void modpath_delete() { for (unsigned idx = 0; idx < mp_count; idx += 1) { - free(mp_list[idx]); + delete mp_list[idx]; } free(mp_list); mp_list = 0; diff --git a/vvp/event.cc b/vvp/event.cc index f4df19d6d..de32d910a 100644 --- a/vvp/event.cc +++ b/vvp/event.cc @@ -23,9 +23,6 @@ # include "schedule.h" # include "vpi_priv.h" # include "config.h" -#ifdef CHECK_WITH_VALGRIND -# include "vvp_cleanup.h" -#endif # include # include # include @@ -855,14 +852,6 @@ void compile_named_event(char*label, char*name) #ifdef CHECK_WITH_VALGRIND void named_event_delete(__vpiHandle*handle) { - __vpiNamedEvent *obj = (__vpiNamedEvent *) handle; - - while (obj->callbacks) { - struct __vpiCallback*tmp = obj->callbacks->next; - delete_vpi_callback(obj->callbacks); - obj->callbacks = tmp; - } - - free(obj); + delete dynamic_cast<__vpiNamedEvent *>(handle); } #endif diff --git a/vvp/vpi_callback.cc b/vvp/vpi_callback.cc index 7de1029c1..314a3bb79 100644 --- a/vvp/vpi_callback.cc +++ b/vvp/vpi_callback.cc @@ -639,8 +639,9 @@ void vvp_vpi_callback::add_vpi_callback(value_callback*cb) void vvp_vpi_callback::clear_all_callbacks() { while (vpi_callbacks_) { - struct __vpiCallback*tmp = vpi_callbacks_->next; - delete_vpi_callback(vpi_callbacks_); + value_callback *tmp = dynamic_cast + (vpi_callbacks_->next); + delete vpi_callbacks_; vpi_callbacks_ = tmp; } } diff --git a/vvp/vpi_const.cc b/vvp/vpi_const.cc index bd3289bc2..5e90851a5 100644 --- a/vvp/vpi_const.cc +++ b/vvp/vpi_const.cc @@ -83,7 +83,7 @@ void __vpiStringConst::process_string_(void) __vpiStringConst::~__vpiStringConst() { - delete[]value_; + delete[] value_; } int __vpiStringConst::get_type_code(void) const @@ -650,7 +650,7 @@ int __vpiRealConst::vpi_get(int code) default: fprintf(stderr, "vvp error: get %d not supported " - "by vpiDecConst\n", code); + "by vpiRealConst\n", code); assert(0); return 0; } @@ -754,25 +754,20 @@ vpiHandle vpip_make_real_param(char*name, double value, #ifdef CHECK_WITH_VALGRIND void constant_delete(vpiHandle item) { - assert(item->vpi_type->type_code == vpiConstant); + assert(item->get_type_code() == vpiConstant); switch(vpi_get(vpiConstType, item)) { - case vpiStringConst: { - struct __vpiStringConst*rfp = dynamic_cast<__vpiStringConst*>(item); - delete [] rfp->value; - free(rfp); - break; } - case vpiDecConst: { - struct __vpiDecConst*rfp = dynamic_cast<__vpiDecConst*>(item); - free(rfp); - break; } - case vpiBinaryConst: { - struct __vpiBinaryConst*rfp = dynamic_cast<__vpiBinaryConst*>(item); - delete rfp; - break; } - case vpiRealConst: { - struct __vpiRealConst*rfp = dynamic_cast<__vpiRealConst*>(item); - free(rfp); - break; } + case vpiStringConst: + delete dynamic_cast<__vpiStringConst*>(item); + break; + case vpiDecConst: + delete dynamic_cast<__vpiDecConst*>(item); + break; + case vpiBinaryConst: + delete dynamic_cast<__vpiBinaryConst*>(item); + break; + case vpiRealConst: + delete dynamic_cast<__vpiRealConst*>(item); + break; default: assert(0); } diff --git a/vvp/vpi_event.cc b/vvp/vpi_event.cc index de5d90d45..2c0ccabaf 100644 --- a/vvp/vpi_event.cc +++ b/vvp/vpi_event.cc @@ -32,6 +32,15 @@ inline __vpiNamedEvent::__vpiNamedEvent(__vpiScope*sc, const char*nam) callbacks_ = 0; } +__vpiNamedEvent::~__vpiNamedEvent() +{ + while (callbacks_) { + struct __vpiCallback *tmp = callbacks_->next; + delete callbacks_; + callbacks_ = tmp; + } +} + int __vpiNamedEvent::get_type_code(void) const { return vpiNamedEvent; } diff --git a/vvp/vpi_priv.h b/vvp/vpi_priv.h index 7029d9bdf..063f40d6c 100644 --- a/vvp/vpi_priv.h +++ b/vvp/vpi_priv.h @@ -273,9 +273,6 @@ struct __vpiSignal : public __vpiHandle { vpiHandle vpi_handle(int code); vpiHandle vpi_iterate(int code); -#ifdef CHECK_WITH_VALGRIND - struct __vpiSignal *pool; -#endif union { // The scope or parent array that contains me. vpiHandle parent; struct __vpiScope* scope; @@ -414,6 +411,7 @@ class __vpiNamedEvent : public __vpiHandle { public: __vpiNamedEvent(__vpiScope*scope, const char*name); + ~__vpiNamedEvent(); int get_type_code(void) const; int vpi_get(int code); char* vpi_get_str(int code); @@ -599,7 +597,8 @@ vpiHandle vpip_make_binary_param(char*name, const vvp_vector4_t&bits, bool signed_flag, bool local_flag, long file_idx, long lineno); -struct __vpiDecConst : public __vpiHandle { +class __vpiDecConst : public __vpiHandle { + public: __vpiDecConst(int val =0); int get_type_code(void) const; int vpi_get(int code); @@ -614,7 +613,7 @@ class __vpiRealConst : public __vpiHandle { int get_type_code(void) const; int vpi_get(int code); void vpi_get_value(p_vpi_value val); - public: + double value; }; diff --git a/vvp/vpi_scope.cc b/vvp/vpi_scope.cc index 632abf1db..dab4ab5af 100644 --- a/vvp/vpi_scope.cc +++ b/vvp/vpi_scope.cc @@ -49,11 +49,13 @@ void vpip_make_root_iterator(__vpiHandle**&table, unsigned&ntable) } #ifdef CHECK_WITH_VALGRIND +void port_delete(__vpiHandle*handle); + static void delete_sub_scopes(struct __vpiScope *scope) { for (unsigned idx = 0; idx < scope->nintern; idx += 1) { struct __vpiScope*lscope = (__vpiScope*)(scope->intern)[idx]; - switch(scope->intern[idx]->vpi_type->type_code) { + switch(scope->intern[idx]->get_type_code()) { case vpiFunction: case vpiTask: contexts_delete(lscope); @@ -70,7 +72,7 @@ static void delete_sub_scopes(struct __vpiScope *scope) break; case vpiModPath: /* The destination ModPath is cleaned up later. */ - free((scope->intern)[idx]); + delete (scope->intern)[idx]; break; case vpiNamedEvent: named_event_delete((scope->intern)[idx]); @@ -94,9 +96,15 @@ static void delete_sub_scopes(struct __vpiScope *scope) case vpiEnumTypespec: enum_delete((scope->intern)[idx]); break; + case vpiPort: + port_delete((scope->intern)[idx]); + break; + case vpiStringVar: + case vpiRegArray: + break; default: fprintf(stderr, "Need support for type: %d\n", - scope->intern[idx]->vpi_type->type_code); + scope->intern[idx]->get_type_code()); assert(0); break; } @@ -528,13 +536,14 @@ unsigned vpip_add_item_to_context(automatic_hooks_s*item, } -struct vpiPortInfo : public __vpiHandle { +class vpiPortInfo : public __vpiHandle { + public: vpiPortInfo( __vpiScope *parent, unsigned index, int vpi_direction, unsigned width, const char *name ); - + ~vpiPortInfo(); int get_type_code(void) const { return vpiPort; } @@ -542,7 +551,7 @@ struct vpiPortInfo : public __vpiHandle { char* vpi_get_str(int code); vpiHandle vpi_handle(int code); -protected: + private: __vpiScope *parent_; unsigned index_; int direction_; @@ -555,14 +564,26 @@ vpiPortInfo::vpiPortInfo( __vpiScope *parent, int vpi_direction, unsigned width, const char *name ) : - parent_(parent), - index_(index), - direction_(vpi_direction), - width_(width), - name_(name) + parent_(parent), + index_(index), + direction_(vpi_direction), + width_(width), + name_(name) { } +vpiPortInfo::~vpiPortInfo() +{ + delete[] name_; +} + +#ifdef CHECK_WITH_VALGRIND +void port_delete(__vpiHandle *handle) +{ + delete dynamic_cast(handle); +} +#endif + int vpiPortInfo::vpi_get(int code) { switch( code ) { diff --git a/vvp/vpi_signal.cc b/vvp/vpi_signal.cc index c10120261..468f211d3 100644 --- a/vvp/vpi_signal.cc +++ b/vvp/vpi_signal.cc @@ -980,7 +980,7 @@ vpiHandle vpip_make_var4(const char*name, int msb, int lsb, } #ifdef CHECK_WITH_VALGRIND -static struct __vpiSignal **signal_pool = 0; +static struct vpiSignal_plug **signal_pool = 0; static unsigned signal_pool_count = 0; static unsigned long signal_count = 0; static unsigned long signal_dels = 0; @@ -988,11 +988,18 @@ static unsigned long signal_dels = 0; struct vpiSignal_plug { unsigned char space[sizeof (struct __vpiSignal)]; +#ifdef CHECK_WITH_VALGRIND + struct vpiSignal_plug *pool; +#endif }; void* __vpiSignal::operator new(size_t siz) { - assert(siz == sizeof(struct vpiSignal_plug)); + assert(siz == sizeof(struct vpiSignal_plug) +#ifdef CHECK_WITH_VALGRIND + - sizeof(struct vpiSignal_plug *) +#endif + ); static struct vpiSignal_plug*alloc_array = 0; static unsigned alloc_index = 0; const unsigned alloc_count = 512; @@ -1035,7 +1042,7 @@ void signal_delete(vpiHandle item) obj->node->fil->clear_all_callbacks(); vvp_net_delete(obj->node); signal_dels += 1; - VALGRIND_MEMPOOL_FREE(obj->pool, obj); + VALGRIND_MEMPOOL_FREE(reinterpret_cast(obj)->pool, obj); } void signal_pool_delete() @@ -1426,7 +1433,7 @@ void PV_delete(vpiHandle item) { struct __vpiPV *obj = dynamic_cast<__vpiPV*>(item); if (obj->sbase) { - switch (obj->sbase->vpi_type->type_code) { + switch (obj->sbase->get_type_code()) { case vpiMemoryWord: if (vpi_get(_vpiFromThr, obj->sbase) == _vpi_at_A) { A_delete(obj->sbase); diff --git a/vvp/vpi_tasks.cc b/vvp/vpi_tasks.cc index 3e9d0f2f8..f60f0e91b 100644 --- a/vvp/vpi_tasks.cc +++ b/vvp/vpi_tasks.cc @@ -711,12 +711,14 @@ void print_vpi_call_errors() #ifdef CHECK_WITH_VALGRIND static void cleanup_vpi_call_args(unsigned argc, vpiHandle*argv) { +#if 0 if (argc) { struct __vpiSysTaskCall*obj = new struct __vpiSysTaskCall; obj->nargs = argc; obj->args = argv; vpi_call_delete(&obj->base); } +#endif } #endif @@ -837,7 +839,7 @@ void vpi_call_delete(vpiHandle item) /* The object can be NULL if there was an error. */ if (!obj) return; for (unsigned arg = 0; arg < obj->nargs; arg += 1) { - switch (obj->args[arg]->vpi_type->type_code) { + switch (obj->args[arg]->get_type_code()) { case vpiConstant: switch (vpi_get(_vpiFromThr, obj->args[arg])) { case _vpiNoThr: diff --git a/vvp/vvp_net.cc b/vvp/vvp_net.cc index af7f29a14..0b7f7fdc1 100644 --- a/vvp/vvp_net.cc +++ b/vvp/vvp_net.cc @@ -150,7 +150,7 @@ void vvp_net_pool_delete() } for (unsigned idx = 0; idx < vvp_net_pool_count; idx += 1) { - VALGRIND_DESTROY_MEMPOOL(vvp_net_pool[idx]) + VALGRIND_DESTROY_MEMPOOL(vvp_net_pool[idx]); ::delete [] vvp_net_pool[idx]; } free(vvp_net_pool); diff --git a/vvp/vvp_net_sig.cc b/vvp/vvp_net_sig.cc index 41c5aa2b6..14ba31b96 100644 --- a/vvp/vvp_net_sig.cc +++ b/vvp/vvp_net_sig.cc @@ -593,6 +593,13 @@ vvp_fun_signal_string_sa::vvp_fun_signal_string_sa() { } +#ifdef CHECK_WITH_VALGRIND +void vvp_fun_signal_string_aa::free_instance(vvp_context_t context) +{ +// Never knew how to do this! +} +#endif + void vvp_fun_signal_string_sa::recv_string(vvp_net_ptr_t ptr, const std::string&bit, vvp_context_t) { @@ -671,6 +678,13 @@ vvp_fun_signal_object_sa::vvp_fun_signal_object_sa() { } +#ifdef CHECK_WITH_VALGRIND +void vvp_fun_signal_object_aa::free_instance(vvp_context_t context) +{ +// Never knew how to do this! +} +#endif + void vvp_fun_signal_object_sa::recv_object(vvp_net_ptr_t ptr, vvp_object_t bit, vvp_context_t) { diff --git a/vvp/words.cc b/vvp/words.cc index 35d07b024..bbbdce56e 100644 --- a/vvp/words.cc +++ b/vvp/words.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003-2011 Stephen Williams (steve@icarus.com) + * Copyright (c) 2003-2012 Stephen Williams (steve@icarus.com) * * This source code is free software; you can redistribute it * and/or modify it in source code form under the terms of the GNU @@ -105,7 +105,7 @@ static void __compile_var_string(char*label, char*name, assert(!name); array_attach_word(array, array_addr, obj); } - delete[]label; + free(label); delete[] name; } @@ -141,7 +141,7 @@ static void __compile_var_darray(char*label, char*name, assert(!name); array_attach_word(array, array_addr, obj); } - delete[]label; + free(label); delete[] name; }