1 | The collector uses a large amount of conditional compilation in order to
|
---|
2 | deal with platform dependencies. This violates a number of known coding
|
---|
3 | standards. On the other hand, it seems to be the only practical way to
|
---|
4 | support this many platforms without excessive code duplication.
|
---|
5 |
|
---|
6 | A few guidelines have mostly been followed in order to keep this manageable:
|
---|
7 |
|
---|
8 | 1) #if and #ifdef directives are properly indented whenever easily possible.
|
---|
9 | All known C compilers allow whitespace between the "#" and the "if" to make
|
---|
10 | this possible. ANSI C also allows white space before the "#", though we
|
---|
11 | avoid that. It has the known disadvantages that it differs from the normal
|
---|
12 | GNU conventions, and that it makes patches larger than otherwise necessary.
|
---|
13 | In my opinion, it's still well worth it, for the same reason that we indent
|
---|
14 | ordinary "if" statements.
|
---|
15 |
|
---|
16 | 2) Whenever possible, tests are performed on the macros defined in gcconfig.h
|
---|
17 | instead of directly testing patform-specific predefined macros. This makes it
|
---|
18 | relatively easy to adapt to new compilers with a different set of predefined
|
---|
19 | macros. Currently these macros generally identify platforms instead of
|
---|
20 | features. In many cases, this is a mistake.
|
---|
21 |
|
---|
22 | 3) The code currently avoids #elif, eventhough that would make it more
|
---|
23 | readable. This was done since #elif would need to be understood by ALL
|
---|
24 | compilers used to build the collector, and that hasn't always been the case.
|
---|
25 | It makes sense to reconsider this decision at some point, since #elif has been
|
---|
26 | standardized at least since 1989.
|
---|
27 |
|
---|
28 | Many of the tested configuration macros are at least somewhat defined in
|
---|
29 | either include/private/gcconfig.h or in Makefile.direct. Here is an attempt
|
---|
30 | at defining some of the remainder: (Thanks to Walter Bright for suggesting
|
---|
31 | this. This is a work in progress)
|
---|
32 |
|
---|
33 | MACRO EXPLANATION
|
---|
34 | ----- -----------
|
---|
35 |
|
---|
36 | __DMC__ Always #define'd by the Digital Mars compiler. Expands
|
---|
37 | to the compiler version number in hex, i.e. 0x810 is
|
---|
38 | version 8.1b0
|
---|
39 |
|
---|
40 | _ENABLE_ARRAYNEW
|
---|
41 | #define'd by the Digital Mars C++ compiler when
|
---|
42 | operator new[] and delete[] are separately
|
---|
43 | overloadable. Used in gc_cpp.h.
|
---|
44 |
|
---|
45 | _MSC_VER Expands to the Visual C++ compiler version. Assumed to
|
---|
46 | not be defined for other compilers (at least if they behave
|
---|
47 | appreciably differently).
|
---|
48 |
|
---|
49 | _DLL Defined by Visual C++ if dynamic libraries are being built
|
---|
50 | or used. Used to test whether __declspec(dllimport) or
|
---|
51 | __declspec(dllexport) needs to be added to declarations
|
---|
52 | to support the case in which the collector is in a dll.
|
---|
53 |
|
---|
54 | GC_DLL User-settable macro that forces the effect of _DLL.
|
---|
55 |
|
---|
56 | GC_NOT_DLL User-settable macro that overrides _DLL, e.g. if dynamic
|
---|
57 | libraries are used, but the collector is in a static library.
|
---|
58 |
|
---|
59 | __STDC__ Assumed to be defined only by compilers that understand
|
---|
60 | prototypes and other C89 features. Its value is generally
|
---|
61 | not used, since we are fine with most nonconforming extensions.
|
---|
62 |
|
---|
63 | SUNOS5SIGS Solaris-like signal handling. This is probably misnamed,
|
---|
64 | since it really doesn't guarantee much more than Posix.
|
---|
65 | Currently set only for Solaris2.X, HPUX, and DRSNX. Should
|
---|
66 | probably be set for some other platforms.
|
---|
67 |
|
---|
68 | PCR Set if the collector is being built as part of the Xerox
|
---|
69 | Portable Common Runtime.
|
---|
70 |
|
---|
71 | SRC_M3 Set if the collector is being built as a replacement of the
|
---|
72 | one in the DEC/Compaq SRC Modula-3 runtime. I suspect this
|
---|
73 | was last used around 1994, and no doubt broke a long time ago.
|
---|
74 | It's there primarily incase someone wants to port to a similar
|
---|
75 | system.
|
---|
76 |
|
---|
77 |
|
---|
78 |
|
---|