ag386att.pas 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310
  1. {
  2. $Id$
  3. Copyright (c) 1996-98 by the FPC development team
  4. This unit implements an asmoutput class for i386 AT&T syntax
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. ****************************************************************************
  17. }
  18. {$ifdef TP}
  19. {$N+,E+}
  20. {$endif}
  21. unit ag386att;
  22. interface
  23. uses cobjects,aasm,assemble;
  24. type
  25. pi386attasmlist=^ti386attasmlist;
  26. ti386attasmlist=object(tasmlist)
  27. procedure WriteTree(p:paasmoutput);virtual;
  28. procedure WriteAsmList;virtual;
  29. {$ifdef GDB}
  30. procedure WriteFileLineInfo(var fileinfo : tfileposinfo);
  31. {$endif}
  32. end;
  33. implementation
  34. uses
  35. {$ifdef Delphi}
  36. dmisc,
  37. {$else Delphi}
  38. dos,
  39. {$endif Delphi}
  40. strings,
  41. globtype,globals,systems,
  42. files,verbose,cpubase,cpuasm
  43. {$ifdef GDB}
  44. ,gdb
  45. {$endif GDB}
  46. ;
  47. const
  48. line_length = 70;
  49. var
  50. {$ifdef GDB}
  51. n_line : byte; { different types of source lines }
  52. linecount,
  53. includecount : longint;
  54. funcname : pchar;
  55. stabslastfileinfo : tfileposinfo;
  56. {$endif}
  57. lastsec : tsection; { last section type written }
  58. lastfileinfo : tfileposinfo;
  59. infile,
  60. lastinfile : pinputfile;
  61. symendcount : longint;
  62. function fixline(s:string):string;
  63. {
  64. return s with all leading and ending spaces and tabs removed
  65. }
  66. var
  67. i,j,k : longint;
  68. begin
  69. i:=length(s);
  70. while (i>0) and (s[i] in [#9,' ']) do
  71. dec(i);
  72. j:=1;
  73. while (j<i) and (s[j] in [#9,' ']) do
  74. inc(j);
  75. for k:=j to i do
  76. if s[k] in [#0..#31,#127..#255] then
  77. s[k]:='.';
  78. fixline:=Copy(s,j,i-j+1);
  79. end;
  80. function single2str(d : single) : string;
  81. var
  82. hs : string;
  83. begin
  84. str(d,hs);
  85. { replace space with + }
  86. if hs[1]=' ' then
  87. hs[1]:='+';
  88. single2str:='0d'+hs
  89. end;
  90. function double2str(d : double) : string;
  91. var
  92. hs : string;
  93. begin
  94. str(d,hs);
  95. { replace space with + }
  96. if hs[1]=' ' then
  97. hs[1]:='+';
  98. double2str:='0d'+hs
  99. end;
  100. function extended2str(e : extended) : string;
  101. var
  102. hs : string;
  103. begin
  104. str(e,hs);
  105. { replace space with + }
  106. if hs[1]=' ' then
  107. hs[1]:='+';
  108. extended2str:='0d'+hs
  109. end;
  110. type
  111. pdouble = ^double;
  112. function comp2str(d : bestreal) : string;
  113. var
  114. c : comp;
  115. dd : pdouble;
  116. begin
  117. {$ifdef FPC}
  118. c:=comp(d);
  119. {$else}
  120. c:=d;
  121. {$endif}
  122. dd:=pdouble(@c); { this makes a bitwise copy of c into a double }
  123. comp2str:=double2str(dd^);
  124. end;
  125. function getreferencestring(var ref : treference) : string;
  126. var
  127. s : string;
  128. begin
  129. if ref.is_immediate then
  130. begin
  131. internalerror(1000101);
  132. exit;
  133. end
  134. else
  135. begin
  136. with ref do
  137. begin
  138. inc(offset,offsetfixup);
  139. offsetfixup:=0;
  140. { have we a segment prefix ? }
  141. { These are probably not correctly handled under GAS }
  142. { should be replaced by coding the segment override }
  143. { directly! - DJGPP FAQ }
  144. if segment<>R_NO then
  145. s:=att_reg2str[segment]+':'
  146. else
  147. s:='';
  148. if assigned(symbol) then
  149. s:=s+symbol^.name;
  150. if offset<0 then
  151. s:=s+tostr(offset)
  152. else
  153. if (offset>0) then
  154. begin
  155. if assigned(symbol) then
  156. s:=s+'+'+tostr(offset)
  157. else
  158. s:=s+tostr(offset);
  159. end;
  160. if (index<>R_NO) and (base=R_NO) then
  161. Begin
  162. s:=s+'(,'+att_reg2str[index];
  163. if scalefactor<>0 then
  164. s:=s+','+tostr(scalefactor)+')'
  165. else
  166. s:=s+')';
  167. end
  168. else
  169. if (index=R_NO) and (base<>R_NO) then
  170. s:=s+'('+att_reg2str[base]+')'
  171. else
  172. if (index<>R_NO) and (base<>R_NO) then
  173. Begin
  174. s:=s+'('+att_reg2str[base]+','+att_reg2str[index];
  175. if scalefactor<>0 then
  176. s:=s+','+tostr(scalefactor)+')'
  177. else
  178. s := s+')';
  179. end;
  180. end;
  181. end;
  182. getreferencestring:=s;
  183. end;
  184. function getopstr(const o:toper) : string;
  185. var
  186. hs : string;
  187. begin
  188. case o.typ of
  189. top_reg :
  190. getopstr:=att_reg2str[o.reg];
  191. top_ref :
  192. getopstr:=getreferencestring(o.ref^);
  193. top_const :
  194. getopstr:='$'+tostr(o.val);
  195. top_symbol :
  196. begin
  197. if assigned(o.sym) then
  198. hs:='$'+o.sym^.name
  199. else
  200. hs:='$';
  201. if o.symofs>0 then
  202. hs:=hs+'+'+tostr(o.symofs)
  203. else
  204. if o.symofs<0 then
  205. hs:=hs+tostr(o.symofs)
  206. else
  207. if not(assigned(o.sym)) then
  208. hs:=hs+'0';
  209. getopstr:=hs;
  210. end;
  211. else
  212. internalerror(10001);
  213. end;
  214. end;
  215. function getopstr_jmp(const o:toper) : string;
  216. var
  217. hs : string;
  218. begin
  219. case o.typ of
  220. top_reg :
  221. getopstr_jmp:='*'+att_reg2str[o.reg];
  222. top_ref :
  223. getopstr_jmp:='*'+getreferencestring(o.ref^);
  224. top_const :
  225. getopstr_jmp:=tostr(o.val);
  226. top_symbol :
  227. begin
  228. hs:=o.sym^.name;
  229. if o.symofs>0 then
  230. hs:=hs+'+'+tostr(o.symofs)
  231. else
  232. if o.symofs<0 then
  233. hs:=hs+tostr(o.symofs);
  234. getopstr_jmp:=hs;
  235. end;
  236. else
  237. internalerror(10001);
  238. end;
  239. end;
  240. {****************************************************************************
  241. TI386ATTASMOUTPUT
  242. ****************************************************************************}
  243. const
  244. ait_const2str : array[ait_const_32bit..ait_const_8bit] of string[8]=
  245. (#9'.long'#9,#9'.short'#9,#9'.byte'#9);
  246. function ait_section2str(s:tsection):string;
  247. begin
  248. ait_section2str:=target_asm.secnames[s];
  249. {$ifdef GDB}
  250. { this is needed for line info in data }
  251. funcname:=nil;
  252. case s of
  253. sec_code : n_line:=n_textline;
  254. sec_data : n_line:=n_dataline;
  255. sec_bss : n_line:=n_bssline;
  256. else n_line:=n_dataline;
  257. end;
  258. {$endif GDB}
  259. LastSec:=s;
  260. end;
  261. {$ifdef GDB}
  262. procedure ti386attasmlist.WriteFileLineInfo(var fileinfo : tfileposinfo);
  263. var
  264. curr_n : byte;
  265. begin
  266. if not (cs_debuginfo in aktmoduleswitches) then
  267. exit;
  268. { file changed ? (must be before line info) }
  269. if (fileinfo.fileindex<>0) and
  270. (stabslastfileinfo.fileindex<>fileinfo.fileindex) then
  271. begin
  272. infile:=current_module^.sourcefiles^.get_file(fileinfo.fileindex);
  273. if includecount=0 then
  274. curr_n:=n_sourcefile
  275. else
  276. curr_n:=n_includefile;
  277. if (infile^.path^<>'') then
  278. begin
  279. AsmWriteLn(#9'.stabs "'+lower(BsToSlash(FixPath(infile^.path^,false)))+'",'+
  280. tostr(curr_n)+',0,0,'+'Ltext'+ToStr(IncludeCount));
  281. end;
  282. AsmWriteLn(#9'.stabs "'+lower(FixFileName(infile^.name^))+'",'+
  283. tostr(curr_n)+',0,0,'+'Ltext'+ToStr(IncludeCount));
  284. AsmWriteLn('Ltext'+ToStr(IncludeCount)+':');
  285. inc(includecount);
  286. end;
  287. { line changed ? }
  288. if (stabslastfileinfo.line<>fileinfo.line) and (fileinfo.line<>0) then
  289. begin
  290. if (n_line=n_textline) and assigned(funcname) and
  291. (target_os.use_function_relative_addresses) then
  292. begin
  293. AsmWriteLn(target_asm.labelprefix+'l'+tostr(linecount)+':');
  294. AsmWrite(#9'.stabn '+tostr(n_line)+',0,'+tostr(fileinfo.line)+','+
  295. target_asm.labelprefix+'l'+tostr(linecount)+' - ');
  296. AsmWritePChar(FuncName);
  297. AsmLn;
  298. inc(linecount);
  299. end
  300. else
  301. AsmWriteLn(#9'.stabd'#9+tostr(n_line)+',0,'+tostr(fileinfo.line));
  302. end;
  303. stabslastfileinfo:=fileinfo;
  304. end;
  305. {$endif GDB}
  306. procedure ti386attasmlist.WriteTree(p:paasmoutput);
  307. const
  308. allocstr : array[boolean] of string[10]=(' released',' allocated');
  309. nolinetai =[ait_label,
  310. ait_regalloc,ait_tempalloc,
  311. ait_stabn,ait_stabs,ait_section,
  312. ait_cut,ait_marker,ait_align,ait_stab_function_name];
  313. type
  314. t80bitarray = array[0..9] of byte;
  315. t64bitarray = array[0..7] of byte;
  316. t32bitarray = array[0..3] of byte;
  317. var
  318. ch : char;
  319. hp : pai;
  320. consttyp : tait;
  321. s : string;
  322. found : boolean;
  323. i,pos,l : longint;
  324. co : comp;
  325. sin : single;
  326. d : double;
  327. e : extended;
  328. op : tasmop;
  329. calljmp,
  330. do_line : boolean;
  331. sep : char;
  332. begin
  333. if not assigned(p) then
  334. exit;
  335. { lineinfo is only needed for codesegment (PFV) }
  336. do_line:=(cs_asm_source in aktglobalswitches) or
  337. ((cs_lineinfo in aktmoduleswitches) and (p=codesegment));
  338. hp:=pai(p^.first);
  339. while assigned(hp) do
  340. begin
  341. aktfilepos:=hp^.fileinfo;
  342. if not(hp^.typ in nolinetai) then
  343. begin
  344. {$ifdef GDB}
  345. { write stabs }
  346. if cs_debuginfo in aktmoduleswitches then
  347. WriteFileLineInfo(hp^.fileinfo);
  348. {$endif GDB}
  349. if do_line then
  350. begin
  351. { load infile }
  352. if lastfileinfo.fileindex<>hp^.fileinfo.fileindex then
  353. begin
  354. infile:=current_module^.sourcefiles^.get_file(hp^.fileinfo.fileindex);
  355. { open only if needed !! }
  356. if (cs_asm_source in aktglobalswitches) then
  357. infile^.open;
  358. { avoid unnecessary reopens of the same file !! }
  359. lastfileinfo.fileindex:=hp^.fileinfo.fileindex;
  360. { be sure to change line !! }
  361. lastfileinfo.line:=-1;
  362. end;
  363. { write source }
  364. if (cs_asm_source in aktglobalswitches) then
  365. begin
  366. if (infile<>lastinfile) and assigned(lastinfile) then
  367. begin
  368. AsmWriteLn(target_asm.comment+'['+infile^.name^+']');
  369. lastinfile^.close;
  370. end;
  371. if (hp^.fileinfo.line<>lastfileinfo.line) and
  372. (hp^.fileinfo.line<infile^.maxlinebuf) then
  373. begin
  374. if (hp^.fileinfo.line<>0) and
  375. (infile^.linebuf^[hp^.fileinfo.line]>=0) then
  376. AsmWriteLn(target_asm.comment+'['+tostr(hp^.fileinfo.line)+'] '+
  377. fixline(infile^.GetLineStr(hp^.fileinfo.line)));
  378. { set it to a negative value !
  379. to make that is has been read already !! PM }
  380. infile^.linebuf^[hp^.fileinfo.line]:=-infile^.linebuf^[hp^.fileinfo.line]-1;
  381. end;
  382. end;
  383. {$ifdef LINEINFO}
  384. { lineinfo }
  385. if (cs_lineinfo in aktmoduleswitches) then
  386. begin
  387. if (infile<>lastinfile) then
  388. begin
  389. lineinfolist^.concat(new(pai_const(init_8bit
  390. end
  391. else
  392. begin
  393. end;
  394. end;
  395. {$endif LINEINFO}
  396. lastfileinfo:=hp^.fileinfo;
  397. lastinfile:=infile;
  398. end;
  399. end;
  400. case hp^.typ of
  401. ait_comment :
  402. Begin
  403. AsmWrite(target_asm.comment);
  404. AsmWritePChar(pai_asm_comment(hp)^.str);
  405. AsmLn;
  406. End;
  407. ait_regalloc :
  408. begin
  409. if (cs_asm_regalloc in aktglobalswitches) then
  410. AsmWriteLn(target_asm.comment+'Register '+att_reg2str[pairegalloc(hp)^.reg]+
  411. allocstr[pairegalloc(hp)^.allocation]);
  412. end;
  413. ait_tempalloc :
  414. begin
  415. if (cs_asm_tempalloc in aktglobalswitches) then
  416. AsmWriteLn(target_asm.comment+'Temp '+tostr(paitempalloc(hp)^.temppos)+','+
  417. tostr(paitempalloc(hp)^.tempsize)+allocstr[paitempalloc(hp)^.allocation]);
  418. end;
  419. ait_align :
  420. begin
  421. AsmWrite(#9'.balign '+tostr(pai_align(hp)^.aligntype));
  422. if pai_align(hp)^.use_op then
  423. AsmWrite(','+tostr(pai_align(hp)^.fillop));
  424. AsmLn;
  425. end;
  426. ait_section :
  427. begin
  428. if pai_section(hp)^.sec<>sec_none then
  429. begin
  430. AsmLn;
  431. AsmWriteLn(ait_section2str(pai_section(hp)^.sec));
  432. {$ifdef GDB}
  433. lastfileinfo.line:=-1;
  434. {$endif GDB}
  435. end;
  436. end;
  437. ait_datablock :
  438. begin
  439. if pai_datablock(hp)^.is_global then
  440. AsmWrite(#9'.comm'#9)
  441. else
  442. AsmWrite(#9'.lcomm'#9);
  443. AsmWrite(pai_datablock(hp)^.sym^.name);
  444. AsmWriteLn(','+tostr(pai_datablock(hp)^.size));
  445. end;
  446. ait_const_32bit,
  447. ait_const_16bit,
  448. ait_const_8bit :
  449. begin
  450. AsmWrite(ait_const2str[hp^.typ]+tostr(pai_const(hp)^.value));
  451. consttyp:=hp^.typ;
  452. l:=0;
  453. repeat
  454. found:=(not (Pai(hp^.next)=nil)) and (Pai(hp^.next)^.typ=consttyp);
  455. if found then
  456. begin
  457. hp:=Pai(hp^.next);
  458. s:=','+tostr(pai_const(hp)^.value);
  459. AsmWrite(s);
  460. inc(l,length(s));
  461. end;
  462. until (not found) or (l>line_length);
  463. AsmLn;
  464. end;
  465. ait_const_symbol :
  466. begin
  467. AsmWrite(#9'.long'#9+pai_const_symbol(hp)^.sym^.name);
  468. if pai_const_symbol(hp)^.offset>0 then
  469. AsmWrite('+'+tostr(pai_const_symbol(hp)^.offset))
  470. else if pai_const_symbol(hp)^.offset<0 then
  471. AsmWrite(tostr(pai_const_symbol(hp)^.offset));
  472. AsmLn;
  473. end;
  474. ait_const_rva :
  475. AsmWriteLn(#9'.rva'#9+pai_const_symbol(hp)^.sym^.name);
  476. ait_real_80bit :
  477. begin
  478. if do_line then
  479. AsmWriteLn(target_asm.comment+extended2str(pai_real_80bit(hp)^.value));
  480. { Make sure e is a extended type, bestreal could be
  481. a different type (bestreal) !! (PFV) }
  482. e:=pai_real_80bit(hp)^.value;
  483. AsmWrite(#9'.byte'#9);
  484. for i:=0 to 9 do
  485. begin
  486. if i<>0 then
  487. AsmWrite(',');
  488. AsmWrite(tostr(t80bitarray(e)[i]));
  489. end;
  490. AsmLn;
  491. end;
  492. ait_real_64bit :
  493. begin
  494. if do_line then
  495. AsmWriteLn(target_asm.comment+double2str(pai_real_64bit(hp)^.value));
  496. d:=pai_real_64bit(hp)^.value;
  497. AsmWrite(#9'.byte'#9);
  498. for i:=0 to 7 do
  499. begin
  500. if i<>0 then
  501. AsmWrite(',');
  502. AsmWrite(tostr(t64bitarray(d)[i]));
  503. end;
  504. AsmLn;
  505. end;
  506. ait_real_32bit :
  507. begin
  508. if do_line then
  509. AsmWriteLn(target_asm.comment+single2str(pai_real_32bit(hp)^.value));
  510. sin:=pai_real_32bit(hp)^.value;
  511. AsmWrite(#9'.byte'#9);
  512. for i:=0 to 3 do
  513. begin
  514. if i<>0 then
  515. AsmWrite(',');
  516. AsmWrite(tostr(t32bitarray(sin)[i]));
  517. end;
  518. AsmLn;
  519. end;
  520. ait_comp_64bit :
  521. begin
  522. if do_line then
  523. AsmWriteLn(target_asm.comment+comp2str(pai_comp_64bit(hp)^.value));
  524. AsmWrite(#9'.byte'#9);
  525. {$ifdef FPC}
  526. co:=comp(pai_comp_64bit(hp)^.value);
  527. {$else}
  528. co:=pai_comp_64bit(hp)^.value;
  529. {$endif}
  530. for i:=0 to 7 do
  531. begin
  532. if i<>0 then
  533. AsmWrite(',');
  534. AsmWrite(tostr(t64bitarray(co)[i]));
  535. end;
  536. AsmLn;
  537. end;
  538. ait_direct :
  539. begin
  540. AsmWritePChar(pai_direct(hp)^.str);
  541. AsmLn;
  542. {$IfDef GDB}
  543. if strpos(pai_direct(hp)^.str,'.data')<>nil then
  544. n_line:=n_dataline
  545. else if strpos(pai_direct(hp)^.str,'.text')<>nil then
  546. n_line:=n_textline
  547. else if strpos(pai_direct(hp)^.str,'.bss')<>nil then
  548. n_line:=n_bssline;
  549. {$endif GDB}
  550. end;
  551. ait_string :
  552. begin
  553. pos:=0;
  554. for i:=1 to pai_string(hp)^.len do
  555. begin
  556. if pos=0 then
  557. begin
  558. AsmWrite(#9'.ascii'#9'"');
  559. pos:=20;
  560. end;
  561. ch:=pai_string(hp)^.str[i-1];
  562. case ch of
  563. #0, {This can't be done by range, because a bug in FPC}
  564. #1..#31,
  565. #128..#255 : s:='\'+tostr(ord(ch) shr 6)+tostr((ord(ch) and 63) shr 3)+tostr(ord(ch) and 7);
  566. '"' : s:='\"';
  567. '\' : s:='\\';
  568. else
  569. s:=ch;
  570. end;
  571. AsmWrite(s);
  572. inc(pos,length(s));
  573. if (pos>line_length) or (i=pai_string(hp)^.len) then
  574. begin
  575. AsmWriteLn('"');
  576. pos:=0;
  577. end;
  578. end;
  579. end;
  580. ait_label :
  581. begin
  582. if (pai_label(hp)^.l^.is_used) then
  583. begin
  584. if pai_label(hp)^.l^.typ=AS_GLOBAL then
  585. begin
  586. AsmWrite('.globl'#9);
  587. AsmWriteLn(pai_label(hp)^.l^.name);
  588. end;
  589. AsmWrite(pai_label(hp)^.l^.name);
  590. AsmWriteLn(':');
  591. end;
  592. end;
  593. ait_symbol :
  594. begin
  595. if pai_symbol(hp)^.is_global then
  596. begin
  597. AsmWrite('.globl'#9);
  598. AsmWriteLn(pai_symbol(hp)^.sym^.name);
  599. end;
  600. if target_info.target=target_i386_linux then
  601. begin
  602. AsmWrite(#9'.type'#9);
  603. AsmWrite(pai_symbol(hp)^.sym^.name);
  604. if assigned(pai(hp^.next)) and
  605. (pai(hp^.next)^.typ in [ait_const_symbol,ait_const_rva,
  606. ait_const_32bit,ait_const_16bit,ait_const_8bit,ait_datablock,
  607. ait_real_32bit,ait_real_64bit,ait_real_80bit,ait_comp_64bit]) then
  608. AsmWriteLn(',@object')
  609. else
  610. AsmWriteLn(',@function');
  611. if pai_symbol(hp)^.sym^.size>0 then
  612. begin
  613. AsmWrite(#9'.size'#9);
  614. AsmWrite(pai_symbol(hp)^.sym^.name);
  615. AsmWrite(', ');
  616. AsmWriteLn(tostr(pai_symbol(hp)^.sym^.size));
  617. end;
  618. end;
  619. AsmWrite(pai_symbol(hp)^.sym^.name);
  620. AsmWriteLn(':');
  621. end;
  622. ait_symbol_end :
  623. begin
  624. if target_info.target=target_i386_linux then
  625. begin
  626. s:=target_asm.labelprefix+'e'+tostr(symendcount);
  627. inc(symendcount);
  628. AsmWriteLn(s+':');
  629. AsmWrite(#9'.size'#9);
  630. AsmWrite(pai_symbol(hp)^.sym^.name);
  631. AsmWrite(', '+s+' - ');
  632. AsmWriteLn(pai_symbol(hp)^.sym^.name);
  633. end;
  634. end;
  635. ait_instruction :
  636. begin
  637. op:=paicpu(hp)^.opcode;
  638. calljmp:=is_calljmp(op);
  639. { call maybe not translated to calll }
  640. s:=#9+att_op2str[op]+cond2str[paicpu(hp)^.condition];
  641. if (not calljmp) and
  642. (not att_nosuffix[op]) and
  643. not(
  644. (paicpu(hp)^.oper[0].typ=top_reg) and
  645. (paicpu(hp)^.oper[0].reg in [R_ST..R_ST7])
  646. ) then
  647. s:=s+att_opsize2str[paicpu(hp)^.opsize];
  648. { process operands }
  649. if paicpu(hp)^.ops<>0 then
  650. begin
  651. { call and jmp need an extra handling }
  652. { this code is only called if jmp isn't a labeled instruction }
  653. if calljmp then
  654. s:=s+#9+getopstr_jmp(paicpu(hp)^.oper[0])
  655. else
  656. begin
  657. for i:=0to paicpu(hp)^.ops-1 do
  658. begin
  659. if i=0 then
  660. sep:=#9
  661. else
  662. sep:=',';
  663. s:=s+sep+getopstr(paicpu(hp)^.oper[i])
  664. end;
  665. end;
  666. end;
  667. AsmWriteLn(s);
  668. end;
  669. {$ifdef GDB}
  670. ait_stabs :
  671. begin
  672. AsmWrite(#9'.stabs ');
  673. AsmWritePChar(pai_stabs(hp)^.str);
  674. AsmLn;
  675. end;
  676. ait_stabn :
  677. begin
  678. AsmWrite(#9'.stabn ');
  679. AsmWritePChar(pai_stabn(hp)^.str);
  680. AsmLn;
  681. end;
  682. ait_force_line :
  683. stabslastfileinfo.line:=0;
  684. ait_stab_function_name:
  685. funcname:=pai_stab_function_name(hp)^.str;
  686. {$endif GDB}
  687. ait_cut :
  688. begin
  689. if SmartAsm then
  690. begin
  691. { only reset buffer if nothing has changed }
  692. if AsmSize=AsmStartSize then
  693. AsmClear
  694. else
  695. begin
  696. AsmClose;
  697. DoAssemble;
  698. if pai_cut(hp)^.EndName then
  699. IsEndFile:=true;
  700. AsmCreate;
  701. end;
  702. { avoid empty files }
  703. while assigned(hp^.next) and (pai(hp^.next)^.typ in [ait_cut,ait_section,ait_comment]) do
  704. begin
  705. if pai(hp^.next)^.typ=ait_section then
  706. lastsec:=pai_section(hp^.next)^.sec;
  707. hp:=pai(hp^.next);
  708. end;
  709. {$ifdef GDB}
  710. { force write of filename }
  711. FillChar(stabslastfileinfo,sizeof(stabslastfileinfo),0);
  712. includecount:=0;
  713. funcname:=nil;
  714. WriteFileLineInfo(hp^.fileinfo);
  715. {$endif GDB}
  716. if lastsec<>sec_none then
  717. AsmWriteLn(ait_section2str(lastsec));
  718. AsmStartSize:=AsmSize;
  719. end;
  720. end;
  721. ait_marker :
  722. ;
  723. else
  724. internalerror(10000);
  725. end;
  726. hp:=pai(hp^.next);
  727. end;
  728. end;
  729. procedure ti386attasmlist.WriteAsmList;
  730. var
  731. p:dirstr;
  732. n:namestr;
  733. e:extstr;
  734. {$ifdef GDB}
  735. fileinfo : tfileposinfo;
  736. {$endif GDB}
  737. begin
  738. {$ifdef EXTDEBUG}
  739. if assigned(current_module^.mainsource) then
  740. Comment(v_info,'Start writing att-styled assembler output for '+current_module^.mainsource^);
  741. {$endif}
  742. LastSec:=sec_none;
  743. {$ifdef GDB}
  744. FillChar(stabslastfileinfo,sizeof(stabslastfileinfo),0);
  745. {$endif GDB}
  746. FillChar(lastfileinfo,sizeof(lastfileinfo),0);
  747. LastInfile:=nil;
  748. if assigned(current_module^.mainsource) then
  749. fsplit(current_module^.mainsource^,p,n,e)
  750. else
  751. begin
  752. p:=inputdir;
  753. n:=inputfile;
  754. e:=inputextension;
  755. end;
  756. { to get symify to work }
  757. AsmWriteLn(#9'.file "'+FixFileName(n+e)+'"');
  758. {$ifdef GDB}
  759. n_line:=n_bssline;
  760. funcname:=nil;
  761. linecount:=1;
  762. includecount:=0;
  763. fileinfo.fileindex:=1;
  764. fileinfo.line:=1;
  765. { Write main file }
  766. WriteFileLineInfo(fileinfo);
  767. {$endif GDB}
  768. AsmStartSize:=AsmSize;
  769. symendcount:=0;
  770. countlabelref:=false;
  771. If (cs_debuginfo in aktmoduleswitches) then
  772. WriteTree(debuglist);
  773. WriteTree(codesegment);
  774. WriteTree(datasegment);
  775. WriteTree(consts);
  776. WriteTree(rttilist);
  777. Writetree(resourcestringlist);
  778. WriteTree(bsssegment);
  779. Writetree(importssection);
  780. { exports are written by DLLTOOL
  781. if we use it so don't insert it twice (PM) }
  782. if not RelocSection then
  783. Writetree(exportssection);
  784. Writetree(resourcesection);
  785. countlabelref:=true;
  786. AsmLn;
  787. {$ifdef EXTDEBUG}
  788. if assigned(current_module^.mainsource) then
  789. comment(v_info,'Done writing att-styled assembler output for '+current_module^.mainsource^);
  790. {$endif EXTDEBUG}
  791. end;
  792. end.
  793. {
  794. $Log$
  795. Revision 1.14 1999-09-10 18:48:00 florian
  796. * some bug fixes (e.g. must_be_valid and procinfo.funcret_is_valid)
  797. * most things for stored properties fixed
  798. Revision 1.13 1999/09/02 17:07:38 florian
  799. * problems with -Or fixed: tdef.isfpuregable was wrong!
  800. Revision 1.12 1999/08/25 16:03:46 peter
  801. * symbol name is now written using separate asmwrite() calls to overcome
  802. > 255 char strings
  803. Revision 1.11 1999/08/25 11:59:32 jonas
  804. * changed pai386, paippc and paiapha (same for tai*) to paicpu (taicpu)
  805. Revision 1.10 1999/08/13 15:44:57 peter
  806. * first things to include lineinfo in the executable
  807. Revision 1.9 1999/08/10 12:26:20 pierre
  808. * avoid double .edata section if using DLLTOOL
  809. Revision 1.8 1999/08/04 00:22:34 florian
  810. * renamed i386asm and i386base to cpuasm and cpubase
  811. Revision 1.7 1999/07/30 12:26:07 peter
  812. * write .size only for linux
  813. Revision 1.6 1999/07/29 20:53:56 peter
  814. * write .size also
  815. Revision 1.5 1999/07/22 09:37:29 florian
  816. + resourcestring implemented
  817. + start of longstring support
  818. Revision 1.4 1999/07/18 10:19:38 florian
  819. * made it compilable with Dlephi 4 again
  820. + fixed problem with large stack allocations on win32
  821. Revision 1.3 1999/07/03 00:27:04 peter
  822. * better smartlinking support
  823. Revision 1.2 1999/06/22 15:25:14 peter
  824. * merged
  825. Revision 1.1.2.1 1999/06/22 15:23:08 peter
  826. * reinserted
  827. Revision 1.100 1999/06/22 14:41:20 peter
  828. * merged
  829. Revision 1.99 1999/06/14 17:47:44 peter
  830. * merged
  831. Revision 1.97.2.3 1999/06/22 14:40:27 peter
  832. * small change to fpureg check
  833. Revision 1.97.2.2 1999/06/22 14:20:19 peter
  834. * fixed parsing and writing of fpureg
  835. Revision 1.97.2.1 1999/06/14 17:30:41 peter
  836. * align fixes from pierre
  837. Revision 1.98 1999/06/11 22:54:10 pierre
  838. * .align problem treated :
  839. .align is considered as .p2align on go32v1 and go32v2
  840. and as .balign on other targets
  841. + ra386att supports also .balign and .p2align
  842. * ag386att uses .balign allways
  843. Revision 1.97 1999/06/09 23:00:06 peter
  844. * small ansistring fixes
  845. * val_ansistr_sint destsize changed to longint
  846. * don't write low/hi ascii with -al
  847. Revision 1.96 1999/06/06 15:53:13 peter
  848. * suffix adding can be turned of for some tasmops in att_nosuffix array
  849. Revision 1.95 1999/05/27 19:43:56 peter
  850. * removed oldasm
  851. * plabel -> pasmlabel
  852. * -a switches to source writing automaticly
  853. * assembler readers OOPed
  854. * asmsymbol automaticly external
  855. * jumptables and other label fixes for asm readers
  856. Revision 1.94 1999/05/23 18:41:54 florian
  857. * better error recovering in typed constants
  858. * some problems with arrays of const fixed, some problems
  859. due my previous
  860. - the location type of array constructor is now LOC_MEM
  861. - the pushing of high fixed
  862. - parameter copying fixed
  863. - zero temp. allocation removed
  864. * small problem in the assembler writers fixed:
  865. ref to nil wasn't written correctly
  866. Revision 1.93 1999/05/21 13:54:39 peter
  867. * NEWLAB for label as symbol
  868. Revision 1.92 1999/05/16 17:03:05 peter
  869. * better file position info
  870. Revision 1.91 1999/05/12 00:19:36 peter
  871. * removed R_DEFAULT_SEG
  872. * uniform float names
  873. Revision 1.90 1999/05/08 19:52:31 peter
  874. + MessagePos() which is enhanced Message() function but also gets the
  875. position info
  876. * Removed comp warnings
  877. Revision 1.89 1999/05/07 00:38:22 pierre
  878. * comp fixes 2
  879. Revision 1.88 1999/05/07 00:09:35 pierre
  880. * better comp output
  881. Revision 1.87 1999/05/06 09:05:06 peter
  882. * generic write_float and str_float
  883. * fixed constant float conversions
  884. Revision 1.86 1999/05/04 21:44:29 florian
  885. * changes to compile it with Delphi 4.0
  886. Revision 1.85 1999/05/02 23:29:57 peter
  887. * readded condition, becuase it's needed for set<cond> and cmov<cond> !
  888. Revision 1.84 1999/05/02 22:41:47 peter
  889. * moved section names to systems
  890. * fixed nasm,intel writer
  891. Revision 1.83 1999/05/02 21:33:51 florian
  892. * several bugs regarding -Or fixed
  893. Revision 1.82 1999/05/01 13:47:51 peter
  894. * fix hack for fsub
  895. Revision 1.81 1999/05/01 13:23:56 peter
  896. * merged nasm compiler
  897. * old asm moved to oldasm/
  898. Revision 1.80 1999/04/17 22:17:04 pierre
  899. * ifdef USE_OP3 released (changed into ifndef NO_OP3)
  900. * SHRD and SHLD first operand (ATT syntax) can only be CL reg or immediate const
  901. Revision 1.79 1999/04/16 11:49:37 peter
  902. + tempalloc
  903. + -at to show temp alloc info in .s file
  904. Revision 1.78 1999/04/16 10:00:54 pierre
  905. + ifdef USE_OP3 code :
  906. added all missing op_... constructors for taicpu needed
  907. for SHRD,SHLD and IMUL code in assembler readers
  908. (check in tests/tbs0123.pp)
  909. Revision 1.77 1999/04/14 12:44:46 daniel
  910. * Proper fix for the .bss conflict
  911. Revision 1.76 1999/04/14 11:43:25 michael
  912. + reverted back to .section .bss
  913. Revision 1.75 1999/04/13 08:45:33 daniel
  914. * EMX assembler prefers .bss instead of .section .bss
  915. Revision 1.74 1999/04/10 16:14:59 peter
  916. * fixed browcol
  917. + -ar to show regalloc info in .s file
  918. Revision 1.73 1999/04/09 08:33:45 peter
  919. * write * before register with call for the stricter as versions
  920. Revision 1.72 1999/03/31 13:55:02 peter
  921. * assembler inlining working for ag386bin
  922. Revision 1.71 1999/03/29 16:05:42 peter
  923. * optimizer working for ag386bin
  924. Revision 1.70 1999/03/10 21:48:21 florian
  925. * bug0218 fixed, ag386att writes now all real types as byte
  926. sequences to minimize rouding error, in -al mode the
  927. value is written as comment
  928. Revision 1.69 1999/03/10 13:25:43 pierre
  929. section order changed to get closer output from coff writer
  930. Revision 1.68 1999/03/02 02:56:09 peter
  931. + stabs support for binary writers
  932. * more fixes and missing updates from the previous commit :(
  933. Revision 1.67 1999/03/01 15:46:15 peter
  934. * ag386bin finally make cycles correct
  935. * prefixes are now also normal opcodes
  936. Revision 1.66 1999/02/26 00:48:12 peter
  937. * assembler writers fixed for ag386bin
  938. Revision 1.65 1999/02/25 21:02:17 peter
  939. * ag386bin updates
  940. + coff writer
  941. Revision 1.64 1999/02/22 02:14:57 peter
  942. * updates for ag386bin
  943. Revision 1.63 1999/02/17 10:16:25 peter
  944. * small fixes for the binary writer
  945. Revision 1.62 1999/01/12 14:21:26 peter
  946. * fixed pushw warning
  947. Revision 1.61 1998/12/29 18:50:04 jonas
  948. * don't write debug info if not (cs_debuginfo in aktmoduleswitches)
  949. Revision 1.60 1998/12/23 22:53:43 peter
  950. * don't count ait_marker for lineinfo
  951. Revision 1.58 1998/12/11 00:02:38 peter
  952. + globtype,tokens,version unit splitted from globals
  953. Revision 1.57 1998/12/01 23:36:32 pierre
  954. * zero padded alignment was buggy
  955. Revision 1.56 1998/12/01 11:19:37 peter
  956. * fixed range problem with in [tasmop]
  957. Revision 1.55 1998/11/30 09:42:53 pierre
  958. * some range check bugs fixed (still not working !)
  959. + added DLL writing support for win32 (also accepts variables)
  960. + TempAnsi for code that could be used for Temporary ansi strings
  961. handling
  962. Revision 1.54 1998/11/17 10:04:13 pierre
  963. * zero indexed file not searched
  964. Revision 1.53 1998/11/17 00:26:08 peter
  965. * fixed for $H+
  966. Revision 1.52 1998/11/12 11:19:32 pierre
  967. * fix for first line of function break
  968. Revision 1.51 1998/11/09 09:21:18 pierre
  969. * fix for stabs line infos
  970. Revision 1.50 1998/11/06 09:49:25 pierre
  971. * n_line stuff cleaned
  972. Revision 1.49 1998/10/26 23:07:02 peter
  973. * fixpath fix
  974. Revision 1.48 1998/10/15 15:08:39 pierre
  975. * removed lots of unnecessary inputfile system.open calls
  976. (made a big speed decrease on go32v2 !)
  977. Revision 1.47 1998/10/13 14:01:05 peter
  978. * fixed -al
  979. Revision 1.46 1998/10/13 13:10:07 peter
  980. * new style for m68k/i386 infos and enums
  981. Revision 1.45 1998/10/12 12:20:39 pierre
  982. + added tai_const_symbol_offset
  983. for r : pointer = @var.field;
  984. * better message for different arg names on implementation
  985. of function
  986. Revision 1.44 1998/10/06 17:16:32 pierre
  987. * some memory leaks fixed (thanks to Peter for heaptrc !)
  988. Revision 1.43 1998/10/01 20:19:12 jonas
  989. + ait_marker support
  990. Revision 1.42 1998/09/28 16:57:08 pierre
  991. * changed all length(p^.value_str^) into str_length(p)
  992. to get it work with and without ansistrings
  993. * changed sourcefiles field of tmodule to a pointer
  994. Revision 1.41 1998/09/20 17:11:19 jonas
  995. * released REGALLOC
  996. Revision 1.40 1998/09/16 17:58:34 jonas
  997. * fixed -dRegAlloc and -dDRegalloc problems
  998. Revision 1.39 1998/09/11 11:30:41 pierre
  999. -al -g option bug corrected
  1000. Revision 1.38.2.1 1998/09/11 10:49:09 pierre
  1001. * bug with -g -al option removed
  1002. Revision 1.38 1998/09/07 22:23:35 peter
  1003. * fixed for no gdb compiler
  1004. Revision 1.37 1998/09/07 18:33:34 peter
  1005. + smartlinking for win95 imports
  1006. Revision 1.36 1998/09/04 17:34:19 pierre
  1007. * bug with datalabel corrected
  1008. + assembler errors better commented
  1009. * one nested record crash removed
  1010. Revision 1.35 1998/09/03 17:08:38 pierre
  1011. * better lines for stabs
  1012. (no scroll back to if before else part
  1013. no return to case line at jump outside case)
  1014. + source lines also if not in order
  1015. Revision 1.34 1998/09/03 11:22:41 peter
  1016. + support for cs_asm_source
  1017. Revision 1.33 1998/08/26 10:06:33 peter
  1018. * reduce amount of asmfiles generated
  1019. * no stabs are written in writefilelineinfo when debuginfo is off
  1020. Revision 1.32 1998/08/20 09:26:35 pierre
  1021. + funcret setting in underproc testing
  1022. compile with _dTEST_FUNCRET
  1023. Revision 1.31 1998/08/11 14:01:16 peter
  1024. * @object type also for extended and comp
  1025. Revision 1.30 1998/08/10 23:56:02 peter
  1026. * fixed extended writing
  1027. Revision 1.29 1998/08/10 14:49:35 peter
  1028. + localswitches, moduleswitches, globalswitches splitting
  1029. Revision 1.27 1998/08/08 12:30:07 florian
  1030. * extended writing improved
  1031. Revision 1.26 1998/08/08 10:19:16 florian
  1032. * small fixes to write the extended type correct
  1033. Revision 1.28 1998/08/10 10:01:33 peter
  1034. * Fixed with GDB undefined
  1035. Revision 1.25 1998/08/06 16:53:25 pierre
  1036. * debugging info corrected
  1037. Revision 1.24 1998/07/14 14:46:37 peter
  1038. * released NEWINPUT
  1039. Revision 1.23 1998/07/07 11:19:51 peter
  1040. + NEWINPUT for a better inputfile and scanner object
  1041. Revision 1.22 1998/06/08 22:59:42 peter
  1042. * smartlinking works for win32
  1043. * some defines to exclude some compiler parts
  1044. Revision 1.21 1998/06/05 17:46:01 peter
  1045. * tp doesn't like comp() typecast
  1046. Revision 1.20 1998/06/04 23:51:27 peter
  1047. * m68k compiles
  1048. + .def file creation moved to gendef.pas so it could also be used
  1049. for win32
  1050. Revision 1.19 1998/05/31 14:13:29 peter
  1051. * fixed call bugs with assembler readers
  1052. + OPR_SYMBOL to hold a symbol in the asm parser
  1053. * fixed staticsymtable vars which were acessed through %ebp instead of
  1054. name
  1055. Revision 1.18 1998/05/28 17:24:25 peter
  1056. - $R- for tp to solve range errors with in[]
  1057. Revision 1.17 1998/05/25 17:11:34 pierre
  1058. * firstpasscount bug fixed
  1059. now all is already set correctly the first time
  1060. under EXTDEBUG try -gp to skip all other firstpasses
  1061. it works !!
  1062. * small bug fixes
  1063. - for smallsets with -dTESTSMALLSET
  1064. - some warnings removed (by correcting code !)
  1065. Revision 1.16 1998/05/23 01:20:54 peter
  1066. + aktasmmode, aktoptprocessor, aktoutputformat
  1067. + smartlink per module $SMARTLINK-/+ (like MMX) and moved to aktswitches
  1068. + $LIBNAME to set the library name where the unit will be put in
  1069. * splitted cgi386 a bit (codeseg to large for bp7)
  1070. * nasm, tasm works again. nasm moved to ag386nsm.pas
  1071. Revision 1.15 1998/05/11 13:07:53 peter
  1072. + $ifdef NEWPPU for the new ppuformat
  1073. + $define GDB not longer required
  1074. * removed all warnings and stripped some log comments
  1075. * no findfirst/findnext anymore to remove smartlink *.o files
  1076. Revision 1.14 1998/05/06 18:36:53 peter
  1077. * tai_section extended with code,data,bss sections and enumerated type
  1078. * ident 'compiled by FPC' moved to pmodules
  1079. * small fix for smartlink
  1080. Revision 1.13 1998/05/06 08:38:32 pierre
  1081. * better position info with UseTokenInfo
  1082. UseTokenInfo greatly simplified
  1083. + added check for changed tree after first time firstpass
  1084. (if we could remove all the cases were it happen
  1085. we could skip all firstpass if firstpasscount > 1)
  1086. Only with ExtDebug
  1087. Revision 1.12 1998/05/04 17:54:24 peter
  1088. + smartlinking works (only case jumptable left todo)
  1089. * redesign of systems.pas to support assemblers and linkers
  1090. + Unitname is now also in the PPU-file, increased version to 14
  1091. Revision 1.11 1998/05/01 07:43:52 florian
  1092. + basics for rtti implemented
  1093. + switch $m (generate rtti for published sections)
  1094. Revision 1.10 1998/04/30 15:59:39 pierre
  1095. * GDB works again better :
  1096. correct type info in one pass
  1097. + UseTokenInfo for better source position
  1098. * fixed one remaining bug in scanner for line counts
  1099. * several little fixes
  1100. Revision 1.9 1998/04/29 10:33:41 pierre
  1101. + added some code for ansistring (not complete nor working yet)
  1102. * corrected operator overloading
  1103. * corrected nasm output
  1104. + started inline procedures
  1105. + added starstarn : use ** for exponentiation (^ gave problems)
  1106. + started UseTokenInfo cond to get accurate positions
  1107. Revision 1.8 1998/04/28 08:23:58 pierre
  1108. * bug in stabn generation fixed
  1109. Revision 1.7 1998/04/27 23:10:27 peter
  1110. + new scanner
  1111. * $makelib -> if smartlink
  1112. * small filename fixes pmodule.setfilename
  1113. * moved import from files.pas -> import.pas
  1114. Revision 1.6 1998/04/21 11:30:13 peter
  1115. * fixed $ifdef regalloc
  1116. Revision 1.5 1998/04/16 16:53:24 jonas
  1117. * changed $ifdef regalloc to $ifdef dregalloc (= debugging info)
  1118. Revision 1.4 1998/04/09 15:46:38 florian
  1119. + register allocation tracing stuff added
  1120. Revision 1.3 1998/04/08 16:58:00 pierre
  1121. * several bugfixes
  1122. ADD ADC and AND are also sign extended
  1123. nasm output OK (program still crashes at end
  1124. and creates wrong assembler files !!)
  1125. procsym types sym in tdef removed !!
  1126. }