> Ah, thanks, I tried it but the defs__struct1IP function has > DECL_IGNORED_P = false when I build it with -gnatD. > > So that would not be affected by setting DECL_SOURCE_LOCATION to > UNKNOWN_LOCATION as done in the proposed patch, because that is only > done for functions with DECL_IGNORED_P = true.
Ouch, I should have checked it myself... Thanks for doing the investigation. > Then we have ordinary functions with DECL_IGNORED_P = false, > but they are morphed into a thunk calling a similar looking function > and the thunk has now DECL_IGNORED_P = true, and all debug info > removed, except the DECL_SOURCE_LOCATION. To make this even worse, > the similar looking function is inlined into the thunk again, and > all debug info is again stripped away. > > And when this happens it is desirable to at least see the source line where > the original function was declared. > > > As an example, please consider this test case: > > $ cat test.ads > package test is > > type Func_Ptr is access function (X : Integer) return Integer; > > function Test1 (X : Integer) return Integer; > function Test2 (X : Integer) return Integer; > function DoIt (X : Integer; Func : Func_Ptr) return Integer; > > end test; > $ cat test.ads > package test is > > type Func_Ptr is access function (X : Integer) return Integer; > > function Test1 (X : Integer) return Integer; > function Test2 (X : Integer) return Integer; > function DoIt (X : Integer; Func : Func_Ptr) return Integer; > > end test; > > $ cat test.adb > package body test is > > function Test1 (X : Integer) return Integer is > begin > return X; > end Test1; > > function Test2 (X : Integer) return Integer is > begin > return X; > end Test2; > > function DoIt (X : Integer; Func : Func_Ptr) return Integer is > begin > return Func (X); > end DoIt; > > end test; > > $ cat main.adb > with Ada.Text_IO; use Ada.Text_IO; > with test; use test; > > procedure Main is > > X : Integer := 7; > Y : Integer := DoIt (X, Test1'Access); > Z : Integer := DoIt (X, Test2'Access); > > begin > Put_Line (X'Img & " " & Y'Img & " " & Z'Img); > end Main; > > $ gnatmake -f -g -O2 main.adb -save-temp -fdump-tree-all-lineno > > Now Test1 and Test2 are ordinary functions, but Test2 ends up as > DECL_IGNORED_P = true, that happens between test.adb.052t.local-fnsummary2 > and test.adb.092t.fixup_cfg3: Ouch (bis). Quite unexpected that DECL_IGNORED_P is set out of nowhere. It's Identical Code Folding which turns Test2 into a thunk? > in test.adb.052t.local-fnsummary2 we have: > > integer test.test1 (integer x) > { > <bb 2> [local count: 1073741824]: > [test.adb:5:7] return x_1(D); > > } > > and > > integer test.test2 (integer x) > { > <bb 2> [local count: 1073741824]: > [test.adb:10:7] return x_1(D); > > } > > > but in test.adb.092t.fixup_cfg3 > > we have > > integer test.test1 (integer x) > { > <bb 2> [local count: 1073741824]: > [test.adb:5:7] return x_1(D); > > } > > and > > integer test.test2 (integer x) > { > integer D.4674; > integer retval.5; > integer _4; > > <bb 2> [local count: 1073741824]: > # DEBUG x => x_1(D) > _4 = x_1(D); > # DEBUG x => NULL > retval.5_2 = _4; > return retval.5_2; > > } > > > the line numbers are gone, and the function has DECL_IGNORED_P, > but still a useful DECL_SOURCE_LOCATION, I don't know > where the DECL_SOURCE_LOCATION can be seen in the dump files, > but from debugging this effect, I know that quite well. > > This second effect is why as a special case DECL_IGNORED_P functions > with valid looking DECL_SOURCE_LOCATION have now a .loc statement, > because that is less surprising to a user than having no line numbers > at all here. OK, thanks for the explanation, the patch is OK then. -- Eric Botcazou