Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/coreclr/inc/cfi.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ struct CFI_CODE
{
unsigned char CodeOffset;// Offset from the start of code the frame covers.
unsigned char CfiOpCode;
short DwarfReg; // Dwarf register number. 0~32 for x64.
short DwarfReg; // Dwarf register number.
int Offset;
CFI_CODE(unsigned char codeOffset, unsigned char cfiOpcode,
short dwarfReg, int offset)
Expand Down
31 changes: 27 additions & 4 deletions src/coreclr/jit/unwind.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -165,17 +165,40 @@ void Compiler::unwindPushPopCFI(regNumber reg)
}

//------------------------------------------------------------------------
// Compiler::unwindPush2Pop2CFI: Record push/save of 2 registers simultaneously.
// Compiler::unwindPush2Pop2CFI: Record push/save of 2 registers simultaneously.
//
// Arguments:
// reg1 - The first register being pushed/saved.
// reg2 - The second register being pushed/saved.
//
void Compiler::unwindPush2Pop2CFI(regNumber reg1, regNumber reg2)
{
// ToDo: This is a placeholder till OS has unwind support for push2/pop2.
unwindPushPopCFI(reg1);
unwindPushPopCFI(reg2);
assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog());

FuncInfoDsc* func = funCurrentFunc();
UNATIVE_OFFSET cbProlog = unwindGetCurrentOffset(func);

regMaskTP relOffsetMask = RBM_CALLEE_SAVED
#if defined(UNIX_AMD64_ABI) && ETW_EBP_FRAMED
// In case of ETW_EBP_FRAMED defined the REG_FPBASE (RBP)
// is excluded from the callee-save register list.
// Make sure the register gets PUSH unwind info in this case,
// since it is pushed as a frame register.
| RBM_FPBASE
#endif
;

createCfiCode(func, cbProlog, CFI_ADJUST_CFA_OFFSET, DWARF_REG_ILLEGAL, 2 * REGSIZE_BYTES);

if (relOffsetMask & genRegMask(reg1))
{
createCfiCode(func, cbProlog, CFI_REL_OFFSET, mapRegNumToDwarfReg(reg1), REGSIZE_BYTES);
}

if (relOffsetMask & genRegMask(reg2))
{
createCfiCode(func, cbProlog, CFI_REL_OFFSET, mapRegNumToDwarfReg(reg2), 0);
}
}

typedef jitstd::vector<CFI_CODE> CFICodeVector;
Expand Down
32 changes: 16 additions & 16 deletions src/coreclr/jit/unwindamd64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,52 +72,52 @@ short Compiler::mapRegNumToDwarfReg(regNumber reg)
dwarfReg = 15;
break;
case REG_R16:
dwarfReg = 16;
dwarfReg = 130;
break;
case REG_R17:
dwarfReg = 17;
dwarfReg = 131;
break;
case REG_R18:
dwarfReg = 18;
dwarfReg = 132;
break;
case REG_R19:
dwarfReg = 19;
dwarfReg = 133;
break;
case REG_R20:
dwarfReg = 20;
dwarfReg = 134;
break;
case REG_R21:
dwarfReg = 21;
dwarfReg = 135;
break;
case REG_R22:
dwarfReg = 22;
dwarfReg = 136;
break;
case REG_R23:
dwarfReg = 23;
dwarfReg = 137;
break;
case REG_R24:
dwarfReg = 24;
dwarfReg = 138;
break;
case REG_R25:
dwarfReg = 25;
dwarfReg = 139;
break;
case REG_R26:
dwarfReg = 26;
dwarfReg = 140;
break;
case REG_R27:
dwarfReg = 27;
dwarfReg = 141;
break;
case REG_R28:
dwarfReg = 28;
dwarfReg = 142;
break;
case REG_R29:
dwarfReg = 29;
dwarfReg = 143;
break;
case REG_R30:
dwarfReg = 30;
dwarfReg = 144;
break;
case REG_R31:
dwarfReg = 31;
dwarfReg = 145;
break;
default:
noway_assert(!"unexpected REG_NUM");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ private static byte[] CfiCodeToInstructions(DwarfCie cie, byte[] blobData)
{
case CFI_OPCODE.CFI_DEF_CFA_REGISTER:
cfiCode[cfiCodeOffset++] = DW_CFA_def_cfa_register;
cfiCode[cfiCodeOffset++] = (byte)dwarfReg;
cfiCodeOffset += DwarfHelper.WriteULEB128(cfiCode.AsSpan(cfiCodeOffset), (uint)dwarfReg);
break;

case CFI_OPCODE.CFI_REL_OFFSET:
Expand Down Expand Up @@ -112,7 +112,7 @@ private static byte[] CfiCodeToInstructions(DwarfCie cie, byte[] blobData)

case CFI_OPCODE.CFI_DEF_CFA:
cfiCode[cfiCodeOffset++] = DW_CFA_def_cfa;
cfiCode[cfiCodeOffset++] = (byte)dwarfReg;
cfiCodeOffset += DwarfHelper.WriteULEB128(cfiCode.AsSpan(cfiCodeOffset), (uint)dwarfReg);
cfaOffset = cfiOffset;
cfiCodeOffset += DwarfHelper.WriteULEB128(cfiCode.AsSpan(cfiCodeOffset), (uint)cfaOffset);
break;
Expand Down
Loading