1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 2002-2023, Free Software Foundation, Inc. --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
17 -- for more details. You should have received a copy of the GNU General --
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
21 -- GNAT was originally developed by the GNAT team at New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
24 ------------------------------------------------------------------------------
26 with Debug
; use Debug
;
27 with Osint
; use Osint
;
28 with Osint
.C
; use Osint
.C
;
29 with Output
; use Output
;
30 with System
.OS_Lib
; use System
.OS_Lib
;
32 package body Sinput
.D
is
34 Dfile
: Source_File_Index
;
35 -- Index of currently active debug source file
37 ------------------------
38 -- Close_Debug_Source --
39 ------------------------
41 procedure Close_Debug_Source
is
43 SFR
: Source_File_Record
renames Source_File
.Table
(Dfile
);
44 Src
: Source_Buffer_Ptr
;
46 Trim_Lines_Table
(Dfile
);
49 -- Now we need to read the file that we wrote and store it in memory for
53 (SFR
.Full_Debug_Name
, SFR
.Source_First
, SFR
.Source_Last
, Src
, FD
);
54 SFR
.Source_Text
:= Src
;
55 pragma Assert
(SFR
.Source_Text
'First = SFR
.Source_First
);
56 pragma Assert
(SFR
.Source_Text
'Last = SFR
.Source_Last
);
57 end Close_Debug_Source
;
59 -------------------------
60 -- Create_Debug_Source --
61 -------------------------
63 procedure Create_Debug_Source
64 (Source
: Source_File_Index
;
69 ((Source_File
.Table
(Source_File
.Last
).Source_Last
+ Source_Align
) /
70 Source_Align
) * Source_Align
;
71 Source_File
.Append
(Source_File
.Table
(Source
));
72 Dfile
:= Source_File
.Last
;
75 S
: Source_File_Record
renames Source_File
.Table
(Dfile
);
79 S
.Full_Debug_Name
:= Create_Debug_File
(S
.File_Name
);
80 S
.Debug_Source_Name
:= Strip_Directory
(S
.Full_Debug_Name
);
81 S
.Source_Text
:= null;
82 S
.Source_First
:= Loc
;
84 S
.Lines_Table
:= null;
85 S
.Last_Source_Line
:= 1;
87 -- Allocate lines table, guess that it needs to be three times bigger
88 -- than the original source (in number of lines).
91 (S
, Int
(Source_File
.Table
(Source
).Last_Source_Line
* 3));
92 S
.Lines_Table
(1) := Loc
;
95 Write_Str
("Sinput.D.Create_Debug_Source: created source ");
96 Write_Int
(Int
(Dfile
));
98 Write_Str
(Get_Name_String
(S
.Full_Debug_Name
));
102 end Create_Debug_Source
;
104 ----------------------
105 -- Write_Debug_Line --
106 ----------------------
108 procedure Write_Debug_Line
(Str
: String; Loc
: in out Source_Ptr
) is
109 S
: Source_File_Record
renames Source_File
.Table
(Dfile
);
112 -- Ignore write request if null line at start of file
114 if Str
'Length = 0 and then Loc
= S
.Source_First
then
117 -- Here we write the line, compute the source location for the following
118 -- line, allocate its table entry, and update the source record entry.
121 Write_Debug_Info
(Str
(Str
'First .. Str
'Last - 1));
122 Loc
:= Loc
- 1 + Source_Ptr
(Str
'Length + Debug_File_Eol_Length
);
123 Add_Line_Tables_Entry
(S
, Loc
);
124 S
.Source_Last
:= Loc
;
125 Set_Source_File_Index_Table
(Dfile
);
127 end Write_Debug_Line
;