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

编译器/解释器

开发平台:

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. /* Handles name mangling
  23.  */
  24. #include        <stdio.h>
  25. #include <malloc.h>
  26. #include <ctype.h>
  27. #include        "expr.h"
  28. #include        "c.h"
  29. #include  "errors.h"
  30. extern TABLE oldlsym,lsyms,gsyms;
  31. extern int prm_cplusplus,prm_cmangle;
  32. #define HASHTABLESIZE 1023
  33. #ifdef CPLUSPLUS
  34. char destructor_name[] = "$dtr";
  35. char constructor_name[] = "$ctr";
  36. char *tn_void = "void";
  37. char *tn_char = "char";
  38. char *tn_int = "int";
  39. char *tn_long = "long" ;
  40. char *tn_short = "short";
  41. char *tn_unsigned = "unsigned ";
  42. char *tn_ellipse = "...";
  43. char *tn_float = "float";
  44. char *tn_double = "double";
  45. char *tn_longdouble = "long double";
  46. #endif /* CPLUSPLUS */
  47. /* Insert an overloaded function ref into the function table
  48.  */
  49. void funcrefinsert(char *name, char *mangname, TYP *tp, TABLE *tbl)
  50. {
  51. #ifdef CPLUSPLUS
  52. char buf[100];
  53. SYM *sp,*sp1;
  54. sp = xalloc(sizeof(SYM));
  55. buf[0] = '$';
  56. buf[1] = '$';
  57. strcpy(&buf[2],name);
  58. sp->defalt = mangname;
  59. sp->storage_class = sc_defunc;
  60. sp->value.overlist.head = 0;
  61. sp->name = litlate(buf);
  62. sp->tp = tp;
  63. sp1 = search(buf,tbl);
  64. if (sp1)
  65. if (sp1->value.overlist.head == 0)
  66. sp1->value.overlist.head = sp1->value.overlist.tail = sp;
  67. else
  68. sp1->value.overlist.tail = sp1->value.overlist.tail->next = sp;
  69. else
  70. insert(sp,tbl);
  71. #endif
  72. }
  73. #ifdef CPLUSPLUS
  74. /* See if two C++ functions match */
  75. static int fomatch(TYP *tp1, TYP *tp2)
  76. {
  77. SYM *sp1 = tp1->lst.head;
  78. SYM *sp2 = tp2->lst.head;
  79. if (sp1 == (SYM *)-1 && sp2 == (SYM *)-1)
  80. return TRUE;
  81. if (sp1 && sp1->defalt)
  82. return TRUE;
  83. while (sp2 && sp1) {
  84. if (sp1->tp->type == bt_ellipse)
  85. return TRUE;
  86. if (!exactype(sp1->tp, sp2->tp) && !(isscalar(tp1) && isscalar(tp2)))
  87. return FALSE;
  88. if (sp1->defalt)
  89. return TRUE;
  90. sp1 = sp1->next;
  91. sp2 = sp2->next;
  92. }
  93. return sp1 == sp2;
  94. }
  95. #endif
  96. /* Search the tables looking for a match for an argument type list */
  97. SYM *funcovermatch(char *name,TYP *tp)
  98. {
  99. #ifdef CPLUSPLUS
  100. char buf1[100];
  101. TABLE *tbl1, *tbl2;
  102. if (prm_cplusplus) {
  103. SYM *sp2,*sp3,*sp4=0,*sp5=0,*sp6,*sp7;
  104. tbl1 = &lsyms;
  105. tbl2 = &gsyms;
  106. buf1[0] = '$';
  107. buf1[1] = '$';
  108. strcpy(&buf1[2],name);
  109. sp2 = search(buf1,tbl1);
  110. sp3 = search(buf1,tbl2);
  111. if (sp2)
  112. if (fomatch(sp2->tp,tp)) 
  113. sp4 = sp2;
  114. if (sp3)
  115. if (fomatch(sp3->tp,tp)) 
  116. sp5 = sp3;
  117. if (sp4 && sp5) {
  118. genfunc2error(ERR_AMBIGFUNC,sp4->defalt,sp5->defalt);
  119. return gsearch(sp4->defalt);
  120. }
  121. if (sp2) {
  122. sp6 = sp2->value.overlist.head;
  123. while (sp6) {
  124. if (fomatch(sp6->tp,tp)) {
  125. if (sp4) {
  126. genfunc2error(ERR_AMBIGFUNC,sp4->defalt,sp6->defalt);
  127. return gsearch(sp4->defalt);
  128. }
  129. else if (sp5) {
  130. genfunc2error(ERR_AMBIGFUNC,sp5->defalt,sp6->defalt);
  131. return gsearch(sp5->defalt);
  132. }
  133. else sp4 = sp6;
  134. }
  135. sp6 = sp6->next;
  136. }
  137. }
  138. if (sp3) {
  139. sp7 = sp3->value.overlist.head;
  140. while (sp7) {
  141. if (fomatch(sp7->tp,tp)) {
  142. if (sp4) {
  143. genfunc2error(ERR_AMBIGFUNC,sp4->defalt,sp7->defalt);
  144. return gsearch(sp4->defalt);
  145. }
  146. else if (sp5) {
  147. genfunc2error(ERR_AMBIGFUNC,sp5->defalt,sp7->defalt);
  148. return gsearch(sp5->defalt);
  149. }
  150. else sp5 = sp7;
  151. }
  152. sp7 = sp7->next;
  153. }
  154. }
  155. if (sp4)
  156. return gsearch(sp4->defalt);
  157. if (sp5)
  158. return gsearch(sp5->defalt);
  159. }
  160. #endif
  161. return(gsearch(name));
  162. }
  163. #ifdef CPLUSPLUS
  164. /* Mangle one C++ argument */
  165. static char *cpponearg(char *buf,TYP *tp)
  166. {
  167. start:
  168. switch (tp->type) {
  169. case bt_ptrfunc:
  170. *buf++ = 'q';
  171. buf = cppargs(buf,tp->lst.head);
  172. *buf++ = '$';
  173. tp = tp->btp;
  174. goto start;
  175. case bt_struct:
  176. case bt_union:
  177. case bt_class:
  178. case bt_enum:
  179. sprintf(buf,"%d%s",strlen(tp->sname+1),tp->sname+1);
  180. buf = buf + strlen(buf);
  181. break;
  182. case bt_unsignedshort:
  183. *buf++ = 'u';
  184. case bt_short:
  185. *buf++ = 's';
  186. break;
  187. case bt_unsigned:
  188. *buf++ = 'u';
  189. case bt_long:
  190. *buf++ = 'i';
  191. break;
  192. case bt_unsignedchar:
  193. *buf++ = 'u';
  194. case bt_char:
  195. *buf++ = 'c';
  196. break;
  197. case bt_float:
  198. *buf++ = 'f';
  199. break;
  200. case bt_double:
  201. *buf++ = 'd';
  202. break;
  203. case bt_longdouble:
  204. *buf++ = 'g';
  205. break;
  206. case bt_pointer:
  207. *buf++ = 'p';
  208. tp = tp->btp;
  209. goto start;
  210. case bt_ref:
  211. *buf++ = 'r';
  212. tp = tp->btp;
  213. goto start;
  214. case bt_ellipse:
  215. *buf++ = 'e';
  216. break;
  217. }
  218. *buf = 0;
  219. return buf;
  220. }
  221. /* Mangle an entire C++ function */
  222. static char *cppargs(char *buf,SYM *sp)
  223. {
  224. *buf++ = 'q';
  225. if (sp == (SYM *)-1) {
  226. *buf++ = 'v';
  227. }
  228. else while (sp) {
  229. buf = cpponearg(buf,sp->tp);
  230. sp = sp->next;
  231. }
  232. *buf=0;
  233. return buf + strlen(buf);
  234. }
  235. /* Wrapper for function name mangling */
  236. char * cppmangle(char *name, TYP *tp)
  237. {
  238. char buf[100];
  239. if (*name == 0)
  240. return 0;
  241. if (prm_cmangle)
  242. name++;
  243. sprintf(buf,"@%s$",name);
  244. cppargs(buf+strlen(buf),tp->lst.head);
  245. return(litlate(buf));
  246. }
  247. /* Unmangle a pointer reference */
  248. char * putptr(char *buf, int *ptr, int **ptrs)
  249. {
  250. int *p = *ptrs;
  251. buf = buf+strlen(buf);
  252. while ((*ptr)--) {
  253. *buf++ = ' ';
  254. if (*p++) 
  255. *buf++= '&';
  256. else
  257. *buf++ = '*';
  258. }
  259. *ptr = 0;
  260. *buf = 0;
  261. return buf;
  262. }
  263. /* Argument unmangling for C++ */
  264. static char *unmang1(char *buf, char *name, int *ptr, int **ptrs)
  265. {
  266. start:
  267. if (isdigit(*name)) {
  268. int v = *name++ - '0';
  269. while (isdigit(*name)) 
  270. v = v*10+ *name++ - '0';
  271. while (v--) 
  272. *buf++ = *name++;
  273. *buf = 0;
  274. }
  275. else switch (*name++) {
  276. case 'q': {
  277. char buf1[100],buf2[100];
  278. strcpy(buf1," (*) ");
  279. buf+=5;
  280.   name = unmangcppfunc(buf1,name);
  281. name++;
  282. name = unmang1(buf2,name,ptr,ptrs);
  283. buf = putptr(buf,ptr,ptrs);
  284. strcpy(buf,buf2);
  285. strcat(buf,buf1);
  286. buf = buf +strlen(buf);
  287. }
  288. break;
  289. case 'u':
  290. strcpy(buf,"unsigned ");
  291. buf = buf+9;
  292. switch(*name++) {
  293. case 'i':
  294. strcpy(buf,tn_int);
  295. buf = putptr(buf,ptr,ptrs);
  296. break;
  297. case 'l':
  298. strcpy(buf,tn_long);
  299. buf = putptr(buf,ptr,ptrs);
  300. break;
  301. case 's':
  302. strcpy(buf,tn_short);
  303. buf = putptr(buf,ptr,ptrs);
  304. break;
  305. case 'c':
  306. strcpy(buf,tn_char);
  307. buf = putptr(buf,ptr,ptrs);
  308. break;
  309. }
  310. case 'f':
  311. strcpy(buf,tn_float);
  312. buf = putptr(buf,ptr,ptrs);
  313. break;
  314. case 'd':
  315. strcpy(buf,tn_double);
  316. buf = putptr(buf,ptr,ptrs);
  317. break;
  318. case 'g':
  319. strcpy(buf,tn_longdouble);
  320. buf = putptr(buf,ptr,ptrs);
  321. break;
  322. case 'i':
  323. strcpy(buf,tn_int);
  324. buf = putptr(buf,ptr,ptrs);
  325. break;
  326. case 'l':
  327. strcpy(buf,tn_long);
  328. buf = putptr(buf,ptr,ptrs);
  329. break;
  330. case 's':
  331. strcpy(buf,tn_short);
  332. buf = putptr(buf,ptr,ptrs);
  333. break;
  334. case 'c':
  335. strcpy(buf,tn_char);
  336. buf = putptr(buf,ptr,ptrs);
  337. break;
  338. case 'v':
  339. strcpy(buf,tn_void);
  340. buf = putptr(buf,ptr,ptrs);
  341. break;
  342. case 'p':
  343. (*ptrs)[(*ptr)++] = 0;
  344. goto start;
  345. case 'r':
  346. (*ptrs)[(*ptr)++] = 1;
  347. goto start;
  348. case 'e':
  349. strcpy(buf,tn_ellipse);
  350. break;
  351. case '$':
  352. name--;
  353. return name;
  354. }
  355. return name;
  356. }
  357. /* Unmangle an entire C++ function */
  358. static char * unmangcppfunc(char *buf, char *name)
  359. {
  360. int ptr = 0;
  361. char ptrs[50];
  362. *buf++ = '(';
  363. while (*name && *name != '$') {
  364. name = unmang1(buf,name,&ptr,&ptrs);
  365. buf = buf+strlen(buf);
  366. if (*name && *name != '$')
  367. *buf++ = ',';
  368. else
  369. *buf++ = ')';
  370. }
  371. *buf=0;
  372. return buf;
  373. }
  374. #endif
  375. /* Name unmangling in general */
  376. void unmangle(char *buf, char *name)
  377. {
  378. if (name[0] == '_' && prm_cmangle) {
  379. strcpy(buf,&name[1]);
  380. }
  381. #ifdef CPLUSPLUS
  382. else 
  383. if (name[0] != '@')
  384. strcpy(buf,name);
  385. else {
  386. name++;
  387. while (*name != '$' && *name)
  388. *buf++ = *name++;
  389. if (*name) {
  390. name+=2;
  391. unmangcppfunc(buf,name);
  392. }
  393. else *buf++ = 0;
  394. }
  395. #endif
  396. }