Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 690517f

Browse files
committed
Merge pull request #468 from LLITCHEV/work
Enable ETW_EBP_FRAMED flag on System V systems.
2 parents 6f77cc5 + 37a11ba commit 690517f

File tree

3 files changed

+178
-103
lines changed

3 files changed

+178
-103
lines changed

src/jit/emitxarch.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -1713,7 +1713,14 @@ UNATIVE_OFFSET emitter::emitInsSizeSV(size_t code, int var, int dsp)
17131713
#endif
17141714
{
17151715
// Dev10 804810 - failing this assert can lead to bad codegen and runtime crashes
1716+
#ifdef UNIX_AMD64_ABI
1717+
LclVarDsc* varDsc = emitComp->lvaTable + var;
1718+
bool isRegPassedArg = varDsc->lvIsParam && varDsc->lvIsRegArg;
1719+
// Register passed args could have a stack offset of 0.
1720+
noway_assert((int)offs < 0 || isRegPassedArg);
1721+
#else // !UNIX_AMD64_ABI
17161722
noway_assert((int)offs < 0);
1723+
#endif // !UNIX_AMD64_ABI
17171724
}
17181725

17191726

src/jit/target.h

+162-102
Original file line numberDiff line numberDiff line change
@@ -667,12 +667,11 @@ typedef unsigned short regPairNoSmall; // arm: need 12 bits
667667
#define FEATURE_EH_FUNCLETS 1
668668
#define FEATURE_EH_CALLFINALLY_THUNKS 1 // Generate call-to-finally code in "thunks" in the enclosing EH region, protected by "cloned finally" clauses.
669669
#define FEATURE_STACK_FP_X87 0
670-
#ifndef UNIX_AMD64_ABI
671-
#define ETW_EBP_FRAMED 0 // if 1 we cannot use EBP as a scratch register and must create EBP based frames for most methods
672-
#else // UNIX_AMD64_ABI
673-
// TODO-Amd64-Unis: Enable Frame Pointer chaining for most methods when uniwinding and the rest is implemented. Set the following to 1.
670+
#ifdef UNIX_AMD64_ABI
671+
#define ETW_EBP_FRAMED 1 // if 1 we cannot use EBP as a scratch register and must create EBP based frames for most methods
672+
#else // !UNIX_AMD64_ABI
674673
#define ETW_EBP_FRAMED 0 // if 1 we cannot use EBP as a scratch register and must create EBP based frames for most methods
675-
#endif // UNIX_AMD64_ABI
674+
#endif // !UNIX_AMD64_ABI
676675
#define FEATURE_FP_REGALLOC 0 // Enabled if RegAlloc is used to enregister Floating Point LclVars
677676
#define CSE_CONSTS 1 // Enable if we want to CSE constants
678677

@@ -695,26 +694,26 @@ typedef unsigned short regPairNoSmall; // arm: need 12 bits
695694
#define STACK_ALIGN 16 // stack alignment requirement
696695
#define STACK_ALIGN_SHIFT 3 // Shift-right amount to convert stack size in bytes to size in pointer sized words
697696

