Commit c0dbd22d by Pierre-Marie de Rodat Committed by Pierre-Marie de Rodat

DWARF: fix scoping for descriptions of local types

In Ada, it is possible to have nested subprograms in the following
configuration:

    procedure Parent is
       type T;
       [...]
       procedure Child (Value : T) is
       begin
          [...]
       end Child;
    begin
       [...]
    end Parent;

As we currently generate debugging information for Child first before
Parent, the debug info for T appears in global scope since the DIE for
Parent does not exist yet.

This patch makes sure that when we generate early debug info for a
nested function, we trigger generation for the parent function first.

gcc/

	* dwarf2out.c (dwarf2out_early_global_decl): For nested
	functions, call dwarf2out_decl on the parent function first.

gcc/testsuite/

	* gnat.dg/debug9.adb: New testcase.

From-SVN: r241023
parent 7d7f9288
2016-10-12 Pierre-Marie de Rodat <derodat@adacore.com>
* dwarf2out.c (dwarf2out_early_global_decl): For nested
functions, call dwarf2out_decl on the parent function first.
2016-10-12 Richard Biener <rguenther@suse.de> 2016-10-12 Richard Biener <rguenther@suse.de>
* match.pd ((X /[ex] A) * A -> X): Remove unnecessary constraint * match.pd ((X /[ex] A) * A -> X): Remove unnecessary constraint
......
...@@ -23902,6 +23902,16 @@ dwarf2out_early_global_decl (tree decl) ...@@ -23902,6 +23902,16 @@ dwarf2out_early_global_decl (tree decl)
if (!DECL_STRUCT_FUNCTION (decl)) if (!DECL_STRUCT_FUNCTION (decl))
goto early_decl_exit; goto early_decl_exit;
/* For nested functions, emit DIEs for the parents first so that all
nested DIEs are generated at the proper scope in the first
shot. */
tree context = decl_function_context (decl);
if (context != NULL)
{
current_function_decl = context;
dwarf2out_decl (context);
}
current_function_decl = decl; current_function_decl = decl;
} }
dwarf2out_decl (decl); dwarf2out_decl (decl);
......
2016-10-12 Pierre-Marie de Rodat <derodat@adacore.com>
* gnat.dg/debug9.adb: New testcase.
2016-10-12 Richard Biener <rguenther@suse.de> 2016-10-12 Richard Biener <rguenther@suse.de>
* gcc.dg/tree-ssa/vrp35.c: Adjust. * gcc.dg/tree-ssa/vrp35.c: Adjust.
......
-- The aim of this test is to check that Ada types appear in the proper
-- context in the debug info.
--
-- Checking this directly would be really tedious just scanning for assembly
-- lines, so instead we rely on DWARFv4's .debug_types sections, which must be
-- created only for global-scope types. Checking the number of .debug_types is
-- some hackish way to check that types are output in the proper context (i.e.
-- at global or local scope).
--
-- { dg-options "-g -gdwarf-4 -cargs -fdebug-types-section -dA" }
-- { dg-final { scan-assembler-times "\\(DIE \\(0x\[a-f0-9\]*\\) DW_TAG_type_unit\\)" 0 } }
procedure Debug9 is
type Array_Type is array (Natural range <>) of Integer;
type Record_Type (L1, L2 : Natural) is record
I1 : Integer;
A1 : Array_Type (1 .. L1);
I2 : Integer;
A2 : Array_Type (1 .. L2);
I3 : Integer;
end record;
function Get (L1, L2 : Natural) return Record_Type is
Result : Record_Type (L1, L2);
begin
Result.I1 := 1;
for I in Result.A1'Range loop
Result.A1 (I) := I;
end loop;
Result.I2 := 2;
for I in Result.A2'Range loop
Result.A2 (I) := I;
end loop;
Result.I3 := 3;
return Result;
end Get;
R1 : Record_Type := Get (0, 0);
R2 : Record_Type := Get (1, 0);
R3 : Record_Type := Get (0, 1);
R4 : Record_Type := Get (2, 2);
procedure Process (R : Record_Type) is
begin
null;
end Process;
begin
Process (R1);
Process (R2);
Process (R3);
Process (R4);
end Debug9;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment