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

编译器/解释器

开发平台:

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;
  26. extern long lc_maxauto, framedepth;
  27. extern int prm_linkreg;
  28. extern SYM *currentfunc;
  29. char PROGNAME[]="CC68K";
  30. char ENVNAME[]="CC68K";
  31. char SOURCEXT[]=".SRC";
  32. char GLBDEFINE[]="_m68k_";
  33. #ifdef BRIEFHELP
  34. char *usage_text = "[+e/+i/f+l/w+A/C/D/E/I/O] file list";
  35. #else
  36. char *usage_text = "[options] filesn"
  37. "+e     - dump errors to file        /fname - specify parameter filen"
  38. "+i     - dump preprocessed 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. "  -b   - no BSSn"
  45. "  -c   - don't optimize to CLR      +d     - display diagnosticsn"
  46. "  +1   - generate 68010 code        +2     - generate 68020 coden"
  47. "  -l   - no C source in ASM file    -m     - no leading underscoresn"
  48. "  +r   - reverse order of bit ops   +s     - small data modeln"
  49. "  +A   - absolute addressing        +L     - large data modeln"
  50. "  +P   - PHI system stack frames    -R     - no link registern"
  51. "Optimizer parameters (/O[+][-][params])n"
  52. "  -A   - no address register optimizationsn"
  53. "  -D   - no data register optimizationsn"
  54. "  -F   - no fp register optimizationsn";
  55. #endif                                    
  56. int prm_buggyclr = FALSE;
  57. int prm_smalldata = FALSE;
  58. int prm_smallcode = FALSE;
  59. int prm_rel = TRUE;
  60. int linkreg;
  61. int basereg;
  62. int prm_phiform=0;
  63. int prm_largedata = FALSE;
  64. int prm_68020 = FALSE;
  65. int prm_68010 = FALSE;
  66. int cf_maxaddress =21;
  67. int cf_maxdata=8;
  68. int cf_maxfloat = 40;
  69. int cf_freeaddress =2;
  70. int cf_freedata=3;
  71. int cf_freefloat=3;
  72. int stackadd = 3;
  73. int stackmod = -4;
  74. int strucadd = 3;
  75. int strucmod = -4;
  76. int stdretblocksize = 8;
  77. int stdinttype = bt_long;
  78. int stdunstype = bt_unsigned;
  79. int stdintsize = 4;
  80. int stdldoublesize = 12;
  81. int stdaddrsize = 4;
  82. int regdsize = 4;
  83. int regasize = 4;
  84. int regfsize = 12;
  85. extern TYP stdchar;
  86. TYP             stdconst = { bt_long, 1, UF_DEFINED, 0, 0, -1, -1, 4, {0, 0}, 0, "stdconst",0};
  87. TYP             stdstring = {bt_pointer, 0, 0,0,0,-1, -1, 4, {0, 0}, &stdchar, 0,0};
  88. TYP             stdint = { bt_long, 0, UF_DEFINED | UF_USED,0, 0,-1, -1, 4, {0, 0}, 0, 0,0 };
  89. TYP stdlongdouble = {bt_longdouble,0,0,0,0,-1,-1,12,{0,0},0,0,0 };
  90. TYP             stduns = { bt_unsigned, 0, 0,0, 0,-1, -1, 4, {0, 0}, 0, 0,0 };
  91. KEYWORDS prockeywords[] = {
  92. {0,"_trap", kw__trap}, {0,"_interrupt", kw__interrupt},
  93. {0,"_absolute", kw__abs }, {0,"_genword", kw__genword },
  94. {0,"pascal", kw__pascal },
  95. {0,"_D0",kw_D0},{0,"_D1",kw_D1},{0,"_D2",kw_D2},{0,"_D3",kw_D3},
  96. {0,"_D4",kw_D4},{0,"_D5",kw_D5},{0,"_D6",kw_D6},{0,"_D7",kw_D7},
  97. {0,"_A0",kw_A0},{0,"_A1",kw_A1},{0,"_A2",kw_A2},{0,"_A3",kw_A3},
  98. {0,"_A4",kw_A4},{0,"_A5",kw_A5},{0,"_A6",kw_A6},{0,"_A7",kw_A7},
  99. {0,"_FP0",kw_F0},{0,"_FP1",kw_F1},{0,"_FP2",kw_F2},{0,"_FP3",kw_F3},
  100. {0,"_FP4",kw_F4},{0,"_FP5",kw_F5},{0,"_FP6",kw_F6},{0,"_FP7",kw_F7},
  101.         {0, 0, 0} };
  102. char *registers[]  = { 
  103. "D0","D1","D2","D3","D4","D5","D6","D7",
  104. "","","","","","","","",
  105. "A0","A1","A2","A3","A4","A5","A6","A7",
  106. "","","","","","","","",
  107. "FP0","FP1","FP2","FP3","FP4","FP5","FP6","FP7",
  108. "","","","","","","","" } ;
  109. int confcodegen(char s, int bool)
  110. {
  111. switch (s) {
  112. case 'c':
  113. prm_buggyclr = !bool;
  114. break;
  115. case 'L': /* 68000 specific */
  116. prm_largedata = bool;
  117. break;
  118. case '2':   /* 68020 specific */
  119. prm_68020 = bool;
  120. break;
  121. case '1':   /* 68020 specific */
  122. prm_68010 = bool;
  123. break;
  124. case 'P':
  125. prm_phiform = bool;
  126. break;
  127. case 's':
  128. prm_smalldata = prm_smallcode = bool;
  129. break;
  130. case 'A':
  131. prm_rel = !bool;
  132. break;
  133. default:
  134. return 0;
  135. }
  136. return 1;
  137. }
  138. void confsetup(void)
  139. {
  140. if (prm_68020)
  141. prm_largedata = FALSE;
  142. if (prm_phiform)
  143. prm_linkreg = FALSE;
  144. linkreg = 6;
  145.   basereg = 5;
  146. if (prm_phiform || prm_linkreg) {
  147. if (prm_rel) {
  148.   cf_maxaddress=21;
  149. }
  150. else
  151. cf_maxaddress = 22;
  152. }
  153. else {
  154. /* Note that the link reg may be used by trap calls even
  155.  * though nothing else uses it, so it can never be freed
  156.  */
  157. if (prm_rel) {
  158. cf_maxaddress=21;
  159. }
  160. else {
  161. cf_maxaddress=22;
  162. }
  163. }
  164. }
  165. static int     alignment(int type, TYP *tp)
  166. {       switch(tp->type) {
  167.                 case bt_char: case bt_unsignedchar:  return 1;
  168.                 case bt_short: case bt_unsignedshort: return 2;
  169.                 case bt_long: case bt_unsigned: return 4;
  170.                 case bt_enum:           return 2;
  171.                 case bt_pointer:
  172. case bt_matchall:
  173.                         if(tp->val_flag)
  174.                                 return alignment(type,tp->btp);
  175.                         else
  176.                                 return 4;
  177.                 case bt_float:          return 4;
  178.                 case bt_double:         return 4;
  179. case bt_longdouble: return 4;
  180.                 case bt_struct:
  181.                 case bt_union:          return 4;
  182.                 default:                return 1;
  183.                 }
  184. }
  185. int getalign(int sc, TYP *tp)
  186. {
  187.    int align = alignment(sc,tp);
  188. if (sc != sc_auto) 
  189. if (prm_packing) 
  190. if (!prm_68020)
  191. align = 1;
  192. else
  193. if (align > 2) align = 2;
  194. return align;
  195. }
  196. long getautoval(long val)
  197. {
  198. if (prm_linkreg && !currentfunc->intflag)
  199. return val;
  200. if (val >= 0) 
  201. if (prm_phiform || currentfunc->intflag)
  202. return framedepth+val;
  203. else
  204. return val;
  205. else
  206. return lc_maxauto + val;
  207. }
  208. int funcvaluesize(int size)
  209. {
  210. return 4 - size;
  211. }