698-
#ifndef UNIX_AMD64_ABI
699-
#if !ETW_EBP_FRAMED
700-
#define RBM_INT_CALLEE_SAVED (RBM_EBX|RBM_ESI|RBM_EDI|RBM_EBP|RBM_R12|RBM_R13|RBM_R14|RBM_R15)
701-
#else // ETW_EBP_FRAMED
702-
#define RBM_INT_CALLEE_SAVED (RBM_EBX|RBM_ESI|RBM_EDI|RBM_R12|RBM_R13|RBM_R14|RBM_R15)
703-
#endif // ETW_EBP_FRAMED
704-
#define RBM_INT_CALLEE_TRASH (RBM_EAX|RBM_ECX|RBM_EDX|RBM_R8|RBM_R9|RBM_R10|RBM_R11)
705-
#define RBM_FLT_CALLEE_SAVED (RBM_XMM6|RBM_XMM7|RBM_XMM8|RBM_XMM9|RBM_XMM10|RBM_XMM11|RBM_XMM12|RBM_XMM13|RBM_XMM14|RBM_XMM15)
706-
#define RBM_FLT_CALLEE_TRASH (RBM_XMM0|RBM_XMM1|RBM_XMM2|RBM_XMM3|RBM_XMM4|RBM_XMM5)
707-
#else // UNIX_AMD64_ABI
708-
#if !ETW_EBP_FRAMED
709-
#define RBM_INT_CALLEE_SAVED (RBM_EBX|RBM_EBP|RBM_R12|RBM_R13|RBM_R14|RBM_R15)
710-
#else // ETW_EBP_FRAMED
697+
#ifdef UNIX_AMD64_ABI
698+
#if ETW_EBP_FRAMED
711699
#define RBM_INT_CALLEE_SAVED (RBM_EBX|RBM_R12|RBM_R13|RBM_R14|RBM_R15)
712-
#endif // ETW_EBP_FRAMED
700+
#else // !ETW_EBP_FRAMED
701+
#define RBM_INT_CALLEE_SAVED (RBM_EBX|RBM_EBP|RBM_R12|RBM_R13|RBM_R14|RBM_R15)
702+
#endif // !ETW_EBP_FRAMED
713703
#define RBM_INT_CALLEE_TRASH (RBM_EAX|RBM_RDI|RBM_RSI|RBM_EDX|RBM_ECX|RBM_R8|RBM_R9|RBM_R10|RBM_R11)
714704
#define RBM_FLT_CALLEE_SAVED (0)
715705
#define RBM_FLT_CALLEE_TRASH (RBM_XMM0|RBM_XMM1|RBM_XMM2|RBM_XMM3|RBM_XMM4|RBM_XMM5|RBM_XMM6|RBM_XMM7| \
716706
RBM_XMM8|RBM_XMM9|RBM_XMM10|RBM_XMM11|RBM_XMM12|RBM_XMM13|RBM_XMM14|RBM_XMM15)
717-
#endif // UNIX_AMD64_ABI
707+
#else // !UNIX_AMD64_ABI
708+
#if ETW_EBP_FRAMED
709+
#define RBM_INT_CALLEE_SAVED (RBM_EBX|RBM_ESI|RBM_EDI|RBM_R12|RBM_R13|RBM_R14|RBM_R15)
710+
#else // ETW_EBP_FRAMED
711+
#define RBM_INT_CALLEE_SAVED (RBM_EBX|RBM_ESI|RBM_EDI|RBM_EBP|RBM_R12|RBM_R13|RBM_R14|RBM_R15)
712+
#endif // ETW_EBP_FRAMED
713+
#define RBM_INT_CALLEE_TRASH (RBM_EAX|RBM_ECX|RBM_EDX|RBM_R8|RBM_R9|RBM_R10|RBM_R11)
714+
#define RBM_FLT_CALLEE_SAVED (RBM_XMM6|RBM_XMM7|RBM_XMM8|RBM_XMM9|RBM_XMM10|RBM_XMM11|RBM_XMM12|RBM_XMM13|RBM_XMM14|RBM_XMM15)
715+
#define RBM_FLT_CALLEE_TRASH (RBM_XMM0|RBM_XMM1|RBM_XMM2|RBM_XMM3|RBM_XMM4|RBM_XMM5)
716+
#endif // !UNIX_AMD64_ABI
718717

719718
#define REG_FLT_CALLEE_SAVED_FIRST REG_XMM6
720719
#define REG_FLT_CALLEE_SAVED_LAST REG_XMM15
@@ -725,74 +724,135 @@ typedef unsigned short regPairNoSmall; // arm: need 12 bits
725724
#define RBM_CALLEE_TRASH_NOGC RBM_CALLEE_TRASH
726725

