summaryrefslogtreecommitdiff
path: root/compiler/x86/rax86.pas
diff options
context:
space:
mode:
authornickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2>2019-06-10 15:08:46 +0000
committernickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2>2019-06-10 15:08:46 +0000
commit621a9024bb013289d0488942d3594e5d35c0c89f (patch)
tree145a4238b41187af9ea1f1866f7eef9044589c6e /compiler/x86/rax86.pas
parenta3c118e0455716608fb275e6d8e8e110798feb01 (diff)
downloadfpc-621a9024bb013289d0488942d3594e5d35c0c89f.tar.gz
* prettify the "Use of +offset(%ebp) is not compatible with regcall convention"
and "Use of +offset(%ebp) for parameters invalid here" warning messages by showing the exact register used (bp, ebp or rbp) and using the original asm syntax (Intel: [EBP+offset]; AT&T: +offset(%ebp) ) git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@42207 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/x86/rax86.pas')
-rw-r--r--compiler/x86/rax86.pas33
1 files changed, 30 insertions, 3 deletions
diff --git a/compiler/x86/rax86.pas b/compiler/x86/rax86.pas
index 0bba0909ea..447b19c2f7 100644
--- a/compiler/x86/rax86.pas
+++ b/compiler/x86/rax86.pas
@@ -248,7 +248,8 @@ begin
end;
Function Tx86Operand.CheckOperand: boolean;
-
+var
+ ErrorRefStr: string;
begin
result:=true;
if (opr.typ=OPR_Reference) then
@@ -257,10 +258,36 @@ begin
begin
if (getsupreg(opr.ref.base)=RS_EBP) and (opr.ref.offset>0) then
begin
+ if current_settings.asmmode in [asmmode_i8086_intel,asmmode_i386_intel,asmmode_x86_64_intel] then
+ begin
+ case getsubreg(opr.ref.base) of
+ R_SUBW:
+ ErrorRefStr:='[BP+offset]';
+ R_SUBD:
+ ErrorRefStr:='[EBP+offset]';
+ R_SUBQ:
+ ErrorRefStr:='[RBP+offset]';
+ else
+ internalerror(2019061001);
+ end;
+ end
+ else
+ begin
+ case getsubreg(opr.ref.base) of
+ R_SUBW:
+ ErrorRefStr:='+offset(%bp)';
+ R_SUBD:
+ ErrorRefStr:='+offset(%ebp)';
+ R_SUBQ:
+ ErrorRefStr:='+offset(%rbp)';
+ else
+ internalerror(2019061002);
+ end;
+ end;
if current_procinfo.procdef.proccalloption=pocall_register then
- message(asmr_w_no_direct_ebp_for_parameter)
+ message1(asmr_w_no_direct_ebp_for_parameter,ErrorRefStr)
else
- message(asmr_w_direct_ebp_for_parameter_regcall);
+ message1(asmr_w_direct_ebp_for_parameter_regcall,ErrorRefStr);
end
else if (getsupreg(opr.ref.base)=RS_EBP) and (opr.ref.offset<0) then
message(asmr_w_direct_ebp_neg_offset)