فهرست منبع

Implement simple support for .thumb_func in the ELF output.

git-svn-id: branches/laksen/armiw@29340 -
Jeppe Johansen 10 سال پیش
والد
کامیت
de00a1d76d
3فایلهای تغییر یافته به همراه23 افزوده شده و 2 حذف شده
  1. 3 2
      compiler/assemble.pas
  2. 13 0
      compiler/ogbase.pas
  3. 7 0
      compiler/ogelf.pas

+ 3 - 2
compiler/assemble.pas

@@ -1214,9 +1214,10 @@ Implementation
                    asd_reference:
                    asd_reference:
                      { ignore for now, but should be added}
                      { ignore for now, but should be added}
                      ;
                      ;
+{$ifdef ARM}
                    asd_thumb_func:
                    asd_thumb_func:
-                     { ignore for now, but should be added}
-                     ;
+                     ObjData.ThumbFunc:=true;
+{$endif ARM}
                    else
                    else
                      internalerror(2010011101);
                      internalerror(2010011101);
                  end;
                  end;

+ 13 - 0
compiler/ogbase.pas

@@ -233,6 +233,9 @@ interface
        ExeSection  : TExeSection;
        ExeSection  : TExeSection;
        USed        : Boolean;
        USed        : Boolean;
        VTRefList : TFPObjectList;
        VTRefList : TFPObjectList;
+{$ifdef ARM}
+       ThumbFunc : boolean;
+{$endif ARM}
        constructor create(AList:TFPHashObjectList;const Aname:string;Aalign:shortint;Aoptions:TObjSectionOptions);virtual;
        constructor create(AList:TFPHashObjectList;const Aname:string;Aalign:shortint;Aoptions:TObjSectionOptions);virtual;
        destructor  destroy;override;
        destructor  destroy;override;
        function  write(const d;l:aword):aword;
        function  write(const d;l:aword):aword;
@@ -289,6 +292,9 @@ interface
      public
      public
        CurrPass  : byte;
        CurrPass  : byte;
        ExecStack : boolean;
        ExecStack : boolean;
+{$ifdef ARM}
+       ThumbFunc : boolean;
+{$endif ARM}
        constructor create(const n:string);virtual;
        constructor create(const n:string);virtual;
        destructor  destroy;override;
        destructor  destroy;override;
        { Sections }
        { Sections }
@@ -984,6 +990,9 @@ implementation
         FCachedAsmSymbolList:=TFPObjectList.Create(false);
         FCachedAsmSymbolList:=TFPObjectList.Create(false);
         { section class type for creating of new sections }
         { section class type for creating of new sections }
         FCObjSection:=TObjSection;
         FCObjSection:=TObjSection;
+{$ifdef ARM}
+        ThumbFunc:=false;
+{$endif ARM}
       end;
       end;
 
 
 
 
@@ -1131,6 +1140,10 @@ implementation
           begin
           begin
             result:=CObjSection.create(FObjSectionList,aname,aalign,aoptions);
             result:=CObjSection.create(FObjSectionList,aname,aalign,aoptions);
             result.ObjData:=self;
             result.ObjData:=self;
+{$ifdef ARM}
+            result.ThumbFunc:=ThumbFunc;
+            ThumbFunc:=false;
+{$endif ARM}
           end;
           end;
         FCurrObjSec:=result;
         FCurrObjSec:=result;
       end;
       end;

+ 7 - 0
compiler/ogelf.pas

@@ -968,6 +968,13 @@ implementation
           elfsym.st_name:=nameidx;
           elfsym.st_name:=nameidx;
         elfsym.st_size:=objsym.size;
         elfsym.st_size:=objsym.size;
         elfsym.st_value:=objsym.address;
         elfsym.st_value:=objsym.address;
+
+{$ifdef ARM}
+        if (objsym.typ=AT_FUNCTION) and
+           objsym.objsection.ThumbFunc then
+          inc(elfsym.st_value);
+{$endif ARM}
+
         case objsym.bind of
         case objsym.bind of
           AB_LOCAL :
           AB_LOCAL :
             begin
             begin