[clang] [flang] [llvm] [mlir] Make MMIWP not have ownership over MMI + Make MMI Only Use an External MCContext (PR #105541)

Matin Raayai via cfe-commits cfe-commits at lists.llvm.org
Sun Sep 22 11:22:02 PDT 2024


matinraayai wrote:

> > @aeubanks @arsenm after looking into this in more detail, I realized that the `getContext` method of `MMI` is heavily used in the `AsmPrinter` to create symbols. Also not having it makes it harder for the `MMI` to create machine functions using `getOrCreateMachineFunction`.
> 
> The AsmPrinter is just an ordinary ModulePass. The initialization can just set a MMI member?

I agree that separating `MCContext` from `MMI` is not an issue for `AsmPrinter`; But I don't see a way to do that with `MachineModuleInfo::getOrCreateMachineFunction`, besides making it take an explicit `MCContext` argument here:

```c++

MachineFunction &MachineModuleInfo::getOrCreateMachineFunction(Function &F, MCContext &MCCtx) {
  // Shortcut for the common case where a sequence of MachineFunctionPasses
  // all query for the same Function.
  if (LastRequest == &F)
    return *LastResult;

  auto I = MachineFunctions.insert(
      std::make_pair(&F, std::unique_ptr<MachineFunction>()));
  MachineFunction *MF;
  if (I.second) {
    // No pre-existing machine function, create a new one.
    const TargetSubtargetInfo &STI = *TM.getSubtargetImpl(F);
    MF = new MachineFunction(F, TM, STI, MCCtx, NextFnNum++);
    MF->initTargetMachineFunctionInfo(STI);

    // MRI callback for target specific initializations.
    TM.registerMachineRegisterInfoCallback(*MF);

    // Update the set entry.
    I.first->second.reset(MF);
  } else {
    MF = I.first->second.get();
  }

  LastRequest = &F;
  LastResult = MF;
  return *MF;
}
```

Also the constructor for MMI sets the context's object file info here:
```c++
MachineModuleInfo::MachineModuleInfo(const LLVMTargetMachine *TM)
    : TM(*TM), Context(TM->getTargetTriple(), TM->getMCAsmInfo(),
                       TM->getMCRegisterInfo(), TM->getMCSubtargetInfo(),
                       nullptr, &TM->Options.MCOptions, false) {
  Context.setObjectFileInfo(TM->getObjFileLowering());
  initialize();
}
```

Again, for both these cases, it's possible to remove the `MCContext` from `MMI`; However doing so will make it harder to use in my opinion. 




https://github.com/llvm/llvm-project/pull/105541


More information about the cfe-commits mailing list