Przeglądaj źródła

* handle GOT-relative loads in the assembler reader as reads of
sizeof(pint) bytes (mantis 23109)

git-svn-id: trunk@28789 -

Jonas Maebe 10 lat temu
rodzic
commit
5c8ae259c4
3 zmienionych plików z 19 dodań i 1 usunięć
  1. 1 0
      .gitattributes
  2. 5 1
      compiler/x86/rax86.pas
  3. 13 0
      tests/webtbs/tw23109.pp

+ 1 - 0
.gitattributes

@@ -13923,6 +13923,7 @@ tests/webtbs/tw2300.pp svneol=native#text/plain
 tests/webtbs/tw2305.pp svneol=native#text/plain
 tests/webtbs/tw2305.pp svneol=native#text/plain
 tests/webtbs/tw2306.pp svneol=native#text/plain
 tests/webtbs/tw2306.pp svneol=native#text/plain
 tests/webtbs/tw2307.pp svneol=native#text/plain
 tests/webtbs/tw2307.pp svneol=native#text/plain
+tests/webtbs/tw23109.pp svneol=native#text/plain
 tests/webtbs/tw2311.pp svneol=native#text/plain
 tests/webtbs/tw2311.pp svneol=native#text/plain
 tests/webtbs/tw23130.pp svneol=native#text/pascal
 tests/webtbs/tw23130.pp svneol=native#text/pascal
 tests/webtbs/tw23136.pp svneol=native#text/pascal
 tests/webtbs/tw23136.pp svneol=native#text/pascal

+ 5 - 1
compiler/x86/rax86.pas

@@ -437,7 +437,11 @@ begin
             memopsize := 0;
             memopsize := 0;
             case operands[i].opr.typ of
             case operands[i].opr.typ of
                   OPR_LOCAL: memopsize := operands[i].opr.localvarsize * 8;
                   OPR_LOCAL: memopsize := operands[i].opr.localvarsize * 8;
-              OPR_REFERENCE: memopsize := operands[i].opr.varsize * 8;
+              OPR_REFERENCE:
+                  if operands[i].opr.ref.refaddr = addr_pic then
+                    memopsize := sizeof(pint) * 8
+                  else
+                    memopsize := operands[i].opr.varsize * 8;
             end;
             end;
 
 
             if memopsize = 0 then memopsize := topsize2memsize[tx86operand(operands[i]).opsize];
             if memopsize = 0 then memopsize := topsize2memsize[tx86operand(operands[i]).opsize];

+ 13 - 0
tests/webtbs/tw23109.pp

@@ -0,0 +1,13 @@
+{ %cpu=x86_64}
+{ %opt=-Cg -vew }
+
+var
+  global: boolean;
+begin
+  asm
+    movq global@GOTPCREL(%rip), %rax
+    movb $1, (%rax)
+  end;
+  if not global then
+    halt(1);
+end.