From 3ea409ab44bea51a678b46eb114326343ec97cad Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 20 Feb 2001 21:36:39 +0000 Subject: [PATCH] * tasm/masm fixes merged --- compiler/aasm.pas | 8 ++- compiler/assemble.pas | 10 ++- compiler/i386/ag386int.pas | 130 +++++++++++++++++++++++++++++++++---- compiler/i386/ag386nsm.pas | 19 ++++-- compiler/systems.pas | 25 ++++--- 5 files changed, 158 insertions(+), 34 deletions(-) diff --git a/compiler/aasm.pas b/compiler/aasm.pas index e61e7d57ba..845db591f1 100644 --- a/compiler/aasm.pas +++ b/compiler/aasm.pas @@ -954,7 +954,8 @@ uses begin; labelnr:=nextlabelnr; inc(nextlabelnr); - if (cs_create_smart in aktmoduleswitches) then + if (cs_create_smart in aktmoduleswitches) or + target_asm.labelprefix_only_inside_procedure then inherited init('_$'+current_module.modulename^+'$_L'+tostr(labelnr),AB_GLOBAL,AT_DATA) else inherited init(target_asm.labelprefix+tostr(labelnr),AB_LOCAL,AT_DATA); @@ -1160,7 +1161,10 @@ uses end. { $Log$ - Revision 1.15 2000-12-25 00:07:25 peter + Revision 1.16 2001-02-20 21:36:39 peter + * tasm/masm fixes merged + + Revision 1.15 2000/12/25 00:07:25 peter + new tlinkedlist class (merge of old tstringqueue,tcontainer and tlinkedlist objects) diff --git a/compiler/assemble.pas b/compiler/assemble.pas index 684bf56754..94bd40ccae 100644 --- a/compiler/assemble.pas +++ b/compiler/assemble.pas @@ -164,9 +164,9 @@ begin lastas:=ord(target_asm.id); { is an assembler passed ? } if utilsdirectory<>'' then - LastASBin:=FindFile(UtilExe,utilsdirectory,asfound)+UtilExe; + asfound:=FindFile(UtilExe,utilsdirectory,LastASBin); if not AsFound then - LastASBin:=FindExe(UtilExe,asfound); + asfound:=FindExe(UtilExe,LastASBin); if (not asfound) and not(cs_asm_extern in aktglobalswitches) then begin Message1(exec_w_assembler_not_found,LastASBin); @@ -555,6 +555,7 @@ begin a:=new(pi386nasmasmlist,Init(smart)); {$endif NoAg386Nsm} {$ifndef NoAg386Int} + as_i386_masm, as_i386_tasm : a:=new(pi386intasmlist,Init(smart)); {$endif NoAg386Int} @@ -602,7 +603,10 @@ end; end. { $Log$ - Revision 1.12 2001-02-09 23:06:17 peter + Revision 1.13 2001-02-20 21:36:39 peter + * tasm/masm fixes merged + + Revision 1.12 2001/02/09 23:06:17 peter * fixed uninited var Revision 1.11 2001/02/05 20:46:59 peter diff --git a/compiler/i386/ag386int.pas b/compiler/i386/ag386int.pas index 76990013e4..c353e4eee7 100644 --- a/compiler/i386/ag386int.pas +++ b/compiler/i386/ag386int.pas @@ -43,10 +43,7 @@ interface sysutils, {$endif} cutils,globtype,globals,systems,cobjects, - verbose,cpubase,cpuasm -{$ifdef extdebug} - ,fmodule -{$endif extdebug} + verbose,cpubase,cpuasm,finput,fmodule ; const @@ -139,6 +136,8 @@ interface s:='['; if assigned(symbol) then begin + if (aktoutputformat = as_i386_tasm) then + s:=s+'dword ptr '; s:=s+symbol^.name; first:=false; end; @@ -233,7 +232,7 @@ interface end; end; - function getopstr_jmp(const o:toper) : string; + function getopstr_jmp(const o:toper;s : topsize) : string; var hs : string; begin @@ -253,12 +252,43 @@ interface getopstr_jmp:=hs; end; top_ref : - getopstr_jmp:=getreferencestring(o.ref^); + { what about lcall or ljmp ??? } + begin + if (aktoutputformat = as_i386_tasm) then + hs:='' + else + begin + if s=S_FAR then + hs:='far ptr ' + else + hs:='near ptr '; + end; + getopstr_jmp:=hs+getreferencestring(o.ref^); + end; else internalerror(10001); end; end; + function fixline(s:string):string; + { + return s with all leading and ending spaces and tabs removed + } + var + i,j,k : longint; + begin + i:=length(s); + while (i>0) and (s[i] in [#9,' ']) do + dec(i); + j:=1; + while (jhp.fileinfo.fileindex then + begin + infile:=current_module.sourcefiles.get_file(hp.fileinfo.fileindex); + if assigned(infile) then + begin + { open only if needed !! } + if (cs_asm_source in aktglobalswitches) then + infile.open; + end; + { avoid unnecessary reopens of the same file !! } + lastfileinfo.fileindex:=hp.fileinfo.fileindex; + { be sure to change line !! } + lastfileinfo.line:=-1; + end; + { write source } + if (cs_asm_source in aktglobalswitches) and + assigned(infile) then + begin + if (infile<>lastinfile) then + begin + AsmWriteLn(target_asm.comment+'['+infile.name^+']'); + if assigned(lastinfile) then + lastinfile.close; + end; + if (hp.fileinfo.line<>lastfileinfo.line) and + ((hp.fileinfo.line0)) then + begin + if (hp.fileinfo.line<>0) and + ((infile.linebuf^[hp.fileinfo.line]>=0) or (InlineLevel>0)) then + AsmWriteLn(target_asm.comment+'['+tostr(hp.fileinfo.line)+'] '+ + fixline(infile.GetLineStr(hp.fileinfo.line))); + { set it to a negative value ! + to make that is has been read already !! PM } + if (infile.linebuf^[hp.fileinfo.line]>=0) then + infile.linebuf^[hp.fileinfo.line]:=-infile.linebuf^[hp.fileinfo.line]-1; + end; + end; + lastfileinfo:=hp.fileinfo; + lastinfile:=infile; + end; case hp.typ of ait_comment : Begin AsmWrite(target_asm.comment); @@ -514,16 +597,16 @@ interface AsmWriteLn(s); break; end; - { nasm prefers prefix on a line alone } - AsmWriteln(#9#9+prefix); - prefix:=''; + { nasm prefers prefix on a line alone + AsmWriteln(#9#9+prefix); but not masm PM + prefix:=''; } end else prefix:= ''; if taicpu(hp).ops<>0 then begin if is_calljmp(taicpu(hp).opcode) then - s:=#9+getopstr_jmp(taicpu(hp).oper[0]) + s:=#9+getopstr_jmp(taicpu(hp).oper[0],taicpu(hp).opsize) else begin for i:=0to taicpu(hp).ops-1 do @@ -577,7 +660,13 @@ ait_stab_function_name : ; target_asm.secnames[lastsec]+''''); AsmStartSize:=AsmSize; end; - ait_marker: ; + ait_marker : + begin + if tai_marker(hp).kind=InlineStart then + inc(InlineLevel) + else if tai_marker(hp).kind=InlineEnd then + dec(InlineLevel); + end; else internalerror(10000); end; @@ -591,7 +680,13 @@ ait_stab_function_name : ; procedure writeexternal(p:pnamedindexobject); begin if pasmsymbol(p)^.defbind=AB_EXTERNAL then - currentasmList^.AsmWriteln(#9'EXTRN'#9+p^.name); + begin + if (aktoutputformat = as_i386_masm) then + currentasmlist^.AsmWriteln(#9'EXTRN'#9+p^.name + +': NEAR') + else + currentasmlist^.AsmWriteln(#9'EXTRN'#9+p^.name); + end; end; procedure ti386intasmlist.WriteExternals; @@ -609,7 +704,11 @@ ait_stab_function_name : ; {$endif} LastSec:=sec_none; AsmWriteLn(#9'.386p'); - AsmWriteLn(#9'LOCALS '+target_asm.labelprefix); + { masm 6.11 does not seem to like LOCALS PM } + if (aktoutputformat = as_i386_tasm) then + begin + AsmWriteLn(#9'LOCALS '+target_asm.labelprefix); + end; AsmWriteLn('DGROUP'#9'GROUP'#9'_BSS,_DATA'); AsmWriteLn(#9'ASSUME'#9'CS:_CODE,ES:DGROUP,DS:DGROUP,SS:DGROUP'); AsmLn; @@ -641,7 +740,10 @@ ait_stab_function_name : ; end. { $Log$ - Revision 1.5 2001-01-13 20:24:24 peter + Revision 1.6 2001-02-20 21:36:39 peter + * tasm/masm fixes merged + + Revision 1.5 2001/01/13 20:24:24 peter * fixed operand order that got mixed up for external writers after my previous assembler block valid instruction check diff --git a/compiler/i386/ag386nsm.pas b/compiler/i386/ag386nsm.pas index 9931eebd29..26f58e2f36 100644 --- a/compiler/i386/ag386nsm.pas +++ b/compiler/i386/ag386nsm.pas @@ -614,9 +614,7 @@ interface AsmWriteLn(':') end; - ait_symbol_end : - begin - end; + ait_symbol_end : ; ait_instruction : begin @@ -629,7 +627,9 @@ interface suffix:=''; prefix:='';} s:=''; - if (taicpu(hp).opcode=A_FADDP) and (taicpu(hp).ops=0) then + if ((taicpu(hp).opcode=A_FADDP) or + (taicpu(hp).opcode=A_FMULP)) + and (taicpu(hp).ops=0) then begin taicpu(hp).ops:=2; taicpu(hp).oper[0].typ:=top_reg; @@ -756,6 +756,12 @@ interface WriteTree(rttilist); WriteTree(resourcestringlist); WriteTree(bsssegment); + Writetree(importssection); + { exports are written by DLLTOOL + if we use it so don't insert it twice (PM) } + if not UseDeffileForExport and assigned(exportssection) then + Writetree(exportssection); + Writetree(resourcesection); countlabelref:=true; AsmLn; @@ -768,7 +774,10 @@ interface end. { $Log$ - Revision 1.4 2001-01-13 20:24:24 peter + Revision 1.5 2001-02-20 21:36:39 peter + * tasm/masm fixes merged + + Revision 1.4 2001/01/13 20:24:24 peter * fixed operand order that got mixed up for external writers after my previous assembler block valid instruction check diff --git a/compiler/systems.pas b/compiler/systems.pas index aada1f4729..66cf032610 100644 --- a/compiler/systems.pas +++ b/compiler/systems.pas @@ -173,8 +173,9 @@ interface supported_target : ttarget; allowdirect, externals, - needar : boolean; - labelprefix : string[2]; + needar, + labelprefix_only_inside_procedure : boolean; + labelprefix : string[3]; comment : string[2]; secnames : array[tsection] of string[20]; end; @@ -659,7 +660,7 @@ implementation allowdirect : true; externals : true; needar : true; - labelprefix : 'L'; + labelprefix : '..@'; comment : '; '; secnames : ('', '.text','.data','.bss', @@ -675,7 +676,7 @@ implementation allowdirect : true; externals : true; needar : true; - labelprefix : 'L'; + labelprefix : '..@'; comment : '; '; secnames : ('', '.text','.data','.bss', @@ -691,7 +692,7 @@ implementation allowdirect : true; externals : true; needar : true; - labelprefix : 'L'; + labelprefix : '..@'; comment : '; '; secnames : ('', '.text','.data','.bss', @@ -707,7 +708,7 @@ implementation allowdirect : true; externals : true; needar : true; - labelprefix : 'L'; + labelprefix : '..@'; comment : '; '; secnames : ('', '.text','.data','.bss', @@ -718,11 +719,12 @@ implementation id : as_i386_tasm; idtxt : 'TASM'; asmbin : 'tasm'; - asmcmd : '/m2 $ASM $OBJ'; + asmcmd : '/m2 /ml $ASM $OBJ'; supported_target : target_any; { what should I write here ?? } allowdirect : true; externals : true; needar : true; + labelprefix_only_inside_procedure : true; labelprefix : '@@'; comment : '; '; secnames : ('', @@ -734,12 +736,12 @@ implementation id : as_i386_masm; idtxt : 'MASM'; asmbin : 'masm'; - asmcmd : '$ASM $OBJ'; + asmcmd : '/c $ASM /Fo$OBJ'; supported_target : target_any; { what should I write here ?? } allowdirect : true; externals : true; needar : true; - labelprefix : '.L'; + labelprefix : '@@'; comment : '; '; secnames : ('', 'CODE','DATA','BSS', @@ -1709,7 +1711,10 @@ begin end. { $Log$ - Revision 1.12 2001-01-06 20:15:43 peter + Revision 1.13 2001-02-20 21:36:40 peter + * tasm/masm fixes merged + + Revision 1.12 2001/01/06 20:15:43 peter * merged libp library prefix Revision 1.11 2000/10/15 09:08:58 peter