727726
#define RBM_ALLINT (RBM_INT_CALLEE_SAVED | RBM_INT_CALLEE_TRASH)
728-
#ifndef UNIX_AMD64_ABI
729-
#define RBM_LOWINT (RBM_EAX|RBM_ECX|RBM_EBX|RBM_EBP|RBM_ESI|RBM_EDI)
730-
#else // UNIX_AMD64_ABI
727+
#ifdef UNIX_AMD64_ABI
728+
#if ETW_EBP_FRAMED
729+
#define RBM_LOWINT (RBM_EAX|RBM_RDI|RBM_RSI|RBM_EDX|RBM_ECX|RBM_EBX)
730+
#else // !ETW_EBP_FRAMED
731731
#define RBM_LOWINT (RBM_EAX|RBM_RDI|RBM_RSI|RBM_EDX|RBM_ECX|RBM_EBX|RBM_EBP)
732-
#endif // UNIX_AMD64_ABI
732+
#endif // !ETW_EBP_FRAMED
733+
#else // !UNIX_AMD64_ABI
734+
#if ETW_EBP_FRAMED
735+
#define RBM_LOWINT (RBM_EAX|RBM_ECX|RBM_EBX|RBM_ESI|RBM_EDI)
736+
#else // !ETW_EBP_FRAMED
737+
#define RBM_LOWINT (RBM_EAX|RBM_ECX|RBM_EBX|RBM_EBP|RBM_ESI|RBM_EDI)
738+
#endif // !ETW_EBP_FRAMED
739+
#endif // !UNIX_AMD64_ABI
733740

734741
#if 0
735-
#define REG_VAR_ORDER REG_EAX,REG_EDX,REG_ECX,REG_ESI,REG_EDI,REG_EBX,REG_EBP, \
736-
REG_R8,REG_R9,REG_R10,REG_R11,REG_R14,REG_R15,REG_R12,REG_R13
742+
#if ETW_EBP_FRAMED
743+
#define REG_VAR_ORDER REG_EAX,REG_EDX,REG_ECX,REG_ESI,REG_EDI,REG_EBX, \
744+
REG_R8,REG_R9,REG_R10,REG_R11,REG_R14,REG_R15,REG_R12,REG_R13
745+
#else // !ETW_EBP_FRAMED
746+
#define REG_VAR_ORDER REG_EAX,REG_EDX,REG_ECX,REG_ESI,REG_EDI,REG_EBX,REG_EBP, \
747+
REG_R8,REG_R9,REG_R10,REG_R11,REG_R14,REG_R15,REG_R12,REG_R13
748+
#endif // !ETW_EBP_FRAMED
749+
737750
#else
738751
// TEMPORARY ORDER TO AVOID CALLEE-SAVES
739752
// TODO-CQ: Review this and set appropriately
740-
#ifndef UNIX_AMD64_ABI
741-
#define REG_VAR_ORDER REG_EAX,REG_EDX,REG_ECX, \
742-
REG_R8,REG_R9,REG_R10,REG_R11, \
743-
REG_ESI,REG_EDI,REG_EBX,REG_EBP, \
744-
REG_R14,REG_R15,REG_R12,REG_R13
745-
#else // UNIX_AMD64_ABI
746-
#define REG_VAR_ORDER \
747-
REG_EAX, REG_EDI, REG_ESI, \
748-
REG_EDX, REG_ECX, REG_R8, REG_R9, \
749-
REG_R10, REG_R11, REG_EBX, REG_EBP, \
750-
REG_R14, REG_R15, REG_R12, REG_R13
751-
#endif // UNIX_AMD64_ABI
753+
#ifdef UNIX_AMD64_ABI
754+
#if ETW_EBP_FRAMED
755+
#define REG_VAR_ORDER \
756+
REG_EAX,REG_EDI,REG_ESI, \
757+
REG_EDX,REG_ECX,REG_R8,REG_R9, \
758+
REG_R10,REG_R11,REG_EBX, \
759+
REG_R14,REG_R15,REG_R12,REG_R13
760+
#else // !ETW_EBP_FRAMED
761+
#define REG_VAR_ORDER \
762+
REG_EAX,REG_EDI,REG_ESI, \
763+
REG_EDX,REG_ECX,REG_R8,REG_R9, \
764+
REG_R10,REG_R11,REG_EBX,REG_EBP, \
765+
REG_R14,REG_R15,REG_R12,REG_R13
766+
#endif // !ETW_EBP_FRAMED
767+
#else // !UNIX_AMD64_ABI
768+
#if ETW_EBP_FRAMED
769+
#define REG_VAR_ORDER REG_EAX,REG_EDX,REG_ECX, \
770+
REG_R8,REG_R9,REG_R10,REG_R11, \
771+
REG_ESI,REG_EDI,REG_EBX, \
772+
REG_R14,REG_R15,REG_R12,REG_R13
773+
#else // !ETW_EBP_FRAMED
774+
#define REG_VAR_ORDER REG_EAX,REG_EDX,REG_ECX, \
775+
REG_R8,REG_R9,REG_R10,REG_R11, \
776+
REG_ESI,REG_EDI,REG_EBX,REG_EBP, \
777+
REG_R14,REG_R15,REG_R12,REG_R13
778+
#endif // !ETW_EBP_FRAMED
779+
#endif // !UNIX_AMD64_ABI
752780
#endif
753781

