Remove dwarf2_cu::language

dwarf2_cu has a 'language' value, but dwarf2_per_cu_data also holds a
value of this same type.  There doesn't seem to be any reason to keep
two copies of this value.  This patch removes the field from
dwarf2_cu, and arranges to set the value in the per-CU object instead.

Note that the value must still be set when expanding the full CU.
This is needed because the CUs will not be scanned when a DWARF index
is in use.

gdb/ChangeLog
2021-06-25  Tom Tromey  <tom@tromey.com>

	* dwarf2/read.c (process_psymtab_comp_unit): Don't set 'lang'.
	(scan_partial_symbols, partial_die_parent_scope)
	(add_partial_symbol, add_partial_subprogram)
	(compute_delayed_physnames, rust_union_quirks)
	(process_full_comp_unit, process_full_type_unit)
	(process_imported_unit_die, process_die, dw2_linkage_name)
	(dwarf2_compute_name, dwarf2_physname, read_import_statement)
	(read_file_scope, queue_and_load_dwo_tu, read_func_scope)
	(read_variable, dwarf2_get_subprogram_pc_bounds)
	(dwarf2_attach_fields_to_type, dwarf2_add_member_fn)
	(dwarf2_attach_fn_fields_to_type)
	(quirk_ada_thick_pointer_struct, read_structure_type)
	(handle_struct_member_die, process_structure_scope)
	(read_array_type, read_array_order, prototyped_function_p)
	(read_subroutine_type, dwarf2_init_complex_target_type)
	(read_base_type, read_subrange_type, read_unspecified_type)
	(load_partial_dies, partial_die_info::fixup, set_cu_language)
	(new_symbol, need_gnat_info, determine_prefix, typename_concat)
	(dwarf2_canonicalize_name, follow_die_offset)
	(prepare_one_comp_unit): Update.
	* dwarf2/cu.c (dwarf2_cu::start_symtab): Update.
This commit is contained in:
Tom Tromey
2021-06-25 12:23:04 -06:00
parent bf1dcdb391
commit 3e9f1ca148
4 changed files with 176 additions and 148 deletions

@ -1,3 +1,27 @@
2021-06-25 Tom Tromey <tom@tromey.com>
* dwarf2/read.c (process_psymtab_comp_unit): Don't set 'lang'.
(scan_partial_symbols, partial_die_parent_scope)
(add_partial_symbol, add_partial_subprogram)
(compute_delayed_physnames, rust_union_quirks)
(process_full_comp_unit, process_full_type_unit)
(process_imported_unit_die, process_die, dw2_linkage_name)
(dwarf2_compute_name, dwarf2_physname, read_import_statement)
(read_file_scope, queue_and_load_dwo_tu, read_func_scope)
(read_variable, dwarf2_get_subprogram_pc_bounds)
(dwarf2_attach_fields_to_type, dwarf2_add_member_fn)
(dwarf2_attach_fn_fields_to_type)
(quirk_ada_thick_pointer_struct, read_structure_type)
(handle_struct_member_die, process_structure_scope)
(read_array_type, read_array_order, prototyped_function_p)
(read_subroutine_type, dwarf2_init_complex_target_type)
(read_base_type, read_subrange_type, read_unspecified_type)
(load_partial_dies, partial_die_info::fixup, set_cu_language)
(new_symbol, need_gnat_info, determine_prefix, typename_concat)
(dwarf2_canonicalize_name, follow_die_offset)
(prepare_one_comp_unit): Update.
* dwarf2/cu.c (dwarf2_cu::start_symtab): Update.
2021-06-25 Tom Tromey <tom@tromey.com> 2021-06-25 Tom Tromey <tom@tromey.com>
* dwarf2/read.c (read_file_scope): Don't call set_cu_language. * dwarf2/read.c (read_file_scope): Don't call set_cu_language.

