Browse Source

Save and read correctly Assembler Output options in Textmoed ide.

Margers 11 months ago
parent
commit
ef4ad5d669
3 changed files with 53 additions and 20 deletions
  1. 1 0
      packages/ide/fpmcomp.inc
  2. 7 6
      packages/ide/fpmopts.inc
  3. 45 14
      packages/ide/fpswitch.pas

+ 1 - 0
packages/ide/fpmcomp.inc

@@ -50,6 +50,7 @@ begin
        if L<>RB^.Value then
          PrevMainFile:='';
        UpdateTarget;
+       UpdateAsmOutputSwitches;
     end;
   Dispose(D, Done);
 end;

+ 7 - 6
packages/ide/fpmopts.inc

@@ -256,16 +256,17 @@ begin
     New(Label52, Init(R2, label_compiler_assemblerinfo, CB5));
 
     Count:=AsmOutputSwitches^.ItemCount;
+    UpdateAsmOutputSwitches;
+    Count:=AsmOutputSwitches[SwitchesMode]^.ItemCount;
     R2.Copy(TabIR);
     R2.A.X:=R2.B.X-(R2.B.X-R2.A.X) div 2;
     Dec(R2.B.X,4);
     R2.B.Y:=R2.A.Y+Count;
     Items:=nil;
-    UpdateAsmOutputSwitches;
     for I:=Count-1 downto 0 do
-      Items:=NewSItem(AsmOutputSwitches^.ItemName(I), Items);
+      Items:=NewSItem(AsmOutputSwitches[SwitchesMode]^.ItemName(I), Items);
     New(RB6, Init(R2, Items));
-    L:=AsmOutputSwitches^.GetCurrSel;
+    L:=AsmOutputSwitches[SwitchesMode]^.GetCurrSel;
     RB6^.SetData(L);
     Dec(R2.A.Y);
     R2.B.Y:=R2.A.Y+1;
@@ -348,7 +349,7 @@ begin
     AsmReaderSwitches^.SetCurrSel(RB5^.Value);
     for I:=0 to AsmInfoSwitches^.ItemCount-1 do
       AsmInfoSwitches^.SetBooleanItem(I,CB5^.Mark(I));
-    AsmOutputSwitches^.SetCurrSel(RB6^.Value);
+    AsmOutputSwitches[SwitchesMode]^.SetCurrSel(RB6^.Value);
     BrowserSwitches^.SetCurrSel(RB4^.Value);
     ConditionalSwitches^.SetStringItem(0,IL^.Data^);
     CustomArg[SwitchesMode]:=IL2^.Data^;
@@ -464,11 +465,11 @@ begin
     OtherLinkerSwitches^.SetBooleanItem(1,CB2^.Mark(0));
     if LibLinkerSwitches^.GetCurrSelParam='X' then
      if CompareText(TargetSwitches^.GetCurrSelParam,'Windows')=0 then
-      if CompareText(AsmOutputSwitches^.GetCurrSelParam,'pecoff')<>0 then
+      if CompareText(AsmOutputSwitches[SwitchesMode]^.GetCurrSelParam,'pecoff')<>0 then
         if ConfirmBox(
           FormatStrStr3(msg_xmustbesettoyforz_doyouwanttochangethis,
            label_compiler_assembleroutput,'pecoff','smartlinking'),nil,false)=cmYes then
-             AsmOutputSwitches^.SetCurrSelParam('pecoff');
+             AsmOutputSwitches[SwitchesMode]^.SetCurrSelParam('pecoff');
     for I:=0 to LinkAfterSwitches^.ItemCount-1 do
       LinkAfterSwitches^.SetBooleanItem(I,CB^.Mark(I));
   end;

+ 45 - 14
packages/ide/fpswitch.pas

@@ -178,13 +178,15 @@ var
     ProcessorOptimizationSwitches,
     AsmReaderSwitches,
     AsmInfoSwitches,
-    AsmOutputSwitches,
     TargetSwitches,
     ConditionalSwitches,
     MemorySwitches,
     BrowserSwitches,
     DirectorySwitches : PSwitches;
 
+    {Every mode can have different target, thus have its own AsmOutput}
+    AsmOutputSwitches: array [TSwitchMode] of PSwitches;
+
 { write/read the Switches to fpc.cfg file }
 procedure WriteSwitches(const fn:string);
 procedure ReadSwitches(const fn:string);
@@ -966,7 +968,8 @@ begin
      ProcessorOptimizationSwitches^.WriteItemsCfg;
      AsmReaderSwitches^.WriteItemsCfg;
      AsmInfoSwitches^.WriteItemsCfg;
-     AsmOutputSwitches^.WriteItemsCfg;
+     if assigned(AsmOutputSwitches[SwitchesMode]) then
+       AsmOutputSwitches[SwitchesMode]^.WriteItemsCfg;
      DirectorySwitches^.WriteItemsCfg;
      MemorySwitches^.WriteItemsCfg;
      ConditionalSwitches^.WriteItemsCfg;
