Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Merge branch 'master' of github.com:steveicarus/iverilog

  • Loading branch information...
commit d04aa4b234e3309be0a046af66f69213eba8edb0 2 parents 074055b + f682d9c
Stephen Williams authored
2  tgt-pcb/fp.y
View
@@ -59,7 +59,7 @@ static fp_element_t cur_element;
long integer;
char*text;
};
-
+
%token <text> STRING
%token <integer> INTEGER
%token K_ELEMENT
10 vvp/array.cc
View
@@ -77,8 +77,8 @@ vvp_array_t array_find(const char*label)
* an array of vvp_vector4_t vectors.
*
* - Array of real variables
-* The valsr member points to a vvp_realarray_t objects that has an
-* array of double variables. This is very much line the way the
+* The vals member points to a dynamic array objects that has an
+* array of double variables. This is very much like the way the
* vector4 array works.
*/
struct __vpiArray : public __vpiHandle {
@@ -1074,7 +1074,7 @@ vvp_vector4_t array_get_word(vvp_array_t arr, unsigned address)
arr->vals->get_word(address, val);
return val;
}
-
+
assert(arr->vals4 == 0);
assert(arr->vals == 0);
assert(arr->nets != 0);
@@ -2038,10 +2038,10 @@ void memory_delete(vpiHandle item)
// constant_delete(handle)?
delete arr->vals4;
-// if (arr->valsr) {}
+// if (arr->vals) {}
// Delete the individual words?
// constant_delete(handle)?
- delete arr->valsr;
+ delete arr->vals;
if (arr->nets) {
for (unsigned idx = 0; idx < arr->array_count; idx += 1) {
13 vvp/main.cc
View
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001-2012 Stephen Williams (steve@icarus.com)
+ * Copyright (c) 2001-2013 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
@@ -31,6 +31,9 @@
# include <cstdlib>
# include <cstring>
# include <unistd.h>
+#ifdef CHECK_WITH_VALGRIND
+# include <pthread.h>
+#endif
#if defined(HAVE_SYS_RESOURCE_H)
# include <sys/time.h>
@@ -232,6 +235,14 @@ static void final_cleanup()
* files are automatically closed.
*/
load_module_delete();
+
+#ifdef CHECK_WITH_VALGRIND
+ simulator_cb_delete();
+ /* This is needed to prevent valgrind from complaining about
+ * _dlerror_run() having a memory leak. */
+// HERE: Is this portable? Does it break anything?
+ pthread_exit(NULL);
+#endif
}
unsigned module_cnt = 0;
35 vvp/vpi_callback.cc
View
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001-2012 Stephen Williams (steve@icarus.com)
+ * Copyright (c) 2001-2013 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
@@ -31,6 +31,9 @@
# include "event.h"
# include "vvp_net_sig.h"
# include "config.h"
+#ifdef CHECK_WITH_VALGRIND
+#include "vvp_cleanup.h"
+#endif
# include <cstdio>
# include <cassert>
# include <cstdlib>
@@ -412,6 +415,36 @@ static simulator_callback*EndOfCompile = 0;
static simulator_callback*StartOfSimulation = 0;
static simulator_callback*EndOfSimulation = 0;
+#ifdef CHECK_WITH_VALGRIND
+/* This is really only needed if the simulator aborts before starting the
+ * main event loop. For that reason we can skip the next sim time queue. */
+void simulator_cb_delete(void)
+{
+ simulator_callback* cur;
+
+ /* Delete all the end of compile callbacks. */
+ while (EndOfCompile) {
+ cur = EndOfCompile;
+ EndOfCompile = dynamic_cast<simulator_callback*>(cur->next);
+ delete cur;
+ }
+
+ /* Delete all the start of simulation callbacks. */
+ while (StartOfSimulation) {
+ cur = StartOfSimulation;
+ StartOfSimulation = dynamic_cast<simulator_callback*>(cur->next);
+ delete cur;
+ }
+
+ /* Delete all the end of simulation callbacks. */
+ while (EndOfSimulation) {
+ cur = EndOfSimulation;
+ EndOfSimulation = dynamic_cast<simulator_callback*>(cur->next);
+ delete cur;
+ }
+}
+#endif
+
void vpiEndOfCompile(void) {
simulator_callback* cur;
8 vvp/vpi_tasks.cc
View
@@ -706,14 +706,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;
+ /* Since this is just being used to cleanup the arguments a
+ * system task definition can be used. */
+ struct __vpiSysTaskCall*obj = new systask_def;
obj->nargs = argc;
obj->args = argv;
- vpi_call_delete(&obj->base);
+ vpi_call_delete(obj);
}
-#endif
}
#endif
1  vvp/vvp_cleanup.h
View
@@ -34,6 +34,7 @@ extern void load_module_delete(void);
extern void modpath_delete(void);
extern void root_table_delete(void);
extern void signal_pool_delete(void);
+extern void simulator_cb_delete(void);
extern void udp_defns_delete(void);
extern void vpi_handle_delete(void);
extern void vpi_stack_delete(void);
Please sign in to comment.
Something went wrong with that request. Please try again.