754-
#define REG_VAR_ORDER_FLT REG_XMM0, REG_XMM1, REG_XMM2, REG_XMM3, REG_XMM4, REG_XMM5, REG_XMM6, REG_XMM7, REG_XMM8, REG_XMM9, REG_XMM10, REG_XMM11, REG_XMM12, REG_XMM13, REG_XMM14, REG_XMM15
782+
#define REG_VAR_ORDER_FLT REG_XMM0,REG_XMM1,REG_XMM2,REG_XMM3,REG_XMM4,REG_XMM5,REG_XMM6,REG_XMM7,REG_XMM8,REG_XMM9,REG_XMM10,REG_XMM11,REG_XMM12,REG_XMM13,REG_XMM14,REG_XMM15
755783

756-
#define MAX_VAR_ORDER_SIZE 15
784+
#ifdef UNIX_AMD64_ABI
785+
#if ETW_EBP_FRAMED
786+
#define REG_TMP_ORDER REG_EAX,REG_EDI,REG_ESI,REG_EDX,REG_ECX,REG_EBX, \
787+
REG_R8,REG_R9,REG_R10,REG_R11,REG_R14,REG_R15,REG_R12,REG_R13
788+
#else // !ETW_EBP_FRAMED
789+
#define REG_TMP_ORDER REG_EAX,REG_EDI,REG_ESI,REG_EDX,REG_ECX,REG_EBX,REG_EBP, \
790+
REG_R8,REG_R9,REG_R10,REG_R11,REG_R14,REG_R15,REG_R12,REG_R13
791+
#endif // !ETW_EBP_FRAMED
792+
#else // !UNIX_AMD64_ABI
793+
#if ETW_EBP_FRAMED
794+
#define MAX_VAR_ORDER_SIZE 14
795+
#define REG_TMP_ORDER REG_EAX,REG_EDX,REG_ECX,REG_EBX,REG_ESI,REG_EDI, \
796+
REG_R8,REG_R9,REG_R10,REG_R11,REG_R14,REG_R15,REG_R12,REG_R13
797+
#else // !ETW_EBP_FRAMED
798+
#define MAX_VAR_ORDER_SIZE 15
799+
#define REG_TMP_ORDER REG_EAX,REG_EDX,REG_ECX,REG_EBX,REG_ESI,REG_EDI,REG_EBP, \
800+
REG_R8,REG_R9,REG_R10,REG_R11,REG_R14,REG_R15,REG_R12,REG_R13
801+
#endif // !ETW_EBP_FRAMED
802+
#endif // !UNIX_AMD64_ABI
803+
804+
#ifdef UNIX_AMD64_ABI
805+
#if ETW_EBP_FRAMED
806+
#define REG_PREDICT_ORDER REG_EAX,REG_EDI,REG_ESI,REG_EDX,REG_ECX,REG_EBX, \
807+
REG_R8,REG_R9,REG_R10,REG_R11,REG_R14,REG_R15,REG_R12,REG_R13
808+
#define CNT_CALLEE_SAVED (5)
809+
#else // ETW_EBP_FRAMED
810+
#define REG_PREDICT_ORDER REG_EAX,REG_EDI,REG_ESI,REG_EDX,REG_ECX,REG_EBX,REG_EBP, \
811+
REG_R8,REG_R9,REG_R10,REG_R11,REG_R14,REG_R15,REG_R12,REG_R13
812+
#define CNT_CALLEE_SAVED (6)
813+
#endif // ETW_EBP_FRAMED
814+
#define CNT_CALLEE_TRASH (9)
815+
#define CNT_CALLEE_ENREG (CNT_CALLEE_SAVED)
757816

