Skip to content

Commit be74db2

Browse files
annkrsigcbot
authored andcommitted
Emit unwinding rules for CE register value v7
v7: -disable debug-frame-store-ce.cl and selective-function-control-debug-frame.cl. They are expected to pass once emission of CE register value to the stack is enabled.
1 parent 0164a79 commit be74db2

File tree

1 file changed

+20
-2
lines changed

1 file changed

+20
-2
lines changed

IGC/DebugInfo/DwarfDebug.cpp

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3268,6 +3268,11 @@ void DwarfDebug::writeFDEStackCall(VISAModule *m) {
32683268
}
32693269
};
32703270

3271+
auto writeUndefined = [](std::vector<uint8_t> &data, uint32_t srcReg) {
3272+
write(data, (uint8_t)llvm::dwarf::DW_CFA_undefined);
3273+
writeULEB128(data, srcReg);
3274+
};
3275+
32713276
auto writeSameValue = [](std::vector<uint8_t> &data, uint32_t srcReg) {
32723277
write(data, (uint8_t)llvm::dwarf::DW_CFA_same_value);
32733278
writeULEB128(data, srcReg);
@@ -3398,11 +3403,24 @@ void DwarfDebug::writeFDEStackCall(VISAModule *m) {
33983403
} else {
33993404
if (m->GetType() == VISAModule::ObjectType::KERNEL) {
34003405
// set return location to be undefined in top frame
3401-
write(cfaOps[0], (uint8_t)llvm::dwarf::DW_CFA_undefined);
3402-
writeULEB128(cfaOps[0], RegisterNumbering::IP);
3406+
writeUndefined(cfaOps[0], RegisterNumbering::IP);
34033407
}
34043408
}
34053409

3410+
// write channel enable (currently only in -O0)
3411+
if (CFI.CEOffsetFromFPOff != 0xffff) {
3412+
write(cfaOps[CFI.CEStoreIP], (uint8_t)llvm::dwarf::DW_CFA_expression);
3413+
writeULEB128(cfaOps[CFI.CEStoreIP], RegisterNumbering::EMask);
3414+
writeCFAExpr(cfaOps[CFI.CEStoreIP], CFI.CEOffsetFromFPOff);
3415+
3416+
// set EMask to undefined when epilog starts to prevent
3417+
// dereferencing invalid CFA
3418+
writeUndefined(cfaOps[CFI.callerbefp.back().end + MovGenInstSizeInBytes],
3419+
RegisterNumbering::EMask);
3420+
} else {
3421+
writeUndefined(cfaOps[0], RegisterNumbering::EMask);
3422+
}
3423+
34063424
// write callee save
34073425
if (CFI.calleeSaveEntry.size() > 0) {
34083426
// set holds any callee save GRF that has been saved already to stack.

0 commit comments

Comments
 (0)