aboutsummaryrefslogtreecommitdiff
path: root/gdb/stabsread.c
diff options
context:
space:
mode:
authorJim Blandy <jimb@codesourcery.com>2002-05-04 00:21:09 +0000
committerJim Blandy <jimb@codesourcery.com>2002-05-04 00:21:09 +0000
commit13a393b0d3bc047b7ce69cb25502437d96e8fb95 (patch)
treeae66cc45ae8836df0b1293876ba5755fc3b0b57c /gdb/stabsread.c
parent2ae1c2d22252e6ac448c9e5fe11d7cd8701284e3 (diff)
downloadgdb-13a393b0d3bc047b7ce69cb25502437d96e8fb95.zip
gdb-13a393b0d3bc047b7ce69cb25502437d96e8fb95.tar.gz
gdb-13a393b0d3bc047b7ce69cb25502437d96e8fb95.tar.bz2
* stabsread.c (cleanup_undefined_types): Use replace_type, not memcpy.
(read_type): Doc fix. * gdbtypes.c (replace_type): Doc fix.
Diffstat (limited to 'gdb/stabsread.c')
-rw-r--r--gdb/stabsread.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/gdb/stabsread.c b/gdb/stabsread.c
index 74a873e..7065b7b 100644
--- a/gdb/stabsread.c
+++ b/gdb/stabsread.c
@@ -2537,7 +2537,24 @@ again:
the related problems with unnecessarily stubbed types;
someone motivated should attempt to clean up the issue
here as well. Once a type pointed to has been created it
- should not be modified. */
+ should not be modified.
+
+ Well, it's not *absolutely* wrong. Constructing recursive
+ types (trees, linked lists) necessarily entails modifying
+ types after creating them. Constructing any loop structure
+ entails side effects. The Dwarf 2 reader does handle this
+ more gracefully (it never constructs more than once
+ instance of a type object, so it doesn't have to copy type
+ objects wholesale), but it still mutates type objects after
+ other folks have references to them.
+
+ Keep in mind that this circularity/mutation issue shows up
+ at the source language level, too: C's "incomplete types",
+ for example. So the proper cleanup, I think, would be to
+ limit GDB's type smashing to match exactly those required
+ by the source language. So GDB could have a
+ "complete_this_type" function, but never create unnecessary
+ copies of a type otherwise. */
replace_type (type, xtype);
TYPE_NAME (type) = NULL;
TYPE_TAG_NAME (type) = NULL;
@@ -5122,10 +5139,7 @@ cleanup_undefined_types (void)
&& (TYPE_CODE (SYMBOL_TYPE (sym)) ==
TYPE_CODE (*type))
&& STREQ (SYMBOL_NAME (sym), typename))
- {
- memcpy (*type, SYMBOL_TYPE (sym),
- sizeof (struct type));
- }
+ replace_type (*type, SYMBOL_TYPE (sym));
}
}
}