OSDN Git Service

2001-08-10 Gunter Winkler gunter.winkler@mathematik.tu-chemnitz.de
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / porting.texi
1 \input texinfo
2
3 @c ---------------------------------------------------------------------
4 @c Prologue
5 @c ---------------------------------------------------------------------
6
7 @setfilename porting.info
8 @settitle Porting libstdc++-v3
9 @setchapternewpage odd
10
11 @ifinfo
12 This file explains how to port libstdc++-v3 (the GNU C++ library) to 
13 a new target.
14
15 Copyright (c) 2000, 2001 Free Software Foundation, Inc.
16 @end ifinfo
17
18 @c ---------------------------------------------------------------------
19 @c Titlepage
20 @c ---------------------------------------------------------------------
21
22 @titlepage
23 @title Porting libstdc++-v3
24 @author Mark Mitchell
25 @page
26 @vskip 0pt plus 1filll
27 Copyright @copyright{} 2000, 2001 Free Software Foundation, Inc.
28
29 Permission is granted to copy, distribute and/or modify this document
30 under the terms of the GNU Free Documentation License, Version 1.1 or
31 any later version published by the Free Software Foundation; with the
32 Invariant Sections being ``GNU General Public License'', the Front-Cover
33 texts being (a) (see below), and with the Back-Cover Texts being (b)
34 (see below).  A copy of the license is included in the section entitled
35 ``GNU Free Documentation License''.
36
37 (a) The FSF's Front-Cover Text is:
38
39      A GNU Manual
40
41 (b) The FSF's Back-Cover Text is:
42
43      You have freedom to copy and modify this GNU Manual, like GNU
44      software.  Copies published by the Free Software Foundation raise
45      funds for GNU development.
46 @end titlepage
47
48 @c ---------------------------------------------------------------------
49 @c Top
50 @c ---------------------------------------------------------------------
51
52 @node Top
53 @top Porting libstdc++-v3
54
55 This document explains how to port libstdc++-v3 (the GNU C++ library) to 
56 a new target.
57
58 In order to make the GNU C++ library (libstdc++-v3) work with a new
59 target, you must edit some configuration files and provide some new
60 header files.  
61
62 Before you get started, make sure that you have a working C library on
63 your target.  The C library need not precisely comply with any
64 particular standard, but should generally conform to the requirements
65 imposed by the ANSI/ISO standard.
66
67 In addition, you should try to verify that the C++ compiler generally
68 works.  It is difficult to test the C++ compiler without a working
69 library, but you should at least try some minimal test cases.
70
71 Here are the primary steps required to port the library:
72
73 @menu
74 * Operating system::    Configuring for your operating system.
75 * Character types::     Implementing character classification.
76 * Thread safety::       Implementing atomic operations.
77 * Libtool::             Using libtool.
78 * GNU Free Documentation License:: How you can copy and share this manual.
79 @end menu
80
81 @c ---------------------------------------------------------------------
82 @c Operating system
83 @c ---------------------------------------------------------------------
84
85 @node Operating system
86 @chapter Operating system
87
88 If you are porting to a new operating-system (as opposed to a new chip
89 using an existing operating system), you will need to create a new
90 directory in the @file{config/os} hierarchy.  For example, the IRIX
91 configuration files are all in @file{config/os/irix}.  There is no set
92 way to organize the OS configuration directory.  For example,
93 @file{config/os/solaris/solaris-2.6} and
94 @file{config/os/solaris/solaris-2.7} are used as configuration
95 directories for these two versions of Solaris.  On the other hand, both
96 Solaris 2.7 and Solaris 2.8 use the @file{config/os/solaris/solaris-2.7}
97 directory.  The important information is that there needs to be a
98 directory under @file{config/os} to store the files for your operating
99 system.
100
101 You'll have to change the @file{configure.target} file to ensure that
102 your new directory is activated.  Look for the switch statement that
103 sets @code{os_include_dir}, and add a pattern to handle your operating
104 system.  The switch statement switches on only the OS portion of the
105 standard target triplet; e.g., the @code{solaris2.8} in
106 @code{sparc-sun-solaris2.8}.
107
108 The first file to create in this directory, should be called
109 @file{bits/os_defines.h}.  This file contains basic macro definitions
110 that are required to allow the C++ library to work with your C library.
111 This file should provide macro definitions for @code{__off_t},
112 @code{__off64_t}, and @code{__ssize_t}.  Typically, this just looks
113 like:
114
115 @example
116 #define __off_t off_t
117 #define __off64_t off64_t
118 #define __ssize_t ssize_t
119 @end example
120
121 @noindent
122 You don't have to provide these definitions if your system library
123 already defines these types -- but the only library known to provide
124 these types is the GNU C Library, so you will almost certainly have to
125 provide these macros.  Note that this file does not have to include a
126 header file that defines @code{off_t}, or the other types; you simply
127 have to provide the macros.
128
129 In addition, several libstdc++-v3 source files unconditionally define
130 the macro @code{_POSIX_SOURCE}.  On many systems, defining this macro
131 causes large portions of the C library header files to be eliminated
132 at preprocessing time.  Therefore, you may have to @code{#undef} this
133 macro, or define other macros (like @code{_LARGEFILE_SOURCE} or
134 @code{__EXTENSIONS__}).  You won't know what macros to define or
135 undefine at this point; you'll have to try compiling the library and
136 seeing what goes wrong.  If you see errors about calling functions
137 that have not been declared, look in your C library headers to see if
138 the functions are declared there, and then figure out what macros you
139 need to define.  You will need to add them to the
140 @code{CPLUSPLUS_CPP_SPEC} macro in the GCC configuration file for your
141 target.  It will not work to simply define these macros in
142 @file{os_defines.h}.
143
144 At this time, there are two libstdc++-v3-specific macros which may be
145 defined.  @code{_G_USING_THUNKS} may be defined to 0 to express that the
146 port doesn't use thunks (although it is unclear that this is still
147 useful since libio support isn't currently working and the g++ v3 ABI
148 invalidates the assumption that some ports don't use thunks).
149 @code{_GLIBCPP_AVOID_FSEEK} may be defined if seeking on an interactive
150 stream (or one hooked to a pipe) is not allowed by the OS.  In this
151 case, getc()/ungetc() will be used at some key locations in the library
152 implementation instead of fseek().  Currently, the code path to avoid
153 fseek() is only enabled when the seek size is 1 character away from the
154 current stream position.  This is known to improve *-unknown-freebsd*
155 and sparc-sun-solaris2.*.
156
157 Finally, you should bracket the entire file in an include-guard, like
158 this:
159
160 @example
161 #ifndef _GLIBCPP_OS_DEFINES
162 #define _GLIBCPP_OS_DEFINES
163 ...
164 #endif
165 @end example
166
167 We recommend copying an existing @file{bits/os_defines.h} to use as a
168 starting point.
169
170 @c ---------------------------------------------------------------------
171 @c Character types
172 @c ---------------------------------------------------------------------
173
174 @node Character types
175 @chapter Character types
176
177 The library requires that you provide three header files to implement
178 character classification, analagous to that provided by the C libraries
179 @file{<ctype.h>} header.  You can model these on the files provided in
180 @file{config/os/generic/bits}.  However, these files will almost
181 certainly need some modification.
182
183 The first file to write is @file{bits/ctype_base.h}.  This file provides
184 some very basic information about character classification.  The libstdc++-v3
185 library assumes that your C library implements @file{<ctype.h>} by using
186 a table (indexed by character code) containing integers, where each of
187 these integers is a bit-mask indicating whether the charcter is
188 upper-case, lower-case, alphabetic, etc.  The @file{bits/ctype_base.h}
189 file gives the type of the integer, and the values of the various bit
190 masks.  You will have to peer at your own @file{<ctype.h>} to figure out
191 how to define the values required by this file.
192
193 The @file{bits/ctype_base.h} header file does not need include guards.
194 It should contain a single @code{struct} definition called
195 @code{ctype_base}.  This @code{struct} should contain two type
196 declarations, and one enumeration declaration, like this example, taken
197 from the IRIX configuration:
198
199 @example
200 struct ctype_base
201 @{
202   typedef unsigned int  mask;
203   typedef int*          __to_type;
204
205   enum
206   @{
207     space = _ISspace,
208     print = _ISprint,
209     cntrl = _IScntrl,
210     upper = _ISupper,
211     lower = _ISlower,
212     alpha = _ISalpha,
213     digit = _ISdigit,
214     punct = _ISpunct,
215     xdigit = _ISxdigit,
216     alnum = _ISalnum,
217     graph = _ISgraph
218   @};
219 @};
220 @end example
221
222 @noindent
223 The @code{mask} type is the type of the elements in the table.  If your
224 C library uses a table to map lower-case numbers to upper-case numbers,
225 and vice versa, you should define @code{__to_type} to be the type of the
226 elements in that table.  If you don't mind taking a minor performance
227 penalty, or if your library doesn't implement @code{toupper} and
228 @code{tolower} in this way, you can pick any pointer-to-integer type,
229 but you must still define the type.
230
231 The enumeration should give definitions for all the values in the above
232 example, using the values from your native @file{<ctype.h>}.  They can
233 be given symbolically (as above), or numerically, if you prefer.  You do
234 not have to include @file{<ctype.h>} in this header; it will always be
235 included before @file{bits/ctype_base.h} is included.
236
237 The next file to write is @file{bits/ctype_noninline.h}, which also does
238 not require include guards.  This file defines a few member functions
239 that will be included in @file{include/bits/locale_facets.h}.  The first
240 function that must be written is the @code{ctype<char>::ctype}
241 constructor.  Here is the IRIX example:
242
243 @example
244 ctype<char>::ctype(const mask* __table = 0, bool __del = false, 
245       size_t __refs = 0)
246   : _Ctype_nois<char>(__refs), _M_del(__table != 0 && __del), 
247     _M_toupper(NULL),
248     _M_tolower(NULL),
249     _M_ctable(NULL), 
250     _M_table(!__table
251              ? (const mask*) (__libc_attr._ctype_tbl->_class + 1)
252              : __table) 
253   @{ @}
254 @end example
255
256 @noindent
257 There are two parts of this that you might choose to alter. The first,
258 and most important, is the line involving @code{__libc_attr}.  That is
259 IRIX system-dependent code that gets the base of the table mapping
260 character codes to attributes.  You need to substitute code that obtains
261 the address of this table on your system.  If you want to use your
262 operating system's tables to map upper-case letters to lower-case, and
263 vice versa, you should initialize @code{_M_toupper} and
264 @code{_M_tolower} with those tables, in similar fashion.
265
266 Now, you have to write two functions to convert from upper-case to
267 lower-case, and vice versa.  Here are the IRIX versions:
268
269 @example
270 char
271 ctype<char>::do_toupper(char __c) const
272 @{ return _toupper(__c); @}
273
274 char
275 ctype<char>::do_tolower(char __c) const
276 @{ return _tolower(__c); @}
277 @end example
278
279 @noindent
280 Your C library provides equivalents to IRIX's @code{_toupper} and
281 @code{_tolower}.  If you initialized @code{_M_toupper} and
282 @code{_M_tolower} above, then you could use those tables instead.
283
284 Finally, you have to provide two utility functions that convert strings
285 of characters.  The versions provided here will always work -- but you
286 could use specialized routines for greater performance if you have
287 machinery to do that on your system:
288
289 @example
290 const char*
291 ctype<char>::do_toupper(char* __low, const char* __high) const
292 @{
293   while (__low < __high)
294     @{
295       *__low = do_toupper(*__low);
296       ++__low;
297     @}
298   return __high;
299 @}
300
301 const char* 
302 ctype<char>::do_tolower(char* __low, const char* __high) const
303 @{
304   while (__low < __high)
305     @{
306       *__low = do_tolower(*__low);
307       ++__low;
308     @}
309   return __high;
310 @}
311 @end example
312
313 You must also provide the @file{bits/ctype_inline.h} file, which
314 contains a few more functions.  On most systems, you can just copy
315 @file{config/os/generic/ctype_inline.h} and use it on your system.
316
317 In detail, the functions provided test characters for particular
318 properties; they are analagous to the functions like @code{isalpha} and
319 @code{islower} provided by the C library.
320
321 The first function is implemented like this on IRIX:
322
323 @example
324 bool
325 ctype<char>::
326 is(mask __m, char __c) const throw()
327 @{ return (_M_table)[(unsigned char)(__c)] & __m; @}
328 @end example
329
330 @noindent
331 The @code{_M_table} is the table passed in above, in the constructor.
332 This is the table that contains the bitmasks for each character.  The
333 implementation here should work on all systems.
334
335 The next function is:
336
337 @example
338 const char*
339 ctype<char>::
340 is(const char* __low, const char* __high, mask* __vec) const throw()
341 @{
342   while (__low < __high)
343     *__vec++ = (_M_table)[(unsigned char)(*__low++)];
344   return __high;
345 @}
346 @end example
347
348 @noindent
349 This function is similar; it copies the masks for all the characters
350 from @code{__low} up until @code{__high} into the vector given by
351 @code{__vec}.
352
353 The last two functions again are entirely generic:
354
355 @example
356 const char*
357 ctype<char>::
358 scan_is(mask __m, const char* __low, const char* __high) const throw()
359 @{
360   while (__low < __high && !this->is(__m, *__low))
361     ++__low;
362   return __low;
363 @}
364
365 const char*
366 ctype<char>::
367 scan_not(mask __m, const char* __low, const char* __high) const throw()
368 @{
369   while (__low < __high && this->is(__m, *__low))
370     ++__low;
371   return __low;
372 @}
373 @end example
374
375 @c ---------------------------------------------------------------------
376 @c Thread safety
377 @c ---------------------------------------------------------------------
378
379 @node Thread safety
380 @chapter Thread safety
381
382 The C++ library string functionality requires a couple of atomic
383 operations to provide thread-safety.  If you don't take any special
384 action, the library will use stub versions of these functions that are
385 not thread-safe.  They will work fine, unless your applications are
386 multi-threaded.
387
388 If you want to provide custom, safe, versions of these functions, there
389 are two distinct approaches.  One is to provide a version for your CPU,
390 using assembly language constructs.  The other is to use the
391 thread-safety primitives in your operating system.  In either case, you
392 make a file called @file{bits/atomicity.h}.  
393
394 If you are using the assembly-language approach, put this code in
395 @file{config/cpu/<chip>/bits/atomicity.h}, where chip is the name of
396 your processor.  In that case, edit the switch statement in
397 @file{configure.target} to set the @code{cpu_include_dir}.  In either
398 case, set the switch statement that sets @code{ATOMICITYH} to be the
399 directory containing @file{bits/atomicity.h}.
400
401 With those bits out of the way, you have to actually write
402 @file{bits/atomicity.h} itself.  This file should be wrapped in an
403 include guard named @code{_BITS_ATOMICITY_H}.  It should define one
404 type, and two functions.  
405
406 The type is @code{_Atomic_word}.  Here is the version used on IRIX:
407
408 @example
409 typedef long _Atomic_word;
410 @end example
411
412 @noindent
413 This type must be a signed integral type supporting atomic operations.
414 If you're using the OS approach, use the same type used by your system's
415 primitives.  Otherwise, use the type for which your CPU provides atomic
416 primitives.
417
418 Then, you must provide two functions.  The bodies of these functions
419 must be equivalent to those provided here, but using atomic operations:
420
421 @example
422 static inline _Atomic_word
423 __attribute__ ((__unused__))
424 __exchange_and_add (_Atomic_word* __mem, int __val)
425 @{
426   _Atomic_word __result = *__mem;
427   *__mem += __val;
428   return __result;
429 @}
430
431 static inline void
432 __attribute__ ((__unused__))
433 __atomic_add (_Atomic_word* __mem, int __val)
434 @{
435   *__mem += __val;
436 @}
437 @end example
438
439 @c ---------------------------------------------------------------------
440 @c Libtool
441 @c ---------------------------------------------------------------------
442
443 @node Libtool
444 @chapter Libtool
445
446 The C++ library is compiled, archived and linked with libtool.
447 Explaining the full workings of libtool is beyond the scope of this
448 document, but there are a few, particular bits that are necessary for
449 porting.
450
451 Some parts of the libstdc++-v3 library are compiled with the libtool
452 @code{--tags CXX} option (the C++ definitions for libtool).  Therefore,
453 @file{ltcf-cxx.sh} in the top-level directory needs to have the correct
454 logic to compile and archive objects equivalent to the C version of libtool,
455 @file{ltcf-c.sh}.  Some libtool targets have definitions for C but not
456 for C++, or C++ definitions which have not been kept up to date.
457
458 The C++ run-time library contains initialization code that needs to be
459 run as the library is loaded.  Often, that requires linking in special
460 object files when the C++ library is built as a shared library, or
461 taking other system-specific actions.
462
463 The libstdc++-v3 library is linked with the C version of libtool, even though it
464 is a C++ library.  Therefore, the C version of libtool needs to ensure
465 that the run-time library initializers are run.  The usual way to do
466 this is to build the library using @code{gcc -shared}.
467
468 If you need to change how the library is linked, look at
469 @file{ltcf-c.sh} in the top-level directory.  Find the switch statement
470 that sets @code{archive_cmds}.  Here, adjust the setting for your
471 operating system.
472
473 @c ---------------------------------------------------------------------
474 @c GFDL
475 @c ---------------------------------------------------------------------
476
477 @include fdl.texi
478
479 @c ---------------------------------------------------------------------
480 @c Epilogue
481 @c ---------------------------------------------------------------------
482
483 @contents
484 @bye