diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 09a2ad2ca3..ac1031ca58 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -1282,6 +1282,7 @@ HFILES_NO_SRCDIR = \
 	interps.h \
 	jit.h \
 	language.h \
+	legacy-buildsym.h \
 	linespec.h \
 	linux-fork.h \
 	linux-nat.h \
diff --git a/gdb/buildsym.c b/gdb/buildsym.c
index 2f4b0c79ef..3e3170f0ee 100644
--- a/gdb/buildsym.c
+++ b/gdb/buildsym.c
@@ -16,53 +16,8 @@
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
-/* This module provides subroutines used for creating and adding to
-   the symbol table.  These routines are called from various symbol-
-   file-reading routines.
-
-   Routines to support specific debugging information formats (stabs,
-   DWARF, etc) belong somewhere else.
-
-   The basic way this module is used is as follows:
-
-   scoped_free_pendings free_pending;
-   cust = start_symtab (...);
-   ... read debug info ...
-   cust = end_symtab (...);
-
-   The compunit symtab pointer ("cust") is returned from both start_symtab
-   and end_symtab to simplify the debug info readers.
-
-   There are minor variations on this, e.g., dwarf2read.c splits end_symtab
-   into two calls: end_symtab_get_static_block, end_symtab_from_static_block,
-   but all debug info readers follow this basic flow.
-
-   Reading DWARF Type Units is another variation:
-
-   scoped_free_pendings free_pending;
-   cust = start_symtab (...);
-   ... read debug info ...
-   cust = end_expandable_symtab (...);
-
-   And then reading subsequent Type Units within the containing "Comp Unit"
-   will use a second flow:
-
-   scoped_free_pendings free_pending;
-   cust = restart_symtab (...);
-   ... read debug info ...
-   cust = augment_type_symtab (...);
-
-   dbxread.c and xcoffread.c use another variation:
-
-   scoped_free_pendings free_pending;
-   cust = start_symtab (...);
-   ... read debug info ...
-   cust = end_symtab (...);
-   ... start_symtab + read + end_symtab repeated ...
-*/
-
 #include "defs.h"
-#include "buildsym.h"
+#include "legacy-buildsym.h"
 #include "bfd.h"
 #include "gdb_obstack.h"
 #include "symtab.h"
