| 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.  Set | 
|---|
| 55 | by gc.h if _DLL is defined and GC_NOT_DLL is undefined. | 
|---|
| 56 | This is the macro that is tested internally to determine | 
|---|
| 57 | whether the GC is in its own dynamic library.  May need | 
|---|
| 58 | to be set by clients before including gc.h.  Note that | 
|---|
| 59 | inside the GC implementation it indicates that the | 
|---|
| 60 | collector is in its own dynamic library, should export | 
|---|
| 61 | its symbols, etc.  But in clients it indicates that the | 
|---|
| 62 | GC resides in a different DLL, its entry points should | 
|---|
| 63 | be referenced accordingly, and precautions may need to | 
|---|
| 64 | be taken to properly deal with statically allocated | 
|---|
| 65 | variables in the main program.  Used only for MS Windows. | 
|---|
| 66 |  | 
|---|
| 67 | GC_NOT_DLL      User-settable macro that overrides _DLL, e.g. if dynamic | 
|---|
| 68 | libraries are used, but the collector is in a static library. | 
|---|
| 69 |  | 
|---|
| 70 | __STDC__        Assumed to be defined only by compilers that understand | 
|---|
| 71 | prototypes and other C89 features.  Its value is generally | 
|---|
| 72 | not used, since we are fine with most nonconforming extensions. | 
|---|
| 73 |  | 
|---|
| 74 | SUNOS5SIGS      Solaris-like signal handling.  This is probably misnamed, | 
|---|
| 75 | since it really doesn't guarantee much more than Posix. | 
|---|
| 76 | Currently set only for Solaris2.X, HPUX, and DRSNX.  Should | 
|---|
| 77 | probably be set for some other platforms. | 
|---|
| 78 |  | 
|---|
| 79 | PCR             Set if the collector is being built as part of the Xerox | 
|---|
| 80 | Portable Common Runtime. | 
|---|
| 81 |  | 
|---|
| 82 | SRC_M3          Set if the collector is being built as a replacement of the | 
|---|
| 83 | one in the DEC/Compaq SRC Modula-3 runtime.  I suspect this | 
|---|
| 84 | was last used around 1994, and no doubt broke a long time ago. | 
|---|
| 85 | It's there primarily incase someone wants to port to a similar | 
|---|
| 86 | system. | 
|---|
| 87 |  | 
|---|
| 88 | USE_COMPILER_TLS  Assume the existence of __thread-style thread-local | 
|---|
| 89 | storage.  Set automatically for thread-local allocation with | 
|---|
| 90 | the HP/UX vendor compiler.  Usable with gcc on sufficiently | 
|---|
| 91 | up-to-date ELF platforms. | 
|---|
| 92 |  | 
|---|
| 93 |  | 
|---|
| 94 |  | 
|---|