浏览代码

t_morph.pas

Károly Balogh 20 年之前
父节点
当前提交
9ccc0ffda7
共有 3 个文件被更改,包括 188 次插入58 次删除
  1. 74 4
      compiler/systems/i_amiga.pas
  2. 5 2
      compiler/systems/t_amiga.pas
  3. 109 52
      compiler/systems/t_morph.pas

+ 74 - 4
compiler/systems/i_amiga.pas

@@ -90,18 +90,88 @@ unit i_amiga;
             use_function_relative_addresses : true
           );
 
+       system_powerpc_amiga_info : tsysteminfo =
+          (
+            system       : system_powerpc_Amiga;
+            name         : 'AmigaOS for PowerPC';
+            shortname    : 'amigappc';
+            flags        : [];
+            cpu          : cpu_powerpc;
+            unit_env     : '';
+            extradefines : '';
+            sourceext    : '.pp';
+            pasext       : '.pas';
+            exeext       : '';
+            defext       : '.def';
+            scriptext    : '.sh';
+            smartext     : '.sl';
+            unitext      : '.ppu';
+            unitlibext   : '.ppl';
+            asmext       : '.s';
+            objext       : '.o';
+            resext       : '.res';
+            resobjext    : '.or';
+            sharedlibext : '.library';
+            staticlibext : '.a';
+            staticlibprefix : 'lib';
+            sharedlibprefix : '';
+            sharedClibext : '.library';
+            staticClibext : '.a';
+            staticClibprefix : 'lib';
+            sharedClibprefix : '';
+            Cprefix      : '';
+            newline      : #10;
+            dirsep       : '/';
+            files_case_relevent : true;
+            assem        : as_gas;
+            assemextern  : as_gas;
+            link         : nil;
+            linkextern   : nil;
+            ar           : ar_gnu_ar;
+            res          : res_none;
+            script       : script_amiga;
+            endian       : endian_big;
+            alignment    :
+              (
+                procalign       : 4;
+                loopalign       : 4;
+                jumpalign       : 0;
+                constalignmin   : 0;
+                constalignmax   : 4;
+                varalignmin     : 0;
+                varalignmax     : 4;
+                localalignmin   : 0;
+                localalignmax   : 4;
+                recordalignmin  : 0;
+                recordalignmax  : 4;
+                maxCrecordalign : 4
+              );
+            first_parm_offset : 8;
+            stacksize    : 262144;
+            DllScanSupported:false;
+            use_function_relative_addresses : true
+          );
+
   implementation
 
 initialization
-{$ifdef cpu68}
+{$ifdef CPU68}
   {$ifdef AMIGA}
     set_source_info(system_m68k_Amiga_info);
