Annotation of gcc/config/i386rose.h, revision 1.1.1.4

1.1       root        1: /* Definitions of target machine for GNU compiler.
1.1.1.4 ! root        2:    Intel 386 (OSF/1 with OSF/rose) version.
1.1       root        3:    Copyright (C) 1991 Free Software Foundation, Inc.
                      4: 
                      5: This file is part of GNU CC.
                      6: 
                      7: GNU CC is free software; you can redistribute it and/or modify
                      8: it under the terms of the GNU General Public License as published by
                      9: the Free Software Foundation; either version 2, or (at your option)
                     10: any later version.
                     11: 
                     12: GNU CC is distributed in the hope that it will be useful,
                     13: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15: GNU General Public License for more details.
                     16: 
                     17: You should have received a copy of the GNU General Public License
                     18: along with GNU CC; see the file COPYING.  If not, write to
                     19: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     20: 
1.1.1.4 ! root       21: /* Put leading underscores in front of names. */
        !            22: #define YES_UNDERSCORES
        !            23: 
1.1.1.3   root       24: #include "halfpic.h"
1.1.1.4 ! root       25: #include "i386gstabs.h"
1.1       root       26: 
                     27: #define OSF_OS
                     28: 
1.1.1.4 ! root       29: #undef  WORD_SWITCH_TAKES_ARG
        !            30: #define WORD_SWITCH_TAKES_ARG(STR)                                     \
        !            31:  (!strcmp (STR, "Tdata") || !strcmp (STR, "Ttext")                     \
        !            32:   || !strcmp (STR, "Tbss") || !strcmp (STR, "include")                 \
        !            33:   || !strcmp (STR, "imacros") || !strcmp (STR, "aux-info")             \
        !            34:   || !strcmp (STR, "pic-names"))
        !            35: 
        !            36: #define MASK_HALF_PIC          0x40000000      /* Mask for half-pic code */
        !            37: #define MASK_HALF_PIC_DEBUG    0x20000000      /* Debug flag */
        !            38: 
        !            39: #define TARGET_HALF_PIC        (target_flags & MASK_HALF_PIC)
        !            40: #define TARGET_DEBUG   (target_flags & MASK_HALF_PIC_DEBUG)
        !            41: #define HALF_PIC_DEBUG TARGET_DEBUG
1.1.1.3   root       42: 
1.1.1.4 ! root       43: #undef SUBTARGET_SWITCHES
1.1.1.3   root       44: #define SUBTARGET_SWITCHES \
1.1.1.4 ! root       45:      { "half-pic",      MASK_HALF_PIC},                                \
        !            46:      { "no-half-pic",  -MASK_HALF_PIC},                                \
        !            47:      { "debugb",        MASK_HALF_PIC_DEBUG},
        !            48: 
1.1       root       49: /* Prefix that appears before all global/static identifiers, except for
                     50:    temporary labels.  */
                     51: 
                     52: #define IDENTIFIER_PREFIX "_"
                     53: 
                     54: /* Suffix that appears after all global/static identifiers, except for
                     55:    temporary labels.  */
                     56: 
                     57: #define IDENTIFIER_SUFFIX ""
                     58: 
                     59: /* Change default predefines.  */
1.1.1.4 ! root       60: #undef CPP_PREDEFINES
1.1       root       61: #define CPP_PREDEFINES "-DOSF -DOSF1 -Dunix -Di386"
                     62: 
                     63: #undef  CPP_SPEC
                     64: #define CPP_SPEC "\
                     65: %{.S:  -D__LANGUAGE_ASSEMBLY %{!ansi:-DLANGUAGE_ASSEMBLY}} \
                     66: %{.cc: -D__LANGUAGE_C_PLUS_PLUS} \
                     67: %{.cxx:        -D__LANGUAGE_C_PLUS_PLUS} \
                     68: %{.C:  -D__LANGUAGE_C_PLUS_PLUS} \
                     69: %{.m:  -D__LANGUAGE_OBJECTIVE_C} \
                     70: %{!.S: -D__LANGUAGE_C %{!ansi:-DLANGUAGE_C}}"
                     71: 
