This commit renames the functions that are to be shared.
Functions to be shared that were static are made nonstatic.
gdb/
2014-06-18 Gary Benson <gbenson@redhat.com>
* i386-nat.c (i386_show_dr): Renamed to
i386_dr_show and made nonstatic. All uses updated.
(i386_length_and_rw_bits): Renamed to
i386_dr_length_and_rw_bits and made nonstatic.
All uses updated.
(i386_insert_aligned_watchpoint): Renamed to
i386_dr_insert_aligned_watchpoint and made nonstatic.
All uses updated.
(i386_remove_aligned_watchpoint): Renamed to
i386_dr_remove_aligned_watchpoint and made nonstatic.
All uses updated.
(i386_update_inferior_debug_regs): Renamed to
i386_dr_update_inferior_debug_regs and made nonstatic.
All uses updated.
gdb/gdbserver/
2014-06-18 Gary Benson <gbenson@redhat.com>
* i386-low.h (i386_low_insert_watchpoint): Renamed to
i386_dr_insert_watchpoint.
(i386_low_remove_watchpoint): Renamed to
i386_dr_remove_watchpoint.
(i386_low_region_ok_for_watchpoint): Renamed to
i386_dr_region_ok_for_watchpoint.
(i386_low_stopped_data_address): Renamed to
i386_dr_stopped_data_address.
(i386_low_stopped_by_watchpoint): Renamed to
i386_dr_stopped_by_watchpoint.
* i386-low.c (i386_show_dr): Renamed to
i386_dr_show and made nonstatic. All uses updated.
(i386_length_and_rw_bits): Renamed to
i386_dr_length_and_rw_bits and made nonstatic.
All uses updated.
(i386_insert_aligned_watchpoint): Renamed to
i386_dr_insert_aligned_watchpoint and made nonstatic.
All uses updated.
(i386_remove_aligned_watchpoint): Renamed to
i386_dr_remove_aligned_watchpoint and made nonstatic.
All uses updated.
(i386_update_inferior_debug_regs): Renamed to
i386_dr_update_inferior_debug_regs and made nonstatic.
All uses updated.
(i386_low_insert_watchpoint): Renamed to
i386_dr_insert_watchpoint. All uses updated.
(i386_low_remove_watchpoint): Renamed to
i386_dr_remove_watchpoint. All uses updated.
(i386_low_region_ok_for_watchpoint): Renamed to
i386_dr_region_ok_for_watchpoint. All uses updated.
(i386_low_stopped_data_address): Renamed to
i386_dr_stopped_data_address. All uses updated.
(i386_low_stopped_by_watchpoint): Renamed to
i386_dr_stopped_by_watchpoint. All uses updated.
+2014-06-18 Gary Benson <gbenson@redhat.com>
+
+ * i386-nat.c (i386_show_dr): Renamed to
+ i386_dr_show and made nonstatic. All uses updated.
+ (i386_length_and_rw_bits): Renamed to
+ i386_dr_length_and_rw_bits and made nonstatic.
+ All uses updated.
+ (i386_insert_aligned_watchpoint): Renamed to
+ i386_dr_insert_aligned_watchpoint and made nonstatic.
+ All uses updated.
+ (i386_remove_aligned_watchpoint): Renamed to
+ i386_dr_remove_aligned_watchpoint and made nonstatic.
+ All uses updated.
+ (i386_update_inferior_debug_regs): Renamed to
+ i386_dr_update_inferior_debug_regs and made nonstatic.
+ All uses updated.
+
2014-06-18 Gary Benson <gbenson@redhat.com>
* i386-nat.c (i386_dr_low_can_set_addr): New macro.
+2014-06-18 Gary Benson <gbenson@redhat.com>
+
+ * i386-low.h (i386_low_insert_watchpoint): Renamed to
+ i386_dr_insert_watchpoint.
+ (i386_low_remove_watchpoint): Renamed to
+ i386_dr_remove_watchpoint.
+ (i386_low_region_ok_for_watchpoint): Renamed to
+ i386_dr_region_ok_for_watchpoint.
+ (i386_low_stopped_data_address): Renamed to
+ i386_dr_stopped_data_address.
+ (i386_low_stopped_by_watchpoint): Renamed to
+ i386_dr_stopped_by_watchpoint.
+ * i386-low.c (i386_show_dr): Renamed to
+ i386_dr_show and made nonstatic. All uses updated.
+ (i386_length_and_rw_bits): Renamed to
+ i386_dr_length_and_rw_bits and made nonstatic.
+ All uses updated.
+ (i386_insert_aligned_watchpoint): Renamed to
+ i386_dr_insert_aligned_watchpoint and made nonstatic.
+ All uses updated.
+ (i386_remove_aligned_watchpoint): Renamed to
+ i386_dr_remove_aligned_watchpoint and made nonstatic.
+ All uses updated.
+ (i386_update_inferior_debug_regs): Renamed to
+ i386_dr_update_inferior_debug_regs and made nonstatic.
+ All uses updated.
+ (i386_low_insert_watchpoint): Renamed to
+ i386_dr_insert_watchpoint. All uses updated.
+ (i386_low_remove_watchpoint): Renamed to
+ i386_dr_remove_watchpoint. All uses updated.
+ (i386_low_region_ok_for_watchpoint): Renamed to
+ i386_dr_region_ok_for_watchpoint. All uses updated.
+ (i386_low_stopped_data_address): Renamed to
+ i386_dr_stopped_data_address. All uses updated.
+ (i386_low_stopped_by_watchpoint): Renamed to
+ i386_dr_stopped_by_watchpoint. All uses updated.
+
2014-06-18 Gary Benson <gbenson@redhat.com>
* i386-low.c (i386_dr_low_can_set_addr): New macro.
Currently, all watchpoint are locally enabled. If you need to
enable them globally, read the comment which pertains to this in
- i386_insert_aligned_watchpoint below. */
+ i386_dr_insert_aligned_watchpoint below. */
#define DR_LOCAL_ENABLE_SHIFT 0 /* Extra shift to the local enable bit. */
#define DR_GLOBAL_ENABLE_SHIFT 1 /* Extra shift to the global enable bit. */
#define DR_ENABLE_SIZE 2 /* Two enable bits per debug register. */
/* Print the values of the mirrored debug registers. */
-static void
-i386_show_dr (struct i386_debug_reg_state *state,
+void
+i386_dr_show (struct i386_debug_reg_state *state,
const char *func, CORE_ADDR addr,
int len, enum target_hw_bp_type type)
{
region of LEN bytes for accesses of type TYPE. LEN is assumed to
have the value of 1, 2, or 4. */
-static unsigned
-i386_length_and_rw_bits (int len, enum target_hw_bp_type type)
+unsigned
+i386_dr_length_and_rw_bits (int len, enum target_hw_bp_type type)
{
unsigned rw;
#endif
default:
internal_error (__FILE__, __LINE__, _("\
-Invalid hardware breakpoint type %d in i386_length_and_rw_bits.\n"),
+Invalid hardware breakpoint type %d in i386_dr_length_and_rw_bits.\n"),
(int) type);
}
/* ELSE FALL THROUGH */
default:
internal_error (__FILE__, __LINE__, _("\
-Invalid hardware breakpoint length %d in i386_length_and_rw_bits.\n"), len);
+Invalid hardware breakpoint length %d in i386_dr_length_and_rw_bits.\n"), len);
}
}
type of the region to be watched by this watchpoint. Return 0 on
success, -1 on failure. */
-static int
-i386_insert_aligned_watchpoint (struct i386_debug_reg_state *state,
- CORE_ADDR addr, unsigned len_rw_bits)
+int
+i386_dr_insert_aligned_watchpoint (struct i386_debug_reg_state *state,
+ CORE_ADDR addr, unsigned len_rw_bits)
{
int i;
type of the region watched by this watchpoint. Return 0 on
success, -1 on failure. */
-static int
-i386_remove_aligned_watchpoint (struct i386_debug_reg_state *state,
- CORE_ADDR addr, unsigned len_rw_bits)
+int
+i386_dr_remove_aligned_watchpoint (struct i386_debug_reg_state *state,
+ CORE_ADDR addr, unsigned len_rw_bits)
{
int i, retval = -1;
}
else
{
- unsigned len_rw = i386_length_and_rw_bits (size, type);
+ unsigned len_rw = i386_dr_length_and_rw_bits (size, type);
if (what == WP_INSERT)
- retval = i386_insert_aligned_watchpoint (state, addr, len_rw);
+ retval = i386_dr_insert_aligned_watchpoint (state, addr, len_rw);
else if (what == WP_REMOVE)
- retval = i386_remove_aligned_watchpoint (state, addr, len_rw);
+ retval = i386_dr_remove_aligned_watchpoint (state, addr, len_rw);
else
internal_error (__FILE__, __LINE__, _("\
Invalid value %d of operation in i386_handle_nonaligned_watchpoint.\n"),
/* Update the inferior debug registers state, in STATE, with the
new debug registers state, in NEW_STATE. */
-static void
-i386_update_inferior_debug_regs (struct i386_debug_reg_state *state,
- struct i386_debug_reg_state *new_state)
+void
+i386_dr_update_inferior_debug_regs (struct i386_debug_reg_state *state,
+ struct i386_debug_reg_state *new_state)
{
int i;
of the type TYPE. Return 0 on success, -1 on failure. */
int
-i386_low_insert_watchpoint (struct i386_debug_reg_state *state,
- enum target_hw_bp_type type,
- CORE_ADDR addr, int len)
+i386_dr_insert_watchpoint (struct i386_debug_reg_state *state,
+ enum target_hw_bp_type type,
+ CORE_ADDR addr, int len)
{
int retval;
/* Work on a local copy of the debug registers, and on success,
}
else
{
- unsigned len_rw = i386_length_and_rw_bits (len, type);
+ unsigned len_rw = i386_dr_length_and_rw_bits (len, type);
- retval = i386_insert_aligned_watchpoint (&local_state,
+ retval = i386_dr_insert_aligned_watchpoint (&local_state,
addr, len_rw);
}
if (retval == 0)
- i386_update_inferior_debug_regs (state, &local_state);
+ i386_dr_update_inferior_debug_regs (state, &local_state);
if (debug_hw_points)
- i386_show_dr (state, "insert_watchpoint", addr, len, type);
+ i386_dr_show (state, "insert_watchpoint", addr, len, type);
return retval;
}
type TYPE. Return 0 on success, -1 on failure. */
int
-i386_low_remove_watchpoint (struct i386_debug_reg_state *state,
- enum target_hw_bp_type type,
- CORE_ADDR addr, int len)
+i386_dr_remove_watchpoint (struct i386_debug_reg_state *state,
+ enum target_hw_bp_type type,
+ CORE_ADDR addr, int len)
{
int retval;
/* Work on a local copy of the debug registers, and on success,
}
else
{
- unsigned len_rw = i386_length_and_rw_bits (len, type);
+ unsigned len_rw = i386_dr_length_and_rw_bits (len, type);
- retval = i386_remove_aligned_watchpoint (&local_state,
+ retval = i386_dr_remove_aligned_watchpoint (&local_state,
addr, len_rw);
}
if (retval == 0)
- i386_update_inferior_debug_regs (state, &local_state);
+ i386_dr_update_inferior_debug_regs (state, &local_state);
if (debug_hw_points)
- i386_show_dr (state, "remove_watchpoint", addr, len, type);
+ i386_dr_show (state, "remove_watchpoint", addr, len, type);
return retval;
}
address ADDR and whose length is LEN bytes. */
int
-i386_low_region_ok_for_watchpoint (struct i386_debug_reg_state *state,
- CORE_ADDR addr, int len)
+i386_dr_region_ok_for_watchpoint (struct i386_debug_reg_state *state,
+ CORE_ADDR addr, int len)
{
int nregs;
Otherwise, return zero. */
int
-i386_low_stopped_data_address (struct i386_debug_reg_state *state,
- CORE_ADDR *addr_p)
+i386_dr_stopped_data_address (struct i386_debug_reg_state *state,
+ CORE_ADDR *addr_p)
{
CORE_ADDR addr = 0;
int i;
addr = i386_dr_low_get_addr (i);
rc = 1;
if (debug_hw_points)
- i386_show_dr (state, "watchpoint_hit", addr, -1, hw_write);
+ i386_dr_show (state, "watchpoint_hit", addr, -1, hw_write);
}
}
if (debug_hw_points && addr == 0)
- i386_show_dr (state, "stopped_data_addr", 0, 0, hw_write);
+ i386_dr_show (state, "stopped_data_addr", 0, 0, hw_write);
if (rc)
*addr_p = addr;
Otherwise return zero. */
int
-i386_low_stopped_by_watchpoint (struct i386_debug_reg_state *state)
+i386_dr_stopped_by_watchpoint (struct i386_debug_reg_state *state)
{
CORE_ADDR addr = 0;
- return i386_low_stopped_data_address (state, &addr);
+ return i386_dr_stopped_data_address (state, &addr);
}
/* Insert a watchpoint to watch a memory region which starts at
address ADDR and whose length is LEN bytes. Watch memory accesses
of the type TYPE. Return 0 on success, -1 on failure. */
-extern int i386_low_insert_watchpoint (struct i386_debug_reg_state *state,
- enum target_hw_bp_type type,
- CORE_ADDR addr,
- int len);
+extern int i386_dr_insert_watchpoint (struct i386_debug_reg_state *state,
+ enum target_hw_bp_type type,
+ CORE_ADDR addr,
+ int len);
/* Remove a watchpoint that watched the memory region which starts at
address ADDR, whose length is LEN bytes, and for accesses of the
type TYPE. Return 0 on success, -1 on failure. */
-extern int i386_low_remove_watchpoint (struct i386_debug_reg_state *state,
- enum target_hw_bp_type type,
- CORE_ADDR addr,
- int len);
+extern int i386_dr_remove_watchpoint (struct i386_debug_reg_state *state,
+ enum target_hw_bp_type type,
+ CORE_ADDR addr,
+ int len);
/* Return non-zero if we can watch a memory region that starts at
address ADDR and whose length is LEN bytes. */
-extern int i386_low_region_ok_for_watchpoint (struct i386_debug_reg_state *state,
- CORE_ADDR addr, int len);
+extern int i386_dr_region_ok_for_watchpoint (struct i386_debug_reg_state *state,
+ CORE_ADDR addr, int len);
/* If the inferior has some break/watchpoint that triggered, set the
address associated with that break/watchpoint and return true.
Otherwise, return false. */
-extern int i386_low_stopped_data_address (struct i386_debug_reg_state *state,
- CORE_ADDR *addr_p);
+extern int i386_dr_stopped_data_address (struct i386_debug_reg_state *state,
+ CORE_ADDR *addr_p);
/* Return true if the inferior has some watchpoint that triggered.
Otherwise return false. */
-extern int i386_low_stopped_by_watchpoint (struct i386_debug_reg_state *state);
+extern int i386_dr_stopped_by_watchpoint (struct i386_debug_reg_state *state);
\f
/* Each target needs to provide several low-level functions
that will be called to insert watchpoints and hardware breakpoints
struct i386_debug_reg_state *state
= &proc->private->arch_private->debug_reg_state;
- return i386_low_insert_watchpoint (state, hw_type, addr, size);
+ return i386_dr_insert_watchpoint (state, hw_type, addr, size);
}
default:
struct i386_debug_reg_state *state
= &proc->private->arch_private->debug_reg_state;
- return i386_low_remove_watchpoint (state, hw_type, addr, size);
+ return i386_dr_remove_watchpoint (state, hw_type, addr, size);
}
default:
/* Unsupported. */
x86_stopped_by_watchpoint (void)
{
struct process_info *proc = current_process ();
- return i386_low_stopped_by_watchpoint (&proc->private->arch_private->debug_reg_state);
+ return i386_dr_stopped_by_watchpoint (&proc->private->arch_private->debug_reg_state);
}
static CORE_ADDR
{
struct process_info *proc = current_process ();
CORE_ADDR addr;
- if (i386_low_stopped_data_address (&proc->private->arch_private->debug_reg_state,
- &addr))
+ if (i386_dr_stopped_data_address (&proc->private->arch_private->debug_reg_state,
+ &addr))
return addr;
return 0;
}
/* If we're setting a watchpoint, any change the inferior
had done itself to the debug registers needs to be
- discarded, otherwise, i386_low_stopped_data_address can
+ discarded, otherwise, i386_dr_stopped_data_address can
get confused. */
clear_status = 1;
}
enum target_hw_bp_type hw_type
= raw_bkpt_type_to_target_hw_bp_type (type);
- return i386_low_insert_watchpoint (&debug_reg_state,
- hw_type, addr, size);
+ return i386_dr_insert_watchpoint (&debug_reg_state,
+ hw_type, addr, size);
}
default:
/* Unsupported. */
enum target_hw_bp_type hw_type
= raw_bkpt_type_to_target_hw_bp_type (type);
- return i386_low_remove_watchpoint (&debug_reg_state,
- hw_type, addr, size);
+ return i386_dr_remove_watchpoint (&debug_reg_state,
+ hw_type, addr, size);
}
default:
/* Unsupported. */
static int
i386_stopped_by_watchpoint (void)
{
- return i386_low_stopped_by_watchpoint (&debug_reg_state);
+ return i386_dr_stopped_by_watchpoint (&debug_reg_state);
}
static CORE_ADDR
i386_stopped_data_address (void)
{
CORE_ADDR addr;
- if (i386_low_stopped_data_address (&debug_reg_state, &addr))
+ if (i386_dr_stopped_data_address (&debug_reg_state, &addr))
return addr;
return 0;
}
Currently, all watchpoint are locally enabled. If you need to
enable them globally, read the comment which pertains to this in
- i386_insert_aligned_watchpoint below. */
+ i386_dr_insert_aligned_watchpoint below. */
#define DR_LOCAL_ENABLE_SHIFT 0 /* Extra shift to the local enable bit. */
#define DR_GLOBAL_ENABLE_SHIFT 1 /* Extra shift to the global enable bit. */
#define DR_ENABLE_SIZE 2 /* Two enable bits per debug register. */
/* Print the values of the mirrored debug registers. */
-static void
-i386_show_dr (struct i386_debug_reg_state *state,
+void
+i386_dr_show (struct i386_debug_reg_state *state,
const char *func, CORE_ADDR addr,
int len, enum target_hw_bp_type type)
{
region of LEN bytes for accesses of type TYPE. LEN is assumed to
have the value of 1, 2, or 4. */
-static unsigned
-i386_length_and_rw_bits (int len, enum target_hw_bp_type type)
+unsigned
+i386_dr_length_and_rw_bits (int len, enum target_hw_bp_type type)
{
unsigned rw;
#endif
default:
internal_error (__FILE__, __LINE__, _("\
-Invalid hardware breakpoint type %d in i386_length_and_rw_bits.\n"),
+Invalid hardware breakpoint type %d in i386_dr_length_and_rw_bits.\n"),
(int) type);
}
/* ELSE FALL THROUGH */
default:
internal_error (__FILE__, __LINE__, _("\
-Invalid hardware breakpoint length %d in i386_length_and_rw_bits.\n"), len);
+Invalid hardware breakpoint length %d in i386_dr_length_and_rw_bits.\n"), len);
}
}
type of the region to be watched by this watchpoint. Return 0 on
success, -1 on failure. */
-static int
-i386_insert_aligned_watchpoint (struct i386_debug_reg_state *state,
- CORE_ADDR addr, unsigned len_rw_bits)
+int
+i386_dr_insert_aligned_watchpoint (struct i386_debug_reg_state *state,
+ CORE_ADDR addr, unsigned len_rw_bits)
{
int i;
type of the region watched by this watchpoint. Return 0 on
success, -1 on failure. */
-static int
-i386_remove_aligned_watchpoint (struct i386_debug_reg_state *state,
- CORE_ADDR addr, unsigned len_rw_bits)
+int
+i386_dr_remove_aligned_watchpoint (struct i386_debug_reg_state *state,
+ CORE_ADDR addr, unsigned len_rw_bits)
{
int i, retval = -1;
}
else
{
- unsigned len_rw = i386_length_and_rw_bits (size, type);
+ unsigned len_rw = i386_dr_length_and_rw_bits (size, type);
if (what == WP_INSERT)
- retval = i386_insert_aligned_watchpoint (state, addr, len_rw);
+ retval = i386_dr_insert_aligned_watchpoint (state, addr, len_rw);
else if (what == WP_REMOVE)
- retval = i386_remove_aligned_watchpoint (state, addr, len_rw);
+ retval = i386_dr_remove_aligned_watchpoint (state, addr, len_rw);
else
internal_error (__FILE__, __LINE__, _("\
Invalid value %d of operation in i386_handle_nonaligned_watchpoint.\n"),
/* Update the inferior debug registers state, in STATE, with the
new debug registers state, in NEW_STATE. */
-static void
-i386_update_inferior_debug_regs (struct i386_debug_reg_state *state,
- struct i386_debug_reg_state *new_state)
+void
+i386_dr_update_inferior_debug_regs (struct i386_debug_reg_state *state,
+ struct i386_debug_reg_state *new_state)
{
int i;
}
else
{
- unsigned len_rw = i386_length_and_rw_bits (len, type);
+ unsigned len_rw = i386_dr_length_and_rw_bits (len, type);
- retval = i386_insert_aligned_watchpoint (&local_state,
+ retval = i386_dr_insert_aligned_watchpoint (&local_state,
addr, len_rw);
}
if (retval == 0)
- i386_update_inferior_debug_regs (state, &local_state);
+ i386_dr_update_inferior_debug_regs (state, &local_state);
if (debug_hw_points)
- i386_show_dr (state, "insert_watchpoint", addr, len, type);
+ i386_dr_show (state, "insert_watchpoint", addr, len, type);
return retval;
}
}
else
{
- unsigned len_rw = i386_length_and_rw_bits (len, type);
+ unsigned len_rw = i386_dr_length_and_rw_bits (len, type);
- retval = i386_remove_aligned_watchpoint (&local_state,
+ retval = i386_dr_remove_aligned_watchpoint (&local_state,
addr, len_rw);
}
if (retval == 0)
- i386_update_inferior_debug_regs (state, &local_state);
+ i386_dr_update_inferior_debug_regs (state, &local_state);
if (debug_hw_points)
- i386_show_dr (state, "remove_watchpoint", addr, len, type);
+ i386_dr_show (state, "remove_watchpoint", addr, len, type);
return retval;
}
addr = i386_dr_low_get_addr (i);
rc = 1;
if (debug_hw_points)
- i386_show_dr (state, "watchpoint_hit", addr, -1, hw_write);
+ i386_dr_show (state, "watchpoint_hit", addr, -1, hw_write);
}
}
if (debug_hw_points && addr == 0)
- i386_show_dr (state, "stopped_data_addr", 0, 0, hw_write);
+ i386_dr_show (state, "stopped_data_addr", 0, 0, hw_write);
if (rc)
*addr_p = addr;
{
struct i386_debug_reg_state *state
= i386_debug_reg_state (ptid_get_pid (inferior_ptid));
- unsigned len_rw = i386_length_and_rw_bits (1, hw_execute);
+ unsigned len_rw = i386_dr_length_and_rw_bits (1, hw_execute);
CORE_ADDR addr = bp_tgt->placed_address;
/* Work on a local copy of the debug registers, and on success,
commit the change back to the inferior. */
struct i386_debug_reg_state local_state = *state;
- int retval = i386_insert_aligned_watchpoint (&local_state,
- addr, len_rw) ? EBUSY : 0;
+ int retval = i386_dr_insert_aligned_watchpoint (&local_state,
+ addr,
+ len_rw) ? EBUSY : 0;
if (retval == 0)
- i386_update_inferior_debug_regs (state, &local_state);
+ i386_dr_update_inferior_debug_regs (state, &local_state);
if (debug_hw_points)
- i386_show_dr (state, "insert_hwbp", addr, 1, hw_execute);
+ i386_dr_show (state, "insert_hwbp", addr, 1, hw_execute);
return retval;
}
{
struct i386_debug_reg_state *state
= i386_debug_reg_state (ptid_get_pid (inferior_ptid));
- unsigned len_rw = i386_length_and_rw_bits (1, hw_execute);
+ unsigned len_rw = i386_dr_length_and_rw_bits (1, hw_execute);
CORE_ADDR addr = bp_tgt->placed_address;
/* Work on a local copy of the debug registers, and on success,
commit the change back to the inferior. */
struct i386_debug_reg_state local_state = *state;
- int retval = i386_remove_aligned_watchpoint (&local_state,
- addr, len_rw);
+ int retval = i386_dr_remove_aligned_watchpoint (&local_state,
+ addr, len_rw);
if (retval == 0)
- i386_update_inferior_debug_regs (state, &local_state);
+ i386_dr_update_inferior_debug_regs (state, &local_state);
if (debug_hw_points)
- i386_show_dr (state, "remove_hwbp", addr, 1, hw_execute);
+ i386_dr_show (state, "remove_hwbp", addr, 1, hw_execute);
return retval;
}