1------------------------------------------------------------------------------ 2-- -- 3-- GNAT COMPILER COMPONENTS -- 4-- -- 5-- S I N P U T . D -- 6-- -- 7-- B o d y -- 8-- -- 9-- Copyright (C) 2002-2003, Free Software Foundation, Inc. -- 10-- -- 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 2, 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 COPYING. If not, write -- 19-- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, -- 20-- MA 02111-1307, USA. -- 21-- -- 22-- GNAT was originally developed by the GNAT team at New York University. -- 23-- Extensive contributions were provided by Ada Core Technologies Inc. -- 24-- -- 25------------------------------------------------------------------------------ 26 27with Osint; use Osint; 28with Osint.C; use Osint.C; 29 30package body Sinput.D is 31 32 Dfile : Source_File_Index; 33 -- Index of currently active debug source file 34 35 ------------------------ 36 -- Close_Debug_Source -- 37 ------------------------ 38 39 procedure Close_Debug_Source is 40 S : Source_File_Record renames Source_File.Table (Dfile); 41 Src : Source_Buffer_Ptr; 42 43 begin 44 Trim_Lines_Table (Dfile); 45 Close_Debug_File; 46 47 -- Now we need to read the file that we wrote and store it 48 -- in memory for subsequent access. 49 50 Read_Source_File 51 (S.Full_Debug_Name, S.Source_First, S.Source_Last, Src); 52 S.Source_Text := Src; 53 Set_Source_File_Index_Table (Dfile); 54 end Close_Debug_Source; 55 56 ------------------------- 57 -- Create_Debug_Source -- 58 ------------------------- 59 60 procedure Create_Debug_Source 61 (Source : Source_File_Index; 62 Loc : out Source_Ptr) 63 is 64 begin 65 Loc := Source_File.Table (Source_File.Last).Source_Last + 1; 66 Source_File.Increment_Last; 67 Dfile := Source_File.Last; 68 69 declare 70 S : Source_File_Record renames Source_File.Table (Dfile); 71 72 begin 73 S := Source_File.Table (Source); 74 S.Full_Debug_Name := Create_Debug_File (S.File_Name); 75 S.Debug_Source_Name := Strip_Directory (S.Full_Debug_Name); 76 S.Source_First := Loc; 77 S.Source_Last := Loc; 78 S.Lines_Table := null; 79 S.Last_Source_Line := 1; 80 81 -- Allocate lines table, guess that it needs to be three times 82 -- bigger than the original source (in number of lines). 83 84 Alloc_Line_Tables 85 (S, Int (Source_File.Table (Source).Last_Source_Line * 3)); 86 S.Lines_Table (1) := Loc; 87 end; 88 end Create_Debug_Source; 89 90 ---------------------- 91 -- Write_Debug_Line -- 92 ---------------------- 93 94 procedure Write_Debug_Line (Str : String; Loc : in out Source_Ptr) is 95 S : Source_File_Record renames Source_File.Table (Dfile); 96 97 begin 98 -- Ignore write request if null line at start of file 99 100 if Str'Length = 0 and then Loc = S.Source_First then 101 return; 102 103 -- Here we write the line, compute the source location for the 104 -- following line, allocate its table entry, and update the source 105 -- record entry. 106 107 else 108 Write_Debug_Info (Str (Str'First .. Str'Last - 1)); 109 Loc := Loc - 1 + Source_Ptr (Str'Length + Debug_File_Eol_Length); 110 Add_Line_Tables_Entry (S, Loc); 111 S.Source_Last := Loc; 112 end if; 113 end Write_Debug_Line; 114 115end Sinput.D; 116