1.1.1.4 ! root       72: /* Turn on -mpic-extern by default.  */
1.1       root       73: #undef  CC1_SPEC
1.1.1.4 ! root       74: #define CC1_SPEC "\
        !            75: %{gline:%{!g:%{!g0:%{!g1:%{!g2: -g1}}}}} \
        !            76: %{pic-none:   -mno-half-pic} \
        !            77: %{pic-lib:    -mhalf-pic} \
        !            78: %{pic-extern: -mhalf-pic} \
        !            79: %{pic-calls:  -mhalf-pic} \
        !            80: %{pic-names*: -mhalf-pic} \
        !            81: %{!pic-*:     -mhalf-pic}"
1.1       root       82: 
1.1.1.4 ! root       83: #undef ASM_SPEC
1.1       root       84: #define ASM_SPEC       ""
                     85: 
                     86: #undef  LINK_SPEC
                     87: #define LINK_SPEC      "%{v*: -v}                           \
1.1.1.3   root       88:                       %{!noshrlib: %{pic-none: -noshrlib} %{!pic-none: -warn_nopic}} \
                     89:                       %{nostdlib} %{noshrlib} %{glue}"
1.1       root       90: 
                     91: #undef  LIB_SPEC
1.1.1.3   root       92: #define LIB_SPEC "-lc"
1.1       root       93: 
                     94: #undef  LIBG_SPEC
1.1.1.4 ! root       95: #define LIBG_SPEC ""
1.1       root       96: 
                     97: #undef  STARTFILE_SPEC
                     98: #define STARTFILE_SPEC "%{pg:gcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}}"
                     99: 
1.1.1.4 ! root      100: #undef TARGET_VERSION_INTERNAL
        !           101: #undef TARGET_VERSION
1.1       root      102: 
1.1.1.4 ! root      103: #define I386_VERSION " 80386, OSF/rose objects"
        !           104: 
        !           105: #define TARGET_VERSION_INTERNAL(STREAM) fputs (I386_VERSION, STREAM)
        !           106: #define TARGET_VERSION TARGET_VERSION_INTERNAL (stderr)
1.1       root      107: 
                    108: #undef  MD_EXEC_PREFIX
                    109: #define MD_EXEC_PREFIX         "/usr/ccs/gcc/"
                    110: 
                    111: #undef  MD_STARTFILE_PREFIX
                    112: #define MD_STARTFILE_PREFIX    "/usr/ccs/lib/"
                    113: 
1.1.1.4 ! root      114: /* Specify size_t, ptrdiff_t, and wchar_t types.  */
        !           115: #undef SIZE_TYPE
        !           116: #undef PTRDIFF_TYPE
        !           117: #undef WCHAR_TYPE
        !           118: #undef WCHAR_TYPE_SIZE
        !           119: 
        !           120: #define SIZE_TYPE      "long unsigned int"
        !           121: #define PTRDIFF_TYPE   "int"
        !           122: #define WCHAR_TYPE     "unsigned int"
        !           123: #define WCHAR_TYPE_SIZE BITS_PER_WORD
        !           124: 
1.1       root      125: /* Tell final.c we don't need a label passed to mcount.  */
                    126: #define NO_PROFILE_DATA
                    127: 
                    128: #undef  FUNCTION_PROFILER
                    129: #define FUNCTION_PROFILER(FILE, LABELNO) fprintf (FILE, "\tcall _mcount\n")
                    130: 
1.1.1.3   root      131: /* Some machines may desire to change what optimizations are
                    132:    performed for various optimization levels.   This macro, if
                    133:    defined, is executed once just after the optimization level is
                    134:    determined and before the remainder of the command options have
                    135:    been parsed.  Values set in this macro are used as the default
                    136:    values for the other command line options.
                    137: 
                    138:    LEVEL is the optimization level specified; 2 if -O2 is
                    139:    specified, 1 if -O is specified, and 0 if neither is specified.  */
                    140: 
                    141: #define OPTIMIZATION_OPTIONS(LEVEL)                                    \
                    142: {                                                                      \
1.1.1.4 ! root      143:   flag_gnu_linker = FALSE;                                             \
1.1.1.3   root      144:                                                                        \
                    145:   if (LEVEL >= 3)                                                      \
1.1.1.4 ! root      146:     flag_inline_functions = TRUE;                                      \
1.1.1.3   root      147: }
                    148: 
                    149: /* A C expression that is 1 if the RTX X is a constant which is a
                    150:    valid address.  On most machines, this can be defined as
                    151:    `CONSTANT_P (X)', but a few machines are more restrictive in
                    152:    which constant addresses are supported.
                    153: 
                    154:    `CONSTANT_P' accepts integer-values expressions whose values are
                    155:    not explicitly known, such as `symbol_ref', `label_ref', and
                    156:    `high' expressions and `const' arithmetic expressions, in
                    157:    addition to `const_int' and `const_double' expressions.  */
                    158: 
