Forráskód Böngészése

Implement some missing things in the SPC32 backend.
Add a simple way to create an absolute symbol in the internal linker.

git-svn-id: branches/laksen/spc32@33691 -

Jeppe Johansen 9 éve
szülő
commit
b1f39905dc

+ 7 - 2
compiler/link.pas

@@ -1175,7 +1175,8 @@ Implementation
             {para:=}GetToken(s,' ');
             if Trim(s)<>'' then
               Comment(V_Warning,'Unknown part "'+s+'" in "'+hp.str+'" internal linker script');
-            if (keyword<>'SYMBOL') and
+            if (keyword<>'ABSSYM') and
+               (keyword<>'SYMBOL') and
                (keyword<>'SYMBOLS') and
                (keyword<>'STABS') and
                (keyword<>'PROVIDE') and
@@ -1264,7 +1265,9 @@ Implementation
             handled:=true;
             keyword:=Upper(GetToken(s,' '));
             para:=ParsePara(GetToken(s,' '));
-            if keyword='SYMBOL' then
+            if keyword='ABSSYM' then
+              ExeOutput.Load_AbsSym(para)
+            else if keyword='SYMBOL' then
               ExeOutput.Load_Symbol(para)
             else if keyword='PROVIDE' then
               ExeOutput.Load_ProvideSymbol(para)
@@ -1336,6 +1339,8 @@ Implementation
               ExeOutput.Order_Values(8,para)
             else if keyword='SYMBOL' then
               ExeOutput.Order_Symbol(para)
+            else if keyword='ABSSYM' then
+              ExeOutput.Order_AbsSym(para)
             else if keyword='PROVIDE' then
               ExeOutput.Order_ProvideSymbol(para)
             else

+ 39 - 0
compiler/ogbase.pas

@@ -612,6 +612,7 @@ interface
         procedure AddObjData(ObjData:TObjData);
         procedure Load_Start;virtual;
         procedure Load_EntryName(const aname:string);virtual;
+        procedure Load_AbsSym(const aname:string);virtual;
         procedure Load_Symbol(const aname:string);virtual;
         procedure Load_ProvideSymbol(const aname:string);virtual;
         procedure Load_IsSharedLibrary;
@@ -624,6 +625,7 @@ interface
         procedure Order_Zeros(const avalue:string);virtual;
         procedure Order_Values(bytesize : aword; const avalue:string);virtual;
         procedure Order_Symbol(const aname:string);virtual;
+        procedure Order_AbsSym(const aname:string);virtual;
         procedure Order_ProvideSymbol(const aname:string);virtual;
         procedure Order_EndExeSection;virtual;
         procedure Order_ObjSection(const aname:string);virtual;
@@ -1954,6 +1956,23 @@ implementation
       end;
 
 
+    procedure TExeOutput.Load_AbsSym(const aname: string);
+      var
+        name, value: String;
+        asmsym: TObjSymbol;
+      begin
+        name:=Copy(aname,1, Pos(',',aname)-1);
+        value:=Copy(aname, pos(',',aname)+1, length(aname)-pos(',',aname));
+
+        if assigned(ExeSymbolList.Find(name)) then
+          exit;
+        internalObjData.createsection('*'+name,0,[]);
+        // Use AB_COMMON to avoid muliple defined complaints
+        asmsym:=internalObjData.SymbolDefine(name,AB_GLOBAL,AT_NONE);
+        asmsym.offset:=strtoint(value);
+      end;
+
+
     procedure TExeOutput.Load_IsSharedLibrary;
       begin
         IsSharedLibrary:=true;
@@ -2080,6 +2099,26 @@ implementation
         CurrExeSec.AddObjSection(objsym.ObjSection,True);
       end;
 
+    procedure TExeOutput.Order_AbsSym(const aname: string);
+      var
+        objsym: TObjSymbol;
+        name: String;
+        exesym: TExeSymbol;
+      begin
+        name:=Copy(aname,1,pos(',',aname)-1);
+
+        objsym:=TObjSymbol(internalObjData.ObjSymbolList.Find(name));
+        if (objsym=nil) or (objsym.ObjSection.ObjData<>internalObjData) then
+          internalerror(200603041);
+        exesym:=TExeSymbol(ExeSymbolList.Find(name));
+        if not assigned(exesym) then
+          internalerror(201206301);
+        { Only include this section if it actually resolves
+          the symbol }
+        if exesym.objsymbol=objsym then
+          CurrExeSec.AddObjSection(objsym.ObjSection,True);
+      end;
+
     procedure TExeOutput.Order_ProvideSymbol(const aname:string);
       var
         objsym : TObjSymbol;

+ 69 - 3
compiler/spc32/hlcgcpu.pas

