aboutsummaryrefslogtreecommitdiff
path: root/gdb/compile/compile-object-run.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/compile/compile-object-run.c')
-rw-r--r--gdb/compile/compile-object-run.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/gdb/compile/compile-object-run.c b/gdb/compile/compile-object-run.c
index 15d3130..771a209 100644
--- a/gdb/compile/compile-object-run.c
+++ b/gdb/compile/compile-object-run.c
@@ -25,6 +25,8 @@
#include "compile-internal.h"
#include "dummy-frame.h"
#include "block.h"
+#include "valprint.h"
+#include "compile.h"
/* Helper for do_module_cleanup. */
@@ -41,6 +43,10 @@ struct do_module_cleanup
enum compile_i_scope_types scope;
void *scope_data;
+ /* Copy from struct compile_module. */
+ struct type *out_value_type;
+ CORE_ADDR out_value_addr;
+
/* objfile_name of our objfile. */
char objfile_name_string[1];
};
@@ -56,7 +62,23 @@ do_module_cleanup (void *arg, int registers_valid)
struct objfile *objfile;
if (data->executedp != NULL)
- *data->executedp = 1;
+ {
+ *data->executedp = 1;
+
+ /* This code cannot be in compile_object_run as OUT_VALUE_TYPE
+ no longer exists there. */
+ if (data->scope == COMPILE_I_PRINT_ADDRESS_SCOPE
+ || data->scope == COMPILE_I_PRINT_VALUE_SCOPE)
+ {
+ struct value *addr_value;
+ struct type *ptr_type = lookup_pointer_type (data->out_value_type);
+
+ addr_value = value_from_pointer (ptr_type, data->out_value_addr);
+
+ /* SCOPE_DATA would be stale unlesse EXECUTEDP != NULL. */
+ compile_print_value (value_ind (addr_value), data->scope_data);
+ }
+ }
ALL_OBJFILES (objfile)
if ((objfile->flags & OBJF_USERLOADED) == 0
@@ -104,6 +126,8 @@ compile_object_run (struct compile_module *module)
strcpy (data->objfile_name_string, objfile_name_s);
data->scope = module->scope;
data->scope_data = module->scope_data;
+ data->out_value_type = module->out_value_type;
+ data->out_value_addr = module->out_value_addr;
xfree (module->source_file);
xfree (module);
@@ -133,6 +157,13 @@ compile_object_run (struct compile_module *module)
(TYPE_FIELD_TYPE (func_type, current_arg), regs_addr);
++current_arg;
}
+ if (TYPE_NFIELDS (func_type) >= 2)
+ {
+ gdb_assert (data->out_value_addr != 0);
+ vargs[current_arg] = value_from_pointer
+ (TYPE_FIELD_TYPE (func_type, current_arg), data->out_value_addr);
+ ++current_arg;
+ }
gdb_assert (current_arg == TYPE_NFIELDS (func_type));
call_function_by_hand_dummy (func_val, TYPE_NFIELDS (func_type), vargs,
do_module_cleanup, data);