diff options
author | nickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2019-06-10 15:08:46 +0000 |
---|---|---|
committer | nickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2019-06-10 15:08:46 +0000 |
commit | 621a9024bb013289d0488942d3594e5d35c0c89f (patch) | |
tree | 145a4238b41187af9ea1f1866f7eef9044589c6e /compiler/x86/rax86.pas | |
parent | a3c118e0455716608fb275e6d8e8e110798feb01 (diff) | |
download | fpc-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.pas | 33 |
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) |