-  {$endif amiga}
-{$endif cpu68}
+  {$endif AMIGA}
+{$endif CPU68}
+{$ifdef CPUPOWERPC}
+  {$ifdef AMIGA}
+//    set_source_info(system_powerpc_Amiga_info);
+  {$endif AMIGA}
+{$endif CPUPOWERPC}
 end.
 {
   $Log$
-  Revision 1.6  2004-10-25 15:38:41  peter
+  Revision 1.7  2005-02-03 03:54:06  karoly
+  t_morph.pas
+
+  Revision 1.6  2004/10/25 15:38:41  peter
     * heap and heapsize removed
     * checkpointer fixes
 

+ 5 - 2
compiler/systems/t_amiga.pas

@@ -3,7 +3,7 @@
     Copyright (c) 2001-2002 by Peter Vreman
 
     This unit implements support import,export,link routines
-    for the (i386) Amiga target
+    for the (m68k/powerpc) Amiga target
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -44,7 +44,10 @@ initialization
 end.
 {
   $Log$
-  Revision 1.2  2004-06-20 08:55:32  florian
+  Revision 1.3  2005-02-03 03:54:07  karoly
+  t_morph.pas
+
+  Revision 1.2  2004/06/20 08:55:32  florian
     * logs truncated
 
 }

+ 109 - 52
compiler/systems/t_morph.pas

@@ -2,7 +2,7 @@
     $Id$
     Copyright (c) 2004 by Free Pascal Development Team
 
-    This unit implements support import,export,link routines
+    This unit implements support import, export, link routines
     for the MorphOS (PowerPC) target
 
     This program is free software; you can redistribute it and/or modify
@@ -46,6 +46,16 @@ implementation
           function  MakeExecutable:boolean; override;
        end;
 
+{$IFDEF MORPHOS}
+{ * PathConv is implemented in the system unit! * }
+function PathConv(path: string): string; external name 'PATHCONV';
+{$ELSE}
+function PathConv(path: string): string;
+begin
+  PathConv:=path;
+end;
+{$ENDIF}
+
 {****************************************************************************
                                TLinkerMorphOS
 ****************************************************************************}
@@ -64,11 +74,10 @@ begin
   with Info do
    begin
      if (cs_link_on_target in aktglobalswitches) then begin
-        ExeCmd[1]:='ld $OPT -o $EXE --script $RES';
-        ExeCmd[2]:='strip --strip-unneeded --remove-section .comment $EXE';
-     end else begin
         ExeCmd[1]:='ld $OPT -o $EXE $RES';
         ExeCmd[2]:='strip --strip-unneeded --remove-section .comment $EXE';
+     end else begin
+        ExeCmd[1]:='fpcvlink -b elf32amiga $OPT $STRIP -o $EXE -F $RES';
      end;
    end;
 end;
@@ -86,49 +95,79 @@ begin
 
   { Open link.res file }
   LinkRes:=TLinkRes.Create(outputexedir+Info.ResName);
-
-  { Write path to search libraries }
-  HPath:=TStringListItem(current_module.locallibrarysearchpath.First);
-  while assigned(HPath) do
-   begin
-     s:=HPath.Str;
-     if (cs_link_on_target in aktglobalswitches) then
+  
+  if (cs_link_on_target in aktglobalswitches) then begin
+
+    { Write path to search libraries }
+    HPath:=TStringListItem(current_module.locallibrarysearchpath.First);
+    while assigned(HPath) do
+     begin
+       s:=HPath.Str;
+       if (cs_link_on_target in aktglobalswitches) then
        s:=ScriptFixFileName(s);
      LinkRes.Add('-L'+s);
      HPath:=TStringListItem(HPath.Next);
-   end;
-  HPath:=TStringListItem(LibrarySearchPath.First);
-  while assigned(HPath) do
-   begin
-     s:=HPath.Str;
-     if s<>'' then
-       LinkRes.Add('SEARCH_DIR('+maybequoted(s)+')');
-     HPath:=TStringListItem(HPath.Next);
-   end;
+    end;
+    HPath:=TStringListItem(LibrarySearchPath.First);
+    while assigned(HPath) do
+     begin
+       s:=HPath.Str;
+       if s<>'' then
+         LinkRes.Add('SEARCH_DIR('+maybequoted(s)+')');
+       HPath:=TStringListItem(HPath.Next);
+     end;
 
-  LinkRes.Add('INPUT (');
-  { add objectfiles, start with prt0 always }
-  s:=FindObjectFile('prt0','',false);
-  LinkRes.AddFileName(s);
-  while not ObjectFiles.Empty do
-   begin
-     s:=ObjectFiles.GetFirst;
-     if s<>'' then
-      LinkRes.AddFileName(maybequoted(s));
-   end;
-  LinkRes.Add(')');
+    LinkRes.Add('INPUT (');
+    { add objectfiles, start with prt0 always }
+    s:=FindObjectFile('prt0','',false);
+    LinkRes.AddFileName(s);
+    while not ObjectFiles.Empty do
+     begin
+       s:=ObjectFiles.GetFirst;
+       if s<>'' then 
+        begin
+         LinkRes.AddFileName(maybequoted(s));
+        end;
+     end;
+    LinkRes.Add(')');
+
+    { Write staticlibraries }
+    if not StaticLibFiles.Empty then
+     begin
+       LinkRes.Add('GROUP(');
+       While not StaticLibFiles.Empty do
+       begin
+         S:=StaticLibFiles.GetFirst;
+         LinkRes.AddFileName(maybequoted(s));
+       end;
+       LinkRes.Add(')');
+     end;
 
-  { Write staticlibraries }
-  if not StaticLibFiles.Empty then
-   begin
-     LinkRes.Add('GROUP(');
-     While not StaticLibFiles.Empty do
-      begin
-        S:=StaticLibFiles.GetFirst;
-        LinkRes.AddFileName(maybequoted(s));
-      end;
-     LinkRes.Add(')');
-   end;
+  end else begin
+
+    { add objectfiles, start with prt0 always }
+    s:=FindObjectFile('prt0','',false);
+    LinkRes.AddFileName(s);
+    while not ObjectFiles.Empty do
+     begin
+       s:=ObjectFiles.GetFirst;
+       if s<>'' then 
+        begin
+         s:=FindObjectFile(s,'',false);
+         LinkRes.AddFileName(maybequoted(s));
+        end;
+     end;
+
+    if not StaticLibFiles.Empty then
+     begin
+       While not StaticLibFiles.Empty do
+       begin
+         S:=StaticLibFiles.GetFirst;
+         LinkRes.AddFileName(maybequoted(s));
+       end;
+     end;
+
+  end;
 
   { Write sharedlibraries like -l<lib>, also add the needed dynamic linker
     here to be sure that it gets linked this is needed for glibc2 systems (PFV) }
@@ -170,31 +209,46 @@ var
   binstr,
   cmdstr  : string;
   success : boolean;
+  StripStr: string[40];
 begin
 
   if not(cs_link_extern in aktglobalswitches) then
    Message1(exec_i_linking,current_module.exefilename^);
 
+  if not (cs_link_on_target in aktglobalswitches) then begin
+    StripStr:='';
+    if (cs_link_strip in aktglobalswitches) then
+     StripStr:='-s -P __abox__';
+  end;
+
 { Write used files and libraries }
   WriteResponseFile(false);
 
 { Call linker }
   SplitBinCmd(Info.ExeCmd[1],binstr,cmdstr);
-  Replace(cmdstr,'$EXE',maybequoted(ScriptFixFileName(current_module.exefilename^)));
   Replace(cmdstr,'$OPT',Info.ExtraOptions);
-  Replace(cmdstr,'$RES',maybequoted(ScriptFixFileName(outputexedir+Info.ResName)));
+  if not(cs_link_on_target in aktglobalswitches) then begin
+    Replace(cmdstr,'$EXE',PathConv(maybequoted(ScriptFixFileName(current_module.exefilename^))));
+    Replace(cmdstr,'$RES',PathConv(maybequoted(ScriptFixFileName(outputexedir+Info.ResName))));
+    Replace(cmdstr,'$STRIP',StripStr);
+  end else begin
+    Replace(cmdstr,'$EXE',maybequoted(ScriptFixFileName(current_module.exefilename^)));
+    Replace(cmdstr,'$RES',maybequoted(ScriptFixFileName(outputexedir+Info.ResName)));
+  end;
   success:=DoExec(FindUtil(BinStr),cmdstr,true,false);
 
 { Stripping Enabled? }
-  { Under MorphOS a separate strip command is needed, to avoid stripping }
+  { For MorphOS a separate strip command is needed, to avoid stripping }
   { __abox__ symbol, which is required to be present in current MorphOS }
   { executables. }
-  if success and (cs_link_strip in aktglobalswitches) then
-    begin
-      SplitBinCmd(Info.ExeCmd[2],binstr,cmdstr);
-      Replace(cmdstr,'$EXE',maybequoted(current_module.exefilename^));
-      success:=DoExec(FindUtil(utilsprefix+binstr),cmdstr,true,false);
-    end;
+  if (cs_link_on_target in aktglobalswitches) then begin
+    if success and (cs_link_strip in aktglobalswitches) then
+      begin
+        SplitBinCmd(Info.ExeCmd[2],binstr,cmdstr);
+        Replace(cmdstr,'$EXE',maybequoted(current_module.exefilename^));
+        success:=DoExec(FindUtil(utilsprefix+binstr),cmdstr,true,false);
+      end;
+  end;
 
 { Remove ReponseFile }
   if (success) and not(cs_link_extern in aktglobalswitches) then
@@ -215,7 +269,10 @@ initialization
 end.
 {
   $Log$
-  Revision 1.10  2004-12-23 18:45:23  jonas
+  Revision 1.11  2005-02-03 03:54:07  karoly
+  t_morph.pas
+
+  Revision 1.10  2004/12/23 18:45:23  jonas
     * fixed typo
 
   Revision 1.9  2004/12/22 16:32:46  peter