annotate gcc/ada/vxlink-bind.adb @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 ------------------------------------------------------------------------------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 -- --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4 -- --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5 -- V X L I N K . B I N D --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 -- --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 -- B o d y --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 -- --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 -- Copyright (C) 2018, AdaCore --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 -- --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 -- for more details. You should have received a copy of the GNU General --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 -- --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 -- GNAT was originally developed by the GNAT team at New York University. --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 -- --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 ------------------------------------------------------------------------------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 pragma Ada_2012;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 with Ada.Text_IO; use Ada.Text_IO;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 with Ada.IO_Exceptions;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 with Ada.Strings.Fixed;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 with GNAT.Regpat; use GNAT.Regpat;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 package body VxLink.Bind is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 function Split_Lines (S : String) return Strings_List.Vector;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 function Split (S : String; C : Character) return Strings_List.Vector;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 function Parse_Nm_Output (S : String) return Symbol_Sets.Set;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 procedure Emit_Module_Dtor
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 (FP : File_Type);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 procedure Emit_CDtor
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 (FP : File_Type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 Var : String;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 Set : Symbol_Sets.Set);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 -----------------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 -- Split_Lines --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 -----------------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 function Split_Lines (S : String) return Strings_List.Vector
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 Last : Natural := S'First;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 Ret : Strings_List.Vector;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 begin
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 for J in S'Range loop
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 if S (J) = ASCII.CR
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 and then J < S'Last
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 and then S (J + 1) = ASCII.LF
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 Ret.Append (S (Last .. J - 1));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 Last := J + 2;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 elsif S (J) = ASCII.LF then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 Ret.Append (S (Last .. J - 1));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 Last := J + 1;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 end if;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 end loop;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 if Last <= S'Last then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 Ret.Append (S (Last .. S'Last));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 end if;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76 return Ret;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 end Split_Lines;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 -----------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80 -- Split --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 -----------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83 function Split (S : String; C : Character) return Strings_List.Vector
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84 is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85 Last : Natural := S'First;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 Ret : Strings_List.Vector;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87 begin
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88 for J in S'Range loop
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 if S (J) = C then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 if J > Last then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91 Ret.Append (S (Last .. J - 1));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92 end if;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 Last := J + 1;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95 end if;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 end loop;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98 if Last <= S'Last then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99 Ret.Append (S (Last .. S'Last));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100 end if;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102 return Ret;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103 end Split;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105 ---------------------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106 -- Parse_Nm_Output --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107 ---------------------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109 function Parse_Nm_Output (S : String) return Symbol_Sets.Set
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
110 is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
111 Nm_Regexp : constant Pattern_Matcher :=
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
112 Compile ("^[0-9A-Za-z]* ([a-zA-Z]) (.*)$");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
113 type CDTor_Type is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
114 (CTOR_Diab,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
115 CTOR_Gcc,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
116 DTOR_Diab,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
117 DTOR_Gcc);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
118 subtype CTOR_Type is CDTor_Type range CTOR_Diab .. CTOR_Gcc;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
119 CTOR_DIAB_Regexp : aliased constant Pattern_Matcher :=
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
120 Compile ("^__?STI__*([0-9]+)_");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
121 CTOR_GCC_Regexp : aliased constant Pattern_Matcher :=
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
122 Compile ("^__?GLOBAL_.I._*([0-9]+)_");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
123 DTOR_DIAB_Regexp : aliased constant Pattern_Matcher :=
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
124 Compile ("^__?STD__*([0-9]+)_");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
125 DTOR_GCC_Regexp : aliased constant Pattern_Matcher :=
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
126 Compile ("^__?GLOBAL_.D._*([0-9]+)_");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
127 type Regexp_Access is access constant Pattern_Matcher;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
128 CDTor_Regexps : constant array (CDTor_Type) of Regexp_Access :=
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
129 (CTOR_Diab => CTOR_DIAB_Regexp'Access,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
130 CTOR_Gcc => CTOR_GCC_Regexp'Access,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
131 DTOR_Diab => DTOR_DIAB_Regexp'Access,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
132 DTOR_Gcc => DTOR_GCC_Regexp'Access);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
133 Result : Symbol_Sets.Set;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
134
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
135 begin
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
136 for Line of Split_Lines (S) loop
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
137 declare
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
138 Sym : Symbol;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
139 Nm_Grps : Match_Array (0 .. 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
140 Ctor_Grps : Match_Array (0 .. 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
141 begin
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
142 Match (Nm_Regexp, Line, Nm_Grps);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
143
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
144 if Nm_Grps (0) /= No_Match then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
145 declare
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
146 Sym_Type : constant Character :=
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
147 Line (Nm_Grps (1).First);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
148 Sym_Name : constant String :=
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
149 Line (Nm_Grps (2).First .. Nm_Grps (2).Last);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
150 begin
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
151 Sym :=
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
152 (Name => To_Unbounded_String (Sym_Name),
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
153 Cat => Sym_Type,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
154 Internal => False,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
155 Kind => Sym_Other,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
156 Priority => -1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
157
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
158 for J in CDTor_Regexps'Range loop
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
159 Match (CDTor_Regexps (J).all, Sym_Name, Ctor_Grps);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
160
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
161 if Ctor_Grps (0) /= No_Match then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
162 if J in CTOR_Type then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
163 Sym.Kind := Sym_Ctor;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
164 else
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
165 Sym.Kind := Sym_Dtor;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
166 end if;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
167
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
168 Sym.Priority := Integer'Value
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
169 (Line (Ctor_Grps (1).First .. Ctor_Grps (1).Last));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
170
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
171 exit;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
172 end if;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
173 end loop;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
174
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
175 Result.Include (Sym);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
176 end;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
177 end if;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
178 end;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
179 end loop;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
180
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
181 return Result;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
182 end Parse_Nm_Output;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
183
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
184 ----------------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
185 -- Initialize --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
186 ----------------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
187
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
188 procedure Initialize
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
189 (Binder : out VxLink_Binder;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
190 Object_File : String)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
191 is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
192 Args : Arguments_List;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
193 Module_Dtor_Not_Needed : Boolean := False;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
194 Module_Dtor_Needed : Boolean := False;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
195
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
196 begin
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
197 Args.Append (Nm);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
198 Args.Append (Object_File);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
199
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
200 declare
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
201 Output : constant String := Run (Args);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
202 Symbols : Symbol_Sets.Set;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
203 begin
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
204 if Is_Error_State then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
205 return;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
206 end if;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
207
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
208 Symbols := Parse_Nm_Output (Output);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
209
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
210 for Sym of Symbols loop
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
211 if Sym.Kind = Sym_Ctor then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
212 Binder.Constructors.Insert (Sym);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
213 elsif Sym.Kind = Sym_Dtor then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
214 Binder.Destructors.Insert (Sym);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
215 elsif Match ("_?__.*_atexit$", To_String (Sym.Name)) then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
216 if Sym.Cat = 'T' then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
217 Module_Dtor_Not_Needed := True;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
218 elsif Sym.Cat = 'U' then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
219 Module_Dtor_Needed := True;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
220 end if;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
221 end if;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
222 end loop;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
223
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
224 Binder.Module_Dtor_Needed :=
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
225 not Module_Dtor_Not_Needed and then Module_Dtor_Needed;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
226 end;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
227 end Initialize;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
228
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
229 --------------------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
230 -- Parse_Tag_File --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
231 --------------------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
232
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
233 procedure Parse_Tag_File
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
234 (Binder : in out VxLink_Binder;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
235 File : String)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
236 is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
237 FP : Ada.Text_IO.File_Type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
238
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
239 begin
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
240 Open
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
241 (FP,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
242 Mode => In_File,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
243 Name => File);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
244 loop
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
245 declare
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
246 Line : constant String :=
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
247 Ada.Strings.Fixed.Trim
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
248 (Get_Line (FP), Ada.Strings.Both);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
249 Tokens : Strings_List.Vector;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
250
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
251 begin
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
252 if Line'Length = 0 then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
253 -- Skip empty lines
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
254 null;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
255
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
256 elsif Line (Line'First) = '#' then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
257 -- Skip comment
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
258 null;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
259
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
260 else
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
261 Tokens := Split (Line, ' ');
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
262 if Tokens.First_Element = "section" then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
263 -- Sections are not used for tags, only when building
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
264 -- kernels. So skip for now
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
265 null;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
266 else
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
267 Binder.Tags_List.Append (Line);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
268 end if;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
269 end if;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
270 end;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
271 end loop;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
272
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
273 exception
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
274 when Ada.IO_Exceptions.End_Error =>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
275 Close (FP);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
276 when others =>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
277 Log_Error ("Cannot open file " & File &
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
278 ". DKM tags won't be generated");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
279 end Parse_Tag_File;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
280
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
281 ----------------------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
282 -- Emit_Module_Dtor --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
283 ----------------------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
284
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
285 procedure Emit_Module_Dtor
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
286 (FP : File_Type)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
287 is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
288 Dtor_Name : constant String := "_GLOBAL__D_65536_0_cxa_finalize";
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
289 begin
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
290 Put_Line (FP, "extern void __cxa_finalize(void *);");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
291 Put_Line (FP, "static void " & Dtor_Name & "()");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
292 Put_Line (FP, "{");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
293 Put_Line (FP, " __cxa_finalize(&__dso_handle);");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
294 Put_Line (FP, "}");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
295 Put_Line (FP, "");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
296 end Emit_Module_Dtor;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
297
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
298 ----------------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
299 -- Emit_CDtor --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
300 ----------------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
301
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
302 procedure Emit_CDtor
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
303 (FP : File_Type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
304 Var : String;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
305 Set : Symbol_Sets.Set)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
306 is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
307 begin
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
308 for Sym of Set loop
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
309 if not Sym.Internal then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
310 Put_Line (FP, "extern void " & To_String (Sym.Name) & "();");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
311 end if;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
312 end loop;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
313
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
314 New_Line (FP);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
315
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
316 Put_Line (FP, "extern void (*" & Var & "[])();");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
317 Put_Line (FP, "void (*" & Var & "[])() =");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
318 Put_Line (FP, " {");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
319 for Sym of Set loop
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
320 Put_Line (FP, " " & To_String (Sym.Name) & ",");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
321 end loop;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
322 Put_Line (FP, " 0};");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
323 New_Line (FP);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
324 end Emit_CDtor;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
325
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
326 ---------------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
327 -- Emit_CTDT --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
328 ---------------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
329
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
330 procedure Emit_CTDT
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
331 (Binder : in out VxLink_Binder;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
332 Namespace : String)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
333 is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
334 FP : Ada.Text_IO.File_Type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
335 CDtor_File : constant String := Namespace & "-cdtor.c";
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
336 begin
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
337 Binder.CTDT_File := To_Unbounded_String (CDtor_File);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
338 Create
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
339 (File => FP,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
340 Name => CDtor_File);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
341 Put_Line (FP, "#if defined(_HAVE_TOOL_XTORS)");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
342 Put_Line (FP, "#include <vxWorks.h>");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
343 if Binder.Module_Dtor_Needed then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
344 Put_Line (FP, "#define _WRS_NEED_CALL_CXA_FINALIZE");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
345 end if;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
346 Put_Line (FP, "#include TOOL_HEADER (toolXtors.h)");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
347 Put_Line (FP, "#else");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
348 Put_Line (FP, "");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
349
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
350 if Binder.Module_Dtor_Needed then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
351 Emit_Module_Dtor (FP);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
352 end if;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
353
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
354 Emit_CDtor (FP, "_ctors", Binder.Constructors);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
355 Emit_CDtor (FP, "_dtors", Binder.Destructors);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
356
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
357 Put_Line (FP, "#endif");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
358
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
359 if not Binder.Tags_List.Is_Empty then
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
360 New_Line (FP);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
361 Put_Line (FP, "/* build variables */");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
362 Put_Line (FP, "__asm("" .section \"".wrs_build_vars\"",\""a\"""");");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
363 for Tag of Binder.Tags_List loop
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
364 Put_Line (FP, "__asm("" .ascii \""" & Tag & "\"""");");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
365 Put_Line (FP, "__asm("" .byte 0"");");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
366 end loop;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
367 Put_Line (FP, "__asm("" .ascii \""end\"""");");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
368 Put_Line (FP, "__asm("" .byte 0"");");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
369 end if;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
370
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
371 Close (FP);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
372
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
373 exception
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
374 when others =>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
375 Close (FP);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
376 Set_Error_State ("Internal error");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
377 raise;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
378 end Emit_CTDT;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
379
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
380 ---------------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
381 -- CTDT_File --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
382 ---------------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
383
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
384 function CTDT_File (Binder : VxLink_Binder) return String
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
385 is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
386 begin
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
387 return To_String (Binder.CTDT_File);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
388 end CTDT_File;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
389
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
390 end VxLink.Bind;