|
|
1.1.1.4 ! root 1: This is Info file gcc.info, produced by Makeinfo-1.49 from the input 1.1 root 2: file gcc.texi. 3: 4: This file documents the use and the internals of the GNU compiler. 5: 6: Copyright (C) 1988, 1989, 1992 Free Software Foundation, Inc. 7: 1.1.1.3 root 8: Permission is granted to make and distribute verbatim copies of this 9: manual provided the copyright notice and this permission notice are 10: preserved on all copies. 1.1 root 11: 12: Permission is granted to copy and distribute modified versions of 13: this manual under the conditions for verbatim copying, provided also 1.1.1.4 ! root 14: that the sections entitled "GNU General Public License" and "Protect ! 15: Your Freedom--Fight `Look And Feel'" are included exactly as in the ! 16: original, and provided that the entire resulting derived work is ! 17: distributed under the terms of a permission notice identical to this ! 18: one. 1.1 root 19: 20: Permission is granted to copy and distribute translations of this 21: manual into another language, under the above conditions for modified 1.1.1.3 root 22: versions, except that the sections entitled "GNU General Public 1.1.1.4 ! root 23: License" and "Protect Your Freedom--Fight `Look And Feel'", and this ! 24: permission notice, may be included in translations approved by the Free ! 25: Software Foundation instead of in the original English. 1.1 root 26: 27: 1.1.1.4 ! root 28: File: gcc.info, Node: Function Attributes, Next: Function Prototypes, Prev: Case Ranges, Up: Extensions 1.1.1.2 root 29: 1.1.1.4 ! root 30: Declaring Attributes of Functions ! 31: ================================= 1.1.1.2 root 32: 1.1.1.4 ! root 33: In GNU C, you declare certain things about functions called in your ! 34: program which help the compiler optimize function calls. 1.1.1.2 root 35: 1.1.1.4 ! root 36: A few standard library functions, such as `abort' and `exit', cannot ! 37: return. GNU CC knows this automatically. Some programs define their ! 38: own functions that never return. You can declare them `volatile' to ! 39: tell the compiler this fact. For example, ! 40: ! 41: extern void volatile fatal (); ! 42: ! 43: void ! 44: fatal (...) ! 45: { ! 46: ... /* Print error message. */ ... ! 47: exit (1); ! 48: } ! 49: ! 50: The `volatile' keyword tells the compiler to assume that `fatal' ! 51: cannot return. This makes slightly better code, but more importantly ! 52: it helps avoid spurious warnings of uninitialized variables. ! 53: ! 54: It does not make sense for a `volatile' function to have a return ! 55: type other than `void'. ! 56: ! 57: Many functions do not examine any values except their arguments, and ! 58: have no effects except the return value. Such a function can be subject ! 59: to common subexpression elimination and loop optimization just as an ! 60: arithmetic operator would be. These functions should be declared ! 61: `const'. For example, ! 62: ! 63: extern int const square (); ! 64: ! 65: says that the hypothetical function `square' is safe to call fewer ! 66: times than the program says. ! 67: ! 68: Note that a function that has pointer arguments and examines the data ! 69: pointed to must *not* be declared `const'. Likewise, a function that ! 70: calls a non-`const' function usually must not be `const'. It does not ! 71: make sense for a `const' function to return `void'. ! 72: ! 73: We recommend placing the keyword `const' after the function's return ! 74: type. It makes no difference in the example above, but when the return ! 75: type is a pointer, it is the only way to make the function itself ! 76: const. For example, ! 77: ! 78: const char *mincp (int); ! 79: ! 80: says that `mincp' returns `const char *'--a pointer to a const object. ! 81: To declare `mincp' const, you must write this: ! 82: ! 83: char * const mincp (int); ! 84: ! 85: Some people object to this feature, suggesting that ANSI C's ! 86: `#pragma' should be used instead. There are two reasons for not doing ! 87: this. ! 88: ! 89: 1. It is impossible to generate `#pragma' commands from a macro. ! 90: ! 91: 2. The `#pragma' command is just as likely as these keywords to mean ! 92: something else in another compiler. ! 93: ! 94: These two reasons apply to almost any application that might be ! 95: proposed for `#pragma'. It is basically a mistake to use `#pragma' for ! 96: *anything*. ! 97: ! 98: The keyword `__attribute__' allows you to specify special attributes ! 99: when making a declaration. This keyword is followed by an attribute ! 100: specification inside double parentheses. One attribute, `format', is ! 101: currently defined for functions. Others are implemented for variables ! 102: and structure fields (*note Function Attributes::.). ! 103: ! 104: `format (ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)' ! 105: The `format' attribute specifies that a function takes `printf' or ! 106: `scanf' style arguments which should be type-checked against a ! 107: format string. For example, the declaration: ! 108: ! 109: extern int ! 110: my_printf (void *my_object, const char *my_format, ...) ! 111: __attribute__ ((format (printf, 2, 3))); ! 112: ! 113: causes the compiler to check the arguments in calls to `my_printf' ! 114: for consistency with the `printf' style format string argument ! 115: `my_format'. ! 116: ! 117: The parameter ARCHETYPE determines how the format string is ! 118: interpreted, and should be either `printf' or `scanf'. The ! 119: parameter STRING-INDEX specifies which argument is the format ! 120: string argument (starting from 1), while FIRST-TO-CHECK is the ! 121: number of the first argument to check against the format string. ! 122: For functions where the arguments are not available to be checked ! 123: (such as `vprintf'), specify the third parameter as zero. In this ! 124: case the compiler only checks the format string for consistency. ! 125: ! 126: In the example above, the format string (`my_format') is the second ! 127: argument of the function `my_print', and the arguments to check ! 128: start with the third argument, so the correct parameters for the ! 129: format attribute are 2 and 3. ! 130: ! 131: The `format' attribute allows you to identify your own functions ! 132: which take format strings as arguments, so that GNU CC can check ! 133: the calls to these functions for errors. The compiler always ! 134: checks formats for the ANSI library functions `printf', `fprintf', ! 135: `sprintf', `scanf', `fscanf', `sscanf', `vprintf', `vfprintf' and ! 136: `vsprintf' whenever such warnings are requested (using ! 137: `-Wformat'), so there is no need to modify the header file ! 138: `stdio.h'. 1.1.1.2 root 139: 1.1.1.4 ! root 140: ! 141: File: gcc.info, Node: Function Prototypes, Next: Dollar Signs, Prev: Function Attributes, Up: Extensions 1.1.1.2 root 142: 1.1.1.4 ! root 143: Prototypes and Old-Style Function Definitions ! 144: ============================================= 1.1.1.2 root 145: 1.1.1.4 ! root 146: GNU C extends ANSI C to allow a function prototype to override a ! 147: later old-style non-prototype definition. Consider the following ! 148: example: ! 149: ! 150: /* Use prototypes unless the compiler is old-fashioned. */ ! 151: #if __STDC__ ! 152: #define P(x) (x) ! 153: #else ! 154: #define P(x) () ! 155: #endif ! 156: ! 157: /* Prototype function declaration. */ ! 158: int isroot P((uid_t)); ! 159: ! 160: /* Old-style function definition. */ ! 161: int ! 162: isroot (x) /* ??? lossage here ??? */ ! 163: uid_t x; ! 164: { ! 165: return x == 0; ! 166: } ! 167: ! 168: Suppose the type `uid_t' happens to be `short'. ANSI C does not ! 169: allow this example, because subword arguments in old-style ! 170: non-prototype definitions are promoted. Therefore in this example the ! 171: function definition's argument is really an `int', which does not match ! 172: the prototype argument type of `short'. ! 173: ! 174: This restriction of ANSI C makes it hard to write code that is ! 175: portable to traditional C compilers, because the programmer does not ! 176: know whether the `uid_t' type is `short', `int', or `long'. Therefore, ! 177: in cases like these GNU C allows a prototype to override a later ! 178: old-style definition. More precisely, in GNU C, a function prototype ! 179: argument type overrides the argument type specified by a later ! 180: old-style definition if the former type is the same as the latter type ! 181: before promotion. Thus in GNU C the above example is equivalent to the ! 182: following: ! 183: ! 184: int isroot (uid_t); ! 185: ! 186: int ! 187: isroot (uid_t x) ! 188: { ! 189: return x == 0; ! 190: } 1.1.1.2 root 191: 192: 1.1.1.4 ! root 193: File: gcc.info, Node: Dollar Signs, Next: Character Escapes, Prev: Function Prototypes, Up: Extensions 1.1 root 194: 1.1.1.4 ! root 195: Dollar Signs in Identifier Names ! 196: ================================ 1.1 root 197: 1.1.1.4 ! root 198: In GNU C, you may use dollar signs in identifier names. This is ! 199: because many traditional C implementations allow such identifiers. 1.1.1.3 root 200: 1.1.1.4 ! root 201: On some machines, dollar signs are allowed in identifiers if you ! 202: specify `-traditional'. On a few systems they are allowed by default, ! 203: even if you do not use `-traditional'. But they are never allowed if ! 204: you specify `-ansi'. ! 205: ! 206: There are certain ANSI C programs (obscure, to be sure) that would ! 207: compile incorrectly if dollar signs were permitted in identifiers. For ! 208: example: ! 209: ! 210: #define foo(a) #a ! 211: #define lose(b) foo (b) ! 212: #define test$ ! 213: lose (test) 1.1.1.3 root 214: 215: 1.1.1.4 ! root 216: File: gcc.info, Node: Character Escapes, Next: Variable Attributes, Prev: Dollar Signs, Up: Extensions 1.1.1.3 root 217: 1.1.1.4 ! root 218: The Character ESC in Constants ! 219: ============================== 1.1.1.3 root 220: 1.1.1.4 ! root 221: You can use the sequence `\e' in a string or character constant to ! 222: stand for the ASCII character ESC. 1.1.1.3 root 223: 1.1.1.4 ! root 224: ! 225: File: gcc.info, Node: Alignment, Next: Inline, Prev: Variable Attributes, Up: Extensions 1.1.1.3 root 226: 1.1.1.4 ! root 227: Inquiring on Alignment of Types or Variables ! 228: ============================================ 1.1.1.3 root 229: 1.1.1.4 ! root 230: The keyword `__alignof__' allows you to inquire about how an object ! 231: is aligned, or the minimum alignment usually required by a type. Its ! 232: syntax is just like `sizeof'. ! 233: ! 234: For example, if the target machine requires a `double' value to be ! 235: aligned on an 8-byte boundary, then `__alignof__ (double)' is 8. This ! 236: is true on many RISC machines. On more traditional machine designs, ! 237: `__alignof__ (double)' is 4 or even 2. ! 238: ! 239: Some machines never actually require alignment; they allow reference ! 240: to any data type even at an odd addresses. For these machines, ! 241: `__alignof__' reports the *recommended* alignment of a type. ! 242: ! 243: When the operand of `__alignof__' is an lvalue rather than a type, ! 244: the value is the largest alignment that the lvalue is known to have. ! 245: It may have this alignment as a result of its data type, or because it ! 246: is part of a structure and inherits alignment from that structure. For ! 247: example, after this declaration: ! 248: ! 249: struct foo { int x; char y; } foo1; ! 250: ! 251: the value of `__alignof__ (foo1.y)' is probably 2 or 4, the same as ! 252: `__alignof__ (int)', even though the data type of `foo1.y' does not ! 253: itself demand any alignment. 1.1.1.3 root 254: 1.1.1.4 ! root 255: A related feature which lets you specify the alignment of an object ! 256: is `__attribute__ ((aligned (ALIGNMENT)))'; see the following section. 1.1.1.3 root 257: 258: 1.1.1.4 ! root 259: File: gcc.info, Node: Variable Attributes, Next: Alignment, Prev: Character Escapes, Up: Extensions 1.1.1.3 root 260: 1.1.1.4 ! root 261: Specifying Attributes of Variables ! 262: ================================== 1.1.1.3 root 263: 1.1.1.4 ! root 264: The keyword `__attribute__' allows you to specify special attributes ! 265: of variables or structure fields. This keyword is followed by an ! 266: attribute specification inside double parentheses. Four attributes are ! 267: currently defined: `aligned', `format', `mode' and `packed'. `format' ! 268: is used for functions, and thus not documented here; see *Note Function ! 269: Attributes::. ! 270: ! 271: `aligned (ALIGNMENT)' ! 272: This attribute specifies the alignment of the variable or structure ! 273: field, measured in bytes. For example, the declaration: ! 274: ! 275: int x __attribute__ ((aligned (16))) = 0; ! 276: ! 277: causes the compiler to allocate the global variable `x' on a ! 278: 16-byte boundary. On a 68040, this could be used in conjunction ! 279: with an `asm' expression to access the `move16' instruction which ! 280: requires 16-byte aligned operands. ! 281: ! 282: You can also specify the alignment of structure fields. For ! 283: example, to create a double-word aligned `int' pair, you could ! 284: write: ! 285: ! 286: struct foo { int x[2] __attribute__ ((aligned (8))); }; ! 287: ! 288: This is an alternative to creating a union with a `double' member ! 289: that forces the union to be double-word aligned. ! 290: ! 291: It is not possible to specify the alignment of functions; the ! 292: alignment of functions is determined by the machine's requirements ! 293: and cannot be changed. You cannot specify alignment for a typedef ! 294: name because such a name is just an alias, not a distinct type. ! 295: ! 296: The linker of your operating system imposes a maximum alignment. ! 297: If the linker aligns each object file on a four byte boundary, ! 298: then it is beyond the compiler's power to cause anything to be ! 299: aligned to a larger boundary than that. For example, if the ! 300: linker happens to put this object file at address 136 (eight more ! 301: than a multiple of 64), then the compiler cannot guarantee an ! 302: alignment of more than 8 just by aligning variables in the object ! 303: file. ! 304: ! 305: `mode (MODE)' ! 306: This attribute specifies the data type for the ! 307: declaration--whichever type corresponds to the mode MODE. This in ! 308: effect lets you request an integer or floating point type ! 309: according to its width. ! 310: ! 311: `packed' ! 312: The `packed' attribute specifies that a variable or structure field ! 313: should have the smallest possible alignment--one byte for a ! 314: variable, and one bit for a field, unless you specify a larger ! 315: value with the `aligned' attribute. 1.1.1.3 root 316: 1.1.1.4 ! root 317: ! 318: File: gcc.info, Node: Inline, Next: Extended Asm, Prev: Alignment, Up: Extensions 1.1.1.3 root 319: 1.1.1.4 ! root 320: An Inline Function is As Fast As a Macro ! 321: ======================================== ! 322: ! 323: By declaring a function `inline', you can direct GNU CC to integrate ! 324: that function's code into the code for its callers. This makes ! 325: execution faster by eliminating the function-call overhead; in ! 326: addition, if any of the actual argument values are constant, their known ! 327: values may permit simplifications at compile time so that not all of the ! 328: inline function's code needs to be included. Inlining of functions is ! 329: an optimization and it really "works" only in optimizing compilation. ! 330: If you don't use `-O', no function is really inline. ! 331: ! 332: To declare a function inline, use the `inline' keyword in its ! 333: declaration, like this: ! 334: ! 335: inline int ! 336: inc (int *a) ! 337: { ! 338: (*a)++; ! 339: } ! 340: ! 341: (If you are writing a header file to be included in ANSI C programs, ! 342: write `__inline__' instead of `inline'. *Note Alternate Keywords::.) ! 343: ! 344: You can also make all "simple enough" functions inline with the ! 345: option `-finline-functions'. Note that certain usages in a function ! 346: definition can make it unsuitable for inline substitution. ! 347: ! 348: When a function is both inline and `static', if all calls to the ! 349: function are integrated into the caller, and the function's address is ! 350: never used, then the function's own assembler code is never referenced. ! 351: In this case, GNU CC does not actually output assembler code for the ! 352: function, unless you specify the option `-fkeep-inline-functions'. Some ! 353: calls cannot be integrated for various reasons (in particular, calls ! 354: that precede the function's definition cannot be integrated, and ! 355: neither can recursive calls within the definition). If there is a ! 356: nonintegrated call, then the function is compiled to assembler code as ! 357: usual. The function must also be compiled as usual if the program ! 358: refers to its address, because that can't be inlined. ! 359: ! 360: When an inline function is not `static', then the compiler must ! 361: assume that there may be calls from other source files; since a global ! 362: symbol can be defined only once in any program, the function must not ! 363: be defined in the other source files, so the calls therein cannot be ! 364: integrated. Therefore, a non-`static' inline function is always ! 365: compiled on its own in the usual fashion. ! 366: ! 367: If you specify both `inline' and `extern' in the function ! 368: definition, then the definition is used only for inlining. In no case ! 369: is the function compiled on its own, not even if you refer to its ! 370: address explicitly. Such an address becomes an external reference, as ! 371: if you had only declared the function, and had not defined it. ! 372: ! 373: This combination of `inline' and `extern' has almost the effect of a ! 374: macro. The way to use it is to put a function definition in a header ! 375: file with these keywords, and put another copy of the definition ! 376: (lacking `inline' and `extern') in a library file. The definition in ! 377: the header file will cause most calls to the function to be inlined. ! 378: If any uses of the function remain, they will refer to the single copy ! 379: in the library. ! 380: ! 381: GNU C does not inline any functions when not optimizing. It is not ! 382: clear whether it is better to inline or not, in this case, but we found ! 383: that a correct implementation when not optimizing was difficult. So we ! 384: did the easy thing, and turned it off. 1.1.1.3 root 385: 386: 1.1.1.4 ! root 387: File: gcc.info, Node: Extended Asm, Next: Asm Labels, Prev: Inline, Up: Extensions ! 388: ! 389: Assembler Instructions with C Expression Operands ! 390: ================================================= 1.1.1.3 root 391: 1.1.1.4 ! root 392: In an assembler instruction using `asm', you can now specify the ! 393: operands of the instruction using C expressions. This means no more ! 394: guessing which registers or memory locations will contain the data you ! 395: want to use. ! 396: ! 397: You must specify an assembler instruction template much like what ! 398: appears in a machine description, plus an operand constraint string for ! 399: each operand. ! 400: ! 401: For example, here is how to use the 68881's `fsinx' instruction: ! 402: ! 403: asm ("fsinx %1,%0" : "=f" (result) : "f" (angle)); ! 404: ! 405: Here `angle' is the C expression for the input operand while `result' ! 406: is that of the output operand. Each has `"f"' as its operand ! 407: constraint, saying that a floating point register is required. The `=' ! 408: in `=f' indicates that the operand is an output; all output operands' ! 409: constraints must use `='. The constraints use the same language used ! 410: in the machine description (*note Constraints::.). ! 411: ! 412: Each operand is described by an operand-constraint string followed by ! 413: the C expression in parentheses. A colon separates the assembler ! 414: template from the first output operand, and another separates the last ! 415: output operand from the first input, if any. Commas separate output ! 416: operands and separate inputs. The total number of operands is limited ! 417: to ten or to the maximum number of operands in any instruction pattern ! 418: in the machine description, whichever is greater. ! 419: ! 420: If there are no output operands, and there are input operands, then ! 421: there must be two consecutive colons surrounding the place where the ! 422: output operands would go. ! 423: ! 424: Output operand expressions must be lvalues; the compiler can check ! 425: this. The input operands need not be lvalues. The compiler cannot ! 426: check whether the operands have data types that are reasonable for the ! 427: instruction being executed. It does not parse the assembler ! 428: instruction template and does not know what it means, or whether it is ! 429: valid assembler input. The extended `asm' feature is most often used ! 430: for machine instructions that the compiler itself does not know exist. ! 431: ! 432: The output operands must be write-only; GNU CC will assume that the ! 433: values in these operands before the instruction are dead and need not be ! 434: generated. Extended asm does not support input-output or read-write ! 435: operands. For this reason, the constraint character `+', which ! 436: indicates such an operand, may not be used. ! 437: ! 438: When the assembler instruction has a read-write operand, or an ! 439: operand in which only some of the bits are to be changed, you must ! 440: logically split its function into two separate operands, one input ! 441: operand and one write-only output operand. The connection between them ! 442: is expressed by constraints which say they need to be in the same ! 443: location when the instruction executes. You can use the same C ! 444: expression for both operands, or different expressions. For example, ! 445: here we write the (fictitious) `combine' instruction with `bar' as its ! 446: read-only source operand and `foo' as its read-write destination: ! 447: ! 448: asm ("combine %2,%0" : "=r" (foo) : "0" (foo), "g" (bar)); ! 449: ! 450: The constraint `"0"' for operand 1 says that it must occupy the same ! 451: location as operand 0. A digit in constraint is allowed only in an ! 452: input operand, and it must refer to an output operand. ! 453: ! 454: Only a digit in the constraint can guarantee that one operand will ! 455: be in the same place as another. The mere fact that `foo' is the value ! 456: of both operands is not enough to guarantee that they will be in the ! 457: same place in the generated assembler code. The following would not ! 458: work: ! 459: ! 460: asm ("combine %2,%0" : "=r" (foo) : "r" (foo), "g" (bar)); ! 461: ! 462: Various optimizations or reloading could cause operands 0 and 1 to ! 463: be in different registers; GNU CC knows no reason not to do so. For ! 464: example, the compiler might find a copy of the value of `foo' in one ! 465: register and use it for operand 1, but generate the output operand 0 in ! 466: a different register (copying it afterward to `foo''s own address). Of ! 467: course, since the register for operand 1 is not even mentioned in the ! 468: assembler code, the result will not work, but GNU CC can't tell that. ! 469: ! 470: Some instructions clobber specific hard registers. To describe ! 471: this, write a third colon after the input operands, followed by the ! 472: names of the clobbered hard registers (given as strings). Here is a ! 473: realistic example for the Vax: ! 474: ! 475: asm volatile ("movc3 %0,%1,%2" ! 476: : /* no outputs */ ! 477: : "g" (from), "g" (to), "g" (count) ! 478: : "r0", "r1", "r2", "r3", "r4", "r5"); ! 479: ! 480: If you refer to a particular hardware register from the assembler ! 481: code, then you will probably have to list the register after the third ! 482: colon to tell the compiler that the register's value is modified. In ! 483: many assemblers, the register names begin with `%'; to produce one `%' ! 484: in the assembler code, you must write `%%' in the input. ! 485: ! 486: If your assembler instruction can alter the condition code register, ! 487: add `cc' to the list of clobbered registers. GNU CC on some machines ! 488: represents the condition codes as a specific hardware register; `cc' ! 489: serves to name this register. On other machines, the condition code is ! 490: handled differently, and specifying `cc' has no effect. But it is ! 491: valid no matter what the machine. ! 492: ! 493: If your assembler instruction modifies memory in an unpredicable ! 494: fashion, add `memory' to the list of clobbered registers. This will ! 495: cause GNU CC to not keep memory values cached in registers across the ! 496: assembler instruction. ! 497: ! 498: You can put multiple assembler instructions together in a single ! 499: `asm' template, separated either with newlines (written as `\n') or with ! 500: semicolons if the assembler allows such semicolons. The GNU assembler ! 501: allows semicolons and all Unix assemblers seem to do so. The input ! 502: operands are guaranteed not to use any of the clobbered registers, and ! 503: neither will the output operands' addresses, so you can read and write ! 504: the clobbered registers as many times as you like. Here is an example ! 505: of multiple instructions in a template; it assumes that the subroutine ! 506: `_foo' accepts arguments in registers 9 and 10: ! 507: ! 508: asm ("movl %0,r9;movl %1,r10;call _foo" ! 509: : /* no outputs */ ! 510: : "g" (from), "g" (to) ! 511: : "r9", "r10"); ! 512: ! 513: Unless an output operand has the `&' constraint modifier, GNU CC may ! 514: allocate it in the same register as an unrelated input operand, on the ! 515: assumption that the inputs are consumed before the outputs are produced. ! 516: This assumption may be false if the assembler code actually consists of ! 517: more than one instruction. In such a case, use `&' for each output ! 518: operand that may not overlap an input. *Note Modifiers::. ! 519: ! 520: If you want to test the condition code produced by an assembler ! 521: instruction, you must include a branch and a label in the `asm' ! 522: construct, as follows: ! 523: ! 524: asm ("clr %0;frob %1;beq 0f;mov #1,%0;0:" ! 525: : "g" (result) ! 526: : "g" (input)); ! 527: ! 528: This assumes your assembler supports local labels, as the GNU assembler ! 529: and most Unix assemblers do. ! 530: ! 531: Usually the most convenient way to use these `asm' instructions is to ! 532: encapsulate them in macros that look like functions. For example, ! 533: ! 534: #define sin(x) \ ! 535: ({ double __value, __arg = (x); \ ! 536: asm ("fsinx %1,%0": "=f" (__value): "f" (__arg)); \ ! 537: __value; }) ! 538: ! 539: Here the variable `__arg' is used to make sure that the instruction ! 540: operates on a proper `double' value, and to accept only those arguments ! 541: `x' which can convert automatically to a `double'. ! 542: ! 543: Another way to make sure the instruction operates on the correct ! 544: data type is to use a cast in the `asm'. This is different from using a ! 545: variable `__arg' in that it converts more different types. For ! 546: example, if the desired type were `int', casting the argument to `int' ! 547: would accept a pointer with no complaint, while assigning the argument ! 548: to an `int' variable named `__arg' would warn about using a pointer ! 549: unless the caller explicitly casts it. ! 550: ! 551: If an `asm' has output operands, GNU CC assumes for optimization ! 552: purposes that the instruction has no side effects except to change the ! 553: output operands. This does not mean that instructions with a side ! 554: effect cannot be used, but you must be careful, because the compiler ! 555: may eliminate them if the output operands aren't used, or move them out ! 556: of loops, or replace two with one if they constitute a common ! 557: subexpression. Also, if your instruction does have a side effect on a ! 558: variable that otherwise appears not to change, the old value of the ! 559: variable may be reused later if it happens to be found in a register. ! 560: ! 561: You can prevent an `asm' instruction from being deleted, moved ! 562: significantly, or combined, by writing the keyword `volatile' after the ! 563: `asm'. For example: ! 564: ! 565: #define set_priority(x) \ ! 566: asm volatile ("set_priority %0": /* no outputs */ : "g" (x)) ! 567: ! 568: An instruction without output operands will not be deleted or moved ! 569: significantly, regardless, unless it is unreachable. ! 570: ! 571: Note that even a volatile `asm' instruction can be moved in ways ! 572: that appear insignificant to the compiler, such as across jump ! 573: instructions. You can't expect a sequence of volatile `asm' ! 574: instructions to remain perfectly consecutive. If you want consecutive ! 575: output, use a single `asm'. ! 576: ! 577: It is a natural idea to look for a way to give access to the ! 578: condition code left by the assembler instruction. However, when we ! 579: attempted to implement this, we found no way to make it work reliably. ! 580: The problem is that output operands might need reloading, which would ! 581: result in additional following "store" instructions. On most machines, ! 582: these instructions would alter the condition code before there was time ! 583: to test it. This problem doesn't arise for ordinary "test" and ! 584: "compare" instructions because they don't have any output operands. 1.1.1.3 root 585: 1.1.1.4 ! root 586: If you are writing a header file that should be includable in ANSI C ! 587: programs, write `__asm__' instead of `asm'. *Note Alternate Keywords::. 1.1.1.3 root 588: 1.1.1.4 ! root 589: ! 590: File: gcc.info, Node: Asm Labels, Next: Explicit Reg Vars, Prev: Extended Asm, Up: Extensions 1.1.1.3 root 591: 1.1.1.4 ! root 592: Controlling Names Used in Assembler Code ! 593: ======================================== 1.1.1.3 root 594: 1.1.1.4 ! root 595: You can specify the name to be used in the assembler code for a C ! 596: function or variable by writing the `asm' (or `__asm__') keyword after ! 597: the declarator as follows: ! 598: ! 599: int foo asm ("myfoo") = 2; ! 600: ! 601: This specifies that the name to be used for the variable `foo' in the ! 602: assembler code should be `myfoo' rather than the usual `_foo'. ! 603: ! 604: On systems where an underscore is normally prepended to the name of ! 605: a C function or variable, this feature allows you to define names for ! 606: the linker that do not start with an underscore. ! 607: ! 608: You cannot use `asm' in this way in a function *definition*; but you ! 609: can get the same effect by writing a declaration for the function ! 610: before its definition and putting `asm' there, like this: ! 611: ! 612: extern func () asm ("FUNC"); ! 613: ! 614: func (x, y) ! 615: int x, y; ! 616: ... ! 617: ! 618: It is up to you to make sure that the assembler names you choose do ! 619: not conflict with any other assembler symbols. Also, you must not use a ! 620: register name; that would produce completely invalid assembler code. ! 621: GNU CC does not as yet have the ability to store static variables in ! 622: registers. Perhaps that will be added. 1.1.1.3 root 623: 1.1.1.4 ! root 624: ! 625: File: gcc.info, Node: Explicit Reg Vars, Next: Alternate Keywords, Prev: Asm Labels, Up: Extensions 1.1.1.3 root 626: 1.1.1.4 ! root 627: Variables in Specified Registers ! 628: ================================ 1.1.1.3 root 629: 1.1.1.4 ! root 630: GNU C allows you to put a few global variables into specified ! 631: hardware registers. You can also specify the register in which an ! 632: ordinary register variable should be allocated. ! 633: ! 634: * Global register variables reserve registers throughout the program. ! 635: This may be useful in programs such as programming language ! 636: interpreters which have a couple of global variables that are ! 637: accessed very often. ! 638: ! 639: * Local register variables in specific registers do not reserve the ! 640: registers. The compiler's data flow analysis is capable of ! 641: determining where the specified registers contain live values, and ! 642: where they are available for other uses. ! 643: ! 644: These local variables are sometimes convenient for use with the ! 645: extended `asm' feature (*note Extended Asm::.), if you want to ! 646: write one output of the assembler instruction directly into a ! 647: particular register. (This will work provided the register you ! 648: specify fits the constraints specified for that operand in the ! 649: `asm'.) 1.1.1.3 root 650: 1.1.1.4 ! root 651: * Menu: 1.1.1.3 root 652: 1.1.1.4 ! root 653: * Global Reg Vars:: ! 654: * Local Reg Vars:: 1.1.1.3 root 655: 656: 1.1.1.4 ! root 657: File: gcc.info, Node: Global Reg Vars, Next: Local Reg Vars, Up: Explicit Reg Vars 1.1.1.3 root 658: 1.1.1.4 ! root 659: Defining Global Register Variables ! 660: ---------------------------------- 1.1.1.3 root 661: 1.1.1.4 ! root 662: You can define a global register variable in GNU C like this: 1.1.1.3 root 663: 1.1.1.4 ! root 664: register int *foo asm ("a5"); 1.1.1.3 root 665: 1.1.1.4 ! root 666: Here `a5' is the name of the register which should be used. Choose a ! 667: register which is normally saved and restored by function calls on your ! 668: machine, so that library routines will not clobber it. ! 669: ! 670: Naturally the register name is cpu-dependent, so you would need to ! 671: conditionalize your program according to cpu type. The register `a5' ! 672: would be a good choice on a 68000 for a variable of pointer type. On ! 673: machines with register windows, be sure to choose a "global" register ! 674: that is not affected magically by the function call mechanism. ! 675: ! 676: In addition, operating systems on one type of cpu may differ in how ! 677: they name the registers; then you would need additional conditionals. ! 678: For example, some 68000 operating systems call this register `%a5'. ! 679: ! 680: Eventually there may be a way of asking the compiler to choose a ! 681: register automatically, but first we need to figure out how it should ! 682: choose and how to enable you to guide the choice. No solution is ! 683: evident. ! 684: ! 685: Defining a global register variable in a certain register reserves ! 686: that register entirely for this use, at least within the current ! 687: compilation. The register will not be allocated for any other purpose ! 688: in the functions in the current compilation. The register will not be ! 689: saved and restored by these functions. Stores into this register are ! 690: never deleted even if they would appear to be dead, but references may ! 691: be deleted or moved or simplified. ! 692: ! 693: It is not safe to access the global register variables from signal ! 694: handlers, or from more than one thread of control, because the system ! 695: library routines may temporarily use the register for other things ! 696: (unless you recompile them specially for the task at hand). ! 697: ! 698: It is not safe for one function that uses a global register variable ! 699: to call another such function `foo' by way of a third function `lose' ! 700: that was compiled without knowledge of this variable (i.e. in a ! 701: different source file in which the variable wasn't declared). This is ! 702: because `lose' might save the register and put some other value there. ! 703: For example, you can't expect a global register variable to be ! 704: available in the comparison-function that you pass to `qsort', since ! 705: `qsort' might have put something else in that register. (If you are ! 706: prepared to recompile `qsort' with the same global register variable, ! 707: you can solve this problem.) ! 708: ! 709: If you want to recompile `qsort' or other source files which do not ! 710: actually use your global register variable, so that they will not use ! 711: that register for any other purpose, then it suffices to specify the ! 712: compiler option `-ffixed-REG'. You need not actually add a global ! 713: register declaration to their source code. ! 714: ! 715: A function which can alter the value of a global register variable ! 716: cannot safely be called from a function compiled without this variable, ! 717: because it could clobber the value the caller expects to find there on ! 718: return. Therefore, the function which is the entry point into the part ! 719: of the program that uses the global register variable must explicitly ! 720: save and restore the value which belongs to its caller. ! 721: ! 722: On most machines, `longjmp' will restore to each global register ! 723: variable the value it had at the time of the `setjmp'. On some ! 724: machines, however, `longjmp' will not change the value of global ! 725: register variables. To be portable, the function that called `setjmp' ! 726: should make other arrangements to save the values of the global register ! 727: variables, and to restore them in a `longjmp'. This way, the same ! 728: thing will happen regardless of what `longjmp' does. ! 729: ! 730: All global register variable declarations must precede all function ! 731: definitions. If such a declaration could appear after function ! 732: definitions, the declaration would be too late to prevent the register ! 733: from being used for other purposes in the preceding functions. ! 734: ! 735: Global register variables may not have initial values, because an ! 736: executable file has no means to supply initial contents for a register. ! 737: ! 738: On the Sparc, there are reports that g3 ... g7 are suitable ! 739: registers, but certain library functions, such as `getwd', as well as ! 740: the subroutines for division and remainder, modify g3 and g4. g1 and ! 741: g2 are local temporaries. 1.1.1.3 root 742: 1.1.1.4 ! root 743: On the 68000, a2 ... a5 should be suitable, as should d2 ... d7. Of ! 744: course, it will not do to use more than a few of those. 1.1 root 745: 746: 1.1.1.4 ! root 747: File: gcc.info, Node: Local Reg Vars, Prev: Global Reg Vars, Up: Explicit Reg Vars 1.1.1.3 root 748: 1.1.1.4 ! root 749: Specifying Registers for Local Variables ! 750: ---------------------------------------- 1.1.1.3 root 751: 1.1.1.4 ! root 752: You can define a local register variable with a specified register ! 753: like this: 1.1.1.3 root 754: 1.1.1.4 ! root 755: register int *foo asm ("a5"); ! 756: ! 757: Here `a5' is the name of the register which should be used. Note that ! 758: this is the same syntax used for defining global register variables, ! 759: but for a local variable it would appear within a function. ! 760: ! 761: Naturally the register name is cpu-dependent, but this is not a ! 762: problem, since specific registers are most often useful with explicit ! 763: assembler instructions (*note Extended Asm::.). Both of these things ! 764: generally require that you conditionalize your program according to cpu ! 765: type. ! 766: ! 767: In addition, operating systems on one type of cpu may differ in how ! 768: they name the registers; then you would need additional conditionals. ! 769: For example, some 68000 operating systems call this register `%a5'. ! 770: ! 771: Eventually there may be a way of asking the compiler to choose a ! 772: register automatically, but first we need to figure out how it should ! 773: choose and how to enable you to guide the choice. No solution is ! 774: evident. ! 775: ! 776: Defining such a register variable does not reserve the register; it ! 777: remains available for other uses in places where flow control determines ! 778: the variable's value is not live. However, these registers are made ! 779: unavailable for use in the reload pass. I would not be surprised if ! 780: excessive use of this feature leaves the compiler too few available ! 781: registers to compile certain functions. 1.1.1.3 root 782: 783: 1.1.1.4 ! root 784: File: gcc.info, Node: Alternate Keywords, Next: Incomplete Enums, Prev: Explicit Reg Vars, Up: Extensions 1.1.1.3 root 785: 1.1.1.4 ! root 786: Alternate Keywords ! 787: ================== 1.1.1.3 root 788: 1.1.1.4 ! root 789: The option `-traditional' disables certain keywords; `-ansi' ! 790: disables certain others. This causes trouble when you want to use GNU C ! 791: extensions, or ANSI C features, in a general-purpose header file that ! 792: should be usable by all programs, including ANSI C programs and ! 793: traditional ones. The keywords `asm', `typeof' and `inline' cannot be ! 794: used since they won't work in a program compiled with `-ansi', while ! 795: the keywords `const', `volatile', `signed', `typeof' and `inline' won't ! 796: work in a program compiled with `-traditional'. ! 797: ! 798: The way to solve these problems is to put `__' at the beginning and ! 799: end of each problematical keyword. For example, use `__asm__' instead ! 800: of `asm', `__const__' instead of `const', and `__inline__' instead of ! 801: `inline'. ! 802: ! 803: Other C compilers won't accept these alternative keywords; if you ! 804: want to compile with another compiler, you can define the alternate ! 805: keywords as macros to replace them with the customary keywords. It ! 806: looks like this: 1.1.1.3 root 807: 1.1.1.4 ! root 808: #ifndef __GNUC__ ! 809: #define __asm__ asm ! 810: #endif 1.1.1.3 root 811: 1.1.1.4 ! root 812: `-pedantic' causes warnings for many GNU C extensions. You can ! 813: prevent such warnings within one expression by writing `__extension__' ! 814: before the expression. `__extension__' has no effect aside from this. 1.1.1.3 root 815: 816: 1.1.1.4 ! root 817: File: gcc.info, Node: Incomplete Enums, Prev: Alternate Keywords, Up: Extensions 1.1 root 818: 1.1.1.4 ! root 819: Incomplete `enum' Types ! 820: ======================= ! 821: ! 822: You can define an `enum' tag without specifying its possible values. ! 823: This results in an incomplete type, much like what you get if you write ! 824: `struct foo' without describing the elements. A later declaration ! 825: which does specify the possible values completes the type. ! 826: ! 827: You can't allocate variables or storage using the type while it is ! 828: incomplete. However, you can work with pointers to that type. ! 829: ! 830: This extension may not be very useful, but it makes the handling of ! 831: `enum' more consistent with the way `struct' and `union' are handled. ! 832: ! 833: ! 834: File: gcc.info, Node: Trouble, Next: Bugs, Prev: Extensions, Up: Top ! 835: ! 836: Known Causes of Trouble with GNU CC ! 837: *********************************** ! 838: ! 839: This section describes known problems that affect users of GNU CC. ! 840: Most of these are not GNU CC bugs per se--if they were, we would fix ! 841: them. But the result for a user may be like the result of a bug. ! 842: ! 843: Some of these problems are due to bugs in other software, some are ! 844: missing features that are too much work to add, and some are places ! 845: where people's opinions differ as to what is best. 1.1 root 846: 847: * Menu: 848: 1.1.1.4 ! root 849: * Actual Bugs:: Bugs we will fix later. ! 850: * Installation Problems:: Problems that manifest when you install GNU CC. ! 851: * Cross-Compiler Problems:: Common problems of cross compiling with GNU CC. ! 852: * Interoperation:: Problems using GNU CC with other compilers, ! 853: and with certain linkers, assemblers and debuggers. ! 854: * Incompatibilities:: GNU CC is incompatible with traditional C. ! 855: * Disappointments:: Regrettable things we can't change, but not quite bugs. ! 856: * Protoize Caveats:: Things to watch out for when using `protoize'. ! 857: * Non-bugs:: Things we think are right, but some others disagree. 1.1 root 858: 859: 1.1.1.4 ! root 860: File: gcc.info, Node: Actual Bugs, Next: Installation Problems, Up: Trouble 1.1 root 861: 1.1.1.4 ! root 862: Actual Bugs We Haven't Fixed Yet ! 863: ================================ 1.1 root 864: 1.1.1.4 ! root 865: * Loop unrolling doesn't work properly for certain C++ programs. ! 866: This is because of difficulty in updating the debugging ! 867: information within the loop being unrolled. We plan to revamp the ! 868: representation of debugging information so that this will work ! 869: properly, but we have not done this in version 2.3 because we ! 870: don't want to delay it any further. 1.1 root 871: 872: 1.1.1.4 ! root 873: File: gcc.info, Node: Installation Problems, Next: Cross-Compiler Problems, Prev: Actual Bugs, Up: Trouble 1.1 root 874: 1.1.1.4 ! root 875: Installation Problems ! 876: ===================== 1.1 root 877: 1.1.1.4 ! root 878: This is a list of problems (and some apparent problems which don't ! 879: really mean anything is wrong) that show up during installation of GNU ! 880: CC. ! 881: ! 882: * On certain systems, defining certain environment variables such as ! 883: `CC' can interfere with the functioning of `make'. ! 884: ! 885: * If you encounter seemingly strange errors when trying to build the ! 886: compiler in a directory other than the source directory, it could ! 887: be because you have previously configured the compiler in the ! 888: source directory. Make sure you have done all the necessary ! 889: preparations. *Note Other Dir::. ! 890: ! 891: * In previous versions of GNU CC, the `gcc' driver program looked for ! 892: `as' and `ld' in various places such as files beginning with ! 893: `/usr/local/lib/gcc-'. GNU CC version 2 looks for them in the ! 894: directory `/usr/local/lib/gcc-lib/TARGET/VERSION'. ! 895: ! 896: Thus, to use a version of `as' or `ld' that is not the system ! 897: default, for example `gas' or GNU `ld', you must put them in that ! 898: directory (or make links to them from that directory). ! 899: ! 900: * Some commands executed when making the compiler may fail (return a ! 901: non-zero status) and be ignored by `make'. These failures, which ! 902: are often due to files that were not found, are expected, and can ! 903: safely be ignored. ! 904: ! 905: * It is normal to have warnings in compiling certain files about ! 906: unreachable code and about enumeration type clashes. These files' ! 907: names begin with `insn-'. ! 908: ! 909: * Sometimes `make' recompiles parts of the compiler when installing ! 910: the compiler. In one case, this was traced down to a bug in ! 911: `make'. Either ignore the problem or switch to GNU Make. ! 912: ! 913: * On some 386 systems, building the compiler never finishes because ! 914: `enquire' hangs due to a hardware problem in the motherboard--it ! 915: reports floating point exceptions to the kernel incorrectly. You ! 916: can install GNU CC except for `float.h' by patching out the ! 917: command to run `enquire'. You may also be able to fix the problem ! 918: for real by getting a replacement motherboard. This problem was ! 919: observed in Revision E of the Micronics motherboard, and is fixed ! 920: in Revision F. ! 921: ! 922: * On some 386 systems, GNU CC crashes trying to compile `enquire.c'. ! 923: This happens on machines that don't have a 387 FPU chip. On 386 ! 924: machines, the system kernel is supposed to emulate the 387 when you ! 925: don't have one. The crash is due to a bug in the emulator. ! 926: ! 927: One of these systems is the Unix from Interactive Systems: 386/ix. ! 928: On this system, an alternate emulator is provided, and it does ! 929: work. To use it, execute this command as super-user: ! 930: ! 931: ln /etc/emulator.rel1 /etc/emulator ! 932: ! 933: and then reboot the system. (The default emulator file remains ! 934: present under the name `emulator.dflt'.) ! 935: ! 936: If you have such a problem on the SCO system, try using ! 937: `/etc/emulator.att'. ! 938: ! 939: Another system which has this problem is Esix. We don't know ! 940: whether it has an alternate emulator that works. ! 941: ! 942: * Sometimes on a Sun 4 you may observe a crash in the program ! 943: `genflags' or `genoutput' while building GNU CC. This is said to ! 944: be due to a bug in `sh'. You can probably get around it by running ! 945: `genflags' or `genoutput' manually and then retrying the `make'. ! 946: ! 947: * If you use the 1.31 version of the MIPS assembler (such as was ! 948: shipped with Ultrix 3.1), you will need to use the ! 949: -fno-delayed-branch switch when optimizing floating point code. ! 950: Otherwise, the assembler will complain when the GCC compiler fills ! 951: a branch delay slot with a floating point instruction, such as ! 952: add.d. ! 953: ! 954: * Users have reported some problems with version 2.0 of the MIPS ! 955: compiler tools that were shipped with Ultrix 4.1. Version 2.10 ! 956: which came with Ultrix 4.2 seems to work fine. ! 957: ! 958: * Some versions of the MIPS linker will issue an assertion failure ! 959: when linking code that uses `alloca' against shared libraries on ! 960: RISC-OS 5.0, and DEC's OSF/1 systems. This is a bug in the ! 961: linker, that is supposed to be fixed in future revisions. To ! 962: protect against this, GCC passes `-non_shared' to the linker ! 963: unless you pass an explicit `-shared' or `-call_shared' switch. ! 964: ! 965: * On System V release 3, you may get this error message while ! 966: linking: ! 967: ! 968: ld fatal: failed to write symbol name SOMETHING ! 969: in strings table for file WHATEVER ! 970: ! 971: This indicates that the disk is full or your ULIMIT won't allow ! 972: the file to be as large as it needs to be. ! 973: ! 974: * On HP 9000 series 300 or 400 running HP-UX release 8.0, there is a ! 975: bug in the assembler that must be fixed before GNU CC can be ! 976: built. This bug manifests itself during the first stage of ! 977: compilation, while building `libgcc2.a': ! 978: ! 979: _floatdisf ! 980: cc1: warning: `-g' option not supported on this version of GCC ! 981: cc1: warning: `-g1' option not supported on this version of GCC ! 982: ./gcc: Internal compiler error: program as got fatal signal 11 ! 983: ! 984: A patched version of the assembler is available by anonymous ftp ! 985: from `altdorf.ai.mit.edu' as the file ! 986: `archive/cph/hpux-8.0-assembler'. If you have HP software support, ! 987: the patch can also be obtained directly from HP, as described in ! 988: the following note: ! 989: ! 990: This is the patched assembler, to patch SR#1653-010439, where ! 991: the assembler aborts on floating point constants. ! 992: ! 993: The bug is not really in the assembler, but in the shared ! 994: library version of the function "cvtnum(3c)". The bug on ! 995: "cvtnum(3c)" is SR#4701-078451. Anyway, the attached ! 996: assembler uses the archive library version of "cvtnum(3c)" ! 997: and thus does not exhibit the bug. ! 998: ! 999: This patch is also known as PHCO_0800. ! 1000: ! 1001: * Another assembler problem on the HP PA results in an error message ! 1002: like this while compiling part of `libgcc2.a': ! 1003: ! 1004: as: /usr/tmp/cca08196.s @line#30 [err#1060] ! 1005: Argument 1 or 3 in FARG upper ! 1006: - lookahead = RTNVAL=GR ! 1007: ! 1008: This happens because HP changed the assembler syntax after system ! 1009: release 8.02. GNU CC assumes the newer syntax; if your assembler ! 1010: wants the older syntax, comment out this line in the file ! 1011: `pa1-hpux.h': ! 1012: ! 1013: #define HP_FP_ARG_DESCRIPTOR_REVERSED ! 1014: ! 1015: * Some versions of the Pyramid C compiler are reported to be unable ! 1016: to compile GNU CC. You must use an older version of GNU CC for ! 1017: bootstrapping. One indication of this problem is if you get a ! 1018: crash when GNU CC compiles the function `muldi3' in file ! 1019: `libgcc2.c'. ! 1020: ! 1021: You may be able to succeed by getting GNU CC version 1, installing ! 1022: it, and using it to compile GNU CC version 2. The bug in the ! 1023: Pyramid C compiler does not seem to affect GNU CC version 1. ! 1024: ! 1025: * On the Tower models 4N0 and 6N0, by default a process is not ! 1026: allowed to have more than one megabyte of memory. GNU CC cannot ! 1027: compile itself (or many other programs) with `-O' in that much ! 1028: memory. ! 1029: ! 1030: To solve this problem, reconfigure the kernel adding the following ! 1031: line to the configuration file: ! 1032: ! 1033: MAXUMEM = 4096 ! 1034: ! 1035: * On the Altos 3068, programs compiled with GNU CC won't work unless ! 1036: you fix a kernel bug. This happens using system versions V.2.2 ! 1037: 1.0gT1 and V.2.2 1.0e and perhaps later versions as well. See the ! 1038: file `README.ALTOS'. ! 1039: ! 1040: * You will get several sorts of compilation and linking errors on the ! 1041: we32k if you don't follow the special instructions. *Note WE32K ! 1042: Install::. 1.1 root 1043: 1.1.1.4 ! root 1044: ! 1045: File: gcc.info, Node: Cross-Compiler Problems, Next: Interoperation, Prev: Installation Problems, Up: Trouble 1.1 root 1046: 1.1.1.4 ! root 1047: Cross-Compiler Problems ! 1048: ======================= ! 1049: ! 1050: * Cross compilation can run into trouble for certain machines because ! 1051: some target machines' assemblers require floating point numbers to ! 1052: be written as *integer* constants in certain contexts. ! 1053: ! 1054: The compiler writes these integer constants by examining the ! 1055: floating point value as an integer and printing that integer, ! 1056: because this is simple to write and independent of the details of ! 1057: the floating point representation. But this does not work if the ! 1058: compiler is running on a different machine with an incompatible ! 1059: floating point format, or even a different byte-ordering. ! 1060: ! 1061: In addition, correct constant folding of floating point values ! 1062: requires representing them in the target machine's format. (The C ! 1063: standard does not quite require this, but in practice it is the ! 1064: only way to win.) ! 1065: ! 1066: It is now possible to overcome these problems by defining macros ! 1067: such as `REAL_VALUE_TYPE'. But doing so is a substantial amount of ! 1068: work for each target machine. *Note Cross-compilation::. ! 1069: ! 1070: * At present, the program `mips-tfile' which adds debug support to ! 1071: object files on MIPS systems does not work in a cross compile ! 1072: environment. 1.1 root 1073: 1074:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.