1.1.1.4 ! root      159: #undef CONSTANT_ADDRESS_P
1.1.1.3   root      160: #define CONSTANT_ADDRESS_P(X)                                           \
                    161:   (CONSTANT_P (X) && (!HALF_PIC_P () || !HALF_PIC_ADDRESS_P (X)))
                    162: 
1.1.1.4 ! root      163: /* Nonzero if the constant value X is a legitimate general operand.
        !           164:    It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
        !           165: 
        !           166: #undef LEGITIMATE_CONSTANT_P
        !           167: #define LEGITIMATE_CONSTANT_P(X)                                       \
        !           168:   (!HALF_PIC_P ()                                                      \
        !           169:    || GET_CODE (X) == CONST_DOUBLE                                     \
        !           170:    || GET_CODE (X) == CONST_INT                                                \
        !           171:    || !HALF_PIC_ADDRESS_P (X))
        !           172: 
        !           173: /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
        !           174:    that is a valid memory address for an instruction.
        !           175:    The MODE argument is the machine mode for the MEM expression
        !           176:    that wants to use this address. */
        !           177: 
        !           178: #undef GO_IF_LEGITIMATE_ADDRESS
        !           179: #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR)                                \
        !           180: {                                                                      \
        !           181:   if (CONSTANT_P (X))                                                  \
        !           182:     {                                                                  \
        !           183:       if (! HALF_PIC_P () || ! HALF_PIC_ADDRESS_P (X))                 \
        !           184:        goto ADDR;                                                      \
        !           185:     }                                                                  \
        !           186:   else                                                                 \
        !           187:     {                                                                  \
        !           188:       GO_IF_INDEXING (X, ADDR);                                                \
        !           189:                                                                        \
        !           190:       if (GET_CODE (X) == PLUS)                                                \
        !           191:        {                                                               \
        !           192:          rtx x1 = XEXP (X, 1);                                         \
        !           193:                                                                        \
        !           194:          if (CONSTANT_P (x1))                                          \
        !           195:            {                                                           \
        !           196:              if (! HALF_PIC_P () || ! HALF_PIC_ADDRESS_P (x1))         \
        !           197:                {                                                       \
        !           198:                  rtx x0 = XEXP (X, 0);                                 \
        !           199:                  GO_IF_INDEXING (x0, ADDR);                            \
        !           200:                }                                                       \
        !           201:            }                                                           \
        !           202:        }                                                               \
        !           203:     }                                                                  \
        !           204: }
        !           205: 
        !           206: /* Sometimes certain combinations of command options do not make sense
        !           207:    on a particular target machine.  You can define a macro
        !           208:    `OVERRIDE_OPTIONS' to take account of this.  This macro, if
        !           209:    defined, is executed once just after all the command options have
        !           210:    been parsed.  */
        !           211: 
        !           212: #define OVERRIDE_OPTIONS                                               \
        !           213: {                                                                      \
        !           214:   if (TARGET_HALF_PIC)                                                 \
        !           215:     half_pic_init ();                                                  \
        !           216: }
        !           217: 
