aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2019-07-13 12:13:15 -0600
committerTom Tromey <tom@tromey.com>2019-08-06 20:08:48 -0600
commit0cf9feb996cb32939840b13073a49310b1fd71e0 (patch)
tree4587051d5f873efbc2eacf85e23f2987f24d7571
parentefba19b06a6f2baacb3920599f970d1333ffc358 (diff)
downloadgdb-0cf9feb996cb32939840b13073a49310b1fd71e0.zip
gdb-0cf9feb996cb32939840b13073a49310b1fd71e0.tar.gz
gdb-0cf9feb996cb32939840b13073a49310b1fd71e0.tar.bz2
Introduce obstack_strndup
This introduces obstack_strndup and changes gdb to use it. Note that obstack_strndup works like savestring, and not exactly like xstrndup. The difference is that obstack_strndup uses the passed-in length, while xstrndup uses strnlen to choose the length. gdb/ChangeLog 2019-08-06 Tom Tromey <tom@tromey.com> * stabsread.c (patch_block_stabs, read_one_struct_field) (read_enum_type): Use obstack_strndup. * rust-exp.y (rust_parser::copy_name): Use obstack_strndup. * gdb_obstack.h (obstack_strndup): Use obstack_strndup. * dwarf2read.c (guess_full_die_structure_name) (anonymous_struct_prefix): Use obstack_strndup. * dbxread.c (cp_set_block_scope): Use obstack_strndup. * c-exp.y (yylex): Use obstack_strndup. * ada-exp.y (write_object_renaming, write_ambiguous_var) (write_var_or_type): Use obstack_strndup.
-rw-r--r--gdb/ChangeLog13
-rw-r--r--gdb/ada-exp.y15
-rw-r--r--gdb/c-exp.y6
-rw-r--r--gdb/dbxread.c3
-rw-r--r--gdb/dwarf2read.c8
-rw-r--r--gdb/gdb_obstack.h11
-rw-r--r--gdb/rust-exp.y2
-rw-r--r--gdb/stabsread.c8
8 files changed, 43 insertions, 23 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 31cd69d..82e0819 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,18 @@
2019-08-06 Tom Tromey <tom@tromey.com>
+ * stabsread.c (patch_block_stabs, read_one_struct_field)
+ (read_enum_type): Use obstack_strndup.
+ * rust-exp.y (rust_parser::copy_name): Use obstack_strndup.
+ * gdb_obstack.h (obstack_strndup): Use obstack_strndup.
+ * dwarf2read.c (guess_full_die_structure_name)
+ (anonymous_struct_prefix): Use obstack_strndup.
+ * dbxread.c (cp_set_block_scope): Use obstack_strndup.
+ * c-exp.y (yylex): Use obstack_strndup.
+ * ada-exp.y (write_object_renaming, write_ambiguous_var)
+ (write_var_or_type): Use obstack_strndup.
+
+2019-08-06 Tom Tromey <tom@tromey.com>
+
* symfile.c (reread_symbols): Use obstack_strdup.
* stabsread.c (read_type): Use obstack_strdup.
* gdb_obstack.h (obstack_strdup): New overload.
diff --git a/gdb/ada-exp.y b/gdb/ada-exp.y
index 2c8f3d6..f36aaba 100644
--- a/gdb/ada-exp.y
+++ b/gdb/ada-exp.y
@@ -812,8 +812,8 @@ write_object_renaming (struct parser_state *par_state,
if (orig_left_context == NULL)
orig_left_context = get_selected_block (NULL);
- name = (char *) obstack_copy0 (&temp_parse_space, renamed_entity,
- renamed_entity_len);
+ name = obstack_strndup (&temp_parse_space, renamed_entity,
+ renamed_entity_len);
ada_lookup_encoded_symbol (name, orig_left_context, VAR_DOMAIN, &sym_info);
if (sym_info.symbol == NULL)
error (_("Could not find renamed variable: %s"), ada_decode (name));
@@ -881,9 +881,8 @@ write_object_renaming (struct parser_state *par_state,
if (end == NULL)
end = renaming_expr + strlen (renaming_expr);
- index_name
- = (char *) obstack_copy0 (&temp_parse_space, renaming_expr,
- end - renaming_expr);
+ index_name = obstack_strndup (&temp_parse_space, renaming_expr,
+ end - renaming_expr);
renaming_expr = end;
ada_lookup_encoded_symbol (index_name, orig_left_context,
@@ -1107,8 +1106,7 @@ write_ambiguous_var (struct parser_state *par_state,
memset (sym, 0, sizeof (struct symbol));
SYMBOL_DOMAIN (sym) = UNDEF_DOMAIN;
- SYMBOL_LINKAGE_NAME (sym)
- = (const char *) obstack_copy0 (&temp_parse_space, name, len);
+ SYMBOL_LINKAGE_NAME (sym) = obstack_strndup (&temp_parse_space, name, len);
SYMBOL_LANGUAGE (sym) = language_ada;
write_exp_elt_opcode (par_state, OP_VAR_VALUE);
@@ -1206,8 +1204,7 @@ write_var_or_type (struct parser_state *par_state,
encoded_name = ada_encode (name0.ptr);
name_len = strlen (encoded_name);
- encoded_name
- = (char *) obstack_copy0 (&temp_parse_space, encoded_name, name_len);
+ encoded_name = obstack_strndup (&temp_parse_space, encoded_name, name_len);
for (depth = 0; depth < MAX_RENAMING_CHAIN_LENGTH; depth += 1)
{
int tail_index;
diff --git a/gdb/c-exp.y b/gdb/c-exp.y
index 439a72a..e0abbd8 100644
--- a/gdb/c-exp.y
+++ b/gdb/c-exp.y
@@ -3291,9 +3291,9 @@ yylex (void)
if (checkpoint > 0)
{
current.value.sval.ptr
- = (const char *) obstack_copy0 (&cpstate->expansion_obstack,
- current.value.sval.ptr,
- current.value.sval.length);
+ = obstack_strndup (&cpstate->expansion_obstack,
+ current.value.sval.ptr,
+ current.value.sval.length);
token_fifo[0] = current;
if (checkpoint > 1)
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index 0b370cd..e339d1f 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -2354,8 +2354,7 @@ cp_set_block_scope (const struct symbol *symbol,
const char *name = SYMBOL_DEMANGLED_NAME (symbol);
unsigned int prefix_len = cp_entire_prefix_len (name);
- block_set_scope (block,
- (const char *) obstack_copy0 (obstack, name, prefix_len),
+ block_set_scope (block, obstack_strndup (obstack, name, prefix_len),
obstack);
}
}
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 6d28924..1c26f83 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -22334,7 +22334,7 @@ guess_full_die_structure_name (struct die_info *die, struct dwarf2_cu *cu)
if (actual_name_len > die_name_len + 2
&& actual_name[actual_name_len
- die_name_len - 1] == ':')
- name = (char *) obstack_copy0 (
+ name = obstack_strndup (
&objfile->per_bfd->storage_obstack,
actual_name, actual_name_len - die_name_len - 2);
}
@@ -22378,9 +22378,9 @@ anonymous_struct_prefix (struct die_info *die, struct dwarf2_cu *cu)
return "";
struct objfile *objfile = cu->per_cu->dwarf2_per_objfile->objfile;
- return (char *) obstack_copy0 (&objfile->per_bfd->storage_obstack,
- DW_STRING (attr),
- &base[-1] - DW_STRING (attr));
+ return obstack_strndup (&objfile->per_bfd->storage_obstack,
+ DW_STRING (attr),
+ &base[-1] - DW_STRING (attr));
}
/* Return the name of the namespace/class that DIE is defined within,
diff --git a/gdb/gdb_obstack.h b/gdb/gdb_obstack.h
index db849a0..3d6a010 100644
--- a/gdb/gdb_obstack.h
+++ b/gdb/gdb_obstack.h
@@ -105,6 +105,17 @@ obstack_strdup (struct obstack *obstackp, const std::string &string)
string.size ());
}
+/* Duplicate the first N characters of STRING, returning a
+ \0-terminated string that's allocated on the obstack OBSTACKP.
+ Note that exactly N characters are copied, even if STRING is
+ shorter. */
+
+static inline char *
+obstack_strndup (struct obstack *obstackp, const char *string, size_t n)
+{
+ return (char *) obstack_copy0 (obstackp, string, n);
+}
+
/* An obstack that frees itself on scope exit. */
struct auto_obstack : obstack
{
diff --git a/gdb/rust-exp.y b/gdb/rust-exp.y
index bf6566b..60ce2cd 100644
--- a/gdb/rust-exp.y
+++ b/gdb/rust-exp.y
@@ -1011,7 +1011,7 @@ static const struct token_info operator_tokens[] =
const char *
rust_parser::copy_name (const char *name, int len)
{
- return (const char *) obstack_copy0 (&obstack, name, len);
+ return obstack_strndup (&obstack, name, len);
}
/* Helper function to make an stoken from a C string. */
diff --git a/gdb/stabsread.c b/gdb/stabsread.c
index 23da5f9..48c88de 100644
--- a/gdb/stabsread.c
+++ b/gdb/stabsread.c
@@ -426,8 +426,8 @@ patch_block_stabs (struct pending *symbols, struct pending_stabs *stabs,
SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
SYMBOL_ACLASS_INDEX (sym) = LOC_OPTIMIZED_OUT;
SYMBOL_SET_LINKAGE_NAME
- (sym, (char *) obstack_copy0 (&objfile->objfile_obstack,
- name, pp - name));
+ (sym, obstack_strndup (&objfile->objfile_obstack,
+ name, pp - name));
pp += 2;
if (*(pp - 1) == 'F' || *(pp - 1) == 'f')
{
@@ -2841,7 +2841,7 @@ read_one_struct_field (struct stab_field_info *fip, const char **pp,
struct gdbarch *gdbarch = get_objfile_arch (objfile);
fip->list->field.name
- = (const char *) obstack_copy0 (&objfile->objfile_obstack, *pp, p - *pp);
+ = obstack_strndup (&objfile->objfile_obstack, *pp, p - *pp);
*pp = p + 1;
/* This means we have a visibility for a field coming. */
@@ -3641,7 +3641,7 @@ read_enum_type (const char **pp, struct type *type,
p = *pp;
while (*p != ':')
p++;
- name = (char *) obstack_copy0 (&objfile->objfile_obstack, *pp, p - *pp);
+ name = obstack_strndup (&objfile->objfile_obstack, *pp, p - *pp);
*pp = p + 1;
n = read_huge_number (pp, ',', &nbits, 0);
if (nbits != 0)