aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2013-08-07 20:03:52 +0000
committerTom Tromey <tromey@redhat.com>2013-08-07 20:03:52 +0000
commitbf6d8a91eac025c21b03d604bdb2e4b901c4c6bc (patch)
tree1917c00119029aac713cbfef834ba7ee6966ec18 /gdb
parentf9125b6c6c523dc3f0191fdb5b9551c6f5d70c61 (diff)
downloadgdb-bf6d8a91eac025c21b03d604bdb2e4b901c4c6bc.zip
gdb-bf6d8a91eac025c21b03d604bdb2e4b901c4c6bc.tar.gz
gdb-bf6d8a91eac025c21b03d604bdb2e4b901c4c6bc.tar.bz2
use language of the main symbol
With "dwz -m", "main" appears in both the PU and the importing CU when running anon-struct.exp. However, the PU does not have a file name. So, find_main_filename returns the empty string, making deduce_language_from_filename return language_unknown. This patch fixes this problem by changing gdb to use the ordinary symbol-lookup functions to find "main"'s symbol. Then, it examines the symbol's language. I think this is cleaner than the current approach. For one thing it avoids trying to guess the language based on the source file name, instead deferring to the presumably more reliable debuginfo. Another possible fix would have been to change how the file name is found via the "qf" methods. However, I think the approach given is preferable for the reason outlined above. This required a minor test suite change, as now a symtab is expanded during the search for "main". Built and regtested (both ways) on x86-64 Fedora 18. * symfile.c (set_initial_language): Look up "main" symbol and use its language. * symtab.c (find_main_filename): Remove. * symtab.h (find_main_filename): Remove. * gdb.base/maint.exp: Allow zero symtabs to be expanded.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/symfile.c8
-rw-r--r--gdb/symtab.c23
-rw-r--r--gdb/symtab.h2
-rw-r--r--gdb/testsuite/ChangeLog4
-rw-r--r--gdb/testsuite/gdb.base/maint.exp7
6 files changed, 19 insertions, 32 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 1097608..42e60aa 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@
2013-08-07 Tom Tromey <tromey@redhat.com>
+ * symfile.c (set_initial_language): Look up "main" symbol
+ and use its language.
+ * symtab.c (find_main_filename): Remove.
+ * symtab.h (find_main_filename): Remove.
+
+2013-08-07 Tom Tromey <tromey@redhat.com>
+
* dwarf2read.c (recursively_compute_inclusions): Add
"immediate_parent" argument. Set symtab's "user" field
if not set.
diff --git a/gdb/symfile.c b/gdb/symfile.c
index 3328648..3dd5509 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -1612,11 +1612,11 @@ set_initial_language (void)
lang = language_of_main;
else
{
- const char *filename;
+ char *name = main_name ();
+ struct symbol *sym = lookup_symbol (name, NULL, VAR_DOMAIN, NULL);
- filename = find_main_filename ();
- if (filename != NULL)
- lang = deduce_language_from_filename (filename);
+ if (sym != NULL)
+ lang = SYMBOL_LANGUAGE (sym);
}
if (lang == language_unknown)
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 8076fe5..3bcec23 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -1949,29 +1949,6 @@ basic_lookup_transparent_type (const char *name)
return (struct type *) 0;
}
-/* Find the name of the file containing main(). */
-/* FIXME: What about languages without main() or specially linked
- executables that have no main() ? */
-
-const char *
-find_main_filename (void)
-{
- struct objfile *objfile;
- char *name = main_name ();
-
- ALL_OBJFILES (objfile)
- {
- const char *result;
-
- if (!objfile->sf)
- continue;
- result = objfile->sf->qf->find_symbol_file (objfile, name);
- if (result)
- return result;
- }
- return (NULL);
-}
-
/* Search BLOCK for symbol NAME in DOMAIN.
Note that if NAME is the demangled form of a C++ symbol, we will fail
diff --git a/gdb/symtab.h b/gdb/symtab.h
index 6d81507..ccf4a4f 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -1252,8 +1252,6 @@ extern VEC (char_ptr) *make_source_files_completion_list (const char *,
int matching_obj_sections (struct obj_section *, struct obj_section *);
-extern const char *find_main_filename (void);
-
extern struct symtab *find_line_symtab (struct symtab *, int, int *, int *);
extern struct symtab_and_line find_function_start_sal (struct symbol *sym,
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 160a27a..fb21761 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,9 @@
2013-08-07 Tom Tromey <tromey@redhat.com>
+ * gdb.base/maint.exp: Allow zero symtabs to be expanded.
+
+2013-08-07 Tom Tromey <tromey@redhat.com>
+
* gdb.dwarf2/dwz.exp: New file.
2013-08-02 Tom Tromey <tromey@redhat.com>
diff --git a/gdb/testsuite/gdb.base/maint.exp b/gdb/testsuite/gdb.base/maint.exp
index 7057ac7..3093aae 100644
--- a/gdb/testsuite/gdb.base/maint.exp
+++ b/gdb/testsuite/gdb.base/maint.exp
@@ -72,9 +72,10 @@ gdb_test "maint print registers" "Name.*Nr.*Rel.*Offset.*Size.*Type.*"
gdb_test_no_output "mt set per on" "mt set per on for expand-symtabs"
gdb_test_multiple "mt expand-symtabs $subdir/break\[.\]c$" \
"mt expand-symtabs" {
- -re "#primary symtabs: (1|2) \\(\[+\](1|2)\\),.*$gdb_prompt $" {
- # This should expand one or at most two primary symtabs.
- # "Normally" it will expand just the one for break.c, but if the
+ -re "#primary symtabs: (1|2) \\(\[+\](0|1|2)\\),.*$gdb_prompt $" {
+ # This should expand at most two primary symtabs.
+ # "Normally" it will not expand any, because the symtab
+ # holding "main" will already have been expanded, but if the
# file is compiled with -fdebug-types-section then a second primary
# symtab for break.c will be created for any types.
pass "mt expand-symtabs"