@@ -3268,6 +3268,11 @@ void DwarfDebug::writeFDEStackCall(VISAModule *m) {
3268
3268
}
3269
3269
};
3270
3270
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
+
3271
3276
auto writeSameValue = [](std::vector<uint8_t > &data, uint32_t srcReg) {
3272
3277
write (data, (uint8_t )llvm::dwarf::DW_CFA_same_value);
3273
3278
writeULEB128 (data, srcReg);
@@ -3398,11 +3403,22 @@ void DwarfDebug::writeFDEStackCall(VISAModule *m) {
3398
3403
} else {
3399
3404
if (m->GetType () == VISAModule::ObjectType::KERNEL) {
3400
3405
// 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);
3403
3407
}
3404
3408
}
3405
3409
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
+ }
3421
+
3406
3422
// write callee save
3407
3423
if (CFI.calleeSaveEntry .size () > 0 ) {
3408
3424
// set holds any callee save GRF that has been saved already to stack.
0 commit comments