mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 16:09:25 +02:00
* Asm readers: allow using procedure symbols in references, resolves #22376.
* rax86int.pas: reject RIP-relative references to locals/parameters. git-svn-id: trunk@29087 -
This commit is contained in:
parent
c53c4702b6
commit
475a9e1617
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -13885,6 +13885,7 @@ tests/webtbs/tw22329.pp svneol=native#text/pascal
|
|||||||
tests/webtbs/tw2233.pp svneol=native#text/plain
|
tests/webtbs/tw2233.pp svneol=native#text/plain
|
||||||
tests/webtbs/tw22331.pp svneol=native#text/plain
|
tests/webtbs/tw22331.pp svneol=native#text/plain
|
||||||
tests/webtbs/tw22344.pp svneol=native#text/plain
|
tests/webtbs/tw22344.pp svneol=native#text/plain
|
||||||
|
tests/webtbs/tw22376.pp svneol=native#text/plain
|
||||||
tests/webtbs/tw2242.pp svneol=native#text/plain
|
tests/webtbs/tw2242.pp svneol=native#text/plain
|
||||||
tests/webtbs/tw22427.pp svneol=native#text/pascal
|
tests/webtbs/tw22427.pp svneol=native#text/pascal
|
||||||
tests/webtbs/tw22428.pp svneol=native#text/pascal
|
tests/webtbs/tw22428.pp svneol=native#text/pascal
|
||||||
|
@ -897,14 +897,20 @@ Begin
|
|||||||
end;
|
end;
|
||||||
procsym :
|
procsym :
|
||||||
begin
|
begin
|
||||||
if opr.typ<>OPR_NONE then
|
|
||||||
Message(asmr_e_invalid_operand_type);
|
|
||||||
if Tprocsym(sym).ProcdefList.Count>1 then
|
if Tprocsym(sym).ProcdefList.Count>1 then
|
||||||
Message(asmr_w_calling_overload_func);
|
Message(asmr_w_calling_overload_func);
|
||||||
l:=opr.ref.offset;
|
case opr.typ of
|
||||||
opr.typ:=OPR_SYMBOL;
|
OPR_REFERENCE:
|
||||||
opr.symbol:=current_asmdata.RefAsmSymbol(tprocdef(tprocsym(sym).ProcdefList[0]).mangledname);
|
opr.ref.symbol:=current_asmdata.RefAsmSymbol(tprocdef(tprocsym(sym).ProcdefList[0]).mangledname);
|
||||||
opr.symofs:=l;
|
OPR_NONE:
|
||||||
|
begin
|
||||||
|
opr.typ:=OPR_SYMBOL;
|
||||||
|
opr.symbol:=current_asmdata.RefAsmSymbol(tprocdef(tprocsym(sym).ProcdefList[0]).mangledname);
|
||||||
|
opr.symofs:=0;
|
||||||
|
end;
|
||||||
|
else
|
||||||
|
Message(asmr_e_invalid_operand_type);
|
||||||
|
end;
|
||||||
hasvar:=true;
|
hasvar:=true;
|
||||||
SetupVar:=TRUE;
|
SetupVar:=TRUE;
|
||||||
Exit;
|
Exit;
|
||||||
|
@ -1420,6 +1420,11 @@ Unit Rax86int;
|
|||||||
begin
|
begin
|
||||||
if (oper.opr.localindexreg<>NR_NO) then
|
if (oper.opr.localindexreg<>NR_NO) then
|
||||||
Message(asmr_e_multiple_index);
|
Message(asmr_e_multiple_index);
|
||||||
|
{$ifdef x86_64}
|
||||||
|
{ Locals/parameters cannot be accessed RIP-relative. Need a dedicated error message here? }
|
||||||
|
if (hreg=NR_RIP) then
|
||||||
|
Message(asmr_e_no_local_or_para_allowed);
|
||||||
|
{$endif x86_64}
|
||||||
oper.opr.localindexreg:=hreg;
|
oper.opr.localindexreg:=hreg;
|
||||||
if scale<>0 then
|
if scale<>0 then
|
||||||
begin
|
begin
|
||||||
|
26
tests/webtbs/tw22376.pp
Normal file
26
tests/webtbs/tw22376.pp
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{ %cpu=i386,x86_64 }
|
||||||
|
{ %opt=-Cg- }
|
||||||
|
{$mode objfpc}
|
||||||
|
{$asmmode intel}
|
||||||
|
|
||||||
|
|
||||||
|
function bar: integer;
|
||||||
|
begin
|
||||||
|
result:=$12345678;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function foo: pointer; assembler; nostackframe;
|
||||||
|
asm
|
||||||
|
{$ifdef x86_64}
|
||||||
|
lea rax,[bar+rip]
|
||||||
|
{$else}
|
||||||
|
lea eax,[bar]
|
||||||
|
{$endif}
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
begin
|
||||||
|
if (foo<>pointer(@bar)) then
|
||||||
|
halt(1);
|
||||||
|
end.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user