758-
#ifndef UNIX_AMD64_ABI
759-
#define REG_TMP_ORDER REG_EAX,REG_EDX,REG_ECX,REG_EBX,REG_ESI,REG_EDI,REG_EBP, \
760-
REG_R8, REG_R9, REG_R10, REG_R11, REG_R14, REG_R15, REG_R12, REG_R13
761-
#else // UNIX_AMD64_ABI
762-
#define REG_TMP_ORDER REG_EAX,REG_EDI,REG_ESI,REG_EDX,REG_ECX,REG_EBX,REG_EBP, \
763-
REG_R8, REG_R9, REG_R10, REG_R11, REG_R14, REG_R15, REG_R12, REG_R13
764-
#endif // UNIX_AMD64_ABI
817+
#define CNT_CALLEE_SAVED_FLOAT (0)
818+
#define CNT_CALLEE_TRASH_FLOAT (16)
765819

820+
#if ETW_EBP_FRAMED
821+
#define REG_CALLEE_SAVED_ORDER REG_EBX,REG_R12,REG_R13,REG_R14,REG_R15
822+
#define RBM_CALLEE_SAVED_ORDER RBM_EBX,RBM_R12,RBM_R13,RBM_R14,RBM_R15
823+
#else // !ETW_EBP_FRAMED
824+
#define REG_CALLEE_SAVED_ORDER REG_EBX,REG_EBP,REG_R12,REG_R13,REG_R14,REG_R15
825+
#define RBM_CALLEE_SAVED_ORDER RBM_EBX,RBM_EBP,RBM_R12,RBM_R13,RBM_R14,RBM_R15
826+
#endif // !ETW_EBP_FRAMED
827+
#define CALLEE_SAVED_REG_MAXSZ (CNT_CALLEE_SAVED*REGSIZE_BYTES) // RBX, RBP, R12, R13, R14, R15
828+
#else // !UNIX_AMD64_ABI
829+
#if ETW_EBP_FRAMED
830+
#define REG_TMP_ORDER_COUNT 14
831+
#define REG_PREDICT_ORDER REG_EAX,REG_EDX,REG_ECX,REG_EBX,REG_ESI,REG_EDI, \
832+
REG_R8,REG_R9,REG_R10,REG_R11,REG_R14,REG_R15,REG_R12,REG_R13
833+
#define CNT_CALLEE_SAVED (7)
834+
#else // ETW_EBP_FRAMED
766835
#define REG_TMP_ORDER_COUNT 15
767-
#ifndef UNIX_AMD64_ABI
768836
#define REG_PREDICT_ORDER REG_EAX,REG_EDX,REG_ECX,REG_EBX,REG_ESI,REG_EDI,REG_EBP, \
769837
REG_R8,REG_R9,REG_R10,REG_R11,REG_R14,REG_R15,REG_R12,REG_R13
770-
771838
#define CNT_CALLEE_SAVED (8)
839+
#endif // ETW_EBP_FRAMED
840+
772841
#define CNT_CALLEE_TRASH (7)
773842
#define CNT_CALLEE_ENREG (CNT_CALLEE_SAVED)
774843

775844
#define CNT_CALLEE_SAVED_FLOAT (10)
776845
#define CNT_CALLEE_TRASH_FLOAT (6)
777846

