Преглед на файлове

* x86 AT&T writer: never ever drop "@GOTPCREL" relocation, because it results in corrupted code (at least, "mov foo@GOTPCREL(%rip),%reg" must change to "lea foo(%rip),%reg" to remain equivalent, but this must be handled elsewhere anyway. Assembler writer should just write generated code as is).
* Added internal errors on some impossible types of references.

git-svn-id: trunk@29506 -

sergei преди 10 години
родител
ревизия
d24382e8f8
променени са 1 файла, в които са добавени 10 реда и са изтрити 9 реда
  1. 10 9
      compiler/x86/agx86att.pas

+ 10 - 9
compiler/x86/agx86att.pas

@@ -163,18 +163,19 @@ interface
            if assigned(relsymbol) then
              owner.AsmWrite('-'+relsymbol.name);
            if ref.refaddr=addr_pic then
-{$ifdef x86_64}
              begin
-               { local symbols don't have to (and in case of Mac OS X: cannot)
-                 be accessed via the GOT
-               }
-               if not assigned(ref.symbol) or
-                  (ref.symbol.bind<>AB_LOCAL) then
-                 owner.AsmWrite('@GOTPCREL');
-             end;
+               { @GOT and @GOTPCREL references are only allowed for symbol alone,
+                 indexing, relsymbol or offset cannot be present. }
+               if assigned(relsymbol) or (offset<>0) or (index<>NR_NO) then
+                 InternalError(2015011801);
+{$ifdef x86_64}
+               if (base<>NR_RIP) then
+                 InternalError(2015011802);
+               owner.AsmWrite('@GOTPCREL');
 {$else x86_64}
-             owner.AsmWrite('@GOT');
+               owner.AsmWrite('@GOT');
 {$endif x86_64}
+             end;
            if offset<0 then
              owner.AsmWrite(tostr(offset))
            else