diff mbox

compile: Remove non-const reference parameters

Message ID 1535647635-9566-1-git-send-email-simon.marchi@ericsson.com
State New
Headers show

Commit Message

Simon Marchi Aug. 30, 2018, 4:47 p.m. UTC
As mentioned here:

  https://sourceware.org/gdb/wiki/Internals%20GDB-C-Coding-Standards#Avoid_non-const_reference_parameters.2C_use_pointers_instead

we prefer to avoid non-const references.  This patch changes the
non-const references I could find in the compile/ directory, either by
making them const or changing them to pointers.

I'd say all the changes are pretty obvious, except the one in
compile_cplus_instance::enter_scope which might require more attention.

gdb/ChangeLog:

	* compile/compile-c.h (generate_c_for_variable_locations):
	Change reference to pointer.
	* compile/compile-c-support.c (compile_program) <compute>:
	Likewise.
	* compile/compile-c-symbols.c (generate_vla_size): Likewise.
	(generate_c_for_for_one_variable): Likewise
	(generate_c_for_variable_locations): Likewise
	* compile/compile-c-types.c (compile_c_instance::convert_type):
	Likewise
	* compile/compile-cplus-types.c
	(compile_cplus_instance::enter_scope): Make reference const.
	(compile_cplus_instance::new_scope): Change reference to
	pointer.
	(compile_cplus_instance::convert_type): Likewise
	* compile/compile-cplus.h (compile_cplus_instance)
	<enter_scope>: Make reference const.
	* compile/compile-internal.h (compile_instance)
	<get_cached_type>: Likewise
	* compile/compile-loc2c.c (push): Likewise
	(pushf): Likewise
	(unary): Likewise
	(binary): Likewise
	(print_label): Likewise
	(pushf_register_address): Likewise
	(pushf_register): Likewise
	(do_compile_dwarf_expr_to_c): Likewise
	(compile_dwarf_expr_to_c): Likewise
	(compile_dwarf_bounds_to_c): Likewise
	* compile/compile.c (compile_instance::get_cached_type):
	Likewise
	* compile/compile.h (compile_dwarf_expr_to_c): Likewise.
	(compile_dwarf_bounds_to_c): Likewise
	* dwarf2loc.c (locexpr_generate_c_location): Likewise.
	(dwarf2_compile_property_to_c): Likewise
	* dwarf2loc.h (dwarf2_compile_property_to_c): Likewise
	* symtab.h (struct symbol_computed_ops) <generate_c_location>:
	Likewise
---
 gdb/compile/compile-c-support.c   |   2 +-
 gdb/compile/compile-c-symbols.c   |  14 ++---
 gdb/compile/compile-c-types.c     |   2 +-
 gdb/compile/compile-c.h           |   2 +-
 gdb/compile/compile-cplus-types.c |   9 ++--
 gdb/compile/compile-cplus.h       |   2 +-
 gdb/compile/compile-internal.h    |   2 +-
 gdb/compile/compile-loc2c.c       | 106 +++++++++++++++++++-------------------
 gdb/compile/compile.c             |   4 +-
 gdb/compile/compile.h             |   4 +-
 gdb/dwarf2loc.c                   |   6 +--
 gdb/dwarf2loc.h                   |   2 +-
 gdb/symtab.h                      |   2 +-
 13 files changed, 78 insertions(+), 79 deletions(-)

Comments

Keith Seitz Aug. 30, 2018, 9:57 p.m. UTC | #1
On 08/30/2018 09:47 AM, Simon Marchi wrote:
> 
> I'd say all the changes are pretty obvious, except the one in
> compile_cplus_instance::enter_scope which might require more attention.

That scope-handling code is a little bit of a mess, given that it was written, 
and then rewritten, right as we were moving from C -> C++03 -> C++11. So I 
had no access to unique_ptrs.

Nonetheless, the intent is that a scope is created and control of that object
is then handed over to the compile_cplus_instance entirely. So your patch
LGTM.

With access to C++11 that we enjoy today, I might have written this
interface quite a bit differently...