847+
#if ETW_EBP_FRAMED
848+
#define REG_CALLEE_SAVED_ORDER REG_EBX,REG_ESI,REG_EDI,REG_R12,REG_R13,REG_R14,REG_R15
849+
#define RBM_CALLEE_SAVED_ORDER RBM_EBX,RBM_ESI,RBM_EDI,RBM_R12,RBM_R13,RBM_R14,RBM_R15
850+
#else // !ETW_EBP_FRAMED
778851
#define REG_CALLEE_SAVED_ORDER REG_EBX,REG_ESI,REG_EDI,REG_EBP,REG_R12,REG_R13,REG_R14,REG_R15
779852
#define RBM_CALLEE_SAVED_ORDER RBM_EBX,RBM_ESI,RBM_EDI,RBM_EBP,RBM_R12,RBM_R13,RBM_R14,RBM_R15
853+
#endif // !ETW_EBP_FRAMED
780854
#define CALLEE_SAVED_REG_MAXSZ (CNT_CALLEE_SAVED*REGSIZE_BYTES) // RBX, RSI, RDI, RBP, R12, R13, R14, R15
781-
#else // UNIX_AMD64_ABI
782-
#define REG_PREDICT_ORDER REG_EAX, REG_EDI, REG_ESI, REG_EDX, REG_ECX, REG_EBX, REG_EBP, \
783-
REG_R8, REG_R9, REG_R10, REG_R11, REG_R14, REG_R15, REG_R12, REG_R13
784-
785-
#define CNT_CALLEE_SAVED (6)
786-
#define CNT_CALLEE_TRASH (9)
787-
#define CNT_CALLEE_ENREG (CNT_CALLEE_SAVED)
788-
789-
#define CNT_CALLEE_SAVED_FLOAT (0)
790-
#define CNT_CALLEE_TRASH_FLOAT (16)
791-
792-
#define REG_CALLEE_SAVED_ORDER REG_EBX,REG_EBP,REG_R12,REG_R13,REG_R14,REG_R15
793-
#define RBM_CALLEE_SAVED_ORDER RBM_EBX,RBM_EBP,RBM_R12,RBM_R13,RBM_R14,RBM_R15
794-
#define CALLEE_SAVED_REG_MAXSZ (CNT_CALLEE_SAVED*REGSIZE_BYTES) // RBX, RBP, R12, R13, R14, R15
795-
#endif // UNIX_AMD64_ABI
855+
#endif // !UNIX_AMD64_ABI
796856

797857
#define CALLEE_SAVED_FLOAT_MAXSZ (CNT_CALLEE_SAVED_FLOAT*16)
798858

@@ -808,13 +868,13 @@ typedef unsigned short regPairNoSmall; // arm: need 12 bits
808868
#define RBM_TMP_0 RBM_EAX
809869

810870
// This is the second register in REG_TMP_ORDER
811-
#ifndef UNIX_AMD64_ABI
812-
#define REG_TMP_1 REG_EDX
813-
#define RBM_TMP_1 RBM_EDX
814-
#else // UNIX_AMD64_ABI
871+
#ifdef UNIX_AMD64_ABI
815872
#define REG_TMP_1 REG_EDI
816873
#define RBM_TMP_1 RBM_EDI
817-
#endif // UNIX_AMD64_ABI
874+
#else // !UNIX_AMD64_ABI
875+
#define REG_TMP_1 REG_EDX
876+
#define RBM_TMP_1 RBM_EDX
877+
#endif // !UNIX_AMD64_ABI
818878
#define REG_PAIR_TMP REG_PAIR_EAXEDX
819879
#define RBM_PAIR_TMP (RBM_EAX|RBM_EDX)
820880
#define REG_PAIR_TMP_LO REG_EAX
@@ -834,13 +894,13 @@ typedef unsigned short regPairNoSmall; // arm: need 12 bits
834894
#define RBM_SCRATCH RBM_EAX
835895