1.1.1.3   root      218: /* Define this macro if references to a symbol must be treated
                    219:    differently depending on something about the variable or
                    220:    function named by the symbol (such as what section it is in).
                    221: 
                    222:    The macro definition, if any, is executed immediately after the
                    223:    rtl for DECL has been created and stored in `DECL_RTL (DECL)'. 
                    224:    The value of the rtl will be a `mem' whose address is a
                    225:    `symbol_ref'.
                    226: 
                    227:    The usual thing for this macro to do is to a flag in the
                    228:    `symbol_ref' (such as `SYMBOL_REF_FLAG') or to store a modified
                    229:    name string in the `symbol_ref' (if one bit is not enough
                    230:    information).
                    231: 
                    232:    The best way to modify the name string is by adding text to the
                    233:    beginning, with suitable punctuation to prevent any ambiguity. 
                    234:    Allocate the new name in `saveable_obstack'.  You will have to
                    235:    modify `ASM_OUTPUT_LABELREF' to remove and decode the added text
                    236:    and output the name accordingly.
                    237: 
                    238:    You can also check the information stored in the `symbol_ref' in
                    239:    the definition of `GO_IF_LEGITIMATE_ADDRESS' or
                    240:    `PRINT_OPERAND_ADDRESS'. */
                    241: 
1.1.1.4 ! root      242: #undef ENCODE_SECTION_INFO
1.1.1.3   root      243: #define ENCODE_SECTION_INFO(DECL)                                      \
                    244: do                                                                     \
                    245:   {                                                                    \
                    246:    if (HALF_PIC_P ())                                                  \
                    247:       HALF_PIC_ENCODE (DECL);                                          \
                    248:   }                                                                    \
                    249: while (0)
                    250: 
                    251: 
1.1.1.4 ! root      252: /* Given a decl node or constant node, choose the section to output it in
        !           253:    and select that section.  */
        !           254: 
        !           255: #undef SELECT_RTX_SECTION
        !           256: #define SELECT_RTX_SECTION(MODE, RTX)                                  \
        !           257: do                                                                     \
        !           258:   {                                                                    \
        !           259:     if (MODE == Pmode && HALF_PIC_P () && HALF_PIC_ADDRESS_P (RTX))    \
        !           260:       data_section ();                                                 \
        !           261:     else                                                               \
        !           262:       readonly_data_section ();                                                \
        !           263:   }                                                                    \
        !           264: while (0)
        !           265: 
        !           266: #undef SELECT_SECTION
        !           267: #define SELECT_SECTION(DECL,RELOC)                                     \
        !           268: {                                                                      \
        !           269:   if (TREE_CODE (DECL) == STRING_CST)                                  \
        !           270:     {                                                                  \
        !           271:       if (flag_writable_strings)                                       \
        !           272:        data_section ();                                                \
        !           273:       else                                                             \
        !           274:        readonly_data_section ();                                       \
        !           275:     }                                                                  \
        !           276:   else if (TREE_CODE (DECL) != VAR_DECL)                               \
        !           277:     readonly_data_section ();                                          \
        !           278:   else if (!TREE_READONLY (DECL))                                      \
        !           279:     data_section ();                                                   \
        !           280:   else                                                                 \
        !           281:     readonly_data_section ();                                          \
        !           282: }
        !           283: 
        !           284: 
1.1.1.3   root      285: /* A C statement (sans semicolon) to output to the stdio stream
                    286:    STREAM any text necessary for declaring the name NAME of an
                    287:    initialized variable which is being defined.  This macro must
                    288:    output the label definition (perhaps using `ASM_OUTPUT_LABEL'). 
                    289:    The argument DECL is the `VAR_DECL' tree node representing the
                    290:    variable.
                    291: 
                    292:    If this macro is not defined, then the variable name is defined
                    293:    in the usual manner as a label (by means of `ASM_OUTPUT_LABEL').  */
                    294: 
1.1.1.4 ! root      295: #undef ASM_DECLARE_OBJECT_NAME
1.1.1.3   root      296: #define ASM_DECLARE_OBJECT_NAME(STREAM, NAME, DECL)                    \
                    297: do                                                                     \
                    298:  {                                                                     \
                    299:    ASM_OUTPUT_LABEL(STREAM,NAME);                                       \
                    300:    HALF_PIC_DECLARE (NAME);                                            \
                    301:  }                                                                     \
                    302: while (0)
                    303: 
                    304: /* This is how to declare a function name. */
                    305: 
                    306: #define ASM_DECLARE_FUNCTION_NAME(STREAM,NAME,DECL)                    \
                    307: do                                                                     \
                    308:  {                                                                     \
                    309:    ASM_OUTPUT_LABEL(STREAM,NAME);                                       \
                    310:    HALF_PIC_DECLARE (NAME);                                            \
                    311:  }                                                                     \
                    312: while (0)
                    313: 
