Browse Source

m68k: some quickhacks to support PalmOS reg-relative globals and quick-n-dirty small code PIC. needs some cleanup, but the basic idea will be useful a potential for MacOS and Amiga .library support as well, among others

git-svn-id: trunk@37900 -
Károly Balogh 7 năm trước cách đây
mục cha
commit
64e7c90147
1 tập tin đã thay đổi với 24 bổ sung3 xóa
  1. 24 3
      compiler/m68k/cgcpu.pas

+ 24 - 3
compiler/m68k/cgcpu.pas

@@ -261,8 +261,9 @@ unit cgcpu;
         for reg:=RS_A0 to RS_A6 do
           begin
             { don't hardwire the frame pointer register, because it can vary between target OS }
-            if assigned(current_procinfo) and (current_procinfo.framepointer = NR_FRAME_POINTER_REG)
-               and (reg = RS_FRAME_POINTER_REG) then
+            if (assigned(current_procinfo) and (current_procinfo.framepointer = NR_FRAME_POINTER_REG)
+               and (reg = RS_FRAME_POINTER_REG))
+               or ((reg = RS_PIC_OFFSET_REG) and (tf_static_reg_based in target_info.flags)) then
               continue;
             setlength(address_regs,length(address_regs)+1);
             address_regs[length(address_regs)-1]:=reg;
@@ -435,6 +436,9 @@ unit cgcpu;
          { NOTE: we don't have to fixup scaling in this function, because the memnode
            won't generate scaling on CPUs which don't support it }
 
+         if (tf_static_reg_based in target_info.flags) and assigned(ref.symbol) and (ref.base=NR_NO) then
+           fullyresolve:=true;
+
          { first, deal with the symbol, if we have an index or base register.
            in theory, the '020+ could deal with these, but it's better to avoid
            long displacements on most members of the 68k family anyway }
@@ -444,6 +448,14 @@ unit cgcpu;
 
              hreg:=getaddressregister(list);
              reference_reset_symbol(href,ref.symbol,ref.offset,ref.alignment,ref.volatility);
+             if (tf_static_reg_based in target_info.flags) and (ref.base=NR_NO) then
+               begin
+                 if ref.symbol.typ in [AT_DATA,AT_DATA_FORCEINDIRECT,AT_DATA_NOINDIRECT] then
+                   href.base:=NR_PIC_OFFSET_REG
+                 else
+                   href.base:=NR_PC;
+               end;
+
              list.concat(taicpu.op_ref_reg(A_LEA,S_L,href,hreg));
              ref.offset:=0;
              ref.symbol:=nil;
@@ -535,6 +547,13 @@ unit cgcpu;
              //list.concat(tai_comment.create(strpnew('fixref: fully resolve to register')));
              if hreg=NR_NO then
                hreg:=getaddressregister(list);
+             if (tf_static_reg_based in target_info.flags) and (ref.base=NR_NO) then
+               begin
+                 if ref.symbol.typ in [AT_DATA,AT_DATA_FORCEINDIRECT,AT_DATA_NOINDIRECT] then
+                   ref.base:=NR_PIC_OFFSET_REG
+                 else
+                   ref.base:=NR_PC;
+               end;
              list.concat(taicpu.op_ref_reg(A_LEA,S_L,ref,hreg));
              ref.base:=hreg;
              ref.index:=NR_NO;
@@ -597,13 +616,15 @@ unit cgcpu;
     procedure tcg68k.a_call_name(list : TAsmList;const s : string; weak: boolean);
       var
         sym: tasmsymbol;
+      const
+        jmp_inst: array[boolean] of tasmop = ( A_JSR, A_BSR );
       begin
         if not(weak) then
           sym:=current_asmdata.RefAsmSymbol(s,AT_FUNCTION)
         else
           sym:=current_asmdata.WeakRefAsmSymbol(s,AT_FUNCTION);
 
-        list.concat(taicpu.op_sym(A_JSR,S_NO,sym));
+        list.concat(taicpu.op_sym(jmp_inst[tf_code_small in target_info.flags],S_NO,sym));
       end;