OSDN Git Service

3bf6c5030b0d424db663baf8cf366312b6b22298
[pf3gnuchains/pf3gnuchains3x.git] / gold / parameters.h
1 // parameters.h -- general parameters for a link using gold  -*- C++ -*-
2
3 // Copyright 2006, 2007 Free Software Foundation, Inc.
4 // Written by Ian Lance Taylor <iant@google.com>.
5
6 // This file is part of gold.
7
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 3 of the License, or
11 // (at your option) any later version.
12
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 // MA 02110-1301, USA.
22
23 #ifndef GOLD_PARAMETERS_H
24 #define GOLD_PARAMETERS_H
25
26 namespace gold
27 {
28
29 class General_options;
30 class Errors;
31 class Target;
32
33 // Here we define the Parameters class which simply holds simple
34 // general parameters which apply to the entire link.  We use a global
35 // variable for this.  This is in contrast to the General_options
36 // class, which holds the complete state of position independent
37 // command line options.  The hope is that Parameters will stay fairly
38 // simple, so that if this turns into a library it will be clear how
39 // these parameters should be set.
40
41 class Parameters
42 {
43  public:
44   Parameters(Errors*);
45
46   // Return the error object.
47   Errors*
48   errors() const
49   { return this->errors_; }
50
51   // Whether the options are valid.  This should not normally be
52   // called, but it is needed by gold_exit.
53   bool
54   options_valid() const
55   { return this->options_valid_; }
56
57   // Whether to use threads.
58   bool
59   threads() const
60   {
61     gold_assert(this->options_valid_);
62     return this->threads_;
63   }
64
65   // Return the output file name.
66   const char*
67   output_file_name() const
68   {
69     gold_assert(this->options_valid_);
70     return this->output_file_name_;
71   }
72
73   // Whether we are generating a regular executable.
74   bool
75   output_is_executable() const
76   {
77     gold_assert(this->output_file_type_ != OUTPUT_INVALID);
78     return this->output_file_type_ == OUTPUT_EXECUTABLE;
79   }
80
81   // Whether we are generating a shared library.
82   bool
83   output_is_shared() const
84   {
85     gold_assert(this->output_file_type_ != OUTPUT_INVALID);
86     return this->output_file_type_ == OUTPUT_SHARED;
87   }
88
89   // Whether we are generating an object file.
90   bool
91   output_is_object() const
92   {
93     gold_assert(this->output_file_type_ != OUTPUT_INVALID);
94     return this->output_file_type_ == OUTPUT_OBJECT;
95   }
96
97   // Whether we are generating position-independent output.
98   // This is the case when generating either a shared library
99   // or a regular executable with the --pic-executable option.
100   // FIXME: support --pic-executable
101   bool
102   output_is_position_independent() const
103   { return output_is_shared(); }
104
105   // The target system root directory.  This is NULL if there isn't
106   // one.
107   const std::string&
108   sysroot() const
109   {
110     gold_assert(this->options_valid_);
111     return this->sysroot_;
112   }
113
114   // Whether to strip all symbols.
115   bool
116   strip_all() const
117   {
118     gold_assert(this->strip_ != STRIP_INVALID);
119     return this->strip_ == STRIP_ALL;
120   }
121
122   // Whether to strip debugging information.
123   bool
124   strip_debug() const
125   {
126     gold_assert(this->strip_ != STRIP_INVALID);
127     return this->strip_ == STRIP_ALL || this->strip_ == STRIP_DEBUG;
128   }
129
130   // Whether to strip debugging information that's not used by gdb.
131   bool
132   strip_debug_gdb() const
133   {
134     gold_assert(this->strip_ != STRIP_INVALID);
135     return this->strip_debug() || this->strip_ == STRIP_DEBUG_UNUSED_BY_GDB;
136   }
137
138   // Whether to permit unresolved references from shared libraries.
139   bool
140   allow_shlib_undefined() const
141   {
142     gold_assert(this->options_valid_);
143     return this->allow_shlib_undefined_;
144   }
145
146   // Whether we are doing a symbolic link, in which all defined
147   // symbols are bound locally.
148   bool
149   Bsymbolic() const
150   {
151     gold_assert(this->options_valid_);
152     return this->symbolic_;
153   }
154
155   // Whether we should demangle C++ symbols in our log messages.
156   bool
157   demangle() const
158   { return this->demangle_; }
159
160   // Whether we should try to detect violations of the One Definition Rule.
161   bool
162   detect_odr_violations() const
163   {
164     gold_assert(this->options_valid_);
165     return this->detect_odr_violations_;
166   }
167
168   // The general linker optimization level (-O).
169   int
170   optimize() const
171   {
172     gold_assert(this->options_valid_);
173     return this->optimization_level_;
174   }
175
176   // Whether the -E/--export-dynamic flag is set.
177   bool
178   export_dynamic() const
179   {
180     gold_assert(this->options_valid_);
181     return this->export_dynamic_;
182   }
183
184   // Return the debug flags.  These are the flags for which we should
185   // report internal debugging information.
186   unsigned int
187   debug() const
188   {
189     gold_assert(this->options_valid_);
190     return this->debug_;
191   }
192
193   // Whether we are doing a static link--a link in which none of the
194   // input files are shared libraries.  This is only known after we
195   // have seen all the input files.
196   bool
197   doing_static_link() const
198   {
199     gold_assert(this->is_doing_static_link_valid_);
200     return this->doing_static_link_;
201   }
202
203   // Return whether the target field has been set.
204   bool
205   is_target_valid() const
206   { return this->is_target_valid_; }
207
208   // The target of the output file we are generating.
209   Target*
210   target() const
211   {
212     gold_assert(this->is_target_valid_);
213     return this->target_;
214   }
215
216   // The size of the output file we are generating.  This should
217   // return 32 or 64.
218   int
219   get_size() const
220   {
221     gold_assert(this->is_target_valid_);
222     return this->size_;
223   }
224
225   // Whether the output is big endian.
226   bool
227   is_big_endian() const
228   {
229     gold_assert(this->is_target_valid_);
230     return this->is_big_endian_;
231   }
232
233   // Set values recorded from options.
234   void
235   set_from_options(const General_options*);
236
237   // Set whether we are doing a static link.
238   void
239   set_doing_static_link(bool doing_static_link);
240
241   // Set the target.
242   void
243   set_target(Target* target);
244
245  private:
246   // The types of output files.
247   enum Output_file_type
248     {
249       // Uninitialized.
250       OUTPUT_INVALID,
251       // Generating executable.
252       OUTPUT_EXECUTABLE,
253       // Generating shared library.
254       OUTPUT_SHARED,
255       // Generating object file.
256       OUTPUT_OBJECT
257     };
258
259   // Which symbols to strip.
260   enum Strip
261   {
262     // Uninitialize.
263     STRIP_INVALID,
264     // Don't strip any symbols.
265     STRIP_NONE,
266     // Strip all symbols.
267     STRIP_ALL,
268     // Strip debugging information.
269     STRIP_DEBUG,
270     // Strip debugging information that's not used by gdb (at least <= 6.7)
271     STRIP_DEBUG_UNUSED_BY_GDB
272   };
273
274   // A pointer to the error handling object.
275   Errors* errors_;
276
277   // Whether the fields set from the options are valid.
278   bool options_valid_;
279   // Whether to use threads.
280   bool threads_;
281   // The output file name.
282   const char* output_file_name_;
283   // The type of the output file.
284   Output_file_type output_file_type_;
285   // The target system root directory.
286   std::string sysroot_;
287   // Which symbols to strip.
288   Strip strip_;
289   // Whether to allow undefined references from shared libraries.
290   bool allow_shlib_undefined_;
291   // Whether we are doing a symbolic link.
292   bool symbolic_;
293   // Whether we should demangle C++ symbols in our log messages.
294   bool demangle_;
295   // Whether we try to detect One Definition Rule violations.
296   bool detect_odr_violations_;
297   // The optimization level.
298   int optimization_level_;
299   // Whether the -E/--export-dynamic flag is set.
300   bool export_dynamic_;
301   // The debug flags.
302   unsigned int debug_;
303
304   // Whether the doing_static_link_ field is valid.
305   bool is_doing_static_link_valid_;
306   // Whether we are doing a static link.
307   bool doing_static_link_;
308   // Whether the target_ field is valid.
309   bool is_target_valid_;
310   // The target.
311   Target* target_;
312   // The size of the output file--32 or 64.
313   int size_;
314   // Whether the output file is big endian.
315   bool is_big_endian_;
316 };
317
318 // This is a global variable.
319 extern const Parameters* parameters;
320
321 // Initialize the global variable.
322 extern void initialize_parameters(Errors*);
323
324 // Set the options.
325 extern void set_parameters_from_options(const General_options*);
326
327 // Set the target recorded in the global parameters variable.
328 extern void set_parameters_target(Target* target);
329
330 // Set whether we are doing a static link.
331 extern void set_parameters_doing_static_link(bool doing_static_link);
332
333 // Return whether we are doing a particular debugging type.  The
334 // argument is one of the flags from debug.h.
335
336 inline bool
337 is_debugging_enabled(unsigned int type)
338 { return (parameters->debug() & type) != 0; }
339
340 } // End namespace gold.
341
342 #endif // !defined(GOLD_PARAMETERS_H)