836896
// Where is the exception object on entry to the handler block?
837-
#ifndef UNIX_AMD64_ABI
838-
#define REG_EXCEPTION_OBJECT REG_EDX
839-
#define RBM_EXCEPTION_OBJECT RBM_EDX
840-
#else
897+
#ifdef UNIX_AMD64_ABI
841898
#define REG_EXCEPTION_OBJECT REG_ESI
842899
#define RBM_EXCEPTION_OBJECT RBM_ESI
843-
#endif // UNIX_AMD64_ABI
900+
#else // !UNIX_AMD64_ABI
901+
#define REG_EXCEPTION_OBJECT REG_EDX
902+
#define RBM_EXCEPTION_OBJECT RBM_EDX
903+
#endif // !UNIX_AMD64_ABI
844904

845905
#define REG_JUMP_THUNK_PARAM REG_EAX
846906
#define RBM_JUMP_THUNK_PARAM RBM_EAX
@@ -924,28 +984,7 @@ typedef unsigned short regPairNoSmall; // arm: need 12 bits
924984

925985
#define FIRST_ARG_STACK_OFFS (REGSIZE_BYTES) // return address
926986

927-
#ifndef UNIX_AMD64_ABI
928-
#define MAX_REG_ARG 4
929-
#define MAX_FLOAT_REG_ARG 4
930-
#define REG_ARG_FIRST REG_ECX
931-
#define REG_ARG_LAST REG_R9
932-
#define INIT_ARG_STACK_SLOT 4 // 4 outgoing reserved stack slots
933-
934-
#define REG_ARG_0 REG_ECX
935-
#define REG_ARG_1 REG_EDX
936-
#define REG_ARG_2 REG_R8
937-
#define REG_ARG_3 REG_R9
938-
939-
SELECTANY const regNumber intArgRegs [] = {REG_ECX, REG_EDX, REG_R8, REG_R9};
940-
SELECTANY const regMaskTP intArgMasks[] = {RBM_ECX, RBM_EDX, RBM_R8, RBM_R9};
941-
SELECTANY const regNumber fltArgRegs [] = {REG_XMM0, REG_XMM1, REG_XMM2, REG_XMM3};
942-
SELECTANY const regMaskTP fltArgMasks[] = {RBM_XMM0, RBM_XMM1, RBM_XMM2, RBM_XMM3};
943-
944-
#define RBM_ARG_0 RBM_ECX
945-
#define RBM_ARG_1 RBM_EDX
946-
#define RBM_ARG_2 RBM_R8
947-
#define RBM_ARG_3 RBM_R9
948-
#else // UNIX_AMD64_ABI
987+
#ifdef UNIX_AMD64_ABI
949988
#define MAX_REG_ARG 6
950989
#define MAX_FLOAT_REG_ARG 8
951990
#define REG_ARG_FIRST REG_EDI
@@ -970,7 +1009,28 @@ typedef unsigned short regPairNoSmall; // arm: need 12 bits
9701009
#define RBM_ARG_3 RBM_ECX
9711010
#define RBM_ARG_4 RBM_R8
9721011
#define RBM_ARG_5 RBM_R9
973-
#endif // UNIX_AMD64_ABI
1012+
#else // !UNIX_AMD64_ABI
1013+
#define MAX_REG_ARG 4
1014+
#define MAX_FLOAT_REG_ARG 4
1015+
#define REG_ARG_FIRST REG_ECX
1016+
#define REG_ARG_LAST REG_R9
1017+
#define INIT_ARG_STACK_SLOT 4 // 4 outgoing reserved stack slots
1018+
1019+
#define REG_ARG_0 REG_ECX
1020+
#define REG_ARG_1 REG_EDX
1021+
#define REG_ARG_2 REG_R8
1022+
#define REG_ARG_3 REG_R9
1023+
1024+
SELECTANY const regNumber intArgRegs[] = { REG_ECX, REG_EDX, REG_R8, REG_R9 };
1025+
SELECTANY const regMaskTP intArgMasks[] = { RBM_ECX, RBM_EDX, RBM_R8, RBM_R9 };
1026+
SELECTANY const regNumber fltArgRegs[] = { REG_XMM0, REG_XMM1, REG_XMM2, REG_XMM3 };
1027+
SELECTANY const regMaskTP fltArgMasks[] = { RBM_XMM0, RBM_XMM1, RBM_XMM2, RBM_XMM3 };
1028+
1029+
#define RBM_ARG_0 RBM_ECX
1030+
#define RBM_ARG_1 RBM_EDX
1031+
#define RBM_ARG_2 RBM_R8
1032+
#define RBM_ARG_3 RBM_R9
1033+
#endif // !UNIX_AMD64_ABI
9741034