1.1.1.4 ! root      314: /* This says what to print at the end of the assembly file */
        !           315: #define ASM_FILE_END(STREAM)                                           \
        !           316: do                                                                     \
        !           317:   {                                                                    \
        !           318:     if (HALF_PIC_P ())                                                 \
        !           319:       HALF_PIC_FINISH (STREAM);                                                \
        !           320:   }                                                                    \
        !           321: while (0)
        !           322: 
1.1       root      323: /* Tell collect that the object format is OSF/rose.  */
                    324: #define OBJECT_FORMAT_ROSE
                    325: 
1.1.1.4 ! root      326: /* Tell collect where the appropriate binaries are.  */
        !           327: #define REAL_LD_FILE_NAME      "/usr/ccs/gcc/gld"
        !           328: #define REAL_NM_FILE_NAME      "/usr/ccs/bin/nm"
        !           329: #define REAL_STRIP_FILE_NAME   "/usr/ccs/bin/strip"
        !           330: 
1.1       root      331: /* Use atexit for static constructors/destructors, instead of defining
                    332:    our own exit function.  */
                    333: #define HAVE_ATEXIT
                    334: 
                    335: /* Define this macro meaning that gcc should find the library 'libgcc.a'
1.1.1.3   root      336:    by hand, rather than passing the argument '-lgcc' to tell the linker
1.1       root      337:    to do the search */
                    338: #define LINK_LIBGCC_SPECIAL
1.1.1.3   root      339: 
                    340: /* A C statement to output assembler commands which will identify the object
                    341:   file as having been compile with GNU CC. We don't need or want this for
                    342:   OSF1. GDB doesn't need it and kdb doesn't like it */
                    343: #define ASM_IDENTIFY_GCC(FILE)
                    344: 
                    345: /* This is how to output an assembler line defining a `double' constant.
                    346:    Use "word" pseudos to avoid printing NaNs, infinity, etc.  */
                    347: 
                    348: /* This is how to output an assembler line defining a `double' constant.  */
                    349: 
1.1.1.4 ! root      350: #undef ASM_OUTPUT_DOUBLE
        !           351: 
        !           352: #ifndef        CROSS_COMPILE
        !           353: #define        ASM_OUTPUT_DOUBLE(STREAM, VALUE)                                \
        !           354: do                                                                     \
        !           355:   {                                                                    \
        !           356:     long value_long[2];                                                        \
        !           357:     REAL_VALUE_TO_TARGET_DOUBLE (VALUE, value_long);                   \
        !           358:                                                                        \
        !           359:     fprintf (STREAM, "\t.long\t0x%08lx\t\t# %.20g\n\t.long\t0x%08lx\n",        \
        !           360:           value_long[0], VALUE, value_long[1]);                        \
        !           361:   }                                                                    \
        !           362: while (0)
        !           363: 
        !           364: #else
        !           365: #define        ASM_OUTPUT_DOUBLE(STREAM, VALUE)                                \
        !           366:   fprintf (STREAM, "\t.double\t%.20g\n", VALUE)
1.1.1.3   root      367: #endif
                    368: 
                    369: /* This is how to output an assembler line defining a `float' constant.  */
                    370: 
1.1.1.4 ! root      371: #undef ASM_OUTPUT_FLOAT
        !           372: 
        !           373: #ifndef        CROSS_COMPILE
        !           374: #define        ASM_OUTPUT_FLOAT(STREAM, VALUE)                                 \
        !           375: do                                                                     \
        !           376:   {                                                                    \
        !           377:     long value_long;                                                   \
        !           378:     REAL_VALUE_TO_TARGET_SINGLE (VALUE, value_long);                   \
        !           379:                                                                        \
        !           380:     fprintf (STREAM, "\t.long\t0x%08lx\t\t# %.12g (float)\n",          \
        !           381:           value_long, VALUE);                                          \
        !           382:   }                                                                    \
        !           383: while (0)
        !           384: 
        !           385: #else
        !           386: #define        ASM_OUTPUT_FLOAT(STREAM, VALUE)                                 \
        !           387:   fprintf (STREAM, "\t.float\t%.12g\n", VALUE)
