using namespace llvm;
-WebAssemblyDebugValueManager::WebAssemblyDebugValueManager(
- MachineInstr *Instr) {
+WebAssemblyDebugValueManager::WebAssemblyDebugValueManager(MachineInstr *Def) {
// This code differs from MachineInstr::collectDebugValues in that it scans
// the whole BB, not just contiguous DBG_VALUEs.
- if (!Instr->getOperand(0).isReg())
+ if (!Def->getOperand(0).isReg())
return;
- CurrentReg = Instr->getOperand(0).getReg();
+ CurrentReg = Def->getOperand(0).getReg();
- MachineBasicBlock::iterator DI = *Instr;
- ++DI;
- for (MachineBasicBlock::iterator DE = Instr->getParent()->end(); DI != DE;
- ++DI) {
- if (DI->isDebugValue() &&
- DI->hasDebugOperandForReg(Instr->getOperand(0).getReg()))
- DbgValues.push_back(&*DI);
+ for (MachineBasicBlock::iterator MI = std::next(Def->getIterator()),
+ ME = Def->getParent()->end();
+ MI != ME; ++MI) {
+ if (MI->isDebugValue() && MI->hasDebugOperandForReg(CurrentReg))
+ DbgValues.push_back(&*MI);
}
}
MBB->splice(Insert, DBI->getParent(), DBI);
}
-void WebAssemblyDebugValueManager::updateReg(unsigned Reg) {
- for (auto *DBI : DbgValues)
- for (auto &MO : DBI->getDebugOperandsForReg(CurrentReg))
- MO.setReg(Reg);
- CurrentReg = Reg;
-}
-
void WebAssemblyDebugValueManager::clone(MachineInstr *Insert,
- unsigned NewReg) {
+ Register NewReg) {
MachineBasicBlock *MBB = Insert->getParent();
MachineFunction *MF = MBB->getParent();
for (MachineInstr *DBI : reverse(DbgValues)) {
}
}
+void WebAssemblyDebugValueManager::updateReg(Register Reg) {
+ for (auto *DBI : DbgValues)
+ for (auto &MO : DBI->getDebugOperandsForReg(CurrentReg))
+ MO.setReg(Reg);
+ CurrentReg = Reg;
+}
+
void WebAssemblyDebugValueManager::replaceWithLocal(unsigned LocalId) {
for (auto *DBI : DbgValues) {
auto IndexType = DBI->isIndirectDebugValue()
/// \file
/// This file contains the declaration of the WebAssembly-specific
/// manager for DebugValues associated with the specific MachineInstr.
+/// This pass currently does not handle DBG_VALUE_LISTs; they are assumed to
+/// have been set to undef in NullifyDebugValueLists pass.
+/// TODO Handle DBG_VALUE_LIST
///
//===----------------------------------------------------------------------===//
#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYDEBUGVALUEMANAGER_H
#include "llvm/ADT/SmallVector.h"
+#include "llvm/CodeGen/Register.h"
namespace llvm {
class MachineInstr;
class WebAssemblyDebugValueManager {
- SmallVector<MachineInstr *, 2> DbgValues;
- unsigned CurrentReg;
+ SmallVector<MachineInstr *, 1> DbgValues;
+ Register CurrentReg;
public:
- WebAssemblyDebugValueManager(MachineInstr *Instr);
+ WebAssemblyDebugValueManager(MachineInstr *Def);
void move(MachineInstr *Insert);
- void updateReg(unsigned Reg);
- void clone(MachineInstr *Insert, unsigned NewReg);
+ void clone(MachineInstr *Insert, Register NewReg);
+ // Update the register for Def and DBG_VALUEs.
+ void updateReg(Register Reg);
+ // Replace the current register in DBG_VALUEs with the given LocalId target
+ // index.
void replaceWithLocal(unsigned LocalId);
};