瀏覽代碼

* also consider jump tables embedded in the code when calculating the
distance between a jump and its target

git-svn-id: trunk@11022 -

Jonas Maebe 17 年之前
父節點
當前提交
942c91afad
共有 1 個文件被更改,包括 13 次插入2 次删除
  1. 13 2
      compiler/ppcgen/aasmcpu.pas

+ 13 - 2
compiler/ppcgen/aasmcpu.pas

@@ -504,8 +504,17 @@ uses cutils, cclasses;
                   labelpositions.count := tai_label(p).labsym.labelnr * 2;
                   labelpositions.count := tai_label(p).labsym.labelnr * 2;
                 labelpositions[tai_label(p).labsym.labelnr] := pointer(instrpos);
                 labelpositions[tai_label(p).labsym.labelnr] := pointer(instrpos);
               end;
               end;
-            if p.typ = ait_instruction then
-              inc(instrpos);
+            { ait_const is for jump tables }
+            case p.typ of
+              ait_instruction:
+                inc(instrpos);
+              ait_const:
+                begin
+                  if (tai_const(p).consttype<>aitconst_32bit) then
+                    internalerror(2008052101); 
+                  inc(instrpos);
+                end;
+            end;
             p := tai(p.next);
             p := tai(p.next);
           end;
           end;
 
 
@@ -571,6 +580,8 @@ uses cutils, cclasses;
                           end;
                           end;
                     end;
                     end;
                   end;
                   end;
+                ait_const:
+                  inc(instrpos);
               end;
               end;
               p := tai(p.next);
               p := tai(p.next);
             end;
             end;