浏览代码

* fixed llvm types for loading the address of a nested routine

git-svn-id: trunk@32594 -
Jonas Maebe 9 年之前
父节点
当前提交
df9efdeb4c
共有 2 个文件被更改,包括 3 次插入3 次删除
  1. 1 1
      compiler/llvm/nllvmcnv.pas
  2. 2 2
      compiler/llvm/nllvmld.pas

+ 1 - 1
compiler/llvm/nllvmcnv.pas

@@ -164,7 +164,7 @@ procedure tllvmtypeconvnode.second_proc_to_procvar;
         if location.loc<>LOC_REFERENCE then
         if location.loc<>LOC_REFERENCE then
           internalerror(2015111902);
           internalerror(2015111902);
         hlcg.g_ptrtypecast_ref(current_asmdata.CurrAsmList,
         hlcg.g_ptrtypecast_ref(current_asmdata.CurrAsmList,
-          cpointerdef.getreusable(left.resultdef),
+          cpointerdef.getreusable(tprocdef(left.resultdef).getcopyas(procvardef,pc_normal)),
           cpointerdef.getreusable(resultdef),
           cpointerdef.getreusable(resultdef),
           location.reference);
           location.reference);
       end;
       end;

+ 2 - 2
compiler/llvm/nllvmld.pas

@@ -90,7 +90,7 @@ procedure tllvmloadnode.pass_generate_code;
               { on little endian, location.register contains proc and
               { on little endian, location.register contains proc and
                 location.registerhi contains self; on big endian, it's the
                 location.registerhi contains self; on big endian, it's the
                 other way around }
                 other way around }
-              tg.gethltemp(current_asmdata.CurrAsmList,resultdef,resultdef.size,tt_normal,href);
+              tg.gethltemp(current_asmdata.CurrAsmList,pvdef,pvdef.size,tt_normal,href);
               if target_info.endian=endian_little then
               if target_info.endian=endian_little then
                 begin
                 begin
                   procreg:=location.register;
                   procreg:=location.register;
@@ -110,7 +110,7 @@ procedure tllvmloadnode.pass_generate_code;
               else
               else
                 selfdef:=cpointerdef.getreusable(left.resultdef);
                 selfdef:=cpointerdef.getreusable(left.resultdef);
               mpref:=href;
               mpref:=href;
-              hlcg.g_ptrtypecast_ref(current_asmdata.CurrAsmList,cpointerdef.getreusable(resultdef),cpointerdef.getreusable(methodpointertype),mpref);
+              hlcg.g_ptrtypecast_ref(current_asmdata.CurrAsmList,cpointerdef.getreusable(pvdef),cpointerdef.getreusable(methodpointertype),mpref);
               hlcg.g_load_reg_field_by_name(current_asmdata.CurrAsmList,cprocvardef.getreusableprocaddr(procdef),trecorddef(methodpointertype),procreg,'proc',mpref);
               hlcg.g_load_reg_field_by_name(current_asmdata.CurrAsmList,cprocvardef.getreusableprocaddr(procdef),trecorddef(methodpointertype),procreg,'proc',mpref);
               hlcg.g_load_reg_field_by_name(current_asmdata.CurrAsmList,selfdef,trecorddef(methodpointertype),selfreg,'self',mpref);
               hlcg.g_load_reg_field_by_name(current_asmdata.CurrAsmList,selfdef,trecorddef(methodpointertype),selfreg,'self',mpref);
               location_reset_ref(location,LOC_REFERENCE,location.size,href.alignment);
               location_reset_ref(location,LOC_REFERENCE,location.size,href.alignment);