@@ -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,22 @@ 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+   }
3421+ 
34063422  //  write callee save
34073423  if  (CFI.calleeSaveEntry .size () > 0 ) {
34083424    //  set holds any callee save GRF that has been saved already to stack.
0 commit comments