1.1.1.3   root      388: #endif
1.1.1.4 ! root      389: 
1.1.1.3   root      390: 
                    391: /* Generate calls to memcpy, etc., not bcopy, etc. */
                    392: #define TARGET_MEM_FUNCTIONS
                    393: 
                    394: 
1.1       root      395: 
                    396: /* Defines to be able to build libgcc.a with GCC.  */
                    397: 
1.1.1.4 ! root      398: /* It might seem that these are not important, since gcc 2 will never
        !           399:    call libgcc for these functions.  But programs might be linked with
        !           400:    code compiled by gcc 1, and then these will be used.  */
        !           401: 
1.1       root      402: #define perform_udivsi3(a,b)                                           \
                    403: {                                                                      \
                    404:   register int dx asm("dx");                                           \
                    405:   register int ax asm("ax");                                           \
                    406:                                                                        \
                    407:   dx = 0;                                                              \
                    408:   ax = a;                                                              \
                    409:   asm ("divl %3" : "=a" (ax), "=d" (dx) : "a" (ax), "g" (b), "d" (dx));        \
                    410:   return ax;                                                           \
                    411: }
                    412: 
1.1.1.2   root      413: #define perform_divsi3(a,b)                                            \
1.1       root      414: {                                                                      \
                    415:   register int dx asm("dx");                                           \
                    416:   register int ax asm("ax");                                           \
                    417:                                                                        \
                    418:   ax = a;                                                              \
                    419:   asm ("cltd\n\tidivl %3" : "=a" (ax), "=d" (dx) : "a" (ax), "g" (b)); \
                    420:   return ax;                                                           \
                    421: }
                    422: 
                    423: #define perform_umodsi3(a,b)                                           \
                    424: {                                                                      \
                    425:   register int dx asm("dx");                                           \
                    426:   register int ax asm("ax");                                           \
                    427:                                                                        \
                    428:   dx = 0;                                                              \
                    429:   ax = a;                                                              \
                    430:   asm ("divl %3" : "=a" (ax), "=d" (dx) : "a" (ax), "g" (b), "d" (dx));        \
                    431:   return dx;                                                           \
                    432: }
                    433: 
1.1.1.2   root      434: #define perform_modsi3(a,b)                                            \
1.1       root      435: {                                                                      \
                    436:   register int dx asm("dx");                                           \
                    437:   register int ax asm("ax");                                           \
                    438:                                                                        \
                    439:   ax = a;                                                              \
                    440:   asm ("cltd\n\tidivl %3" : "=a" (ax), "=d" (dx) : "a" (ax), "g" (b)); \
                    441:   return dx;                                                           \
                    442: }
                    443: 
1.1.1.2   root      444: #define perform_fixdfsi(a)                                             \
1.1       root      445: {                                                                      \
                    446:   auto unsigned short ostatus;                                         \
                    447:   auto unsigned short nstatus;                                         \
                    448:   auto int ret;                                                                \
1.1.1.4 ! root      449:   auto double tmp;                                                     \
1.1       root      450:                                                                        \
                    451:   &ostatus;                    /* guarantee these land in memory */    \
                    452:   &nstatus;                                                            \
                    453:   &ret;                                                                        \
1.1.1.4 ! root      454:   &tmp;                                                                        \
1.1       root      455:                                                                        \
                    456:   asm volatile ("fnstcw %0" : "=m" (ostatus));                         \
                    457:   nstatus = ostatus | 0x0c00;                                          \
                    458:   asm volatile ("fldcw %0" : /* no outputs */ : "m" (nstatus));                \
1.1.1.4 ! root      459:   tmp = a;                                                             \
        !           460:   asm volatile ("fldl %0" : /* no outputs */ : "m" (tmp));             \
1.1       root      461:   asm volatile ("fistpl %0" : "=m" (ret));                             \
1.1.1.2   root      462:   asm volatile ("fldcw %0" : /* no outputs */ : "m" (ostatus));                \
1.1       root      463:                                                                        \
                    464:   return ret;                                                          \
                    465: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.