Bläddra i källkod

+ support for (section-based) threadvars for LLVM

git-svn-id: branches/hlcgllvm@28352 -
Jonas Maebe 11 år sedan
förälder
incheckning
575911dcb0
4 ändrade filer med 18 tillägg och 15 borttagningar
  1. 10 0
      compiler/llvm/aasmllvm.pas
  2. 2 0
      compiler/llvm/agllvm.pas
  3. 4 15
      compiler/llvm/nllvmutil.pas
  4. 2 0
      compiler/options.pas

+ 10 - 0
compiler/llvm/aasmllvm.pas

@@ -150,7 +150,9 @@ interface
       namesym: tasmsymbol;
       def: tdef;
       sec: TAsmSectiontype;
+      tls: boolean;
       constructor create(_namesym: tasmsymbol; _def: tdef; _initdata: tasmlist; _sec: tasmsectiontype);
+      constructor createtls(_namesym: tasmsymbol; _def: tdef);
       destructor destroy; override;
     end;
 
@@ -187,6 +189,14 @@ uses
         _namesym.declared:=true;
       end;
 
+
+    constructor taillvmdecl.createtls(_namesym: tasmsymbol; _def: tdef);
+      begin
+        create(_namesym,_def,nil,sec_data);
+        tls:=true;
+      end;
+
+
     destructor taillvmdecl.destroy;
       begin
         initdata.free;

+ 2 - 0
compiler/llvm/agllvm.pas

@@ -893,6 +893,8 @@ implementation
                     else
                       internalerror(2014020104);
                   end;
+                  if taillvmdecl(hp).tls then
+                    asmwrite('thread_local ');
                   { todo: handle more different section types (mainly
                       Objective-C }
                   if taillvmdecl(hp).sec in [sec_rodata,sec_rodata_norel] then

+ 4 - 15
compiler/llvm/nllvmutil.pas

@@ -37,8 +37,6 @@ interface
       class procedure insertbsssym(list: tasmlist; sym: tstaticvarsym; size: asizeint); override;
      public
       class procedure InsertInitFinalTable; override;
-      class procedure InsertThreadvarTablesTable; override;
-      class procedure InsertThreadvars; override;
       class procedure InsertWideInitsTablesTable; override;
       class procedure InsertWideInits; override;
       class procedure InsertResourceTablesTable; override;
@@ -62,7 +60,10 @@ implementation
         asmsym:=current_asmdata.DefineAsmSymbol(sym.mangledname,AB_GLOBAL,AT_DATA)
       else
         asmsym:=current_asmdata.DefineAsmSymbol(sym.mangledname,AB_LOCAL,AT_DATA);
-      list.concat(taillvmdecl.Create(asmsym,sym.vardef,nil,sec_data));
+      if not(vo_is_thread_var in sym.varoptions) then
+        list.concat(taillvmdecl.create(asmsym,sym.vardef,nil,sec_data))
+      else
+        list.concat(taillvmdecl.createtls(asmsym,sym.vardef))
     end;
 
 
@@ -72,18 +73,6 @@ implementation
     end;
 
 
-  class procedure tllvmnodeutils.InsertThreadvarTablesTable;
-    begin
-      { not yet supported }
-    end;
-
-
-  class procedure tllvmnodeutils.InsertThreadvars;
-    begin
-      { not yet supported }
-    end;
-
-
   class procedure tllvmnodeutils.InsertWideInitsTablesTable;
     begin
       { not required }

+ 2 - 0
compiler/options.pas

@@ -3495,6 +3495,8 @@ if (target_info.abi = abi_eabihf) then
 {$ifdef llvm}
   { standard extension for llvm bitcode files }
   target_info.asmext:='.ll';
+  { always use section threadvars for now }
+  include(target_info.flags,tf_section_threadvars);
 {$endif llvm}
 {$ifdef mipsel}
   case target_info.system of