@@ -1015,7 +1018,10 @@ begin
       Delete(s,1,2);
       case c of
        'a' : res:=AsmInfoSwitches^.ReadItemsCfg(s);
-       'A' : res:=AsmOutputSwitches^.ReadItemsCfg(s);
+       'A' : begin
+               UpdateAsmOutputSwitches;
+               res:=AsmOutputSwitches[SwitchesMode]^.ReadItemsCfg(s);
+             end;
        'b' : res:=BrowserSwitches^.ReadItemsCfg(s);
        'C' : begin
                res:=CodegenSwitches^.ReadItemsCfg(s);
@@ -1100,24 +1106,46 @@ end;
 procedure UpdateAsmOutputSwitches;
 var
   ta : tasm;
+  zt : tsystem;
+  sy : tsystem;
+  sw : TSwitchMode;
   st : string;
-begin
-  if assigned(AsmOutputSwitches) then
-    dispose(AsmOutputSwitches,Done);
-  New(AsmOutputSwitches,InitSelect('A'));
-  with AsmOutputSwitches^ do
+  L : String;
+  t : string;
+begin
+  sw:=SwitchesMode;
+  t:='';
+  if assigned(TargetSwitches) then
+    t:=TargetSwitches^.ItemName(TargetSwitches^.GetCurrSel);
+  sy:=target_info.system;
+  for zt:=low(tsystem) to high(tsystem) do
+    if assigned(targetinfos[zt]) then
+    begin
+      if targetinfos[zt]^.name = t then
+      begin
+        sy:=zt;
+        break;
+      end;
+    end;
+  L:='';
+  if assigned(AsmOutputSwitches[sw]) then
+  begin
+    L:=AsmOutputSwitches[sw]^.GetCurrSelParam;
+    dispose(AsmOutputSwitches[sw],Done);
+  end;
+  New(AsmOutputSwitches[sw],InitSelect('A'));
+  with AsmOutputSwitches[sw]^ do
    begin
-
      AddDefaultSelect(opt_usedefaultas);
      for ta:=low(tasm) to high(tasm) do
        if assigned(asminfos[ta]) and
-         ((target_info.system in asminfos[ta]^.supported_targets) or
+         ((sy in asminfos[ta]^.supported_targets) or
          (system_any in asminfos[ta]^.supported_targets)) then
          begin
            st:='Asm '+asminfos[ta]^.idtxt;
            if asminfos[ta]^.idtxt='AS' then
              st:=opt_usegnuas;
-{$ifdef I386}
+{$if defined(I386) or defined(x86_64)}
            if asminfos[ta]^.idtxt='NASMCOFF' then
              st:=opt_usenasmcoff;
            if asminfos[ta]^.idtxt='NASMOBJ' then
@@ -1148,6 +1176,7 @@ begin
            AddSelectItem(st,asminfos[ta]^.idtxt,idNone);
          end;
    end;
+   AsmOutputSwitches[sw]^.SetCurrSelParam(L);
 end;
 
 {*****************************************************************************
@@ -1476,7 +1505,7 @@ begin
 end;
 
 procedure DoneSwitches;
-
+var sw : TSwitchMode;
 begin
   dispose(SyntaxSwitches,Done);
   dispose(CompilerModeSwitches,Done);
@@ -1488,7 +1517,6 @@ begin
   dispose(BrowserSwitches,Done);
   dispose(TargetSwitches,Done);
   dispose(AsmReaderSwitches,Done);
-  dispose(AsmOutputSwitches,Done);
   dispose(AsmInfoSwitches,Done);
   dispose(ConditionalSwitches,Done);
   dispose(MemorySwitches,Done);
@@ -1499,6 +1527,9 @@ begin
   dispose(LinkAfterSwitches,Done);
   dispose(OtherLinkerSwitches,Done);
   dispose(ProfileInfoSwitches,Done);
+  for sw:=low(TSwitchMode) to high(TSwitchMode) do
+    if assigned(AsmOutputSwitches[sw]) then
+      dispose(AsmOutputSwitches[sw],Done);
 end;
 
 procedure GetCompilerOptionLines(C: PUnsortedStringCollection);
@@ -1575,7 +1606,7 @@ begin
   EnumSwitches(ProcessorCodeGenerationSwitches);
   EnumSwitches(AsmReaderSwitches);
   EnumSwitches(AsmInfoSwitches);
-  EnumSwitches(AsmOutputSwitches);
+  EnumSwitches(AsmOutputSwitches[SM]);
   EnumSwitches(TargetSwitches);
   EnumSwitches(ConditionalSwitches);
   EnumSwitches(MemorySwitches);