CONF386.C
上传用户:hlzzc88
上传日期:2007-01-06
资源大小:220k
文件大小:5k
源码类别:

编译器/解释器

开发平台:

Others

  1. /*
  2.  * 68K/386 32-bit C compiler.
  3.  *
  4.  * copyright (c) 1997, David Lindauer
  5.  * 
  6.  * This compiler is intended for educational use.  It may not be used
  7.  * for profit without the express written consent of the author.
  8.  *
  9.  * It may be freely redistributed, as long as this notice remains intact
  10.  * and either the original sources or derived sources 
  11.  * are distributed along with any executables derived from the originals.
  12.  *
  13.  * The author is not responsible for any damages that may arise from use
  14.  * of this software, either idirect or consequential.
  15.  *
  16.  * v1.35 March 1997
  17.  * David Lindauer, gclind01@starbase.spd.louisville.edu
  18.  *
  19.  * Credits to Mathew Brandt for original K&R C compiler
  20.  *
  21.  */
  22. #include <stdio.h>
  23. #include "expr.h"
  24. #include  "c.h"
  25. extern int prm_packing, prm_68020;
  26. extern long framedepth, lc_maxauto;
  27. extern int prm_linkreg;
  28. char PROGNAME[]="CC386";
  29. char ENVNAME[]="CC386";
  30. char SOURCEXT[]=".ASM";
  31. char GLBDEFINE[]="_i386_";
  32. #ifdef BRIEFHELP
  33. char *usage_text = "[+e/+i/f+l/w+A/C/D/E/I/O] file list";
  34. #else
  35. char *usage_text = "[options] filesn"
  36. "+e     - dump errors to file        /fname - specify parameter filen"
  37. "+i     - dump preprocessed file     +l     - dump listing filen"
  38. "/fname - specify parameter file     +l     - dump listing filen"
  39. "/w-xxx - disable a warning          +A     - disable extensionsn"
  40. "/C     - codegen parameters         /Dxxx  - define somethingn"
  41. "/Enn   - max number of errors       /Ipath - specify include pathn"
  42. "/O     - optimzer parametersn"
  43. "Codegen parameters: (/C[+][-][params])n"
  44. "  +d   - display diagnostics        -b     - no BSSn"
  45. "  -l   - no C source in ASM file    -m     - no leading underscoresn"
  46. "  +r   - reverse order of bit ops   +F     - FLAT modeln"
  47. "  +N   - generate NASM code         -R     - no link registern"
  48. "Optimizer parameters (/O[+][-][params])n"
  49. "  -A   - no address register optimizationsn"
  50. "  -D   - no data register optimizationsn"
  51. "  -F   - no fp register optimizationsn";
  52. #endif                                    
  53. int prm_flat = FALSE;
  54. int prm_nasm = 0;
  55. int cf_maxaddress =20;
  56. int cf_maxdata=4;
  57. int cf_freeaddress =1;
  58. int cf_freedata=3;
  59. int cf_freefloat=3;
  60. int stackadd = 3;
  61. int stackmod = -4;
  62. int strucadd = 3;
  63. int strucmod = -4;
  64. int stdretblocksize = 8;
  65. int stdinttype = bt_long;
  66. int stdunstype = bt_unsigned;
  67. int stdintsize = 4;
  68. int stdldoublesize = 10;
  69. int stdaddrsize = 4;
  70. int regdsize = 4;
  71. int regasize = 4;
  72. int regfsize = 10;
  73. extern TYP stdchar;
  74. TYP             stdconst = { bt_long, 1, UF_DEFINED, 0, 0, -1, -1, 4, {0, 0}, 0, "stdconst",0};
  75. TYP             stdstring = {bt_pointer, 0, 0,0,0,-1, -1, 4, {0, 0}, &stdchar, 0,0};
  76. TYP             stdint = { bt_long, 0, UF_DEFINED | UF_USED,0, 0,-1, -1, 4, {0, 0}, 0, 0,0 };
  77. TYP stdlongdouble = {bt_longdouble,0,0,0,0,-1,-1,10,{0,0},0,0,0 };
  78. TYP             stduns = { bt_unsigned, 0, 0,0, 0,-1, -1, 4, {0, 0}, 0, 0,0 };
  79. KEYWORDS prockeywords[] = {
  80. {0,"_absolute", kw__abs}, { 0, "pascal", kw__pascal },
  81. {0,"_interrupt", kw__interrupt},{0,"_genbyte", kw__genword },
  82. {0,"_EAX", kw_D0}, {0,"_ECX", kw_D1},{0,"_EDX", kw_D2},
  83. {0,"_EBX", kw_D3},{0,"_ESP", kw_D4},{0,"_EBP", kw_D5},
  84. {0,"_ESI", kw_D6},{0,"_EDI", kw_D7},
  85.         {0, 0, 0} };
  86. char *registers[] = { "EAX","ECX","EDX","EBX","ESP","EBP","ESI","EDI",
  87. "","","","","","","","",
  88. "ESP","EBP","ESI","EDI" };
  89. int confcodegen(char s, int bool)
  90. {
  91. switch (s) {
  92. case 'N':
  93. prm_nasm = bool;
  94. break;
  95. case 'F':
  96. prm_flat = bool;
  97. break;
  98. default:
  99. return 0;
  100. }
  101. return 1;
  102. }
  103. void confsetup(void)
  104. {
  105. if (prm_linkreg)
  106. cf_freeaddress = 2;
  107. else
  108. cf_freeaddress = 1;
  109. }
  110. int     alignment(int type, TYP *tp)
  111. {       switch(tp->type) {
  112.                 case bt_char: case bt_unsignedchar:  return 1;
  113.                 case bt_short: case bt_unsignedshort: return 2;
  114.                 case bt_long: case bt_unsigned: return 4;
  115.                 case bt_enum:           return 2;
  116.                 case bt_pointer:
  117. case bt_matchall:
  118.                         if(tp->val_flag)
  119.                                 return alignment(type,tp->btp);
  120.                         else
  121.                                 return 4;
  122.                 case bt_float:          return 4;
  123.                 case bt_double:         return 4;
  124. case bt_longdouble: return 4;
  125.                 case bt_struct:
  126.                 case bt_union:          return 4;
  127.                 default:                return 1;
  128.                 }
  129. }
  130. int getalign(int sc, TYP *tp)
  131. {
  132.    int align = alignment(sc,tp);
  133. if (sc != sc_auto) 
  134. if (prm_packing)
  135. align = 1;
  136. return align;
  137. }
  138. long getautoval(long val)
  139. {
  140. if (prm_linkreg)
  141. return val;
  142. if (val >= 0) 
  143. return framedepth+val;
  144. else
  145. return lc_maxauto + val;
  146. }
  147. funcvaluesize(int size)
  148. {
  149. return 0;
  150. }