WebAssemblyDebugValueManager.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. //===-- WebAssemblyDebugValueManager.cpp - WebAssembly DebugValue Manager -===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. ///
  9. /// \file
  10. /// This file implements the manager for MachineInstr DebugValues.
  11. ///
  12. //===----------------------------------------------------------------------===//
  13. #include "WebAssemblyDebugValueManager.h"
  14. #include "WebAssembly.h"
  15. #include "WebAssemblyMachineFunctionInfo.h"
  16. #include "llvm/CodeGen/MachineInstr.h"
  17. using namespace llvm;
  18. WebAssemblyDebugValueManager::WebAssemblyDebugValueManager(
  19. MachineInstr *Instr) {
  20. // This code differs from MachineInstr::collectDebugValues in that it scans
  21. // the whole BB, not just contiguous DBG_VALUEs.
  22. if (!Instr->getOperand(0).isReg())
  23. return;
  24. CurrentReg = Instr->getOperand(0).getReg();
  25. MachineBasicBlock::iterator DI = *Instr;
  26. ++DI;
  27. for (MachineBasicBlock::iterator DE = Instr->getParent()->end(); DI != DE;
  28. ++DI) {
  29. if (DI->isDebugValue() &&
  30. DI->hasDebugOperandForReg(Instr->getOperand(0).getReg()))
  31. DbgValues.push_back(&*DI);
  32. }
  33. }
  34. void WebAssemblyDebugValueManager::move(MachineInstr *Insert) {
  35. MachineBasicBlock *MBB = Insert->getParent();
  36. for (MachineInstr *DBI : reverse(DbgValues))
  37. MBB->splice(Insert, DBI->getParent(), DBI);
  38. }
  39. void WebAssemblyDebugValueManager::updateReg(unsigned Reg) {
  40. for (auto *DBI : DbgValues)
  41. for (auto &MO : DBI->getDebugOperandsForReg(CurrentReg))
  42. MO.setReg(Reg);
  43. CurrentReg = Reg;
  44. }
  45. void WebAssemblyDebugValueManager::clone(MachineInstr *Insert,
  46. unsigned NewReg) {
  47. MachineBasicBlock *MBB = Insert->getParent();
  48. MachineFunction *MF = MBB->getParent();
  49. for (MachineInstr *DBI : reverse(DbgValues)) {
  50. MachineInstr *Clone = MF->CloneMachineInstr(DBI);
  51. for (auto &MO : Clone->getDebugOperandsForReg(CurrentReg))
  52. MO.setReg(NewReg);
  53. MBB->insert(Insert, Clone);
  54. }
  55. }
  56. void WebAssemblyDebugValueManager::replaceWithLocal(unsigned LocalId) {
  57. for (auto *DBI : DbgValues) {
  58. auto IndexType = DBI->isIndirectDebugValue()
  59. ? llvm::WebAssembly::TI_LOCAL_INDIRECT
  60. : llvm::WebAssembly::TI_LOCAL;
  61. for (auto &MO : DBI->getDebugOperandsForReg(CurrentReg))
  62. MO.ChangeToTargetIndex(IndexType, LocalId);
  63. }
  64. }