diff --git a/gdb/buildsym.h b/gdb/buildsym.h
index a089623fa2..05b80f5cb7 100644
--- a/gdb/buildsym.h
+++ b/gdb/buildsym.h
@@ -411,146 +411,4 @@ extern void add_symbol_to_list (struct symbol *symbol,
 extern struct symbol *find_symbol_in_list (struct pending *list,
 					   char *name, int length);
 
-extern struct block *finish_block (struct symbol *symbol,
-				   struct pending_block *old_blocks,
-				   const struct dynamic_prop *static_link,
-				   CORE_ADDR start,
-				   CORE_ADDR end);
-
-extern void record_block_range (struct block *,
-                                CORE_ADDR start, CORE_ADDR end_inclusive);
-
-class scoped_free_pendings
-{
-public:
-
-  scoped_free_pendings ();
-  ~scoped_free_pendings ();
-
-  DISABLE_COPY_AND_ASSIGN (scoped_free_pendings);
-};
-
-extern void start_subfile (const char *name);
-
-extern void patch_subfile_names (struct subfile *subfile, const char *name);
-
-extern void push_subfile ();
-
-extern const char *pop_subfile ();
-
-extern struct block *end_symtab_get_static_block (CORE_ADDR end_addr,
-						  int expandable,
-						  int required);
-
-extern struct compunit_symtab *
-  end_symtab_from_static_block (struct block *static_block,
-				int section, int expandable);
-
-extern struct compunit_symtab *end_symtab (CORE_ADDR end_addr, int section);
-
-extern struct compunit_symtab *end_expandable_symtab (CORE_ADDR end_addr,
-						      int section);
-
-extern void augment_type_symtab (void);
-
-extern struct context_stack *push_context (int desc, CORE_ADDR valu);
-
-extern struct context_stack *pop_context (void);
-
-extern record_line_ftype record_line;
-
-extern struct compunit_symtab *start_symtab (struct objfile *objfile,
-					     const char *name,
-					     const char *comp_dir,
-					     CORE_ADDR start_addr,
-					     enum language language);
-
-extern void restart_symtab (struct compunit_symtab *cust,
-			    const char *name, CORE_ADDR start_addr);
-
-/* Record the name of the debug format in the current pending symbol
-   table.  FORMAT must be a string with a lifetime at least as long as
-   the symtab's objfile.  */
-
-extern void record_debugformat (const char *format);
-
-/* Record the name of the debuginfo producer (usually the compiler) in
-   the current pending symbol table.  PRODUCER must be a string with a
-   lifetime at least as long as the symtab's objfile.  */
-
-extern void record_producer (const char *producer);
-
-/* Set the name of the last source file.  NAME is copied by this
-   function.  */
-
-extern void set_last_source_file (const char *name);
-
-/* Fetch the name of the last source file.  */
-
-extern const char *get_last_source_file (void);
-
-/* Return the compunit symtab object.
-   It is only valid to call this between calls to start_symtab and the
-   end_symtab* functions.  */
-
-extern struct compunit_symtab *buildsym_compunit_symtab (void);
-
-/* Return the macro table.
-   Initialize it if this is the first use.
-   It is only valid to call this between calls to start_symtab and the
-   end_symtab* functions.  */
-
-extern struct macro_table *get_macro_table (void);
-
-/* Set the last source start address.  Can only be used between
-   start_symtab and end_symtab* calls.  */
-
-extern void set_last_source_start_addr (CORE_ADDR addr);
-
-/* Get the last source start address.  Can only be used between
-   start_symtab and end_symtab* calls.  */
-
-extern CORE_ADDR get_last_source_start_addr ();
-
-/* Return the local using directives.  */
-
-extern struct using_direct **get_local_using_directives ();
-
-/* Set the list of local using directives.  */
-
-extern void set_local_using_directives (struct using_direct *new_local);
-
-/* Return the global using directives.  */
-
-extern struct using_direct **get_global_using_directives ();
-
-/* Non-zero if the context stack is empty.  */
-
-extern bool outermost_context_p ();
-
-/* Return the top of the context stack, or nullptr if there is
-   entry.  */
-
-extern struct context_stack *get_current_context_stack ();
-
-/* Return the context stack depth.  */
-
-extern int get_context_stack_depth ();
-
-/* Return the current subfile.  */
-
-extern struct subfile *get_current_subfile ();
-
-/* Return the local symbol list.  */
-
-extern struct pending **get_local_symbols ();
-
-/* Return the file symbol list.  */
-
-extern struct pending **get_file_symbols ();
-
-/* Return the global symbol list.  */
-
-extern struct pending **get_global_symbols ();
-
 #endif /* defined (BUILDSYM_H) */
diff --git a/gdb/coffread.c b/gdb/coffread.c
index 3bb6639914..f44b2180f7 100644
--- a/gdb/coffread.c
+++ b/gdb/coffread.c
@@ -30,7 +30,7 @@
 #include "coff/internal.h"	/* Internal format of COFF symbols in BFD */
 #include "libcoff.h"		/* FIXME secret internal data from BFD */
 #include "objfiles.h"
-#include "buildsym.h"
+#include "legacy-buildsym.h"
 #include "gdb-stabs.h"
 #include "stabsread.h"
 #include "complaints.h"
diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c
index 22b7af00d6..41affca3a8 100644
--- a/gdb/cp-namespace.c
+++ b/gdb/cp-namespace.c
@@ -29,7 +29,7 @@
 #include "dictionary.h"
 #include "command.h"
 #include "frame.h"
-#include "buildsym.h"
+#include "legacy-buildsym.h"
 #include "language.h"
 #include "namespace.h"
 #include <string>
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index d660157a61..52d19310cb 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -45,7 +45,7 @@
 #include "libaout.h"		/* FIXME Secret internal BFD stuff for a.out */
 #include "filenames.h"
 #include "objfiles.h"
-#include "buildsym.h"
+#include "legacy-buildsym.h"
 #include "stabsread.h"
 #include "gdb-stabs.h"
 #include "demangle.h"
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 9753a5b57d..75a121073c 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -37,7 +37,7 @@
 #include "gdbtypes.h"
 #include "objfiles.h"
 #include "dwarf2.h"
-#include "buildsym.h"
+#include "legacy-buildsym.h"
 #include "demangle.h"
 #include "gdb-demangle.h"
 #include "expression.h"
diff --git a/gdb/go32-nat.c b/gdb/go32-nat.c
index 980180b23a..9796d15f0e 100644
--- a/gdb/go32-nat.c
+++ b/gdb/go32-nat.c
@@ -94,7 +94,7 @@
 #include "command.h"
 #include "gdbcmd.h"
 #include "floatformat.h"
-#include "buildsym.h"
+#include "legacy-buildsym.h"
 #include "i387-tdep.h"
 #include "i386-tdep.h"
 #include "nat/x86-cpuid.h"
diff --git a/gdb/legacy-buildsym.h b/gdb/legacy-buildsym.h
new file mode 100644
index 0000000000..66a3ea8cd0
--- /dev/null
+++ b/gdb/legacy-buildsym.h
@@ -0,0 +1,210 @@
+/* Build symbol tables in GDB's internal format - legacy APIs
+   Copyright (C) 1986-2018 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#if !defined (LEGACY_BUILDSYM_H)
+#define LEGACY_BUILDSYM_H 1
+
+#include "buildsym.h"
+
+/* This module provides definitions used for creating and adding to
+   the symbol table.  These routines are called from various symbol-
+   file-reading routines.  This file holds the legacy API, which
+   relies on a global variable to work properly.  New or maintained
+   symbol readers should use the builder API in buildsym.h.
+
+   The basic way this module is used is as follows:
+
+   scoped_free_pendings free_pending;
+   cust = start_symtab (...);
+   ... read debug info ...
+   cust = end_symtab (...);
+
+   The compunit symtab pointer ("cust") is returned from both start_symtab
+   and end_symtab to simplify the debug info readers.
+
+   There are minor variations on this, e.g., dwarf2read.c splits end_symtab
+   into two calls: end_symtab_get_static_block, end_symtab_from_static_block,
+   but all debug info readers follow this basic flow.
+
+   Reading DWARF Type Units is another variation:
+
+   scoped_free_pendings free_pending;
+   cust = start_symtab (...);
+   ... read debug info ...
+   cust = end_expandable_symtab (...);
+
+   And then reading subsequent Type Units within the containing "Comp Unit"
+   will use a second flow:
+
+   scoped_free_pendings free_pending;
+   cust = restart_symtab (...);
+   ... read debug info ...
+   cust = augment_type_symtab (...);
+
+   dbxread.c and xcoffread.c use another variation:
+
+   scoped_free_pendings free_pending;
+   cust = start_symtab (...);
+   ... read debug info ...
+   cust = end_symtab (...);
+   ... start_symtab + read + end_symtab repeated ...
+*/
+
+class scoped_free_pendings
+{
+public:
+
+  scoped_free_pendings ();
+  ~scoped_free_pendings ();
+
+  DISABLE_COPY_AND_ASSIGN (scoped_free_pendings);
+};
+
+extern struct block *finish_block (struct symbol *symbol,
+				   struct pending_block *old_blocks,
+				   const struct dynamic_prop *static_link,
+				   CORE_ADDR start,
+				   CORE_ADDR end);
+
+extern void record_block_range (struct block *,
+                                CORE_ADDR start, CORE_ADDR end_inclusive);
+
+extern void start_subfile (const char *name);
+
+extern void patch_subfile_names (struct subfile *subfile, const char *name);
+
+extern void push_subfile ();
+
+extern const char *pop_subfile ();
+
+extern struct block *end_symtab_get_static_block (CORE_ADDR end_addr,
+						  int expandable,
+						  int required);
+
+extern struct compunit_symtab *
+  end_symtab_from_static_block (struct block *static_block,
+				int section, int expandable);
+
+extern struct compunit_symtab *end_symtab (CORE_ADDR end_addr, int section);
+
+extern struct compunit_symtab *end_expandable_symtab (CORE_ADDR end_addr,
+						      int section);
+
+extern void augment_type_symtab (void);
+
+extern struct context_stack *push_context (int desc, CORE_ADDR valu);
+
+extern struct context_stack *pop_context (void);
+
+extern record_line_ftype record_line;
+
+extern struct compunit_symtab *start_symtab (struct objfile *objfile,
+					     const char *name,
+					     const char *comp_dir,
+					     CORE_ADDR start_addr,
+					     enum language language);
+
+extern void restart_symtab (struct compunit_symtab *cust,
+			    const char *name, CORE_ADDR start_addr);
+
+/* Record the name of the debug format in the current pending symbol
+   table.  FORMAT must be a string with a lifetime at least as long as
+   the symtab's objfile.  */
+
+extern void record_debugformat (const char *format);
+
+/* Record the name of the debuginfo producer (usually the compiler) in
+   the current pending symbol table.  PRODUCER must be a string with a
+   lifetime at least as long as the symtab's objfile.  */
+
+extern void record_producer (const char *producer);
+
+/* Set the name of the last source file.  NAME is copied by this
+   function.  */
+
+extern void set_last_source_file (const char *name);
+
+/* Fetch the name of the last source file.  */
+
+extern const char *get_last_source_file (void);
+
+/* Return the compunit symtab object.
+   It is only valid to call this between calls to start_symtab and the
+   end_symtab* functions.  */
+
+extern struct compunit_symtab *buildsym_compunit_symtab (void);
+
+/* Return the macro table.
+   Initialize it if this is the first use.
+   It is only valid to call this between calls to start_symtab and the
+   end_symtab* functions.  */
+
+extern struct macro_table *get_macro_table (void);
+
+/* Set the last source start address.  Can only be used between
+   start_symtab and end_symtab* calls.  */
+
+extern void set_last_source_start_addr (CORE_ADDR addr);
+
+/* Get the last source start address.  Can only be used between
+   start_symtab and end_symtab* calls.  */
+
+extern CORE_ADDR get_last_source_start_addr ();
+
+/* Return the local using directives.  */
+
+extern struct using_direct **get_local_using_directives ();
+
+/* Set the list of local using directives.  */
+
+extern void set_local_using_directives (struct using_direct *new_local);
+
+/* Return the global using directives.  */
+
+extern struct using_direct **get_global_using_directives ();
+
+/* Non-zero if the context stack is empty.  */
+
+extern bool outermost_context_p ();
+
+/* Return the top of the context stack, or nullptr if there is
+   entry.  */
+
+extern struct context_stack *get_current_context_stack ();
+
+/* Return the context stack depth.  */
+
+extern int get_context_stack_depth ();
+
+/* Return the current subfile.  */
+
+extern struct subfile *get_current_subfile ();
+
+/* Return the local symbol list.  */
+
+extern struct pending **get_local_symbols ();
+
+/* Return the file symbol list.  */
+
+extern struct pending **get_file_symbols ();
+
+/* Return the global symbol list.  */
+
+extern struct pending **get_global_symbols ();
+
+#endif /* defined (LEGACY_BUILDSYM_H) */
diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c
index 466e36599b..bebefcb724 100644
--- a/gdb/mdebugread.c
+++ b/gdb/mdebugread.c
@@ -46,7 +46,7 @@
 #include "filenames.h"
 #include "objfiles.h"
 #include "gdb_obstack.h"
-#include "buildsym.h"
+#include "legacy-buildsym.h"
 #include "stabsread.h"
 #include "complaints.h"
 #include "demangle.h"
diff --git a/gdb/stabsread.c b/gdb/stabsread.c
index ebb844d2c5..62221d03cf 100644
--- a/gdb/stabsread.c
+++ b/gdb/stabsread.c
@@ -36,7 +36,7 @@
 #include "libaout.h"
 #include "aout/aout64.h"
 #include "gdb-stabs.h"
-#include "buildsym.h"
+#include "legacy-buildsym.h"
 #include "complaints.h"
 #include "demangle.h"
 #include "gdb-demangle.h"
diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
index 16ebd17607..f706b1db39 100644
--- a/gdb/windows-nat.c
+++ b/gdb/windows-nat.c
@@ -44,7 +44,7 @@
 #endif
 #include <algorithm>
 
-#include "buildsym.h"
+#include "legacy-buildsym.h"
 #include "filenames.h"
 #include "symfile.h"
 #include "objfiles.h"
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index 6b561a82b3..92d6934af7 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -41,7 +41,7 @@
 /* FIXME: ezannoni/2004-02-13 Verify if the include below is really needed.  */
 #include "symfile.h"
 #include "objfiles.h"
-#include "buildsym.h"
+#include "legacy-buildsym.h"
 #include "stabsread.h"
 #include "expression.h"
 #include "complaints.h"
