Annotation of researchv10dc/cmd/gcc/internals-2, revision 1.1

1.1     ! root        1: 
        !             2: 
        !             3: File: internals,  Node: Extensions,  Next: Bugs,  Prev: Incompatibilities,  Up: Top
        !             4: 
        !             5: GNU Extensions to the C Language
        !             6: ********************************
        !             7: 
        !             8: GNU C provides several language features not found in ANSI standard C. 
        !             9: (The `-pedantic' option directs GNU CC to print a warning message if any of
        !            10: these features is used.)  To test for the availability of these features in
        !            11: conditional compilation, check for a predefined macro `__GNUC__', which is
        !            12: always defined under GNU CC.
        !            13: 
        !            14: * Menu:
        !            15: 
        !            16: * Statement Exprs::     Putting statements and declarations inside expressions.
        !            17: * Naming Types::        Giving a name to the type of some expression.
        !            18: * Typeof::             `typeof': referring to the type of an expression.
        !            19: * Lvalues::            Using `?:', `,' and casts in lvalues.
        !            20: * Conditionals::       Omitting the middle operand of a `?:' expression.
        !            21: * Zero-Length::                Zero-length arrays.
        !            22: * Variable-Length::    Arrays whose length is computed at run time.
        !            23: * Subscripting::       Any array can be subscripted, even if not an lvalue.
        !            24: * Pointer Arith::      Arithmetic on `void'-pointers and function pointers.
        !            25: * Constructors::       Constructor expressions give structures, unions
        !            26:                         or arrays as values.
        !            27: * Dollar Signs::        Dollar sign is allowed in identifiers.
        !            28: * Alignment::           Inquiring about the alignment of a type or variable.
        !            29: * Inline::              Defining inline functions (as fast as macros).
        !            30: * Extended Asm::       Assembler instructions with C expressions as operands.
        !            31:                         (With them you can define ``built-in'' functions.)
        !            32: * Asm Labels::         Specifying the assembler name to use for a C symbol.
        !            33: 
        !            34: 
        !            35: 
        !            36: File: internals,  Node: Statement Exprs,  Next: Naming Types,  Prev: Extensions,  Up: Extensions
        !            37: 
        !            38: Statements and Declarations inside of Expressions
        !            39: =================================================
        !            40: 
        !            41: A compound statement in parentheses may appear inside an expression in GNU
        !            42: C.  This allows you to declare variables within an expression.  For example:
        !            43: 
        !            44:      ({ int y = foo (); int z;
        !            45:         if (y > 0) z = y;
        !            46:         else z = - y;
        !            47:         z; })
        !            48: 
        !            49: is a valid (though slightly more complex than necessary) expression for the
        !            50: absolute value of `foo ()'.
        !            51: 
        !            52: This feature is especially useful in making macro definitions ``safe'' (so
        !            53: that they evaluate each operand exactly once).  For example, the
        !            54: ``maximum'' function is commonly defined as a macro in standard C as follows:
        !            55: 
        !            56:      #define max(a,b) ((a) > (b) ? (a) : (b))
        !            57: 
        !            58: But this definition computes either A or B twice, with bad results if the
        !            59: operand has side effects.  In GNU C, if you know the type of the operands
        !            60: (here let's assume `int'), you can define the macro safely as follows:
        !            61: 
        !            62:      #define maxint(a,b) \
        !            63:        ({int _a = (a), _b = (b); _a > _b ? _a : _b; })
        !            64: 
        !            65: Embedded statements are not allowed in constant expressions, such as the
        !            66: value of an enumeration constant, the width of a bit field, or the initial
        !            67: value of a static variable.
        !            68: 
        !            69: If you don't know the type of the operand, you can still do this, but you
        !            70: must use `typeof' (*Note Typeof::.) or type naming (*Note Naming Types::.).
        !            71: 
        !            72: 
        !            73: File: internals,  Node: Naming Types,  Next: Typeof,  Prev: Statement Exprs,  Up: Extensions
        !            74: 
        !            75: Naming an Expression's Type
        !            76: ===========================
        !            77: 
        !            78: You can give a name to the type of an expression using a `typedef'
        !            79: declaration with an initializer.  Here is how to define NAME as a type name
        !            80: for the type of EXP:
        !            81: 
        !            82:      typedef NAME = EXP;
        !            83: 
        !            84: This is useful in conjunction with the statements-within-expressions
        !            85: feature.  Here is how the two together can be used to define a safe
        !            86: ``maximum'' macro that operates on any arithmetic type:
        !            87: 
        !            88:      #define max(a,b) \
        !            89:        ({typedef _ta = (a), _tb = (b);  \
        !            90:          _ta _a = (a); _tb _b = (b);     \
        !            91:          _a > _b ? _a : _b; })
        !            92: 
        !            93: The reason for using names that start with underscores for the local
        !            94: variables is to avoid conflicts with variable names that occur within the
        !            95: expressions that are substituted for `a' and `b'.  Eventually we hope to
        !            96: design a new form of declaration syntax that allows you to declare
        !            97: variables whose scopes start only after their initializers; this will be a
        !            98: more reliable way to prevent such conflicts.
        !            99: 
        !           100: 
        !           101: File: internals,  Node: Typeof,  Next: Lvalues,  Prev: Naming Types,  Up: Extensions
        !           102: 
        !           103: Referring to a Type with `typeof'
        !           104: =================================
        !           105: 
        !           106: Another way to refer to the type of an expression is with `typeof'.  The
        !           107: syntax of using of this keyword looks like `sizeof', but the construct acts
        !           108: semantically like a type name defined with `typedef'.
        !           109: 
        !           110: There are two ways of writing the argument to `typeof': with an expression
        !           111: or with a type.  Here is an example with an expression:
        !           112: 
        !           113:      typeof (x[0](1))
        !           114: 
        !           115: This assumes that `x' is an array of functions; the type described is that
        !           116: of the values of the functions.
        !           117: 
        !           118: Here is an example with a typename as the argument:
        !           119: 
        !           120:      typeof (int *)
        !           121: 
        !           122: Here the type described is that of pointers to `int'.
        !           123: 
        !           124: A `typeof'-construct can be used anywhere a typedef name could be used. 
        !           125: For example, you can use it in a declaration, in a cast, or inside of
        !           126: `sizeof' or `typeof'.
        !           127: 
        !           128:    * This declares `y' with the type of what `x' points to.
        !           129: 
        !           130:           typeof (*x) y;
        !           131: 
        !           132:    * This declares `y' as an array of such values.
        !           133: 
        !           134:           typeof (*x) y[4];
        !           135: 
        !           136:    * This declares `y' as an array of pointers to characters:
        !           137: 
        !           138:           typeof (typeof (char *)[4]) y;
        !           139: 
        !           140:      It is equivalent to the following traditional C declaration:
        !           141: 
        !           142:           char *y[4];
        !           143: 
        !           144:      To see the meaning of the declaration using `typeof', and why it might
        !           145:      be a useful way to write, let's rewrite it with these macros:
        !           146: 
        !           147:           #define pointer(T)  typeof(T *)
        !           148:           #define array(T, N) typeof(T [N])
        !           149: 
        !           150:      Now the declaration can be rewritten this way:
        !           151: 
        !           152:           array (pointer (char), 4) y;
        !           153: 
        !           154:      Thus, `array (pointer (char), 4)' is the type of arrays of 4 pointers
        !           155:      to `char'.
        !           156: 
        !           157: 
        !           158: File: internals,  Node: Lvalues,  Next: Conditionals,  Prev: Typeof,  Up: Extensions
        !           159: 
        !           160: Generalized Lvalues
        !           161: ===================
        !           162: 
        !           163: Compound expressions, conditional expressions and casts are allowed as
        !           164: lvalues provided their operands are lvalues.  This means that you can take
        !           165: their addresses or store values into them.
        !           166: 
        !           167: For example, a compound expression can be assigned, provided the last
        !           168: expression in the sequence is an lvalue.  These two expressions are
        !           169: equivalent:
        !           170: 
        !           171:      (a, b) += 5
        !           172:      a, (b += 5)
        !           173: 
        !           174: Similarly, the address of the compound expression can be taken.  These two
        !           175: expressions are equivalent:
        !           176: 
        !           177:      &(a, b)
        !           178:      a, &b
        !           179: 
        !           180: A conditional expression is a valid lvalue if its type is not void and the
        !           181: true and false branches are both valid lvalues.  For example, these two
        !           182: expressions are equivalent:
        !           183: 
        !           184:      (a ? b : c) = 5
        !           185:      (a ? b = 5 : (c = 5))
        !           186: 
        !           187: A cast is a valid lvalue if its operand is valid.  Taking the address of
        !           188: the cast is the same as taking the address without a cast, except for the
        !           189: type of the result.  For example, these two expressions are equivalent (but
        !           190: the second may be valid when the type of `a' does not permit a cast to `int
        !           191: *').
        !           192: 
        !           193:      &(int *)a
        !           194:      (int **)&a
        !           195: 
        !           196: A simple assignment whose left-hand side is a cast works by converting the
        !           197: right-hand side first to the specified type, then to the type of the inner
        !           198: left-hand side expression.  After this is stored, the value is converter
        !           199: back to the specified type to become the value of the assignment.  Thus, if
        !           200: `a' has type `char *', the following two expressions are equivalent:
        !           201: 
        !           202:      (int)a = 5
        !           203:      (int)(a = (char *)5)
        !           204: 
        !           205: An assignment-with-arithmetic operation such as `+=' applied to a cast
        !           206: performs the arithmetic using the type resulting from the cast, and then
        !           207: continues as in the previous case.  Therefore, these two expressions are
        !           208: equivalent:
        !           209: 
        !           210:      (int)a += 5
        !           211:      (int)(a = (char *) ((int)a + 5))
        !           212: 
        !           213: 
        !           214: File: internals,  Node: Conditionals,  Next: Zero-Length,  Prev: Lvalues,  Up: Extensions
        !           215: 
        !           216: Conditional Expressions with Omitted Middle-Operands
        !           217: ====================================================
        !           218: 
        !           219: The middle operand in a conditional expression may be omitted.  Then if the
        !           220: first operand is nonzero, its value is the value of the conditional
        !           221: expression.
        !           222: 
        !           223: Therefore, the expression
        !           224: 
        !           225:      x ? : y
        !           226: 
        !           227: has the value of `x' if that is nonzero; otherwise, the value of `y'.
        !           228: 
        !           229: This example is perfectly equivalent to
        !           230: 
        !           231:      x ? x : y
        !           232: 
        !           233: In this simple case, the ability to omit the middle operand is not
        !           234: especially useful.  When it becomes useful is when the first operand does,
        !           235: or may (if it is a macro argument), contain a side effect.  Then repeating
        !           236: the operand in the middle would perform the side effect twice.  Omitting
        !           237: the middle operand uses the value already computed without the undesirable
        !           238: effects of recomputing it.
        !           239: 
        !           240: 
        !           241: File: internals,  Node: Zero-Length,  Next: Variable-Length,  Prev: Conditionals,  Up: Extensions
        !           242: 
        !           243: Arrays of Length Zero
        !           244: =====================
        !           245: 
        !           246: Zero-length arrays are allowed in GNU C.  They are very useful as the last
        !           247: element of a structure which is really a header for a variable-length object:
        !           248: 
        !           249:      struct line {
        !           250:        int length;
        !           251:        char contents[0];
        !           252:      };
        !           253:      
        !           254:      {
        !           255:        struct line *thisline 
        !           256:          = (struct line *) malloc (sizeof (struct line) + this_length);
        !           257:        thisline->length = thislength;
        !           258:      }
        !           259: 
        !           260: In standard C, you would have to give `contents' a length of 1, which means
        !           261: either you waste space or complicate the argument to `malloc'.
        !           262: 
        !           263: 
        !           264: File: internals,  Node: Variable-Length,  Next: Subscripting,  Prev: Zero-Length,  Up: Extensions
        !           265: 
        !           266: Arrays of Variable Length
        !           267: =========================
        !           268: 
        !           269: Variable-length automatic arrays are allowed in GNU C.  These arrays are
        !           270: declared like any other automatic arrays, but with a length that is not a
        !           271: constant expression.  The storage is allocated at that time and deallocated
        !           272: when the brace-level is exited.  For example:
        !           273: 
        !           274:      FILE *concat_fopen (char *s1, char *s2, char *mode)
        !           275:      {
        !           276:        char str[strlen (s1) + strlen (s2) + 1];
        !           277:        strcpy (str, s1);
        !           278:        strcat (str, s2);
        !           279:        return fopen (str, mode);
        !           280:      }
        !           281: 
        !           282: You can also define structure types containing variable-length arrays, and
        !           283: use them even for arguments or function values, as shown here:
        !           284: 
        !           285:      int foo;
        !           286:      
        !           287:      struct entry
        !           288:      {
        !           289:        char data[foo];
        !           290:      };
        !           291:      
        !           292:      struct entry
        !           293:      tester (struct entry arg)
        !           294:      {
        !           295:        struct entry new;
        !           296:        int i;
        !           297:        for (i = 0; i < foo; i++)
        !           298:          new.data[i] = arg.data[i] + 1;
        !           299:        return new;
        !           300:      }
        !           301: 
        !           302: (Eventually there will be a way to say that the size of the array is
        !           303: another member of the same structure.)
        !           304: 
        !           305: The length of an array is computed on entry to the brace-level where the
        !           306: array is declared and is remembered for the scope of the array in case you
        !           307: access it with `sizeof'.
        !           308: 
        !           309: Jumping or breaking out of the scope of the array name will also deallocate
        !           310: the storage.  Jumping into the scope is not allowed; you will get an error
        !           311: message for it.
        !           312: 
        !           313: You can use the function `alloca' to get an effect much like
        !           314: variable-length arrays.  The function `alloca' is available in many other C
        !           315: implementations (but not in all).  On the other hand, variable-length
        !           316: arrays are more elegant.
        !           317: 
        !           318: There are other differences between these two methods.  Space allocated
        !           319: with `alloca' exists until the containing *function* returns.  The space
        !           320: for a variable-length array is deallocated as soon as the array name's
        !           321: scope ends.  (If you use both variable-length arrays and `alloca' in the
        !           322: same function, deallocation of a variable-length array will also deallocate
        !           323: anything more recently allocated with `alloca'.)
        !           324: 
        !           325: 
        !           326: File: internals,  Node: Subscripting,  Next: Pointer Arith,  Prev: Variable-Length,  Up: Extensions
        !           327: 
        !           328: Non-Lvalue Arrays May Have Subscripts
        !           329: =====================================
        !           330: 
        !           331: Subscripting is allowed on arrays that are not lvalues, even though the
        !           332: unary `&' operator is not.  For example, this is valid in GNU C though not
        !           333: valid in other C dialects:
        !           334: 
        !           335:      struct foo {int a[4];};
        !           336:      
        !           337:      struct foo f();
        !           338:      
        !           339:      bar (int index)
        !           340:      {
        !           341:        return f().a[index];
        !           342:      }
        !           343: 
        !           344: 
        !           345: File: internals,  Node: Pointer Arith,  Next: Initializers,  Prev: Subscripting,  Up: Extensions
        !           346: 
        !           347: Arithmetic on `void'-Pointers and Function Pointers
        !           348: ===================================================
        !           349: 
        !           350: In GNU C, addition and subtraction operations are supported on pointers to
        !           351: `void' and on pointers to functions.  This is done by treating the size of
        !           352: a `void' or of a function as 1.
        !           353: 
        !           354: A consequence of this is that `sizeof' is also allowed on `void' and on
        !           355: function types, and returns 1.
        !           356: 
        !           357: 
        !           358: File: internals,  Node: Initializers,  Next: Constructors,  Prev: Pointer Arith,  Up: Extensions
        !           359: 
        !           360: Non-Constant Initializers
        !           361: =========================
        !           362: 
        !           363: The elements of an aggregate initializer are not required to be constant
        !           364: expressions in GNU C.  Here is an example of an initializer with run-time
        !           365: varying elements:
        !           366: 
        !           367:      foo (float f, float g)
        !           368:      {
        !           369:        float beat_freqs[2] = { f-g, f+g };
        !           370:        ...
        !           371:      }
        !           372: 
        !           373: 
        !           374: File: internals,  Node: Constructors,  Next: Dollar Signs,  Prev: Initializers,  Up: Extensions
        !           375: 
        !           376: Constructor Expressions
        !           377: =======================
        !           378: 
        !           379: GNU C supports constructor expressions.  A constructor looks like a cast
        !           380: containing an initializer.  Its value is an object of the type specified in
        !           381: the cast, containing the elements specified in the initializer.  The type
        !           382: must be a structure, union or array type.
        !           383: 
        !           384: Assume that `struct foo' and `structure' are declared as shown:
        !           385: 
        !           386:      struct foo {int a; char b[2];} structure;
        !           387: 
        !           388: Here is an example of constructing a `struct foo' with a constructor:
        !           389: 
        !           390:      structure = ((struct foo) {x + y, 'a', 0});
        !           391: 
        !           392: This is equivalent to writing the following:
        !           393: 
        !           394:      {
        !           395:        struct foo temp = {x + y, 'a', 0};
        !           396:        structure = temp;
        !           397:      }
        !           398: 
        !           399: You can also construct an array.  If all the elements of the constructor
        !           400: are (made up of) simple constant expressions, suitable for use in
        !           401: initializers, then the constructor is an lvalue and can be coerced to a
        !           402: pointer to its first element, as shown here:
        !           403: 
        !           404:      char **foo = (char *[]) { "x", "y", "z" };
        !           405: 
        !           406: Array constructors whose elements are not simple constants are not very
        !           407: useful, because the constructor is not an lvalue.  There are only two valid
        !           408: ways to use it: to subscript it, or initialize an array variable with it. 
        !           409: The former is probably slower than a `switch' statement, while the latter
        !           410: does the same thing an ordinary C initializer would do.
        !           411: 
        !           412:      output = ((int[]) { 2, x, 28 }) [input];
        !           413: 
        !           414: 
        !           415: File: internals,  Node: Dollar Signs,  Next: Alignment,  Prev: Constructors,  Up: Extensions
        !           416: 
        !           417: Dollar Signs in Identifier Names
        !           418: ================================
        !           419: 
        !           420: In GNU C, you may use dollar signs in identifier names.  This is because
        !           421: many traditional C implementations allow such identifiers.
        !           422: 
        !           423: 
        !           424: File: internals,  Node: Alignment,  Next: Inline,  Prev: Dollar Signs,  Up: Extensions
        !           425: 
        !           426: Inquiring about the Alignment of a Type or Variable
        !           427: ===================================================
        !           428: 
        !           429: The keyword `__alignof' allows you to inquire about how an object is
        !           430: aligned, or the minimum alignment usually required by a type.  Its syntax
        !           431: is just like `sizeof'.
        !           432: 
        !           433: For example, if the target machine requires a `double' value to be aligned
        !           434: on an 8-byte boundary, then `__alignof (double)' is 8.  This is true on
        !           435: many RISC machines.  On more traditional machine designs, `__alignof
        !           436: (double)' is 4 or even 2.
        !           437: 
        !           438: Some machines never actually require alignment; they allow reference to any
        !           439: data type even at an odd addresses.  For these machines, `__alignof'
        !           440: reports the *recommended* alignment of a type.
        !           441: 
        !           442: When the operand of `__alignof' is an lvalue rather than a type, the value
        !           443: is the largest alignment that the lvalue is known to have.  It may have
        !           444: this alignment as a result of its data type, or because it is part of a
        !           445: structure and inherits alignment from that structure. For example, after
        !           446: this declaration:
        !           447: 
        !           448:      struct foo { int x; char y; } foo1;
        !           449: 
        !           450: the value of `__alignof (foo1.y)' is probably 2 or 4, the same as
        !           451: `__alignof (int)', even though the data type of `foo1.y' does not itself
        !           452: demand any alignment.
        !           453: 
        !           454: 
        !           455: File: internals,  Node: Inline,  Next: Extended Asm,  Prev: Alignment,  Up: Extensions
        !           456: 
        !           457: An Inline Function is As Fast As a Macro
        !           458: ========================================
        !           459: 
        !           460: By declaring a function `inline', you can direct GNU CC to integrate that
        !           461: function's code into the code for its callers.  This makes execution faster
        !           462: by eliminating the function-call overhead; in addition, if any of the
        !           463: actual argument values are constant, their known values may permit
        !           464: simplifications at compile time so that not all of the inline function's
        !           465: code needs to be included.
        !           466: 
        !           467: To declare a function inline, use the `inline' keyword in its declaration,
        !           468: like this:
        !           469: 
        !           470:      inline int
        !           471:      inc (int *a)
        !           472:      {
        !           473:        (*a)++;
        !           474:      }
        !           475: 
        !           476: You can also make all ``simple enough'' functions inline with the option
        !           477: `-finline-functions'.  Note that certain usages in a function definition
        !           478: can make it unsuitable for inline substitution.
        !           479: 
        !           480: When a function is both inline and `static', if all calls to the function
        !           481: are integrated into the caller, then the function's own assembler code is
        !           482: never referenced.  In this case, GNU CC does not actually output assembler
        !           483: code for the function, unless you specify the option
        !           484: `-fkeep-inline-functions'.  Some calls cannot be integrated for various
        !           485: reasons (in particular, calls that precede the function's definition cannot
        !           486: be integrated, and neither can recursive calls within the definition).  If
        !           487: there is a nonintegrated call, then the function is compiled to assembler
        !           488: code as usual.
        !           489: 
        !           490: When an inline function is not `static', then the compiler must assume that
        !           491: there may be calls from other source files; since a global symbol can be
        !           492: defined only once in any program, the function must not be defined in the
        !           493: other source files, so the calls therein cannot be integrated.  Therefore,
        !           494: a non-`static' inline function is always compiled on its own in the usual
        !           495: fashion.
        !           496: 
        !           497: 
        !           498: File: internals,  Node: Extended Asm,  Next: Asm Labels,  Prev: Inline,  Up: Extensions
        !           499: 
        !           500: Assembler Instructions with C Expression Operands
        !           501: =================================================
        !           502: 
        !           503: In an assembler instruction using `asm', you can now specify the operands
        !           504: of the instruction using C expressions.  This means no more guessing which
        !           505: registers or memory locations will contain the data you want to use.
        !           506: 
        !           507: You must specify an assembler instruction template much like what appears
        !           508: in a machine description, plus an operand constraint string for each operand.
        !           509: 
        !           510: For example, here is how to use the 68881's `fsinx' instruction:
        !           511: 
        !           512:      asm ("fsinx %1,%0" : "=f" (result) : "f" (angle));
        !           513: 
        !           514: Here `angle' is the C expression for the input operand while `result' is
        !           515: that of the output operand.  Each has `"f"' as its operand constraint,
        !           516: saying that a floating-point register is required.  The constraints use the
        !           517: same language used in the machine description (*Note Constraints::.).
        !           518: 
        !           519: Each operand is described by an operand-constraint string followed by the C
        !           520: expression in parentheses.  A colon separates the assembler template from
        !           521: the first output operand, and another separates the last output operand
        !           522: from the first input, if any.  Commas separate output operands and separate
        !           523: inputs.  The number of operands is limited to the maximum number of
        !           524: operands in any instruction pattern in the machine description.
        !           525: 
        !           526: Output operand expressions must be lvalues, and there must be at least one
        !           527: of them.  The compiler can check this.  The input operands need not be
        !           528: lvalues, and there need not be any.  The compiler cannot check whether the
        !           529: operands have data types that are reasonable for the instruction being
        !           530: executed.
        !           531: 
        !           532: The output operands must be write-only; GNU CC will assume that the values
        !           533: in these operands before the instruction are dead and need not be
        !           534: generated.  For an operand that is read-write, you must logically split its
        !           535: function into two separate operands, one input operand and one write-only
        !           536: output operand.  The connection between them is expressed by constraints
        !           537: which say they need to be in the same location when the instruction
        !           538: executes.  You can use the same C expression for both operands, or
        !           539: different expressions.  For example, here we write the (fictitious)
        !           540: `combine' instruction with `bar' as its read-only source operand and `foo'
        !           541: as its read-write destination:
        !           542: 
        !           543:      asm ("combine %2,%0" : "=r" (foo) : "0" (foo), "g" (bar));
        !           544: 
        !           545: The constraint `"0"' for operand 1 says that it must occupy the same
        !           546: location as operand 0.  Therefore it is not necessary to substitute operand
        !           547: 1 into the assembler code output.
        !           548: 
        !           549: Usually the most convenient way to use these `asm' instructions is to
        !           550: encapsulate them in macros that look like functions.  For example,
        !           551: 
        !           552:      #define sin(x)       \
        !           553:      ({ double __value, __arg = (x);   \
        !           554:         asm ("fsinx %1,%0": "=f" (__value): "f" (__arg));  \
        !           555:         __value; })
        !           556: 
        !           557: Here the variable `__arg' is used to make sure that the instruction
        !           558: operates on a proper `double' value, and to accept only those arguments `x'
        !           559: which can convert automatically to a `double'.
        !           560: 
        !           561: Another way to make sure the instruction operates on the correct data type
        !           562: is to use a cast in the `asm'.  This is different from using a variable
        !           563: `__arg' in that it converts more different types.  For example, if the
        !           564: desired type were `int', casting the argument to `int' would accept a
        !           565: pointer with no complaint, while assigning the argument to an `int'
        !           566: variable named `__arg' would warn about using a pointer unless the caller
        !           567: explicitly casts it.
        !           568: 
        !           569: GNU CC assumes for optimization purposes that these instructions have no
        !           570: side effects except to change the output operands.  This does not mean that
        !           571: instructions with a side effect cannot be used, but you must be careful,
        !           572: because the compiler may eliminate them if the output operands aren't used,
        !           573: or move them out of loops, or replace two with one if they constitute a
        !           574: common subexpression.  Also, if your instruction does have a side effect on
        !           575: a variable that otherwise appears not to change, the old value of the
        !           576: variable may be reused later if it happens to be found in a register.
        !           577: 
        !           578: You can prevent an `asm' instruction from being deleted, moved or combined
        !           579: by writing the keyword `volatile' after the `asm'.  For example:
        !           580: 
        !           581:      #define set_priority(x)  \
        !           582:      asm volatile ("set_priority %1":    \
        !           583:                    "=m" (*(char *)0): "g" (x))
        !           584: 
        !           585: Note that we have supplied an output operand which is not actually used in
        !           586: the instruction.  This is because `asm' requires at least one output
        !           587: operand.  This requirement exists for internal implementation reasons and
        !           588: we might be able to relax it in the future.
        !           589: 
        !           590: In this case output operand has the additional benefit effect of giving the
        !           591: appearance of writing in memory.  As a result, GNU CC will assume that data
        !           592: previously fetched from memory must be fetched again if needed again later.
        !           593:  This may be desirable if you have not employed the `volatile' keyword on
        !           594: all the variable declarations that ought to have it.
        !           595: 
        !           596: 
        !           597: File: internals,  Node: Asm Labels,  Prev: Extended Asm,  Up: Extensions
        !           598: 
        !           599: Controlling Names Used in Assembler Code
        !           600: ========================================
        !           601: 
        !           602: You can specify the name to be used in the assembler code for a C function
        !           603: or variable by writing the `asm' keyword after the declarator as follows:
        !           604: 
        !           605:      int foo asm ("myfoo") = 2;
        !           606: 
        !           607: This specifies that the name to be used for the variable `foo' in the
        !           608: assembler code should be `myfoo' rather than the usual `_foo'.
        !           609: 
        !           610: On systems where an underscore is normally prepended to the name of a C
        !           611: function or variable, this feature allows you to define names for the
        !           612: linker that do not start with an underscore.
        !           613: 
        !           614: You cannot use `asm' in this way in a function *definition*; but you can
        !           615: get the same effect by writing a declaration for the function before its
        !           616: definition and putting `asm' there, like this:
        !           617: 
        !           618:      extern func () asm ("FUNC");
        !           619:      
        !           620:      func (x, y)
        !           621:           int x, y;
        !           622:      ...
        !           623: 
        !           624:  It is up to you to make sure that the assembler names you choose do not
        !           625: conflict with any other assembler symbols.  Also, you must not use a
        !           626: register name; that would produce completely invalid assembler code.  GNU
        !           627: CC does not as yet have the ability to store static variables in registers.
        !           628:  Perhaps that will be added.
        !           629: 
        !           630: 
        !           631: File: internals,  Node: Bugs,  Next: Portability,  Prev: Extensions,  Up: Top
        !           632: 
        !           633: Reporting Bugs
        !           634: **************
        !           635: 
        !           636: Your bug reports play an essential role in making GNU CC reliable.
        !           637: 
        !           638: Reporting a bug may help you by bringing a solution to your problem, or it
        !           639: may not.  But in any case the important function of a bug report is to help
        !           640: the entire community by making the next version of GNU CC work better.  Bug
        !           641: reports are your contribution to the maintenance of GNU CC.
        !           642: 
        !           643: In order for a bug report to serve its purpose, you must include the
        !           644: information that makes for fixing the bug.
        !           645: 
        !           646: * Menu:
        !           647: 
        !           648: * Criteria:  Bug Criteria.   Have you really found a bug?
        !           649: * Reporting: Bug Reporting.  How to report a bug effectively.
        !           650: 
        !           651: 
        !           652: 
        !           653: File: internals,  Node: Bug Criteria,  Next: Bug Reporting,  Prev: Bugs,  Up: Bugs
        !           654: 
        !           655: Have You Found a Bug?
        !           656: =====================
        !           657: 
        !           658: If you are not sure whether you have found a bug, here are some guidelines:
        !           659: 
        !           660:    * If the compiler gets a fatal signal, for any input whatever, that is a
        !           661:      compiler bug.  Reliable compilers never crash.
        !           662: 
        !           663:    * If the compiler produces invalid assembly code, for any input whatever
        !           664:      (except an `asm' statement), that is a compiler bug, unless the
        !           665:      compiler reports errors (not just warnings) which would ordinarily
        !           666:      prevent the assembler from being run.
        !           667: 
        !           668:    * If the compiler produces valid assembly code that does not correctly
        !           669:      execute the input source code, that is a compiler bug.
        !           670: 
        !           671:      However, you must double-check to make sure, because you may have run
        !           672:      into an incompatibility between GNU C and traditional C (*Note
        !           673:      Incompatibilities::.).  These incompatibilities might be considered
        !           674:      bugs, but they are inescapable consequences of valuable features.
        !           675: 
        !           676:      Or you may have a program whose behavior is undefined, which happened
        !           677:      by chance to give the desired results with another C compiler.
        !           678: 
        !           679:      For example, in many nonoptimizing compilers, you can write `x;' at
        !           680:      the end of a function instead of `return x;', with the same results. 
        !           681:      But the value of the function is undefined if `return' is omitted; it
        !           682:      is not a bug when GNU CC produces different results.
        !           683: 
        !           684:      Problems often result from expressions with two increment operators,
        !           685:      as in `f (*p++, *p++)'.  Your previous compiler might have interpreted
        !           686:      that expression the way you intended; GNU CC might interpret it
        !           687:      another way; neither compiler is wrong.
        !           688: 
        !           689:      After you have localized the error to a single source line, it should
        !           690:      be easy to check for these things.  If your program is correct and
        !           691:      well defined, you have found a compiler bug.
        !           692: 
        !           693:    * If the compiler produces an error message for valid input, that is a
        !           694:      compiler bug.
        !           695: 
        !           696:      Note that the following is not valid input, and the error message for
        !           697:      it is not a bug:
        !           698: 
        !           699:           int foo (char);
        !           700:           
        !           701:           int
        !           702:           foo (x)
        !           703:                char x;
        !           704:           { ... }
        !           705: 
        !           706:      The prototype says to pass a `char', while the definition says to pass
        !           707:      an `int' and treat the value as a `char'.  This is what the ANSI
        !           708:      standard says, and it makes sense.
        !           709: 
        !           710:    * If the compiler does not produce an error message for invalid input,
        !           711:      that is a compiler bug.  However, you should note that your idea of
        !           712:      ``invalid input'' might be my idea of ``an extension'' or ``support
        !           713:      for traditional practice''.
        !           714: 
        !           715:    * If you are an experienced user of C compilers, your suggestions for
        !           716:      improvement of GNU CC are welcome in any case.
        !           717: 
        !           718: 
        !           719: File: internals,  Node: Bug Reporting,  Prev: Bug Criteria,  Up: Bugs
        !           720: 
        !           721: How to Report Bugs
        !           722: ==================
        !           723: 
        !           724: Send bug reports for GNU C to one of these addresses:
        !           725: 
        !           726:      [email protected]
        !           727:      {ucbvax|mit-eddie|uunet}!prep.ai.mit.edu!bug-gcc
        !           728: 
        !           729: As a last resort, snail them to:
        !           730: 
        !           731:      GNU Compiler Bugs
        !           732:      545 Tech Sq
        !           733:      Cambridge, MA 02139
        !           734: 
        !           735: The fundamental principle of reporting bugs usefully is this: *report all
        !           736: the facts*.  If you are not sure whether to mention a fact or leave it out,
        !           737: mention it!
        !           738: 
        !           739: Often people omit facts because they think they know what causes the
        !           740: problem and they conclude that some details don't matter.  Thus, you might
        !           741: assume that the name of the variable you use in an example does not matter.
        !           742:  Well, probably it doesn't, but one cannot be sure.  Perhaps the bug is a
        !           743: stray memory reference which happens to fetch from the location where that
        !           744: name is stored in memory; perhaps, if the name were different, the contents
        !           745: of that location would fool the compiler into doing the right thing despite
        !           746: the bug.  Play it safe and give an exact example.
        !           747: 
        !           748: If you want to enable me to fix the bug, you should include all these things:
        !           749: 
        !           750:    * The version of GNU CC.  You can get this by running it with the `-v'
        !           751:      option.
        !           752: 
        !           753:      Without this, I won't know whether there is any point in looking for
        !           754:      the bug in the current version of GNU CC.
        !           755: 
        !           756:    * A complete input file that will reproduce the bug.  If the bug is in
        !           757:      the C preprocessor, send me a source file and any header files that it
        !           758:      requires.  If the bug is in the compiler proper (`cc1'), run your
        !           759:      source file through the C preprocessor by doing `gcc -E SOURCEFILE >
        !           760:      OUTFILE', then include the contents of OUTFILE in the bug report. 
        !           761:      (Any `-I', `-D' or `-U' options that you used in actual compilation
        !           762:      should also be used when doing this.)
        !           763: 
        !           764:      A single statement is not enough of an example.  In order to compile
        !           765:      it, it must be embedded in a function definition; and the bug might
        !           766:      depend on the details of how this is done.
        !           767: 
        !           768:      Without a real example I can compile, all I can do about your bug
        !           769:      report is wish you luck.  It would be futile to try to guess how to
        !           770:      provoke the bug.  For example, bugs in register allocation and
        !           771:      reloading frequently depend on every little detail of the function
        !           772:      they happen in.
        !           773: 
        !           774:    * The command arguments you gave GNU CC to compile that example and
        !           775:      observe the bug.  For example, did you use `-O'?  To guarantee you
        !           776:      won't omit something important, list them all.
        !           777: 
        !           778:      If I were to try to guess the arguments, I would probably guess wrong
        !           779:      and then I would not encounter the bug.
        !           780: 
        !           781:    * The names of the files that you used for `tm.h' and `md' when you
        !           782:      installed the compiler.
        !           783: 
        !           784:    * The type of machine you are using, and the operating system name and
        !           785:      version number.
        !           786: 
        !           787:    * A description of what behavior you observe that you believe is
        !           788:      incorrect.  For example, ``It gets a fatal signal,'' or, ``There is an
        !           789:      incorrect assembler instruction in the output.''
        !           790: 
        !           791:      Of course, if the bug is that the compiler gets a fatal signal, then I
        !           792:      will certainly notice it.  But if the bug is incorrect output, I might
        !           793:      not notice unless it is glaringly wrong.  I won't study all the
        !           794:      assembler code from a 50-line C program just on the off chance that it
        !           795:      might be wrong.
        !           796: 
        !           797:      Even if the problem you experience is a fatal signal, you should still
        !           798:      say so explicitly.  Suppose something strange is going on, such as,
        !           799:      your copy of the compiler is out of synch, or you have encountered a
        !           800:      bug in the C library on your system.  (This has happened!)  Your copy
        !           801:      might crash and mine would not.  If you told me to expect a crash,
        !           802:      then when mine fails to crash, I would know that the bug was not
        !           803:      happening for me.  If you had not told me to expect a crash, then I
        !           804:      would not be able to draw any conclusion from my observations.
        !           805: 
        !           806:      In cases where GNU CC generates incorrect code, if you send me a small
        !           807:      complete sample program I will find the error myself by running the
        !           808:      program under a debugger.  If you send me a large example or a part of
        !           809:      a larger program, I cannot do this; you must debug the compiled
        !           810:      program and narrow the problem down to one source line.  Tell me which
        !           811:      source line it is, and what you believe is incorrect about the code
        !           812:      generated for that line.
        !           813: 
        !           814:    * If you send me examples of output from GNU CC, please use `-g' when
        !           815:      you make them.  The debugging information includes source line numbers
        !           816:      which are essential for correlating the output with the input.
        !           817: 
        !           818: Here are some things that are not necessary:
        !           819: 
        !           820:    * A description of the envelope of the bug.
        !           821: 
        !           822:      Often people who encounter a bug spend a lot of time investigating
        !           823:      which changes to the input file will make the bug go away and which
        !           824:      changes will not affect it.
        !           825: 
        !           826:      This is often time consuming and not very useful, because the way I
        !           827:      will find the bug is by running a single example under the debugger
        !           828:      with breakpoints, not by pure deduction from a series of examples.
        !           829: 
        !           830:      Of course, it can't hurt if you can find a simpler example that
        !           831:      triggers the same bug.  Errors in the output will be easier to spot,
        !           832:      running under the debugger will take less time, etc.  An easy way to
        !           833:      simplify an example is to delete all the function definitions except
        !           834:      the one where the bug occurs.  Those earlier in the file may be
        !           835:      replaced by external declarations.
        !           836: 
        !           837:      However, simplification is not necessary; if you don't want to do
        !           838:      this, report the bug anyway.
        !           839: 
        !           840:    * A patch for the bug.
        !           841: 
        !           842:      A patch for the bug does help me if it is a good one.  But don't omit
        !           843:      the necessary information, such as the test case, because I might see
        !           844:      problems with your patch and decide to fix the problem another way.
        !           845: 
        !           846:      Sometimes with a program as complicated as GNU CC it is very hard to
        !           847:      construct an example that will make the program go through a certain
        !           848:      point in the code.  If you don't send me the example, I won't be able
        !           849:      to verify that the bug is fixed.
        !           850: 
        !           851:    * A guess about what the bug is or what it depends on.
        !           852: 
        !           853:      Such guesses are usually wrong.  Even I can't guess right about such
        !           854:      things without using the debugger to find the facts.  They also don't
        !           855:      serve a useful purpose.
        !           856: 
        !           857: 
        !           858: File: internals,  Node: Portability,  Next: Interface,  Prev: Bugs,  Up: Top
        !           859: 
        !           860: GNU CC and Portability
        !           861: **********************
        !           862: 
        !           863: The main goal of GNU CC was to make a good, fast compiler for machines in
        !           864: the class that the GNU system aims to run on: 32-bit machines that address
        !           865: 8-bit bytes and have several general registers.  Elegance, theoretical
        !           866: power and simplicity are only secondary.
        !           867: 
        !           868: GNU CC gets most of the information about the target machine from a machine
        !           869: description which gives an algebraic formula for each of the machine's
        !           870: instructions.  This is a very clean way to describe the target.  But when
        !           871: the compiler needs information that is difficult to express in this
        !           872: fashion, I have not hesitated to define an ad-hoc parameter to the machine
        !           873: description.  The purpose of portability is to reduce the total work needed
        !           874: on the compiler; it was not of interest for its own sake.
        !           875: 
        !           876: GNU CC does not contain machine dependent code, but it does contain code
        !           877: that depends on machine parameters such as endianness (whether the most
        !           878: significant byte has the highest or lowest address of the bytes in a word)
        !           879: and the availability of autoincrement addressing.  In the RTL-generation
        !           880: pass, it is often necessary to have multiple strategies for generating code
        !           881: for a particular kind of syntax tree, strategies that are usable for
        !           882: different combinations of parameters.  Often I have not tried to address
        !           883: all possible cases, but only the common ones or only the ones that I have
        !           884: encountered.  As a result, a new target may require additional strategies. 
        !           885: You will know if this happens because the compiler will call `abort'. 
        !           886: Fortunately, the new strategies can be added in a machine-independent
        !           887: fashion, and will affect only the target machines that need them.
        !           888: 
        !           889: 
        !           890: File: internals,  Node: Interface,  Next: Passes,  Prev: Portability,  Up: Top
        !           891: 
        !           892: Interfacing to GNU CC Output
        !           893: ****************************
        !           894: 
        !           895: GNU CC is normally configured to use the same function calling convention
        !           896: normally in use on the target system.  This is done with the
        !           897: machine-description macros described (*Note Machine Macros::.).
        !           898: 
        !           899: However, returning of structure and union values is done differently.  As a
        !           900: result, functions compiled with PCC returning such types cannot be called
        !           901: from code compiled with GNU CC, and vice versa.  This usually does not
        !           902: cause trouble because the Unix library routines don't return structures and
        !           903: unions.
        !           904: 
        !           905: Structures and unions that are 1, 2, 4 or 8 bytes long are returned in the
        !           906: same registers used for `int' or `double' return values.  (GNU CC typically
        !           907: allocates variables of such types in registers also.)  Structures and
        !           908: unions of other sizes are returned by storing them into an address passed
        !           909: by the caller in a register.  This method is faster than the one normally
        !           910: used by PCC and is also reentrant.  The register used for passing the
        !           911: address is specified by the machine-description macro `STRUCT_VALUE_REGNUM'.
        !           912: 
        !           913: GNU CC always passes arguments on the stack.  At some point it will be
        !           914: extended to pass arguments in registers, for machines which use that as the
        !           915: standard calling convention.  This will make it possible to use such a
        !           916: convention on other machines as well.  However, that would render it
        !           917: completely incompatible with PCC.  We will probably do this once we have a
        !           918: complete GNU system so we can compile the libraries with GNU CC.
        !           919: 
        !           920: If you use `longjmp', beware of automatic variables.  ANSI C says that
        !           921: automatic variables that are not declared `volatile' have undefined values
        !           922: after a `longjmp'.  And this is all GNU CC promises to do, because it is
        !           923: very difficult to restore register variables correctly, and one of GNU CC's
        !           924: features is that it can put variables in registers without your asking it to.
        !           925: 
        !           926: If you want a variable to be unaltered by `longjmp', and you don't want to
        !           927: write `volatile' because old C compilers don't accept it, just take the
        !           928: address of the variable.  If a variable's address is ever taken, even if
        !           929: just to compute it and ignore it, then the variable cannot go in a register:
        !           930: 
        !           931:      {
        !           932:        int careful;
        !           933:        &careful;
        !           934:        ...
        !           935:      }
        !           936: 
        !           937: Code compiled with GNU CC may call certain library routines.  The routines
        !           938: needed on the Vax and 68000 are in the file `gnulib.c'.  You must compile
        !           939: this file with the standard C compiler, not with GNU CC, and then link it
        !           940: with each program you compile with GNU CC.  (In actuality, many programs
        !           941: will not need it.)  The usual function call interface is used for calling
        !           942: the library routines.  Some standard parts of the C library, such as
        !           943: `bcopy', are also called automatically.
        !           944: 
        !           945: 

unix.superglobalmegacorp.com

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