@ -60,7 +60,7 @@ dwarf2_cu::start_symtab (const char *name, const char *comp_dir,
m_builder.reset (new struct buildsym_compunit m_builder.reset (new struct buildsym_compunit
(this->per_objfile->objfile, (this->per_objfile->objfile,
name, comp_dir, language, low_pc)); name, comp_dir, per_cu->lang, low_pc));
list_in_scope = get_builder ()->get_file_symbols (); list_in_scope = get_builder ()->get_file_symbols ();

@ -103,7 +103,6 @@ struct dwarf2_cu
gdb::optional<CORE_ADDR> base_address; gdb::optional<CORE_ADDR> base_address;
/* The language we are debugging. */ /* The language we are debugging. */
enum language language = language_unknown;
const struct language_defn *language_defn = nullptr; const struct language_defn *language_defn = nullptr;
const char *producer = nullptr; const char *producer = nullptr;

@ -7044,8 +7044,6 @@ process_psymtab_comp_unit (dwarf2_per_cu_data *this_cu,
reader.comp_unit_die, reader.comp_unit_die,
pretend_language); pretend_language);
this_cu->lang = reader.cu->language;
/* Age out any secondary CUs. */ /* Age out any secondary CUs. */
per_objfile->age_comp_units (); per_objfile->age_comp_units ();
} }
@ -7561,7 +7559,7 @@ scan_partial_symbols (struct partial_die_info *first_die, CORE_ADDR *lowpc,
case DW_TAG_subprogram: case DW_TAG_subprogram:
case DW_TAG_inlined_subroutine: case DW_TAG_inlined_subroutine:
add_partial_subprogram (pdi, lowpc, highpc, set_addrmap, cu); add_partial_subprogram (pdi, lowpc, highpc, set_addrmap, cu);
if (cu->language == language_cplus) if (cu->per_cu->lang == language_cplus)
scan_partial_symbols (pdi->die_child, lowpc, highpc, scan_partial_symbols (pdi->die_child, lowpc, highpc,
set_addrmap, cu); set_addrmap, cu);
break; break;
@ -7582,8 +7580,9 @@ scan_partial_symbols (struct partial_die_info *first_die, CORE_ADDR *lowpc,
{ {
add_partial_symbol (pdi, cu); add_partial_symbol (pdi, cu);
} }
if ((cu->language == language_rust if ((cu->per_cu->lang == language_rust
|| cu->language == language_cplus) && pdi->has_children) || cu->per_cu->lang == language_cplus)
&& pdi->has_children)
scan_partial_symbols (pdi->die_child, lowpc, highpc, scan_partial_symbols (pdi->die_child, lowpc, highpc,
set_addrmap, cu); set_addrmap, cu);
break; break;
@ -7622,7 +7621,7 @@ scan_partial_symbols (struct partial_die_info *first_die, CORE_ADDR *lowpc,
/* Go read the partial unit, if needed. */ /* Go read the partial unit, if needed. */
if (per_cu->v.psymtab == NULL) if (per_cu->v.psymtab == NULL)
process_psymtab_comp_unit (per_cu, cu->per_objfile, true, process_psymtab_comp_unit (per_cu, cu->per_objfile, true,
cu->language); cu->per_cu->lang);
cu->per_cu->imported_symtabs_push (per_cu); cu->per_cu->imported_symtabs_push (per_cu);
} }
@ -7697,7 +7696,7 @@ partial_die_parent_scope (struct partial_die_info *pdi,
/* GCC 4.0 and 4.1 had a bug (PR c++/28460) where they generated bogus /* GCC 4.0 and 4.1 had a bug (PR c++/28460) where they generated bogus
DW_TAG_namespace DIEs with a name of "::" for the global namespace. DW_TAG_namespace DIEs with a name of "::" for the global namespace.
Work around this problem here. */ Work around this problem here. */
if (cu->language == language_cplus if (cu->per_cu->lang == language_cplus
&& parent->tag == DW_TAG_namespace && parent->tag == DW_TAG_namespace
&& strcmp (parent->name (cu), "::") == 0 && strcmp (parent->name (cu), "::") == 0
&& grandparent_scope == NULL) && grandparent_scope == NULL)
@ -7718,7 +7717,7 @@ partial_die_parent_scope (struct partial_die_info *pdi,
|| parent->tag == DW_TAG_interface_type || parent->tag == DW_TAG_interface_type
|| parent->tag == DW_TAG_union_type || parent->tag == DW_TAG_union_type
|| parent->tag == DW_TAG_enumeration_type || parent->tag == DW_TAG_enumeration_type
|| (cu->language == language_fortran || (cu->per_cu->lang == language_fortran
&& parent->tag == DW_TAG_subprogram && parent->tag == DW_TAG_subprogram
&& pdi->tag == DW_TAG_subprogram)) && pdi->tag == DW_TAG_subprogram))
{ {
@ -7808,7 +7807,8 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
partial_symbol psymbol; partial_symbol psymbol;
memset (&psymbol, 0, sizeof (psymbol)); memset (&psymbol, 0, sizeof (psymbol));
psymbol.ginfo.set_language (cu->language, &objfile->objfile_obstack); psymbol.ginfo.set_language (cu->per_cu->lang,
&objfile->objfile_obstack);
psymbol.ginfo.set_section_index (-1); psymbol.ginfo.set_section_index (-1);
/* The code below indicates that the psymbol should be installed by /* The code below indicates that the psymbol should be installed by
@ -7822,8 +7822,8 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
addr = (gdbarch_adjust_dwarf2_addr (gdbarch, pdi->lowpc + baseaddr) addr = (gdbarch_adjust_dwarf2_addr (gdbarch, pdi->lowpc + baseaddr)
- baseaddr); - baseaddr);
if (pdi->is_external if (pdi->is_external
|| cu->language == language_ada || cu->per_cu->lang == language_ada
|| (cu->language == language_fortran || (cu->per_cu->lang == language_fortran
&& pdi->die_parent != NULL && pdi->die_parent != NULL
&& pdi->die_parent->tag == DW_TAG_subprogram)) && pdi->die_parent->tag == DW_TAG_subprogram))
{ {
@ -7842,7 +7842,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
psymbol.ginfo.value.address = addr; psymbol.ginfo.value.address = addr;
if (pdi->main_subprogram && actual_name != NULL) if (pdi->main_subprogram && actual_name != NULL)
set_objfile_main_name (objfile, actual_name, cu->language); set_objfile_main_name (objfile, actual_name, cu->per_cu->lang);
break; break;
case DW_TAG_constant: case DW_TAG_constant:
psymbol.domain = VAR_DOMAIN; psymbol.domain = VAR_DOMAIN;
@ -7947,14 +7947,14 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
static vs. global. */ static vs. global. */
psymbol.domain = STRUCT_DOMAIN; psymbol.domain = STRUCT_DOMAIN;
psymbol.aclass = LOC_TYPEDEF; psymbol.aclass = LOC_TYPEDEF;
where = (cu->language == language_cplus where = (cu->per_cu->lang == language_cplus
? psymbol_placement::GLOBAL ? psymbol_placement::GLOBAL
: psymbol_placement::STATIC); : psymbol_placement::STATIC);
break; break;
case DW_TAG_enumerator: case DW_TAG_enumerator:
psymbol.domain = VAR_DOMAIN; psymbol.domain = VAR_DOMAIN;
psymbol.aclass = LOC_CONST; psymbol.aclass = LOC_CONST;
where = (cu->language == language_cplus where = (cu->per_cu->lang == language_cplus
? psymbol_placement::GLOBAL ? psymbol_placement::GLOBAL
: psymbol_placement::STATIC); : psymbol_placement::STATIC);
break; break;
@ -7966,7 +7966,8 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
{ {
if (built_actual_name != nullptr) if (built_actual_name != nullptr)
actual_name = objfile->intern (actual_name); actual_name = objfile->intern (actual_name);
if (pdi->linkage_name == nullptr || cu->language == language_ada) if (pdi->linkage_name == nullptr
|| cu->per_cu->lang == language_ada)
psymbol.ginfo.set_linkage_name (actual_name); psymbol.ginfo.set_linkage_name (actual_name);
else else
{ {
@ -8078,7 +8079,8 @@ add_partial_subprogram (struct partial_die_info *pdi,
if (! pdi->has_children) if (! pdi->has_children)
return; return;
if (cu->language == language_ada || cu->language == language_fortran) if (cu->per_cu->lang == language_ada
|| cu->per_cu->lang == language_fortran)
{ {
pdi = pdi->die_child; pdi = pdi->die_child;
while (pdi != NULL) while (pdi != NULL)
@ -8686,7 +8688,7 @@ compute_delayed_physnames (struct dwarf2_cu *cu)
/* Only C++ delays computing physnames. */ /* Only C++ delays computing physnames. */
if (cu->method_list.empty ()) if (cu->method_list.empty ())
return; return;
gdb_assert (cu->language == language_cplus); gdb_assert (cu->per_cu->lang == language_cplus);
for (const delayed_method_info &mi : cu->method_list) for (const delayed_method_info &mi : cu->method_list)
{ {
@ -9115,7 +9117,7 @@ quirk_rust_enum (struct type *type, struct objfile *objfile)
static void static void
rust_union_quirks (struct dwarf2_cu *cu) rust_union_quirks (struct dwarf2_cu *cu)
{ {
gdb_assert (cu->language == language_rust); gdb_assert (cu->per_cu->lang == language_rust);
for (type *type_ : cu->rust_unions) for (type *type_ : cu->rust_unions)
quirk_rust_enum (type_, cu->per_objfile->objfile); quirk_rust_enum (type_, cu->per_objfile->objfile);
/* We don't need this any more. */ /* We don't need this any more. */
@ -9288,9 +9290,6 @@ process_full_comp_unit (dwarf2_cu *cu, enum language pretend_language)
/* Clear the list here in case something was left over. */ /* Clear the list here in case something was left over. */
cu->method_list.clear (); cu->method_list.clear ();
cu->language = pretend_language;
cu->language_defn = language_def (cu->language);
dwarf2_find_base_address (cu->dies, cu); dwarf2_find_base_address (cu->dies, cu);
/* Before we start reading the top-level DIE, ensure it has a valid tag /* Before we start reading the top-level DIE, ensure it has a valid tag
@ -9312,7 +9311,7 @@ process_full_comp_unit (dwarf2_cu *cu, enum language pretend_language)
process_die (cu->dies, cu); process_die (cu->dies, cu);
/* For now fudge the Go package. */ /* For now fudge the Go package. */
if (cu->language == language_go) if (cu->per_cu->lang == language_go)
fixup_go_packaging (cu); fixup_go_packaging (cu);
/* Now that we have processed all the DIEs in the CU, all the types /* Now that we have processed all the DIEs in the CU, all the types
@ -9320,7 +9319,7 @@ process_full_comp_unit (dwarf2_cu *cu, enum language pretend_language)
physnames. */ physnames. */
compute_delayed_physnames (cu); compute_delayed_physnames (cu);
if (cu->language == language_rust) if (cu->per_cu->lang == language_rust)
rust_union_quirks (cu); rust_union_quirks (cu);
/* Some compilers don't define a DW_AT_high_pc attribute for the /* Some compilers don't define a DW_AT_high_pc attribute for the
@ -9349,9 +9348,9 @@ process_full_comp_unit (dwarf2_cu *cu, enum language pretend_language)
/* Set symtab language to language from DW_AT_language. If the /* Set symtab language to language from DW_AT_language. If the
compilation is from a C file generated by language preprocessors, do compilation is from a C file generated by language preprocessors, do
not set the language if it was already deduced by start_subfile. */ not set the language if it was already deduced by start_subfile. */
if (!(cu->language == language_c if (!(cu->per_cu->lang == language_c
&& COMPUNIT_FILETABS (cust)->language != language_unknown)) && COMPUNIT_FILETABS (cust)->language != language_unknown))
COMPUNIT_FILETABS (cust)->language = cu->language; COMPUNIT_FILETABS (cust)->language = cu->per_cu->lang;
/* GCC-4.0 has started to support -fvar-tracking. GCC-3.x still can /* GCC-4.0 has started to support -fvar-tracking. GCC-3.x still can
produce DW_AT_location with location lists but it can be possibly produce DW_AT_location with location lists but it can be possibly
@ -9401,14 +9400,11 @@ process_full_type_unit (dwarf2_cu *cu,
/* Clear the list here in case something was left over. */ /* Clear the list here in case something was left over. */
cu->method_list.clear (); cu->method_list.clear ();
cu->language = pretend_language;
cu->language_defn = language_def (cu->language);
/* The symbol tables are set up in read_type_unit_scope. */ /* The symbol tables are set up in read_type_unit_scope. */
process_die (cu->dies, cu); process_die (cu->dies, cu);
/* For now fudge the Go package. */ /* For now fudge the Go package. */
if (cu->language == language_go) if (cu->per_cu->lang == language_go)
fixup_go_packaging (cu); fixup_go_packaging (cu);
/* Now that we have processed all the DIEs in the CU, all the types /* Now that we have processed all the DIEs in the CU, all the types
@ -9416,7 +9412,7 @@ process_full_type_unit (dwarf2_cu *cu,
physnames. */ physnames. */
compute_delayed_physnames (cu); compute_delayed_physnames (cu);
if (cu->language == language_rust) if (cu->per_cu->lang == language_rust)
rust_union_quirks (cu); rust_union_quirks (cu);
/* TUs share symbol tables. /* TUs share symbol tables.
@ -9437,9 +9433,9 @@ process_full_type_unit (dwarf2_cu *cu,
compilation is from a C file generated by language preprocessors, compilation is from a C file generated by language preprocessors,
do not set the language if it was already deduced by do not set the language if it was already deduced by
start_subfile. */ start_subfile. */
if (!(cu->language == language_c if (!(cu->per_cu->lang == language_c
&& COMPUNIT_FILETABS (cust)->language != language_c)) && COMPUNIT_FILETABS (cust)->language != language_c))
COMPUNIT_FILETABS (cust)->language = cu->language; COMPUNIT_FILETABS (cust)->language = cu->per_cu->lang;
} }
} }
else else
@ -9487,9 +9483,10 @@ process_imported_unit_die (struct die_info *die, struct dwarf2_cu *cu)
return; return;
/* If necessary, add it to the queue and load its DIEs. */ /* If necessary, add it to the queue and load its DIEs. */
if (maybe_queue_comp_unit (cu, per_cu, per_objfile, cu->language)) if (maybe_queue_comp_unit (cu, per_cu, per_objfile,
cu->per_cu->lang))
load_full_comp_unit (per_cu, per_objfile, per_objfile->get_cu (per_cu), load_full_comp_unit (per_cu, per_objfile, per_objfile->get_cu (per_cu),
false, cu->language); false, cu->per_cu->lang);
cu->per_cu->imported_symtabs_push (per_cu); cu->per_cu->imported_symtabs_push (per_cu);
} }
@ -9547,7 +9544,7 @@ process_die (struct die_info *die, struct dwarf2_cu *cu)
break; break;
case DW_TAG_subprogram: case DW_TAG_subprogram:
/* Nested subprograms in Fortran get a prefix. */ /* Nested subprograms in Fortran get a prefix. */
if (cu->language == language_fortran if (cu->per_cu->lang == language_fortran
&& die->parent != NULL && die->parent != NULL
&& die->parent->tag == DW_TAG_subprogram) && die->parent->tag == DW_TAG_subprogram)
cu->processing_has_namespace_info = true; cu->processing_has_namespace_info = true;
@ -9590,7 +9587,7 @@ process_die (struct die_info *die, struct dwarf2_cu *cu)
/* We only need to handle this case for Ada -- in other /* We only need to handle this case for Ada -- in other
languages, it's normal for the compiler to emit a typedef languages, it's normal for the compiler to emit a typedef
instead. */ instead. */
if (cu->language != language_ada) if (cu->per_cu->lang != language_ada)
break; break;
/* FALLTHROUGH */ /* FALLTHROUGH */
case DW_TAG_base_type: case DW_TAG_base_type:
@ -9622,7 +9619,7 @@ process_die (struct die_info *die, struct dwarf2_cu *cu)
case DW_TAG_imported_module: case DW_TAG_imported_module:
cu->processing_has_namespace_info = true; cu->processing_has_namespace_info = true;
if (die->child != NULL && (die->tag == DW_TAG_imported_declaration if (die->child != NULL && (die->tag == DW_TAG_imported_declaration
|| cu->language != language_fortran)) || cu->per_cu->lang != language_fortran))
complaint (_("Tag '%s' has unexpected children"), complaint (_("Tag '%s' has unexpected children"),
dwarf_tag_name (die->tag)); dwarf_tag_name (die->tag));
read_import_statement (die, cu); read_import_statement (die, cu);
@ -9734,7 +9731,7 @@ dw2_linkage_name (struct die_info *die, struct dwarf2_cu *cu)
/* rustc emits invalid values for DW_AT_linkage_name. Ignore these. /* rustc emits invalid values for DW_AT_linkage_name. Ignore these.
See https://github.com/rust-lang/rust/issues/32925. */ See https://github.com/rust-lang/rust/issues/32925. */
if (cu->language == language_rust && linkage_name != NULL if (cu->per_cu->lang == language_rust && linkage_name != NULL
&& strchr (linkage_name, '{') != NULL) && strchr (linkage_name, '{') != NULL)
linkage_name = NULL; linkage_name = NULL;
@ -9766,6 +9763,8 @@ dwarf2_compute_name (const char *name,
if (name == NULL) if (name == NULL)
name = dwarf2_name (die, cu); name = dwarf2_name (die, cu);
enum language lang = cu->per_cu->lang;
/* For Fortran GDB prefers DW_AT_*linkage_name for the physname if present /* For Fortran GDB prefers DW_AT_*linkage_name for the physname if present
but otherwise compute it by typename_concat inside GDB. but otherwise compute it by typename_concat inside GDB.
FIXME: Actually this is not really true, or at least not always true. FIXME: Actually this is not really true, or at least not always true.
@ -9773,8 +9772,8 @@ dwarf2_compute_name (const char *name,
Fortran names because there is no mangling standard. So new_symbol Fortran names because there is no mangling standard. So new_symbol
will set the demangled name to the result of dwarf2_full_name, and it is will set the demangled name to the result of dwarf2_full_name, and it is
the demangled name that GDB uses if it exists. */ the demangled name that GDB uses if it exists. */
if (cu->language == language_ada if (lang == language_ada
|| (cu->language == language_fortran && physname)) || (lang == language_fortran && physname))
{ {
/* For Ada unit, we prefer the linkage name over the name, as /* For Ada unit, we prefer the linkage name over the name, as
the former contains the exported name, which the user expects the former contains the exported name, which the user expects
@ -9789,9 +9788,9 @@ dwarf2_compute_name (const char *name,
/* These are the only languages we know how to qualify names in. */ /* These are the only languages we know how to qualify names in. */
if (name != NULL if (name != NULL
&& (cu->language == language_cplus && (lang == language_cplus
|| cu->language == language_fortran || cu->language == language_d || lang == language_fortran || lang == language_d
|| cu->language == language_rust)) || lang == language_rust))
{ {
if (die_needs_namespace (die, cu)) if (die_needs_namespace (die, cu))
{ {
@ -9832,12 +9831,11 @@ dwarf2_compute_name (const char *name,
templates; two instantiated function templates are allowed to templates; two instantiated function templates are allowed to
differ only by their return types, which we do not add here. */ differ only by their return types, which we do not add here. */
if (cu->language == language_cplus && strchr (name, '<') == NULL) if (lang == language_cplus && strchr (name, '<') == NULL)
{ {
struct attribute *attr; struct attribute *attr;
struct die_info *child; struct die_info *child;
int first = 1; int first = 1;
const language_defn *cplus_lang = language_def (cu->language);
die->building_fullname = 1; die->building_fullname = 1;
@ -9872,8 +9870,8 @@ dwarf2_compute_name (const char *name,
if (child->tag == DW_TAG_template_type_param) if (child->tag == DW_TAG_template_type_param)
{ {
cplus_lang->print_type (type, "", &buf, -1, 0, cu->language_defn->print_type (type, "", &buf, -1, 0,
&type_print_raw_options); &type_print_raw_options);
continue; continue;
} }
@ -9893,7 +9891,7 @@ dwarf2_compute_name (const char *name,
if (type->has_no_signedness ()) if (type->has_no_signedness ())
/* GDB prints characters as NUMBER 'CHAR'. If that's /* GDB prints characters as NUMBER 'CHAR'. If that's
changed, this can use value_print instead. */ changed, this can use value_print instead. */
cplus_lang->printchar (value, type, &buf); cu->language_defn->printchar (value, type, &buf);
else else
{ {
struct value_print_options opts; struct value_print_options opts;
@ -9939,14 +9937,14 @@ dwarf2_compute_name (const char *name,
information, if PHYSNAME. */ information, if PHYSNAME. */
if (physname && die->tag == DW_TAG_subprogram if (physname && die->tag == DW_TAG_subprogram
&& cu->language == language_cplus) && lang == language_cplus)
{ {
struct type *type = read_type_die (die, cu); struct type *type = read_type_die (die, cu);
c_type_print_args (type, &buf, 1, cu->language, c_type_print_args (type, &buf, 1, lang,
&type_print_raw_options); &type_print_raw_options);
if (cu->language == language_cplus) if (lang == language_cplus)
{ {
/* Assume that an artificial first parameter is /* Assume that an artificial first parameter is
"this", but do not crash if it is not. RealView "this", but do not crash if it is not. RealView
@ -9963,7 +9961,7 @@ dwarf2_compute_name (const char *name,
const std::string &intermediate_name = buf.string (); const std::string &intermediate_name = buf.string ();
if (cu->language == language_cplus) if (lang == language_cplus)
canonical_name canonical_name
= dwarf2_canonicalize_name (intermediate_name.c_str (), cu, = dwarf2_canonicalize_name (intermediate_name.c_str (), cu,
objfile); objfile);
@ -10014,7 +10012,7 @@ dwarf2_physname (const char *name, struct die_info *die, struct dwarf2_cu *cu)
if (!die_needs_namespace (die, cu)) if (!die_needs_namespace (die, cu))
return dwarf2_compute_name (name, die, cu, 1); return dwarf2_compute_name (name, die, cu, 1);
if (cu->language != language_rust) if (cu->per_cu->lang != language_rust)
mangled = dw2_linkage_name (die, cu); mangled = dw2_linkage_name (die, cu);
/* DW_AT_linkage_name is missing in some cases - depend on what GDB /* DW_AT_linkage_name is missing in some cases - depend on what GDB
@ -10022,8 +10020,7 @@ dwarf2_physname (const char *name, struct die_info *die, struct dwarf2_cu *cu)
gdb::unique_xmalloc_ptr<char> demangled; gdb::unique_xmalloc_ptr<char> demangled;
if (mangled != NULL) if (mangled != NULL)
{ {
if (cu->language_defn->store_sym_names_in_linkage_form_p ())
if (language_def (cu->language)->store_sym_names_in_linkage_form_p ())
{ {
/* Do nothing (do not demangle the symbol name). */ /* Do nothing (do not demangle the symbol name). */
} }
@ -10157,7 +10154,7 @@ read_namespace_alias (struct die_info *die, struct dwarf2_cu *cu)
static struct using_direct ** static struct using_direct **
using_directives (struct dwarf2_cu *cu) using_directives (struct dwarf2_cu *cu)
{ {
if (cu->language == language_ada if (cu->per_cu->lang == language_ada
&& cu->get_builder ()->outermost_context_p ()) && cu->get_builder ()->outermost_context_p ())
return cu->get_builder ()->get_global_using_directives (); return cu->get_builder ()->get_global_using_directives ();
else else
@ -10248,12 +10245,15 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
else if (strlen (imported_name_prefix) > 0) else if (strlen (imported_name_prefix) > 0)
canonical_name = obconcat (&objfile->objfile_obstack, canonical_name = obconcat (&objfile->objfile_obstack,
imported_name_prefix, imported_name_prefix,
(cu->language == language_d ? "." : "::"), (cu->per_cu->lang == language_d
? "."
: "::"),
imported_name, (char *) NULL); imported_name, (char *) NULL);
else else
canonical_name = imported_name; canonical_name = imported_name;
if (die->tag == DW_TAG_imported_module && cu->language == language_fortran) if (die->tag == DW_TAG_imported_module
&& cu->per_cu->lang == language_fortran)
for (child_die = die->child; child_die && child_die->tag; for (child_die = die->child; child_die && child_die->tag;
child_die = child_die->sibling) child_die = child_die->sibling)
{ {
@ -10494,7 +10494,7 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu)
struct die_info *child_die; struct die_info *child_die;
CORE_ADDR baseaddr; CORE_ADDR baseaddr;
prepare_one_comp_unit (cu, die, cu->language); prepare_one_comp_unit (cu, die, cu->per_cu->lang);
baseaddr = objfile->text_section_offset (); baseaddr = objfile->text_section_offset ();
get_scope_pc_bounds (die, &lowpc, &highpc, cu); get_scope_pc_bounds (die, &lowpc, &highpc, cu);
@ -12701,7 +12701,7 @@ queue_and_load_dwo_tu (void **slot, void *info)
a real dependency of PER_CU on SIG_TYPE. That is detected later a real dependency of PER_CU on SIG_TYPE. That is detected later
while processing PER_CU. */ while processing PER_CU. */
if (maybe_queue_comp_unit (NULL, sig_type, cu->per_objfile, if (maybe_queue_comp_unit (NULL, sig_type, cu->per_objfile,
cu->language)) cu->per_cu->lang))
load_full_type_unit (sig_type, cu->per_objfile); load_full_type_unit (sig_type, cu->per_objfile);
cu->per_cu->imported_symtabs_push (sig_type); cu->per_cu->imported_symtabs_push (sig_type);
} }
@ -12989,7 +12989,7 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
if (dwarf2_flag_true_p (die, DW_AT_main_subprogram, cu)) if (dwarf2_flag_true_p (die, DW_AT_main_subprogram, cu))
set_objfile_main_name (objfile, newobj->name->linkage_name (), set_objfile_main_name (objfile, newobj->name->linkage_name (),
cu->language); cu->per_cu->lang);
/* If there is a location expression for DW_AT_frame_base, record /* If there is a location expression for DW_AT_frame_base, record
it. */ it. */
@ -13034,7 +13034,7 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
/* If we have a DW_AT_specification, we might need to import using /* If we have a DW_AT_specification, we might need to import using
directives from the context of the specification DIE. See the directives from the context of the specification DIE. See the
comment in determine_prefix. */ comment in determine_prefix. */
if (cu->language == language_cplus if (cu->per_cu->lang == language_cplus
&& dwarf2_attr (die, DW_AT_specification, cu)) && dwarf2_attr (die, DW_AT_specification, cu))
{ {
struct dwarf2_cu *spec_cu = cu; struct dwarf2_cu *spec_cu = cu;
@ -13062,10 +13062,10 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
cstk.static_link, lowpc, highpc); cstk.static_link, lowpc, highpc);
/* For C++, set the block's scope. */ /* For C++, set the block's scope. */
if ((cu->language == language_cplus if ((cu->per_cu->lang == language_cplus
|| cu->language == language_fortran || cu->per_cu->lang == language_fortran
|| cu->language == language_d || cu->per_cu->lang == language_d
|| cu->language == language_rust) || cu->per_cu->lang == language_rust)
&& cu->processing_has_namespace_info) && cu->processing_has_namespace_info)
block_set_scope (block, determine_prefix (die, cu), block_set_scope (block, determine_prefix (die, cu),
&objfile->objfile_obstack); &objfile->objfile_obstack);
@ -13541,7 +13541,7 @@ read_variable (struct die_info *die, struct dwarf2_cu *cu)
{ {
struct rust_vtable_symbol *storage = NULL; struct rust_vtable_symbol *storage = NULL;
if (cu->language == language_rust) if (cu->per_cu->lang == language_rust)
{ {
struct type *containing_type = rust_containing_type (die, cu); struct type *containing_type = rust_containing_type (die, cu);
@ -14047,7 +14047,7 @@ dwarf2_get_subprogram_pc_bounds (struct die_info *die,
/* If the language does not allow nested subprograms (either inside /* If the language does not allow nested subprograms (either inside
subprograms or lexical blocks), we're done. */ subprograms or lexical blocks), we're done. */
if (cu->language != language_ada) if (cu->per_cu->lang != language_ada)
return; return;
/* Check all the children of the given DIE. If it contains nested /* Check all the children of the given DIE. If it contains nested
@ -14814,7 +14814,7 @@ dwarf2_attach_fields_to_type (struct field_info *fip, struct type *type,
type->set_fields type->set_fields
((struct field *) TYPE_ZALLOC (type, sizeof (struct field) * nfields)); ((struct field *) TYPE_ZALLOC (type, sizeof (struct field) * nfields));
if (fip->non_public_fields && cu->language != language_ada) if (fip->non_public_fields && cu->per_cu->lang != language_ada)
{ {
ALLOCATE_CPLUS_STRUCT_TYPE (type); ALLOCATE_CPLUS_STRUCT_TYPE (type);
@ -14833,7 +14833,7 @@ dwarf2_attach_fields_to_type (struct field_info *fip, struct type *type,
/* If the type has baseclasses, allocate and clear a bit vector for /* If the type has baseclasses, allocate and clear a bit vector for
TYPE_FIELD_VIRTUAL_BITS. */ TYPE_FIELD_VIRTUAL_BITS. */
if (!fip->baseclasses.empty () && cu->language != language_ada) if (!fip->baseclasses.empty () && cu->per_cu->lang != language_ada)
{ {
int num_bytes = B_BYTES (fip->baseclasses.size ()); int num_bytes = B_BYTES (fip->baseclasses.size ());
unsigned char *pointer; unsigned char *pointer;
@ -14859,12 +14859,12 @@ dwarf2_attach_fields_to_type (struct field_info *fip, struct type *type,
switch (field.accessibility) switch (field.accessibility)
{ {
case DW_ACCESS_private: case DW_ACCESS_private:
if (cu->language != language_ada) if (cu->per_cu->lang != language_ada)
SET_TYPE_FIELD_PRIVATE (type, i); SET_TYPE_FIELD_PRIVATE (type, i);
break; break;
case DW_ACCESS_protected: case DW_ACCESS_protected:
if (cu->language != language_ada) if (cu->per_cu->lang != language_ada)
SET_TYPE_FIELD_PROTECTED (type, i); SET_TYPE_FIELD_PROTECTED (type, i);
break; break;
@ -14885,7 +14885,7 @@ dwarf2_attach_fields_to_type (struct field_info *fip, struct type *type,
{ {
case DW_VIRTUALITY_virtual: case DW_VIRTUALITY_virtual:
case DW_VIRTUALITY_pure_virtual: case DW_VIRTUALITY_pure_virtual:
if (cu->language == language_ada) if (cu->per_cu->lang == language_ada)
error (_("unexpected virtuality in component of Ada type")); error (_("unexpected virtuality in component of Ada type"));
SET_TYPE_FIELD_VIRTUAL (type, i); SET_TYPE_FIELD_VIRTUAL (type, i);
break; break;
@ -14936,7 +14936,7 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die,
const char *fieldname; const char *fieldname;
struct type *this_type; struct type *this_type;
if (cu->language == language_ada) if (cu->per_cu->lang == language_ada)
error (_("unexpected member function in Ada type")); error (_("unexpected member function in Ada type"));
/* Get name of member function. */ /* Get name of member function. */
@ -14969,7 +14969,7 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die,
fnp = &flp->fnfields.back (); fnp = &flp->fnfields.back ();
/* Delay processing of the physname until later. */ /* Delay processing of the physname until later. */
if (cu->language == language_cplus) if (cu->per_cu->lang == language_cplus)
add_to_method_list (type, i, flp->fnfields.size () - 1, fieldname, add_to_method_list (type, i, flp->fnfields.size () - 1, fieldname,
die, cu); die, cu);
else else
@ -15124,7 +15124,7 @@ static void
dwarf2_attach_fn_fields_to_type (struct field_info *fip, struct type *type, dwarf2_attach_fn_fields_to_type (struct field_info *fip, struct type *type,
struct dwarf2_cu *cu) struct dwarf2_cu *cu)
{ {
if (cu->language == language_ada) if (cu->per_cu->lang == language_ada)
error (_("unexpected member functions in Ada type")); error (_("unexpected member functions in Ada type"));
ALLOCATE_CPLUS_STRUCT_TYPE (type); ALLOCATE_CPLUS_STRUCT_TYPE (type);
@ -15267,7 +15267,7 @@ static void
quirk_ada_thick_pointer_struct (struct die_info *die, struct dwarf2_cu *cu, quirk_ada_thick_pointer_struct (struct die_info *die, struct dwarf2_cu *cu,
struct type *type) struct type *type)
{ {
gdb_assert (cu->language == language_ada); gdb_assert (cu->per_cu->lang == language_ada);
/* Check for a structure with two children. */ /* Check for a structure with two children. */
if (type->code () != TYPE_CODE_STRUCT || type->num_fields () != 2) if (type->code () != TYPE_CODE_STRUCT || type->num_fields () != 2)
@ -15446,9 +15446,9 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
name = dwarf2_name (die, cu); name = dwarf2_name (die, cu);
if (name != NULL) if (name != NULL)
{ {
if (cu->language == language_cplus if (cu->per_cu->lang == language_cplus
|| cu->language == language_d || cu->per_cu->lang == language_d
|| cu->language == language_rust) || cu->per_cu->lang == language_rust)
{ {
const char *full_name = dwarf2_full_name (name, die, cu); const char *full_name = dwarf2_full_name (name, die, cu);
@ -15480,7 +15480,7 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
type->set_code (TYPE_CODE_STRUCT); type->set_code (TYPE_CODE_STRUCT);
} }
if (cu->language == language_cplus && die->tag == DW_TAG_class_type) if (cu->per_cu->lang == language_cplus && die->tag == DW_TAG_class_type)
type->set_is_declared_class (true); type->set_is_declared_class (true);
/* Store the calling convention in the type if it's available in /* Store the calling convention in the type if it's available in
@ -15691,7 +15691,7 @@ handle_struct_member_die (struct die_info *child_die, struct type *type,
/* Rust doesn't have member functions in the C++ sense. /* Rust doesn't have member functions in the C++ sense.
However, it does emit ordinary functions as children However, it does emit ordinary functions as children
of a struct DIE. */ of a struct DIE. */
if (cu->language == language_rust) if (cu->per_cu->lang == language_rust)
read_func_scope (child_die, cu); read_func_scope (child_die, cu);
else else
{ {
@ -15852,7 +15852,8 @@ process_structure_scope (struct die_info *die, struct dwarf2_cu *cu)
/* Copy fi.nested_types_list linked list elements content into the /* Copy fi.nested_types_list linked list elements content into the
allocated array TYPE_NESTED_TYPES_ARRAY (type). */ allocated array TYPE_NESTED_TYPES_ARRAY (type). */
if (!fi.nested_types_list.empty () && cu->language != language_ada) if (!fi.nested_types_list.empty ()
&& cu->per_cu->lang != language_ada)
{ {
int count = fi.nested_types_list.size (); int count = fi.nested_types_list.size ();
@ -15868,9 +15869,9 @@ process_structure_scope (struct die_info *die, struct dwarf2_cu *cu)
} }
quirk_gcc_member_function_pointer (type, objfile); quirk_gcc_member_function_pointer (type, objfile);
if (cu->language == language_rust && die->tag == DW_TAG_union_type) if (cu->per_cu->lang == language_rust && die->tag == DW_TAG_union_type)
cu->rust_unions.push_back (type); cu->rust_unions.push_back (type);
else if (cu->language == language_ada) else if (cu->per_cu->lang == language_ada)
quirk_ada_thick_pointer_struct (die, cu, type); quirk_ada_thick_pointer_struct (die, cu, type);
/* NOTE: carlton/2004-03-16: GCC 3.4 (or at least one of its /* NOTE: carlton/2004-03-16: GCC 3.4 (or at least one of its
@ -16573,7 +16574,7 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu)
maybe_set_alignment (cu, die, type); maybe_set_alignment (cu, die, type);
struct type *replacement_type = nullptr; struct type *replacement_type = nullptr;
if (cu->language == language_ada) if (cu->per_cu->lang == language_ada)
{ {
replacement_type = quirk_ada_thick_pointer (die, cu, type); replacement_type = quirk_ada_thick_pointer (die, cu, type);
if (replacement_type != nullptr) if (replacement_type != nullptr)
@ -16610,7 +16611,7 @@ read_array_order (struct die_info *die, struct dwarf2_cu *cu)
FIXME: dsl/2004-8-20: If G77 is ever fixed, this will also need FIXME: dsl/2004-8-20: If G77 is ever fixed, this will also need
version checking. */ version checking. */
if (cu->language == language_fortran if (cu->per_cu->lang == language_fortran
&& cu->producer && strstr (cu->producer, "GNU F77")) && cu->producer && strstr (cu->producer, "GNU F77"))
{ {
return DW_ORD_row_major; return DW_ORD_row_major;
@ -17349,9 +17350,9 @@ prototyped_function_p (struct die_info *die, struct dwarf2_cu *cu)
languages that allow unprototyped functions (Eg: Objective C). languages that allow unprototyped functions (Eg: Objective C).
For all other languages, assume that functions are always For all other languages, assume that functions are always
prototyped. */ prototyped. */
if (cu->language != language_c if (cu->per_cu->lang != language_c
&& cu->language != language_objc && cu->per_cu->lang != language_objc
&& cu->language != language_opencl) && cu->per_cu->lang != language_opencl)
return 1; return 1;
/* RealView does not emit DW_AT_prototyped. We can not distinguish /* RealView does not emit DW_AT_prototyped. We can not distinguish
@ -17476,7 +17477,8 @@ read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu)
/* RealView does not mark THIS as const, which the testsuite /* RealView does not mark THIS as const, which the testsuite
expects. GCC marks THIS as const in method definitions, expects. GCC marks THIS as const in method definitions,
but not in the class specifications (GCC PR 43053). */ but not in the class specifications (GCC PR 43053). */
if (cu->language == language_cplus && !TYPE_CONST (arg_type) if (cu->per_cu->lang == language_cplus
&& !TYPE_CONST (arg_type)
&& TYPE_FIELD_ARTIFICIAL (ftype, iparams)) && TYPE_FIELD_ARTIFICIAL (ftype, iparams))
{ {
int is_this = 0; int is_this = 0;
@ -17911,7 +17913,7 @@ dwarf2_init_complex_target_type (struct dwarf2_cu *cu,
/* Try to find a suitable floating point builtin type of size BITS. /* Try to find a suitable floating point builtin type of size BITS.
We're going to use the name of this type as the name for the complex We're going to use the name of this type as the name for the complex
target type that we are about to create. */ target type that we are about to create. */
switch (cu->language) switch (cu->per_cu->lang)
{ {
case language_fortran: case language_fortran:
switch (bits) switch (bits)
@ -18001,7 +18003,7 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu)
} }
if ((encoding == DW_ATE_signed_fixed || encoding == DW_ATE_unsigned_fixed) if ((encoding == DW_ATE_signed_fixed || encoding == DW_ATE_unsigned_fixed)
&& cu->language == language_ada && cu->per_cu->lang == language_ada
&& has_zero_over_zero_small_attribute (die, cu)) && has_zero_over_zero_small_attribute (die, cu))
{ {
/* brobecker/2018-02-24: This is a fixed point type for which /* brobecker/2018-02-24: This is a fixed point type for which
@ -18023,7 +18025,7 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu)
than an "else if". */ than an "else if". */
const char *gnat_encoding_suffix = nullptr; const char *gnat_encoding_suffix = nullptr;
if ((encoding == DW_ATE_signed || encoding == DW_ATE_unsigned) if ((encoding == DW_ATE_signed || encoding == DW_ATE_unsigned)
&& cu->language == language_ada && cu->per_cu->lang == language_ada
&& name != nullptr) && name != nullptr)
{ {
gnat_encoding_suffix = gnat_encoded_fixed_point_type_info (name); gnat_encoding_suffix = gnat_encoded_fixed_point_type_info (name);
@ -18080,7 +18082,7 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu)
type = dwarf2_init_integer_type (cu, objfile, bits, 0, name); type = dwarf2_init_integer_type (cu, objfile, bits, 0, name);
break; break;
case DW_ATE_unsigned: case DW_ATE_unsigned:
if (cu->language == language_fortran if (cu->per_cu->lang == language_fortran
&& name && name
&& startswith (name, "character(")) && startswith (name, "character("))
type = init_character_type (objfile, bits, 1, name); type = init_character_type (objfile, bits, 1, name);
@ -18088,18 +18090,20 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu)
type = dwarf2_init_integer_type (cu, objfile, bits, 1, name); type = dwarf2_init_integer_type (cu, objfile, bits, 1, name);
break; break;
case DW_ATE_signed_char: case DW_ATE_signed_char:
if (cu->language == language_ada || cu->language == language_m2 if (cu->per_cu->lang == language_ada
|| cu->language == language_pascal || cu->per_cu->lang == language_m2
|| cu->language == language_fortran) || cu->per_cu->lang == language_pascal
|| cu->per_cu->lang == language_fortran)
type = init_character_type (objfile, bits, 0, name); type = init_character_type (objfile, bits, 0, name);
else else
type = dwarf2_init_integer_type (cu, objfile, bits, 0, name); type = dwarf2_init_integer_type (cu, objfile, bits, 0, name);
break; break;
case DW_ATE_unsigned_char: case DW_ATE_unsigned_char:
if (cu->language == language_ada || cu->language == language_m2 if (cu->per_cu->lang == language_ada
|| cu->language == language_pascal || cu->per_cu->lang == language_m2
|| cu->language == language_fortran || cu->per_cu->lang == language_pascal
|| cu->language == language_rust) || cu->per_cu->lang == language_fortran
|| cu->per_cu->lang == language_rust)
type = init_character_type (objfile, bits, 1, name); type = init_character_type (objfile, bits, 1, name);
else else
type = dwarf2_init_integer_type (cu, objfile, bits, 1, name); type = dwarf2_init_integer_type (cu, objfile, bits, 1, name);
@ -18394,7 +18398,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
/* Set LOW_DEFAULT_IS_VALID if current language and DWARF version allow /* Set LOW_DEFAULT_IS_VALID if current language and DWARF version allow
omitting DW_AT_lower_bound. */ omitting DW_AT_lower_bound. */
switch (cu->language) switch (cu->per_cu->lang)
{ {
case language_c: case language_c:
case language_cplus: case language_cplus:
@ -18530,7 +18534,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
range_type->bounds ()->flag_upper_bound_is_count = 1; range_type->bounds ()->flag_upper_bound_is_count = 1;
/* Ada expects an empty array on no boundary attributes. */ /* Ada expects an empty array on no boundary attributes. */
if (attr == NULL && cu->language != language_ada) if (attr == NULL && cu->per_cu->lang != language_ada)
range_type->bounds ()->high.set_undefined (); range_type->bounds ()->high.set_undefined ();
name = dwarf2_name (die, cu); name = dwarf2_name (die, cu);
@ -18563,7 +18567,7 @@ read_unspecified_type (struct die_info *die, struct dwarf2_cu *cu)
of the type is deferred to a different unit. When encountering of the type is deferred to a different unit. When encountering
such a type, we treat it as a stub, and try to resolve it later on, such a type, we treat it as a stub, and try to resolve it later on,
when needed. */ when needed. */
if (cu->language == language_ada) if (cu->per_cu->lang == language_ada)
type->set_is_stub (true); type->set_is_stub (true);
return set_die_type (die, type, cu); return set_die_type (die, type, cu);
@ -18863,7 +18867,7 @@ load_partial_dies (const struct die_reader_specs *reader,
/* Check for template arguments. We never save these; if /* Check for template arguments. We never save these; if
they're seen, we just mark the parent, and go on our way. */ they're seen, we just mark the parent, and go on our way. */
if (parent_die != NULL if (parent_die != NULL
&& cu->language == language_cplus && cu->per_cu->lang == language_cplus
&& (abbrev->tag == DW_TAG_template_type_param && (abbrev->tag == DW_TAG_template_type_param
|| abbrev->tag == DW_TAG_template_value_param)) || abbrev->tag == DW_TAG_template_value_param))
{ {
@ -18880,7 +18884,7 @@ load_partial_dies (const struct die_reader_specs *reader,
/* We only recurse into c++ subprograms looking for template arguments. /* We only recurse into c++ subprograms looking for template arguments.
Skip their other children. */ Skip their other children. */
if (!load_all if (!load_all
&& cu->language == language_cplus && cu->per_cu->lang == language_cplus
&& parent_die != NULL && parent_die != NULL
&& parent_die->tag == DW_TAG_subprogram && parent_die->tag == DW_TAG_subprogram
&& abbrev->tag != DW_TAG_inlined_subroutine) && abbrev->tag != DW_TAG_inlined_subroutine)
@ -18894,7 +18898,7 @@ load_partial_dies (const struct die_reader_specs *reader,
later variables referencing them via DW_AT_specification (for later variables referencing them via DW_AT_specification (for
static members). */ static members). */
if (!load_all if (!load_all
&& !is_type_tag_for_partial (abbrev->tag, cu->language) && !is_type_tag_for_partial (abbrev->tag, cu->per_cu->lang)
&& abbrev->tag != DW_TAG_constant && abbrev->tag != DW_TAG_constant
&& abbrev->tag != DW_TAG_enumerator && abbrev->tag != DW_TAG_enumerator
&& abbrev->tag != DW_TAG_subprogram && abbrev->tag != DW_TAG_subprogram
@ -19051,17 +19055,17 @@ load_partial_dies (const struct die_reader_specs *reader,
|| last_die->tag == DW_TAG_namespace || last_die->tag == DW_TAG_namespace
|| last_die->tag == DW_TAG_module || last_die->tag == DW_TAG_module
|| last_die->tag == DW_TAG_enumeration_type || last_die->tag == DW_TAG_enumeration_type
|| (cu->language == language_cplus || (cu->per_cu->lang == language_cplus
&& last_die->tag == DW_TAG_subprogram && last_die->tag == DW_TAG_subprogram
&& (last_die->raw_name == NULL && (last_die->raw_name == NULL
|| strchr (last_die->raw_name, '<') == NULL)) || strchr (last_die->raw_name, '<') == NULL))
|| (cu->language != language_c || (cu->per_cu->lang != language_c
&& (last_die->tag == DW_TAG_class_type && (last_die->tag == DW_TAG_class_type
|| last_die->tag == DW_TAG_interface_type || last_die->tag == DW_TAG_interface_type
|| last_die->tag == DW_TAG_structure_type || last_die->tag == DW_TAG_structure_type
|| last_die->tag == DW_TAG_union_type)) || last_die->tag == DW_TAG_union_type))
|| ((cu->language == language_ada || ((cu->per_cu->lang == language_ada
|| cu->language == language_fortran) || cu->per_cu->lang == language_fortran)
&& (last_die->tag == DW_TAG_subprogram && (last_die->tag == DW_TAG_subprogram
|| last_die->tag == DW_TAG_lexical_block)))) || last_die->tag == DW_TAG_lexical_block))))
{ {
@ -19237,7 +19241,7 @@ partial_die_info::read (const struct die_reader_specs *reader,
information, we support this practice for backward information, we support this practice for backward
compatibility. */ compatibility. */
if (attr.constant_value (0) == DW_CC_program if (attr.constant_value (0) == DW_CC_program
&& cu->language == language_fortran) && cu->per_cu->lang == language_fortran)
main_subprogram = 1; main_subprogram = 1;
break; break;
case DW_AT_inline: case DW_AT_inline:
@ -19289,7 +19293,7 @@ partial_die_info::read (const struct die_reader_specs *reader,
of the order in which the name and linkage name were emitted. of the order in which the name and linkage name were emitted.
Really, though, this is just a workaround for the fact that gdb Really, though, this is just a workaround for the fact that gdb
doesn't store both the name and the linkage name. */ doesn't store both the name and the linkage name. */
if (cu->language == language_ada && linkage_name != nullptr) if (cu->per_cu->lang == language_ada && linkage_name != nullptr)
raw_name = linkage_name; raw_name = linkage_name;
if (high_pc_relative) if (high_pc_relative)
@ -19555,7 +19559,7 @@ partial_die_info::fixup (struct dwarf2_cu *cu)
/* If there is no parent die to provide a namespace, and there are /* If there is no parent die to provide a namespace, and there are
children, see if we can determine the namespace from their linkage children, see if we can determine the namespace from their linkage
name. */ name. */
if (cu->language == language_cplus if (cu->per_cu->lang == language_cplus
&& !cu->per_objfile->per_bfd->types.empty () && !cu->per_objfile->per_bfd->types.empty ()
&& die_parent == NULL && die_parent == NULL
&& has_children && has_children
@ -21541,16 +21545,16 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
OBJSTAT (objfile, n_syms++); OBJSTAT (objfile, n_syms++);
/* Cache this symbol's name and the name's demangled form (if any). */ /* Cache this symbol's name and the name's demangled form (if any). */
sym->set_language (cu->language, &objfile->objfile_obstack); sym->set_language (cu->per_cu->lang, &objfile->objfile_obstack);
/* Fortran does not have mangling standard and the mangling does differ /* Fortran does not have mangling standard and the mangling does differ
between gfortran, iFort etc. */ between gfortran, iFort etc. */
const char *physname const char *physname
= (cu->language == language_fortran = (cu->per_cu->lang == language_fortran
? dwarf2_full_name (name, die, cu) ? dwarf2_full_name (name, die, cu)
: dwarf2_physname (name, die, cu)); : dwarf2_physname (name, die, cu));
const char *linkagename = dw2_linkage_name (die, cu); const char *linkagename = dw2_linkage_name (die, cu);
if (linkagename == nullptr || cu->language == language_ada) if (linkagename == nullptr || cu->per_cu->lang == language_ada)
sym->set_linkage_name (physname); sym->set_linkage_name (physname);
else else
{ {
@ -21617,8 +21621,8 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
SYMBOL_ACLASS_INDEX (sym) = LOC_BLOCK; SYMBOL_ACLASS_INDEX (sym) = LOC_BLOCK;
attr2 = dwarf2_attr (die, DW_AT_external, cu); attr2 = dwarf2_attr (die, DW_AT_external, cu);
if ((attr2 != nullptr && attr2->as_boolean ()) if ((attr2 != nullptr && attr2->as_boolean ())
|| cu->language == language_ada || cu->per_cu->lang == language_ada
|| cu->language == language_fortran) || cu->per_cu->lang == language_fortran)
{ {
/* Subprograms marked external are stored as a global symbol. /* Subprograms marked external are stored as a global symbol.
Ada and Fortran subprograms, whether marked external or Ada and Fortran subprograms, whether marked external or
@ -21683,7 +21687,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
/* Fortran explicitly imports any global symbols to the local /* Fortran explicitly imports any global symbols to the local
scope by DW_TAG_common_block. */ scope by DW_TAG_common_block. */
if (cu->language == language_fortran && die->parent if (cu->per_cu->lang == language_fortran && die->parent
&& die->parent->tag == DW_TAG_common_block) && die->parent->tag == DW_TAG_common_block)
attr2 = NULL; attr2 = NULL;
@ -21737,7 +21741,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
/* Fortran explicitly imports any global symbols to the local /* Fortran explicitly imports any global symbols to the local
scope by DW_TAG_common_block. */ scope by DW_TAG_common_block. */
if (cu->language == language_fortran && die->parent if (cu->per_cu->lang == language_fortran && die->parent
&& die->parent->tag == DW_TAG_common_block) && die->parent->tag == DW_TAG_common_block)
{ {
/* SYMBOL_CLASS doesn't matter here because /* SYMBOL_CLASS doesn't matter here because
@ -21823,16 +21827,16 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
buildsym_compunit *builder = cu->get_builder (); buildsym_compunit *builder = cu->get_builder ();
list_to_add list_to_add
= (cu->list_in_scope == builder->get_file_symbols () = (cu->list_in_scope == builder->get_file_symbols ()
&& cu->language == language_cplus && cu->per_cu->lang == language_cplus
? builder->get_global_symbols () ? builder->get_global_symbols ()
: cu->list_in_scope); : cu->list_in_scope);
/* The semantics of C++ state that "struct foo { /* The semantics of C++ state that "struct foo {
... }" also defines a typedef for "foo". */ ... }" also defines a typedef for "foo". */
if (cu->language == language_cplus if (cu->per_cu->lang == language_cplus
|| cu->language == language_ada || cu->per_cu->lang == language_ada
|| cu->language == language_d || cu->per_cu->lang == language_d
|| cu->language == language_rust) || cu->per_cu->lang == language_rust)
{ {
/* The symbol's name is already allocated along /* The symbol's name is already allocated along
with this objfile, so we don't need to with this objfile, so we don't need to
@ -21867,7 +21871,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
list_to_add list_to_add
= (cu->list_in_scope == cu->get_builder ()->get_file_symbols () = (cu->list_in_scope == cu->get_builder ()->get_file_symbols ()
&& cu->language == language_cplus && cu->per_cu->lang == language_cplus
? cu->get_builder ()->get_global_symbols () ? cu->get_builder ()->get_global_symbols ()
: cu->list_in_scope); : cu->list_in_scope);
} }
@ -21910,7 +21914,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
/* For the benefit of old versions of GCC, check for anonymous /* For the benefit of old versions of GCC, check for anonymous
namespaces based on the demangled name. */ namespaces based on the demangled name. */
if (!cu->processing_has_namespace_info if (!cu->processing_has_namespace_info
&& cu->language == language_cplus) && cu->per_cu->lang == language_cplus)
cp_scan_for_anonymous_namespaces (cu->get_builder (), sym, objfile); cp_scan_for_anonymous_namespaces (cu->get_builder (), sym, objfile);
} }
return (sym); return (sym);
@ -22122,7 +22126,7 @@ need_gnat_info (struct dwarf2_cu *cu)
{ {
/* Assume that the Ada compiler was GNAT, which always produces /* Assume that the Ada compiler was GNAT, which always produces
the auxiliary information. */ the auxiliary information. */
return (cu->language == language_ada); return (cu->per_cu->lang == language_ada);
} }
/* Return the auxiliary type of the die in question using its /* Return the auxiliary type of the die in question using its
@ -22497,9 +22501,10 @@ determine_prefix (struct die_info *die, struct dwarf2_cu *cu)
struct type *parent_type; struct type *parent_type;
const char *retval; const char *retval;
if (cu->language != language_cplus if (cu->per_cu->lang != language_cplus
&& cu->language != language_fortran && cu->language != language_d && cu->per_cu->lang != language_fortran
&& cu->language != language_rust) && cu->per_cu->lang != language_d
&& cu->per_cu->lang != language_rust)
return ""; return "";
retval = anonymous_struct_prefix (die, cu); retval = anonymous_struct_prefix (die, cu);
@ -22587,7 +22592,7 @@ determine_prefix (struct die_info *die, struct dwarf2_cu *cu)
/* GCC 4.0 and 4.1 had a bug (PR c++/28460) where they generated bogus /* GCC 4.0 and 4.1 had a bug (PR c++/28460) where they generated bogus
DW_TAG_namespace DIEs with a name of "::" for the global namespace. DW_TAG_namespace DIEs with a name of "::" for the global namespace.
Work around this problem here. */ Work around this problem here. */
if (cu->language == language_cplus if (cu->per_cu->lang == language_cplus
&& strcmp (parent_type->name (), "::") == 0) && strcmp (parent_type->name (), "::") == 0)
return ""; return "";
/* We give a name to even anonymous namespaces. */ /* We give a name to even anonymous namespaces. */
@ -22608,7 +22613,7 @@ determine_prefix (struct die_info *die, struct dwarf2_cu *cu)
case DW_TAG_compile_unit: case DW_TAG_compile_unit:
case DW_TAG_partial_unit: case DW_TAG_partial_unit:
/* gcc-4.5 -gdwarf-4 can drop the enclosing namespace. Cope. */ /* gcc-4.5 -gdwarf-4 can drop the enclosing namespace. Cope. */
if (cu->language == language_cplus if (cu->per_cu->lang == language_cplus
&& !per_objfile->per_bfd->types.empty () && !per_objfile->per_bfd->types.empty ()
&& die->child != NULL && die->child != NULL
&& (die->tag == DW_TAG_class_type && (die->tag == DW_TAG_class_type
@ -22623,7 +22628,7 @@ determine_prefix (struct die_info *die, struct dwarf2_cu *cu)
case DW_TAG_subprogram: case DW_TAG_subprogram:
/* Nested subroutines in Fortran get a prefix with the name /* Nested subroutines in Fortran get a prefix with the name
of the parent's subroutine. */ of the parent's subroutine. */
if (cu->language == language_fortran) if (cu->per_cu->lang == language_fortran)
{ {
if ((die->tag == DW_TAG_subprogram) if ((die->tag == DW_TAG_subprogram)
&& (dwarf2_name (parent, cu) != NULL)) && (dwarf2_name (parent, cu) != NULL))
@ -22662,7 +22667,7 @@ typename_concat (struct obstack *obs, const char *prefix, const char *suffix,
if (suffix == NULL || suffix[0] == '\0' if (suffix == NULL || suffix[0] == '\0'
|| prefix == NULL || prefix[0] == '\0') || prefix == NULL || prefix[0] == '\0')
sep = ""; sep = "";
else if (cu->language == language_d) else if (cu->per_cu->lang == language_d)
{ {
/* For D, the 'main' function could be defined in any module, but it /* For D, the 'main' function could be defined in any module, but it
should never be prefixed. */ should never be prefixed. */
@ -22674,7 +22679,7 @@ typename_concat (struct obstack *obs, const char *prefix, const char *suffix,
else else
sep = "."; sep = ".";
} }
else if (cu->language == language_fortran && physname) else if (cu->per_cu->lang == language_fortran && physname)
{ {
/* This is gfortran specific mangling. Normally DW_AT_linkage_name or /* This is gfortran specific mangling. Normally DW_AT_linkage_name or
DW_AT_MIPS_linkage_name is preferred and used instead. */ DW_AT_MIPS_linkage_name is preferred and used instead. */
@ -22715,7 +22720,7 @@ static const char *
dwarf2_canonicalize_name (const char *name, struct dwarf2_cu *cu, dwarf2_canonicalize_name (const char *name, struct dwarf2_cu *cu,
struct objfile *objfile) struct objfile *objfile)
{ {
if (name && cu->language == language_cplus) if (name && cu->per_cu->lang == language_cplus)
{ {
gdb::unique_xmalloc_ptr<char> canon_name gdb::unique_xmalloc_ptr<char> canon_name
= cp_canonicalize_string (name); = cp_canonicalize_string (name);
@ -23094,10 +23099,10 @@ follow_die_offset (sect_offset sect_off, int offset_in_dwz,
Even if maybe_queue_comp_unit doesn't require us to load the CU's DIEs, Even if maybe_queue_comp_unit doesn't require us to load the CU's DIEs,
it doesn't mean they are currently loaded. Since we require them it doesn't mean they are currently loaded. Since we require them
to be loaded, we must check for ourselves. */ to be loaded, we must check for ourselves. */
if (maybe_queue_comp_unit (cu, per_cu, per_objfile, cu->language) if (maybe_queue_comp_unit (cu, per_cu, per_objfile, cu->per_cu->lang)
|| per_objfile->get_cu (per_cu) == nullptr) || per_objfile->get_cu (per_cu) == nullptr)
load_full_comp_unit (per_cu, per_objfile, per_objfile->get_cu (per_cu), load_full_comp_unit (per_cu, per_objfile, per_objfile->get_cu (per_cu),
false, cu->language); false, cu->per_cu->lang);
target_cu = per_objfile->get_cu (per_cu); target_cu = per_objfile->get_cu (per_cu);
gdb_assert (target_cu != nullptr); gdb_assert (target_cu != nullptr);
@ -24417,19 +24422,19 @@ prepare_one_comp_unit (struct dwarf2_cu *cu, struct die_info *comp_unit_die,
attribute is not standardised yet. As a workaround for the attribute is not standardised yet. As a workaround for the
language detection we fall back to the DW_AT_producer language detection we fall back to the DW_AT_producer
string. */ string. */
cu->language = language_opencl; cu->per_cu->lang = language_opencl;
} }
else if (cu->producer != nullptr else if (cu->producer != nullptr
&& strstr (cu->producer, "GNU Go ") != NULL) && strstr (cu->producer, "GNU Go ") != NULL)
{ {
/* Similar hack for Go. */ /* Similar hack for Go. */
cu->language = language_go; cu->per_cu->lang = language_go;
} }
else if (attr != nullptr) else if (attr != nullptr)
cu->language = dwarf_lang_to_enum_language (attr->constant_value (0)); cu->per_cu->lang = dwarf_lang_to_enum_language (attr->constant_value (0));
else else
cu->language = pretend_language; cu->per_cu->lang = pretend_language;
cu->language_defn = language_def (cu->language); cu->language_defn = language_def (cu->per_cu->lang);
} }
/* See read.h. */ /* See read.h. */