Browse Source

+ Objective-C support

git-svn-id: branches/llvm@15906 -
Jonas Maebe 15 years ago
parent
commit
d1f785c42a
1 changed files with 31 additions and 21 deletions
  1. 31 21
      compiler/llvmdef.pas

+ 31 - 21
compiler/llvmdef.pas

@@ -309,27 +309,31 @@ implementation
           tabstractrecordsymtable(def.symtable).llvmst:=tllvmshadowsymtable.create(tabstractrecordsymtable(def.symtable));
           tabstractrecordsymtable(def.symtable).llvmst:=tllvmshadowsymtable.create(tabstractrecordsymtable(def.symtable));
         symdeflist:=tabstractrecordsymtable(def.symtable).llvmst.symdeflist;
         symdeflist:=tabstractrecordsymtable(def.symtable).llvmst.symdeflist;
 
 
-        i:=0;
-        if (def.typ=objectdef) and
-           assigned(tobjectdef(def).childof) and
-           is_class_or_interface_or_dispinterface(tllvmshadowsymtableentry(symdeflist[0]).def) then
+        if symdeflist.count>0 then
           begin
           begin
-            { insert the struct for the class rather than a pointer to the struct }
-            if (tllvmshadowsymtableentry(symdeflist[0]).def.typ<>objectdef) then
-              internalerror(2008070601);
-            defstr:=defstr+def_llvm_class_struct_name(tobjectdef(tllvmshadowsymtableentry(symdeflist[0]).def)).name+', ';
-            inc(i);
-          end;
-        while i< symdeflist.count do
-          begin
-            defstr:=defstr+def_llvm_name(tllvmshadowsymtableentry(symdeflist[i]).def).name+', ';
-            inc(i);
+            i:=0;
+            if (def.typ=objectdef) and
+               assigned(tobjectdef(def).childof) and
+               is_class_or_interface_or_dispinterface(tllvmshadowsymtableentry(symdeflist[0]).def) then
+              begin
+                writeln(def.typename,' in ',def.owner.name^);
+                { insert the struct for the class rather than a pointer to the struct }
+                if (tllvmshadowsymtableentry(symdeflist[0]).def.typ<>objectdef) then
+                  internalerror(2008070601);
+                defstr:=defstr+def_llvm_class_struct_name(tobjectdef(tllvmshadowsymtableentry(symdeflist[0]).def)).name+', ';
+                inc(i);
+              end;
+            while i<symdeflist.count do
+              begin
+                defstr:=defstr+def_llvm_name(tllvmshadowsymtableentry(symdeflist[i]).def).name+', ';
+                inc(i);
+              end;
+            { remove last ', ' }
+            setlength(defstr,length(defstr)-2);
           end;
           end;
-        { remove last ', ' }
-        setlength(defstr,length(defstr)-2);
         defstr:=defstr+endstr;
         defstr:=defstr+endstr;
-        if (def.typ <> objectdef) or
-           not(tobjectdef(def).objecttype in [odt_interfacecom,odt_interfacecorba,odt_dispinterface,odt_class]) then
+        if (def.typ<>objectdef) or
+           not(tobjectdef(def).objecttype in [odt_interfacecom,odt_interfacecorba,odt_dispinterface,odt_class,odt_objcclass,odt_objccategory]) then
           list.concat(taillvm.op_ressym_string(LA_TYPE,def_llvm_name(def),defstr))
           list.concat(taillvm.op_ressym_string(LA_TYPE,def_llvm_name(def),defstr))
         else
         else
           list.concat(taillvm.op_ressym_string(LA_TYPE,def_llvm_class_struct_name(tobjectdef(def)),defstr))
           list.concat(taillvm.op_ressym_string(LA_TYPE,def_llvm_class_struct_name(tobjectdef(def)),defstr))
@@ -394,7 +398,10 @@ implementation
 
 
     procedure TLLVMDefInfo.appenddef_procvar(list:TAsmList;def:tprocvardef);
     procedure TLLVMDefInfo.appenddef_procvar(list:TAsmList;def:tprocvardef);
       begin
       begin
-        list.concat(taillvm.op_ressym_string(LA_TYPE,def_llvm_name(def),getabstractprocdefstr(def)+'*'));
+        if def.is_addressonly then
+          list.concat(taillvm.op_ressym_string(LA_TYPE,def_llvm_name(def),getabstractprocdefstr(def)+'*'))
+        else
+          list.concat(taillvm.op_ressym_string(LA_TYPE,def_llvm_name(def),'{ '+getabstractprocdefstr(def)+'*, i8* }'))
       end;
       end;
 
 
 
 
@@ -989,12 +996,15 @@ implementation
           odt_interfacecom,
           odt_interfacecom,
           odt_interfacecorba,
           odt_interfacecorba,
           odt_dispinterface,
           odt_dispinterface,
-          odt_class:
+          odt_class,
+          odt_objcclass,
+          odt_objcprotocol:
             begin
             begin
               { implicit pointer }
               { implicit pointer }
               list.concat(taillvm.op_ressym_string(LA_TYPE,def_llvm_name(def),def_llvm_class_struct_name(def).name+'*'));
               list.concat(taillvm.op_ressym_string(LA_TYPE,def_llvm_name(def),def_llvm_class_struct_name(def).name+'*'));
               doappend;
               doappend;
-              doappend_classvmt;
+              if not (def.objecttype in [odt_objcclass,odt_objcprotocol]) then
+                doappend_classvmt;
             end;
             end;
           else
           else
             internalerror(200602041);
             internalerror(200602041);