@@ -45,12 +45,78 @@ interface
 implementation
 
   uses
-    cgcpu,
-    verbose;
+    verbose,globtype,fmodule,
+    aasmbase,aasmtai,
+    symconst,symsym,defutil,
+    cpubase,aasmcpu,parabase,
+    cgobj,cgcpu;
 
   procedure thlcgspc32.g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);
+    var
+      make_global: boolean;
+      href: treference;
+      hsym: tsym;
+      paraloc: pcgparalocation;
+      op: tasmop;
     begin
-      internalerror(2016051501);
+      if not(procdef.proctypeoption in [potype_function,potype_procedure]) then
+        Internalerror(200006137);
+      if not assigned(procdef.struct) or
+         (procdef.procoptions*[po_classmethod, po_staticmethod,
+           po_methodpointer, po_interrupt, po_iocheck]<>[]) then
+        Internalerror(200006138);
+      if procdef.owner.symtabletype<>ObjectSymtable then
+        Internalerror(200109191);
+
+      make_global:=false;
+      if (not current_module.is_unit) or create_smartlink_library or
+         (procdef.owner.defowner.owner.symtabletype=globalsymtable) then
+        make_global:=true;
+
+      if make_global then
+        list.concat(Tai_symbol.Createname_global(labelname,AT_FUNCTION,0))
+      else
+        list.concat(Tai_symbol.Createname(labelname,AT_FUNCTION,0));
+
+      { set param1 interface to self  }
+      procdef.init_paraloc_info(callerside);
+      hsym:=tsym(procdef.parast.Find('self'));
+      if not(assigned(hsym) and
+        (hsym.typ=paravarsym)) then
+        internalerror(2010103101);
+      paraloc:=tparavarsym(hsym).paraloc[callerside].location;
+      if assigned(paraloc^.next) then
+        InternalError(2013020101);
+
+      case paraloc^.loc of
+        LOC_REGISTER:
+          cg.a_op_const_reg(list,OP_SUB,paraloc^.Size,ioffset,paraloc^.register)
+          //tcgspc32(cg).handle_reg_imm12_reg(list,A_SUB,paraloc^.size,paraloc^.register,ioffset,paraloc^.register,NR_IP0,false,true);
+        else
+          internalerror(2010103102);
+      end;
+
+      if (po_virtualmethod in procdef.procoptions) and
+          not is_objectpascal_helper(procdef.struct) then
+        begin
+          if (procdef.extnumber=$ffff) then
+            Internalerror(200006139);
+          { mov  0(%rdi),%rax ; load vmt}
+          reference_reset_base(href,voidpointertype,paraloc^.register,0,sizeof(pint));
+          getcpuregister(list,NR_R0);
+          a_load_ref_reg(list,voidpointertype,voidpointertype,href,NR_R0);
+          { jmp *vmtoffs(%eax) ; method offs }
+          reference_reset_base(href,voidpointertype,NR_R0,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),sizeof(pint));
+          op:=A_LDW;
+          href:=tcgspc32(cg).normalize_ref(list,href);
+          list.concat(taicpu.op_reg_ref(op,NR_R0,href));
+          ungetcpuregister(list,NR_R0);
+          list.concat(taicpu.op_none(A_NUL));
+          list.concat(taicpu.op_reg(A_JMP,NR_R0));
+        end
+      else
+        cg.a_jmp_name(list,procdef.mangledname);
+      list.concat(Tai_symbol_end.Createname(labelname));
     end;
 
   procedure create_hlcodegen;

+ 2 - 1
compiler/systems.pas

@@ -270,7 +270,8 @@ interface
                            system_iA64_embedded,system_x86_64_embedded,
                            system_mips_embedded,system_arm_embedded,
                            system_powerpc64_embedded,system_avr_embedded,
-                           system_jvm_java32,system_mipseb_embedded,system_mipsel_embedded];
+                           system_jvm_java32,system_mipseb_embedded,system_mipsel_embedded,
+                           system_spc32_embedded];
 
        { all systems that allow section directive }
        systems_allow_section = systems_embedded;

+ 7 - 0
compiler/systems/t_embed.pas

@@ -82,6 +82,13 @@ begin
 
   with LinkScript do
     begin
+      if current_settings.controllertype<>ct_none then
+      begin
+        Concat('EXESECTION *globals');
+        Concat('  ABSSYM _stack_top,'+IntToStr(embedded_controllers[current_settings.controllertype].srambase+embedded_controllers[current_settings.controllertype].sramsize));
+        Concat('EXESECTION *globals');
+      end;
+
       Concat('HEADER');
       Concat('EXESECTION .interp');
       Concat('  OBJSECTION .interp');