Ver Fonte

+ llvm type info support for procvars

git-svn-id: branches/llvm@11340 -
Jonas Maebe há 17 anos atrás
pai
commit
69ad7f054a
1 ficheiros alterados com 21 adições e 78 exclusões
  1. 21 78
      compiler/llvmdef.pas

+ 21 - 78
compiler/llvmdef.pas

@@ -48,7 +48,6 @@ interface
 
         function def_llvm_name(def:tdef) : tasmsymbol;
         function def_llvm_class_struct_name(def:tobjectdef) : tasmsymbol;
-//        function def_llvm_class_meta_name(def:tobjectdef) : tasmsymbol;
       protected
         vardatadef: trecorddef;
 
@@ -86,6 +85,7 @@ interface
         procedure appendsym_absolute(list:TAsmList;sym:tabsolutevarsym);override;
         procedure appendsym_property(list:TAsmList;sym:tpropertysym);override;
 
+        function getabstractprocdefstr(def:tabstractprocdef): ansistring;
         function symname(sym:tsym): String;
 
         procedure enum_membersyms_callback(p:TObject;arg:pointer);
@@ -428,49 +428,8 @@ implementation
       end;
 
     procedure TLLVMDefInfo.appenddef_procvar(list:TAsmList;def:tprocvardef);
-
-      procedure doappend;
-        var
-          i : longint;
-        begin
-(*
-          if assigned(def.typesym) then
-            append_entry(DW_TAG_subroutine_type,true,[
-              DW_AT_name,DW_FORM_string,symname(def.typesym)+#0,
-              DW_AT_prototyped,DW_FORM_flag,true
-            ])
-          else
-            append_entry(DW_TAG_subroutine_type,true,[
-              DW_AT_prototyped,DW_FORM_flag,true
-            ]);
-          if not(is_void(tprocvardef(def).returndef)) then
-            append_labelentry_ref(DW_AT_type,def_dwarf_lab(tprocvardef(def).returndef));
-          finish_entry;
-
-          { write parameters }
-          for i:=0 to def.paras.count-1 do
-            begin
-              append_entry(DW_TAG_formal_parameter,false,[
-                DW_AT_name,DW_FORM_string,symname(tsym(def.paras[i]))+#0
-              ]);
-              append_labelentry_ref(DW_AT_type,def_dwarf_lab(tparavarsym(def.paras[i]).vardef));
-              finish_entry;
-            end;
-
-          finish_children;
-*)
-        end;
-
-      var
-        proc : tasmlabel;
-
       begin
-        if def.is_methodpointer then
-          begin
-            list.concat(tai_llvmcpu.op_ressym_string(LA_TYPE,def_llvm_name(def),'methodpointer*'));
-          end
-        else
-          list.concat(tai_llvmcpu.op_ressym_string(LA_TYPE,def_llvm_name(def),'procvar*'));
+        list.concat(tai_llvmcpu.op_ressym_string(LA_TYPE,def_llvm_name(def),getabstractprocdefstr(def)+'*'));
       end;
 
 
@@ -479,14 +438,6 @@ implementation
         labsym : tasmsymbol;
       begin
         list.concat(tai_comment.Create(strpnew('LLVM definition '+def.typename)));
-
-(*
-        labsym:=def_dwarf_lab(def);
-        if ds_dwarf_dbg_info_written in def.defstates then
-          current_asmdata.asmlists[al_dwarf_info].concat(tai_symbol.create_global(labsym,0))
-        else
-          current_asmdata.asmlists[al_dwarf_info].concat(tai_symbol.create(labsym,0));
-*)
       end;
 
 
@@ -495,49 +446,39 @@ implementation
       end;
 
 
-    procedure TLLVMDefInfo.appendprocdef_implicit(list:TAsmList;def:tprocdef);
-
-      procedure addspecialpara(var defstr: ansistring; vo: tvaroption; const modifier: ansistring);
-        var
-          i      : longint;
-        begin
-        for i:=0 to pred(def.parast.symlist.count) do
-          with tabstractvarsym(def.parast.symlist[i]) do
-            if (vo in varoptions) then
-              begin
-                defstr:=defstr+def_llvm_name(vardef).name+modifier+', ';
-                break;
-              end;
-        end;
-
+    function TLLVMDefInfo.getabstractprocdefstr(def:tabstractprocdef): ansistring;
       var
-        defstr : ansistring;
         i      : longint;
       begin
         { function result-by-reference is handled as a parameter }
         if (def.proctypeoption in [potype_constructor,potype_destructor]) or
            not paramanager.ret_in_param(def.returndef,def.proccalloption) then
-          defstr:=def_llvm_name(tprocdef(def).returndef).name
+          result:=def_llvm_name(def.returndef).name
         else
-          defstr:='void';
-        defstr:=defstr+' (  ';
+          result:='void';
+        result:=result+' (  ';
 
         for i:=0 to def.paras.count-1 do
           with tparavarsym(def.paras[i]) do
             begin
-              defstr:=defstr+def_llvm_name(vardef).name;
-              if paramanager.push_addr_param(varspez,vardef,tprocdef(owner.defowner).proccalloption) then
+              result:=result+def_llvm_name(vardef).name;
+              if paramanager.push_addr_param(varspez,vardef,def.proccalloption) then
                 begin
-                  defstr:=defstr+'*';
+                  result:=result+'*';
                   if (vo_has_local_copy in varoptions) then
-                    defstr:=defstr+' byval'
+                    result:=result+' byval'
                   else if (vo_is_funcret in varoptions) then
-                    defstr:=defstr+' sret';
+                    result:=result+' sret';
                 end;
-              defstr:=defstr+', '
+              result:=result+', '
             end;
-        defstr[length(defstr)-1]:=')';
-        list.concat(tai_llvmcpu.op_ressym_string(LA_TYPE,def_llvm_name(def),defstr));
+        result[length(result)-1]:=')';
+      end;
+
+
+    procedure TLLVMDefInfo.appendprocdef_implicit(list:TAsmList;def:tprocdef);
+      begin
+        list.concat(tai_llvmcpu.op_ressym_string(LA_TYPE,def_llvm_name(def),getabstractprocdefstr(def)));
       end;
       
 
@@ -546,6 +487,8 @@ implementation
         defstr : ansistring;
         i      : longint;
       begin
+        { the procdef itself is already written by appendprocdef_implicit }
+      
         { last write the types from this procdef }
         if assigned(def.parast) then
           write_symtable_defs(current_asmdata.asmlists[al_dwarf_info],def.parast);