Keith
Tom Tromey Aug. 31, 2018, 2:41 p.m. UTC | #2
>>>>> "Keith" == Keith Seitz <keiths@redhat.com> writes:

Keith> Nonetheless, the intent is that a scope is created and control of
Keith> that object is then handed over to the compile_cplus_instance
Keith> entirely.

In that case maybe it should take an rvalue ref instead.
I didn't really look at this in context, though, so if that doesn't make
sense, just ignore it.

Tom
Tom Tromey Sept. 17, 2018, 6:31 a.m. UTC | #3
>>>>> "Simon" == Simon Marchi <simon.marchi@ericsson.com> writes:

Simon> As mentioned here:
Simon>   https://sourceware.org/gdb/wiki/Internals%20GDB-C-Coding-Standards#Avoid_non-const_reference_parameters.2C_use_pointers_instead

Simon> we prefer to avoid non-const references.  This patch changes the
Simon> non-const references I could find in the compile/ directory, either by
Simon> making them const or changing them to pointers.

Simon> I'd say all the changes are pretty obvious, except the one in
Simon> compile_cplus_instance::enter_scope which might require more attention.

I think this particular change introduced a regression.  runtest
gdb.compile/*.exp causes gdb to crash for me several times on x86-64
Fedora 28.

The code does this:

  /* Save the new scope.  */
  m_scopes.push_back (std::move (new_scope));