9751035
#define REG_FLTARG_0 REG_XMM0
9761036
#define REG_FLTARG_1 REG_XMM1
@@ -982,10 +1042,7 @@ typedef unsigned short regPairNoSmall; // arm: need 12 bits
9821042
#define RBM_FLTARG_2 RBM_XMM2
9831043
#define RBM_FLTARG_3 RBM_XMM3
9841044

985-
#ifndef UNIX_AMD64_ABI
986-
#define RBM_ARG_REGS (RBM_ARG_0|RBM_ARG_1|RBM_ARG_2|RBM_ARG_3)
987-
#define RBM_FLTARG_REGS (RBM_FLTARG_0|RBM_FLTARG_1|RBM_FLTARG_2|RBM_FLTARG_3)
988-
#else // UNIX_AMD64_ABI
1045+
#ifdef UNIX_AMD64_ABI
9891046
#define REG_FLTARG_4 REG_XMM4
9901047
#define REG_FLTARG_5 REG_XMM5
9911048
#define REG_FLTARG_6 REG_XMM6
@@ -998,7 +1055,10 @@ typedef unsigned short regPairNoSmall; // arm: need 12 bits
9981055

9991056
#define RBM_ARG_REGS (RBM_ARG_0|RBM_ARG_1|RBM_ARG_2|RBM_ARG_3|RBM_ARG_4|RBM_ARG_5)
10001057
#define RBM_FLTARG_REGS (RBM_FLTARG_0|RBM_FLTARG_1|RBM_FLTARG_2|RBM_FLTARG_3|RBM_FLTARG_4|RBM_FLTARG_5|RBM_FLTARG_6|RBM_FLTARG_7)
1001-
#endif // UNIX_AMD64_ABI
1058+
#else // !UNIX_AMD64_ABI
1059+
#define RBM_ARG_REGS (RBM_ARG_0|RBM_ARG_1|RBM_ARG_2|RBM_ARG_3)
1060+
#define RBM_FLTARG_REGS (RBM_FLTARG_0|RBM_FLTARG_1|RBM_FLTARG_2|RBM_FLTARG_3)
1061+
#endif // !UNIX_AMD64_ABI
10021062

10031063
// The registers trashed by profiler enter/leave/tailcall hook
10041064
// See vm\amd64\amshelpers.asm for more details.

src/jit/unwindamd64.cpp

+9-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,15 @@ void Compiler::unwindPush(regNumber reg)
121121
unsigned int cbProlog = unwindGetCurrentOffset(func);
122122
noway_assert((BYTE)cbProlog == cbProlog);
123123
code->CodeOffset = (BYTE)cbProlog;
124-
if (RBM_CALLEE_SAVED & genRegMask(reg))
124+
if ((RBM_CALLEE_SAVED & genRegMask(reg))
125+
#if ETW_EBP_FRAMED
126+
// In case of ETW_EBP_FRAMED defined the REG_FPBASE (RBP)
127+
// is excluded from the callee-save register list.
128+
// Make sure the register gets PUSH unwind info in this case,
129+
// since it is pushed as a frame register.
130+
|| (reg == REG_FPBASE)
131+
#endif // ETW_EBP_FRAMED
132+
)
125133
{
126134
code->UnwindOp = UWOP_PUSH_NONVOL;
127135
code->OpInfo = (BYTE)reg;

0 commit comments

Comments
 (0)