@@ -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