| The collector uses a large amount of conditional compilation in order to |
| deal with platform dependencies. This violates a number of known coding |
| standards. On the other hand, it seems to be the only practical way to |
| support this many platforms without excessive code duplication. |
| |
| A few guidelines have mostly been followed in order to keep this manageable: |
| |
| 1) #if and #ifdef directives are properly indented whenever easily possible. |
| All known C compilers allow whitespace between the "#" and the "if" to make |
| this possible. ANSI C also allows white space before the "#", though we |
| avoid that. It has the known disadvantages that it differs from the normal |
| GNU conventions, and that it makes patches larger than otherwise necessary. |
| In my opinion, it's still well worth it, for the same reason that we indent |
| ordinary "if" statements. |
| |
| 2) Whenever possible, tests are performed on the macros defined in gcconfig.h |
| instead of directly testing patform-specific predefined macros. This makes it |
| relatively easy to adapt to new compilers with a different set of predefined |
| macros. Currently these macros generally identify platforms instead of |
| features. In many cases, this is a mistake. |
| |
| 3) The code currently avoids #elif, eventhough that would make it more |
| readable. This was done since #elif would need to be understood by ALL |
| compilers used to build the collector, and that hasn't always been the case. |
| It makes sense to reconsider this decision at some point, since #elif has been |
| standardized at least since 1989. |
| |
| Many of the tested configuration macros are at least somewhat defined in |
| either include/private/gcconfig.h or in Makefile.direct. Here is an attempt |
| at defining some of the remainder: (Thanks to Walter Bright for suggesting |
| this. This is a work in progress) |
| |
| MACRO EXPLANATION |
| ----- ----------- |
| |
| __DMC__ Always #define'd by the Digital Mars compiler. Expands |
| to the compiler version number in hex, i.e. 0x810 is |
| version 8.1b0 |
| |
| _ENABLE_ARRAYNEW |
| #define'd by the Digital Mars C++ compiler when |
| operator new[] and delete[] are separately |
| overloadable. Used in gc_cpp.h. |
| |
| _MSC_VER Expands to the Visual C++ compiler version. Assumed to |
| not be defined for other compilers (at least if they behave |
| appreciably differently). |
| |
| _DLL Defined by Visual C++ if dynamic libraries are being built |
| or used. Used to test whether __declspec(dllimport) or |
| __declspec(dllexport) needs to be added to declarations |
| to support the case in which the collector is in a dll. |
| |
| GC_DLL User-settable macro that forces the effect of _DLL. Set |
| by gc.h if _DLL is defined and GC_NOT_DLL is undefined. |
| This is the macro that is tested internally to determine |
| whether the GC is in its own dynamic library. May need |
| to be set by clients before including gc.h. Note that |
| inside the GC implementation it indicates that the |
| collector is in its own dynamic library, should export |
| its symbols, etc. But in clients it indicates that the |
| GC resides in a different DLL, its entry points should |
| be referenced accordingly, and precautions may need to |
| be taken to properly deal with statically allocated |
| variables in the main program. Used only for MS Windows. |
| |
| GC_NOT_DLL User-settable macro that overrides _DLL, e.g. if dynamic |
| libraries are used, but the collector is in a static library. |
| |
| __STDC__ Assumed to be defined only by compilers that understand |
| prototypes and other C89 features. Its value is generally |
| not used, since we are fine with most nonconforming extensions. |
| |
| SUNOS5SIGS Solaris-like signal handling. This is probably misnamed, |
| since it really doesn't guarantee much more than Posix. |
| Currently set only for Solaris2.X, HPUX, and DRSNX. Should |
| probably be set for some other platforms. |
| |
| PCR Set if the collector is being built as part of the Xerox |
| Portable Common Runtime. |
| |
| SRC_M3 Set if the collector is being built as a replacement of the |
| one in the DEC/Compaq SRC Modula-3 runtime. I suspect this |
| was last used around 1994, and no doubt broke a long time ago. |
| It's there primarily incase someone wants to port to a similar |
| system. |
| |
| USE_COMPILER_TLS Assume the existence of __thread-style thread-local |
| storage. Set automatically for thread-local allocation with |
| the HP/UX vendor compiler. Usable with gcc on sufficiently |
| up-to-date ELF platforms. |
| |
| |
| |