... but then later code in the function continues to use new_scope,
like:

      std::for_each
	(new_scope.begin (), new_scope.end () - 1,

Tom
Keith Seitz Sept. 17, 2018, 1:29 p.m. UTC | #4
On 09/16/2018 11:31 PM, Tom Tromey wrote:
> I think this particular change introduced a regression.  runtest
> gdb.compile/*.exp causes gdb to crash for me several times on x86-64
> Fedora 28.

Fedora 28 is really broken right now. I have patches to fix almost
everything*, but I am struggling to understand why one of them is needed.
AFAICT, either __builtin_memcpy has usage changes that I missed, or there is
a glibc bug here. ["compile print" is completely broken -- the
__builtin_memcpy on Fedora 28 does nothing. Works fine on my Fedora 21
and 26 boxes.]

Using __builtin_memmove works fine, though. [And just to state the obvious,
no, the memory regions do not overlap.]

Keith

* "Everything" = everything except what appears to be a newly introduced GCC
8 bug that causes regressions in compile-cplus-method.exp.
diff mbox

Patch

diff --git a/gdb/compile/compile-c-support.c b/gdb/compile/compile-c-support.c
index 5c700bb..28a07dc 100644
--- a/gdb/compile/compile-c-support.c
+++ b/gdb/compile/compile-c-support.c
@@ -572,7 +572,7 @@  public:
 	   register struct before the function body.  This requires a
 	   temporary stream.  */
 	gdb::unique_xmalloc_ptr<unsigned char> registers_used
-	  = generate_c_for_variable_locations (m_instance, var_stream, m_arch,
+	  = generate_c_for_variable_locations (m_instance, &var_stream, m_arch,
 					       expr_block, expr_pc);
 
 	buf.puts ("typedef unsigned int"
diff --git a/gdb/compile/compile-c-symbols.c b/gdb/compile/compile-c-symbols.c
index e7423d1..e877b78 100644
--- a/gdb/compile/compile-c-symbols.c
+++ b/gdb/compile/compile-c-symbols.c
@@ -487,7 +487,7 @@  symbol_seen (htab_t hashtab, struct symbol *sym)
 
 static void
 generate_vla_size (compile_instance *compiler,
-		   string_file &stream,
+		   string_file *stream,
 		   struct gdbarch *gdbarch,
 		   unsigned char *registers_used,
 		   CORE_ADDR pc,
@@ -541,7 +541,7 @@  generate_vla_size (compile_instance *compiler,
 
 static void
 generate_c_for_for_one_variable (compile_instance *compiler,
-				 string_file &stream,
+				 string_file *stream,
 				 struct gdbarch *gdbarch,
 				 unsigned char *registers_used,
 				 CORE_ADDR pc,
@@ -556,10 +556,10 @@  generate_c_for_for_one_variable (compile_instance *compiler,
 	     occurs in the middle.  */
 	  string_file local_file;
 
-	  generate_vla_size (compiler, local_file, gdbarch, registers_used, pc,
+	  generate_vla_size (compiler, &local_file, gdbarch, registers_used, pc,
 			     SYMBOL_TYPE (sym), sym);
 
-	  stream.write (local_file.c_str (), local_file.size ());
+	  stream->write (local_file.c_str (), local_file.size ());
 	}
 
       if (SYMBOL_COMPUTED_OPS (sym) != NULL)
@@ -570,12 +570,12 @@  generate_c_for_for_one_variable (compile_instance *compiler,
 	     occurs in the middle.  */
 	  string_file local_file;
 
-	  SYMBOL_COMPUTED_OPS (sym)->generate_c_location (sym, local_file,
+	  SYMBOL_COMPUTED_OPS (sym)->generate_c_location (sym, &local_file,
 							  gdbarch,
 							  registers_used,
 							  pc,
 							  generated_name.get ());
-	  stream.write (local_file.c_str (), local_file.size ());
+	  stream->write (local_file.c_str (), local_file.size ());
 	}
       else
 	{
@@ -611,7 +611,7 @@  generate_c_for_for_one_variable (compile_instance *compiler,
 
 gdb::unique_xmalloc_ptr<unsigned char>
 generate_c_for_variable_locations (compile_instance *compiler,
-				   string_file &stream,
+				   string_file *stream,
 				   struct gdbarch *gdbarch,
 				   const struct block *block,
 				   CORE_ADDR pc)
diff --git a/gdb/compile/compile-c-types.c b/gdb/compile/compile-c-types.c
index 30a4fcb..33b4a87 100644
--- a/gdb/compile/compile-c-types.c
+++ b/gdb/compile/compile-c-types.c
@@ -353,7 +353,7 @@  compile_c_instance::convert_type (struct type *type)
   type = check_typedef (type);
 
   gcc_type result;
-  if (get_cached_type (type, result))
+  if (get_cached_type (type, &result))
     return result;
 
   result = convert_type_basic (this, type);
diff --git a/gdb/compile/compile-c.h b/gdb/compile/compile-c.h
index 18ff4d3..aa11a13 100644
--- a/gdb/compile/compile-c.h
+++ b/gdb/compile/compile-c.h
@@ -69,7 +69,7 @@  private:
 extern gdb::unique_xmalloc_ptr<unsigned char>
   generate_c_for_variable_locations
      (compile_instance *compiler,
-      string_file &stream,
+      string_file *stream,
       struct gdbarch *gdbarch,
       const struct block *block,
       CORE_ADDR pc);
diff --git a/gdb/compile/compile-cplus-types.c b/gdb/compile/compile-cplus-types.c
index 7fc4136..ab4a48b 100644
--- a/gdb/compile/compile-cplus-types.c
+++ b/gdb/compile/compile-cplus-types.c
@@ -247,14 +247,13 @@  operator!= (const compile_scope &lhs, const compile_scope &rhs)
 /* See description in compile-cplus.h.  */
 
 void
-compile_cplus_instance::enter_scope (compile_scope &new_scope)
+compile_cplus_instance::enter_scope (const compile_scope &new_scope)
 {
   bool must_push = m_scopes.empty () || m_scopes.back () != new_scope;
 
-  new_scope.m_pushed = must_push;
-
   /* Save the new scope.  */
   m_scopes.push_back (new_scope);
+  m_scopes.back().m_pushed = must_push;
 
   if (must_push)
     {
@@ -360,7 +359,7 @@  compile_cplus_instance::new_scope (const char *type_name, struct type *type)
 	     class, the previous call will give us that type's gcc_type.
 	     Upper layers are expecting to get the original type's
 	     gcc_type!  */
-	  get_cached_type (type, scope.m_nested_type);
+	  get_cached_type (type, &scope.m_nested_type);
 	  return scope;
 	}
     }
@@ -1211,7 +1210,7 @@  compile_cplus_instance::convert_type (struct type *type,
 {
   /* Check if TYPE has already been converted.  */
   gcc_type result;
-  if (get_cached_type (type, result))
+  if (get_cached_type (type, &result))
     return result;
 
   /* It is the first time this type has been seen -- convert it
diff --git a/gdb/compile/compile-cplus.h b/gdb/compile/compile-cplus.h
index 7baa57d..b7c4df5 100644
--- a/gdb/compile/compile-cplus.h
+++ b/gdb/compile/compile-cplus.h
@@ -159,7 +159,7 @@  public:
   compile_scope new_scope (const char *type_name, struct type *type);
 
   /* Enter the given NEW_SCOPE.  */
-  void enter_scope (compile_scope &scope);
+  void enter_scope (const compile_scope &scope);
 
   /* Leave the current scope.  */
   void leave_scope ();
diff --git a/gdb/compile/compile-internal.h b/gdb/compile/compile-internal.h
index a6e7330..2df8b89 100644
--- a/gdb/compile/compile-internal.h
+++ b/gdb/compile/compile-internal.h
@@ -59,7 +59,7 @@  public:
 
   /* Query the type cache for TYPE, returning the compiler's
      type for it in RET.  */
-  bool get_cached_type (struct type *type, gcc_type &ret) const;
+  bool get_cached_type (struct type *type, gcc_type *ret) const;
 
   /* Insert GCC_TYPE into the type cache for TYPE.
 
diff --git a/gdb/compile/compile-loc2c.c b/gdb/compile/compile-loc2c.c
index bd080f8..1997e9a 100644
--- a/gdb/compile/compile-loc2c.c
+++ b/gdb/compile/compile-loc2c.c
@@ -430,9 +430,9 @@  compute_stack_depth (enum bfd_endian byte_order, unsigned int addr_size,
 /* Emit code to push a constant.  */
 
 static void
-push (int indent, string_file &stream, ULONGEST l)
+push (int indent, string_file *stream, ULONGEST l)
 {
-  fprintfi_filtered (indent, &stream,
+  fprintfi_filtered (indent, stream,
 		     "__gdb_stack[++__gdb_tos] = (" GCC_UINTPTR ") %s;\n",
 		     hex_string (l));
 }
@@ -440,57 +440,57 @@  push (int indent, string_file &stream, ULONGEST l)
 /* Emit code to push an arbitrary expression.  This works like
    printf.  */
 
-static void pushf (int indent, string_file &stream, const char *format, ...)
+static void pushf (int indent, string_file *stream, const char *format, ...)
   ATTRIBUTE_PRINTF (3, 4);
 
 static void
-pushf (int indent, string_file &stream, const char *format, ...)
+pushf (int indent, string_file *stream, const char *format, ...)
 {
   va_list args;
 
-  fprintfi_filtered (indent, &stream, "__gdb_stack[__gdb_tos + 1] = ");
+  fprintfi_filtered (indent, stream, "__gdb_stack[__gdb_tos + 1] = ");
   va_start (args, format);
-  stream.vprintf (format, args);
+  stream->vprintf (format, args);
   va_end (args);
-  stream.puts (";\n");
+  stream->puts (";\n");
 
-  fprintfi_filtered (indent, &stream, "++__gdb_tos;\n");
+  fprintfi_filtered (indent, stream, "++__gdb_tos;\n");
 }
 
 /* Emit code for a unary expression -- one which operates in-place on
    the top-of-stack.  This works like printf.  */
 
-static void unary (int indent, string_file &stream, const char *format, ...)
+static void unary (int indent, string_file *stream, const char *format, ...)
   ATTRIBUTE_PRINTF (3, 4);
 
 static void
-unary (int indent, string_file &stream, const char *format, ...)
+unary (int indent, string_file *stream, const char *format, ...)
 {
   va_list args;
 
-  fprintfi_filtered (indent, &stream, "__gdb_stack[__gdb_tos] = ");
+  fprintfi_filtered (indent, stream, "__gdb_stack[__gdb_tos] = ");
   va_start (args, format);
-  stream.vprintf (format, args);
+  stream->vprintf (format, args);
   va_end (args);
-  stream.puts (";\n");
+  stream->puts (";\n");
 }
 
 /* Emit code for a unary expression -- one which uses the top two
    stack items, popping the topmost one.  This works like printf.  */
-static void binary (int indent, string_file &stream, const char *format, ...)
+static void binary (int indent, string_file *stream, const char *format, ...)
   ATTRIBUTE_PRINTF (3, 4);
 
 static void
-binary (int indent, string_file &stream, const char *format, ...)
+binary (int indent, string_file *stream, const char *format, ...)
 {
   va_list args;
 
-  fprintfi_filtered (indent, &stream, "__gdb_stack[__gdb_tos - 1] = ");
+  fprintfi_filtered (indent, stream, "__gdb_stack[__gdb_tos - 1] = ");
   va_start (args, format);
-  stream.vprintf (format, args);
+  stream->vprintf (format, args);
   va_end (args);
-  stream.puts (";\n");
-  fprintfi_filtered (indent, &stream, "--__gdb_tos;\n");
+  stream->puts (";\n");
+  fprintfi_filtered (indent, stream, "--__gdb_tos;\n");
 }
 
 /* Print the name of a label given its "SCOPE", an arbitrary integer
@@ -498,9 +498,9 @@  binary (int indent, string_file &stream, const char *format, ...)
    corresponding to the label's point of definition.  */
 
 static void
-print_label (string_file &stream, unsigned int scope, int target)
+print_label (string_file *stream, unsigned int scope, int target)
 {
-  stream.printf ("__label_%u_%s", scope, pulongest (target));
+  stream->printf ("__label_%u_%s", scope, pulongest (target));
 }
 
 /* Emit code that pushes a register's address on the stack.
@@ -508,7 +508,7 @@  print_label (string_file &stream, unsigned int scope, int target)
    register was needed by this expression.  */
 
 static void
-pushf_register_address (int indent, string_file &stream,
+pushf_register_address (int indent, string_file *stream,
 			unsigned char *registers_used,
 			struct gdbarch *gdbarch, int regnum)
 {
@@ -526,7 +526,7 @@  pushf_register_address (int indent, string_file &stream,
    register's value before it is pushed.  */
 
 static void
-pushf_register (int indent, string_file &stream,
+pushf_register (int indent, string_file *stream,
 		unsigned char *registers_used,
 		struct gdbarch *gdbarch, int regnum, uint64_t offset)
 {
@@ -572,7 +572,7 @@  pushf_register (int indent, string_file &stream,
    things.  */
 
 static void
-do_compile_dwarf_expr_to_c (int indent, string_file &stream,
+do_compile_dwarf_expr_to_c (int indent, string_file *stream,
 			    const char *type_name,
 			    const char *result_name,
 			    struct symbol *sym, CORE_ADDR pc,
@@ -596,9 +596,9 @@  do_compile_dwarf_expr_to_c (int indent, string_file &stream,
 
   ++scope;
 
-  fprintfi_filtered (indent, &stream, "__attribute__ ((unused)) %s %s;\n",
+  fprintfi_filtered (indent, stream, "__attribute__ ((unused)) %s %s;\n",
 		     type_name, result_name);
-  fprintfi_filtered (indent, &stream, "{\n");
+  fprintfi_filtered (indent, stream, "{\n");
   indent += 2;
 
   stack_depth = compute_stack_depth (byte_order, addr_size,
@@ -634,19 +634,19 @@  do_compile_dwarf_expr_to_c (int indent, string_file &stream,
 		 "compiled code."),
 	       SYMBOL_PRINT_NAME (sym));
 
-      fprintfi_filtered (indent, &stream, "%s = %s;\n",
+      fprintfi_filtered (indent, stream, "%s = %s;\n",
 			 result_name,
 			 core_addr_to_string (value_address (val)));
-      fprintfi_filtered (indent - 2, &stream, "}\n");
+      fprintfi_filtered (indent - 2, stream, "}\n");
       return;
     }
 
-  fprintfi_filtered (indent, &stream, GCC_UINTPTR " __gdb_stack[%d];\n",
+  fprintfi_filtered (indent, stream, GCC_UINTPTR " __gdb_stack[%d];\n",
 		     stack_depth);
 
   if (need_tempvar)
-    fprintfi_filtered (indent, &stream, GCC_UINTPTR " __gdb_tmp;\n");
-  fprintfi_filtered (indent, &stream, "int __gdb_tos = -1;\n");
+    fprintfi_filtered (indent, stream, GCC_UINTPTR " __gdb_tmp;\n");
+  fprintfi_filtered (indent, stream, "int __gdb_tos = -1;\n");
 
   if (initial != NULL)
     pushf (indent, stream, "%s", core_addr_to_string (*initial));
@@ -657,13 +657,13 @@  do_compile_dwarf_expr_to_c (int indent, string_file &stream,
       uint64_t uoffset, reg;
       int64_t offset;
 
-      print_spaces (indent - 2, &stream);
+      print_spaces (indent - 2, stream);
       if (info[op_ptr - base].label)
 	{
 	  print_label (stream, scope, op_ptr - base);
-	  stream.puts (":;");
+	  stream->puts (":;");
 	}
-      stream.printf ("/* %s */\n", get_DW_OP_name (op));
+      stream->printf ("/* %s */\n", get_DW_OP_name (op));
 
       /* This is handy for debugging the generated code:
       fprintf_filtered (stream, "if (__gdb_tos != %d) abort ();\n",
@@ -905,7 +905,7 @@  do_compile_dwarf_expr_to_c (int indent, string_file &stream,
 	  break;
 
 	case DW_OP_drop:
-	  fprintfi_filtered (indent, &stream, "--__gdb_tos;\n");
+	  fprintfi_filtered (indent, stream, "--__gdb_tos;\n");
 	  break;
 
 	case DW_OP_pick:
@@ -915,13 +915,13 @@  do_compile_dwarf_expr_to_c (int indent, string_file &stream,
 	  break;
 
 	case DW_OP_swap:
-	  fprintfi_filtered (indent, &stream,
+	  fprintfi_filtered (indent, stream,
 			     "__gdb_tmp = __gdb_stack[__gdb_tos - 1];\n");
-	  fprintfi_filtered (indent, &stream,
+	  fprintfi_filtered (indent, stream,
 			     "__gdb_stack[__gdb_tos - 1] = "
 			     "__gdb_stack[__gdb_tos];\n");
-	  fprintfi_filtered (indent, &stream, ("__gdb_stack[__gdb_tos] = "
-					       "__gdb_tmp;\n"));
+	  fprintfi_filtered (indent, stream, ("__gdb_stack[__gdb_tos] = "
+					      "__gdb_tmp;\n"));
 	  break;
 
 	case DW_OP_over:
@@ -929,15 +929,15 @@  do_compile_dwarf_expr_to_c (int indent, string_file &stream,
 	  break;
 
 	case DW_OP_rot:
-	  fprintfi_filtered (indent, &stream, ("__gdb_tmp = "
-					       "__gdb_stack[__gdb_tos];\n"));
-	  fprintfi_filtered (indent, &stream,
+	  fprintfi_filtered (indent, stream, ("__gdb_tmp = "
+					      "__gdb_stack[__gdb_tos];\n"));
+	  fprintfi_filtered (indent, stream,
 			     "__gdb_stack[__gdb_tos] = "
 			     "__gdb_stack[__gdb_tos - 1];\n");
-	  fprintfi_filtered (indent, &stream,
+	  fprintfi_filtered (indent, stream,
 			     "__gdb_stack[__gdb_tos - 1] = "
 			     "__gdb_stack[__gdb_tos -2];\n");
-	  fprintfi_filtered (indent, &stream, "__gdb_stack[__gdb_tos - 2] = "
+	  fprintfi_filtered (indent, stream, "__gdb_stack[__gdb_tos - 2] = "
 			     "__gdb_tmp;\n");
 	  break;
 
@@ -959,7 +959,7 @@  do_compile_dwarf_expr_to_c (int indent, string_file &stream,
 
 	    /* Cast to a pointer of the desired type, then
 	       dereference.  */
-	    fprintfi_filtered (indent, &stream,
+	    fprintfi_filtered (indent, stream,
 			       "__gdb_stack[__gdb_tos] = "
 			       "*((__gdb_int_%s *) "
 			       "__gdb_stack[__gdb_tos]);\n",
@@ -1085,19 +1085,19 @@  do_compile_dwarf_expr_to_c (int indent, string_file &stream,
 	case DW_OP_skip:
 	  offset = extract_signed_integer (op_ptr, 2, byte_order);
 	  op_ptr += 2;
-	  fprintfi_filtered (indent, &stream, "goto ");
+	  fprintfi_filtered (indent, stream, "goto ");
 	  print_label (stream, scope, op_ptr + offset - base);
-	  stream.puts (";\n");
+	  stream->puts (";\n");
 	  break;
 
 	case DW_OP_bra:
 	  offset = extract_signed_integer (op_ptr, 2, byte_order);
 	  op_ptr += 2;
-	  fprintfi_filtered (indent, &stream,
+	  fprintfi_filtered (indent, stream,
 			     "if ((( " GCC_INTPTR
 			     ") __gdb_stack[__gdb_tos--]) != 0) goto ");
 	  print_label (stream, scope, op_ptr + offset - base);
-	  stream.puts (";\n");
+	  stream->puts (";\n");
 	  break;
 
 	case DW_OP_nop:
@@ -1108,15 +1108,15 @@  do_compile_dwarf_expr_to_c (int indent, string_file &stream,
 	}
     }
 
-  fprintfi_filtered (indent, &stream, "%s = __gdb_stack[__gdb_tos];\n",
+  fprintfi_filtered (indent, stream, "%s = __gdb_stack[__gdb_tos];\n",
 		     result_name);
-  fprintfi_filtered (indent - 2, &stream, "}\n");
+  fprintfi_filtered (indent - 2, stream, "}\n");
 }
 
 /* See compile.h.  */
 
 void
-compile_dwarf_expr_to_c (string_file &stream, const char *result_name,
+compile_dwarf_expr_to_c (string_file *stream, const char *result_name,
 			 struct symbol *sym, CORE_ADDR pc,
 			 struct gdbarch *arch, unsigned char *registers_used,
 			 unsigned int addr_size,
@@ -1131,7 +1131,7 @@  compile_dwarf_expr_to_c (string_file &stream, const char *result_name,
 /* See compile.h.  */
 
 void
-compile_dwarf_bounds_to_c (string_file &stream,
+compile_dwarf_bounds_to_c (string_file *stream,
 			   const char *result_name,
 			   const struct dynamic_prop *prop,
 			   struct symbol *sym, CORE_ADDR pc,
diff --git a/gdb/compile/compile.c b/gdb/compile/compile.c
index 6d51006..f4d2091 100644
--- a/gdb/compile/compile.c
+++ b/gdb/compile/compile.c
@@ -141,7 +141,7 @@  compile_instance::compile_instance (struct gcc_base_context *gcc_fe,
 /* See compile-internal.h.  */
 
 bool
-compile_instance::get_cached_type (struct type *type, gcc_type &ret) const
+compile_instance::get_cached_type (struct type *type, gcc_type *ret) const
 {
   struct type_map_instance inst, *found;
 
@@ -149,7 +149,7 @@  compile_instance::get_cached_type (struct type *type, gcc_type &ret) const
   found = (struct type_map_instance *) htab_find (m_type_map.get (), &inst);
   if (found != NULL)
     {
-      ret = found->gcc_type_handle;
+      *ret = found->gcc_type_handle;
       return true;
     }
 
diff --git a/gdb/compile/compile.h b/gdb/compile/compile.h
index 6e03d7e..89cc00f 100644
--- a/gdb/compile/compile.h
+++ b/gdb/compile/compile.h
@@ -55,7 +55,7 @@  extern void eval_compile_command (struct command_line *cmd,
    PER_CU is the per-CU object used for looking up various other
    things.  */
 
-extern void compile_dwarf_expr_to_c (string_file &stream,
+extern void compile_dwarf_expr_to_c (string_file *stream,
 				     const char *result_name,
 				     struct symbol *sym,
 				     CORE_ADDR pc,
@@ -90,7 +90,7 @@  extern void compile_dwarf_expr_to_c (string_file &stream,
    PER_CU is the per-CU object used for looking up various other
    things.  */
 
-extern void compile_dwarf_bounds_to_c (string_file &stream,
+extern void compile_dwarf_bounds_to_c (string_file *stream,
 				       const char *result_name,
 				       const struct dynamic_prop *prop,
 				       struct symbol *sym, CORE_ADDR pc,
diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c
index 200fa03..ae5421e 100644
--- a/gdb/dwarf2loc.c
+++ b/gdb/dwarf2loc.c
@@ -2747,7 +2747,7 @@  dwarf2_evaluate_property (const struct dynamic_prop *prop,
 /* See dwarf2loc.h.  */
 
 void
-dwarf2_compile_property_to_c (string_file &stream,
+dwarf2_compile_property_to_c (string_file *stream,
 			      const char *result_name,
 			      struct gdbarch *gdbarch,
 			      unsigned char *registers_used,
@@ -4478,7 +4478,7 @@  locexpr_tracepoint_var_ref (struct symbol *symbol, struct agent_expr *ax,
 /* symbol_computed_ops 'generate_c_location' method.  */
 
 static void
-locexpr_generate_c_location (struct symbol *sym, string_file &stream,
+locexpr_generate_c_location (struct symbol *sym, string_file *stream,
 			     struct gdbarch *gdbarch,
 			     unsigned char *registers_used,
 			     CORE_ADDR pc, const char *result_name)
@@ -4688,7 +4688,7 @@  loclist_tracepoint_var_ref (struct symbol *symbol, struct agent_expr *ax,
 /* symbol_computed_ops 'generate_c_location' method.  */
 
 static void
-loclist_generate_c_location (struct symbol *sym, string_file &stream,
+loclist_generate_c_location (struct symbol *sym, string_file *stream,
 			     struct gdbarch *gdbarch,
 			     unsigned char *registers_used,
 			     CORE_ADDR pc, const char *result_name)
diff --git a/gdb/dwarf2loc.h b/gdb/dwarf2loc.h
index f82e7b2..40b7906 100644
--- a/gdb/dwarf2loc.h
+++ b/gdb/dwarf2loc.h
@@ -156,7 +156,7 @@  int dwarf2_evaluate_property (const struct dynamic_prop *prop,
    evaluated.
    SYM the originating symbol, used for error reporting.  */
 
-void dwarf2_compile_property_to_c (string_file &stream,
+void dwarf2_compile_property_to_c (string_file *stream,
 				   const char *result_name,
 				   struct gdbarch *gdbarch,
 				   unsigned char *registers_used,
diff --git a/gdb/symtab.h b/gdb/symtab.h
index e0fe17a..399666b 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -983,7 +983,7 @@  struct symbol_computed_ops
      The generated C code must assign the location to a local
      variable; this variable's name is RESULT_NAME.  */
 
-  void (*generate_c_location) (struct symbol *symbol, string_file &stream,
+  void (*generate_c_location) (struct symbol *symbol, string_file *stream,
 			       struct gdbarch *gdbarch,
 			       unsigned char *registers_used,
 			       CORE_ADDR pc, const char *result_name);