[CodeGen] Move printing MO_BlockAddress operands to MachineOperand::print

Work towards the unification of MIR and debug output by refactoring the
interfaces.

llvm-svn: 321113
This commit is contained in:
Francis Visoiu Mistrih 2017-12-19 21:47:14 +00:00
parent cb2683d46a
commit f81727d138
3 changed files with 45 additions and 44 deletions

View File

@ -254,6 +254,9 @@ public:
/// Print the offset with explicit +/- signs. /// Print the offset with explicit +/- signs.
static void printOperandOffset(raw_ostream &OS, int64_t Offset); static void printOperandOffset(raw_ostream &OS, int64_t Offset);
/// Print an IRSlotNumber.
static void printIRSlotNumber(raw_ostream &OS, int Slot);
/// Print the MachineOperand to \p os. /// Print the MachineOperand to \p os.
/// Providing a valid \p TRI and \p IntrinsicInfo results in a more /// Providing a valid \p TRI and \p IntrinsicInfo results in a more
/// target-specific printing. If \p TRI and \p IntrinsicInfo are null, the /// target-specific printing. If \p TRI and \p IntrinsicInfo are null, the

View File

@ -157,7 +157,6 @@ public:
void print(const MachineBasicBlock &MBB); void print(const MachineBasicBlock &MBB);
void print(const MachineInstr &MI); void print(const MachineInstr &MI);
void printIRBlockReference(const BasicBlock &BB);
void printIRValueReference(const Value &V); void printIRValueReference(const Value &V);
void printStackObjectReference(int FrameIndex); void printStackObjectReference(int FrameIndex);
void print(const MachineInstr &MI, unsigned OpIdx, void print(const MachineInstr &MI, unsigned OpIdx,
@ -704,32 +703,6 @@ void MIPrinter::print(const MachineInstr &MI) {
} }
} }
static void printIRSlotNumber(raw_ostream &OS, int Slot) {
if (Slot == -1)
OS << "<badref>";
else
OS << Slot;
}
void MIPrinter::printIRBlockReference(const BasicBlock &BB) {
OS << "%ir-block.";
if (BB.hasName()) {
printLLVMNameWithoutPrefix(OS, BB.getName());
return;
}
const Function *F = BB.getParent();
int Slot;
if (F == MST.getCurrentFunction()) {
Slot = MST.getLocalSlot(&BB);
} else {
ModuleSlotTracker CustomMST(F->getParent(),
/*ShouldInitializeAllMetadata=*/false);
CustomMST.incorporateFunction(*F);
Slot = CustomMST.getLocalSlot(&BB);
}
printIRSlotNumber(OS, Slot);
}
void MIPrinter::printIRValueReference(const Value &V) { void MIPrinter::printIRValueReference(const Value &V) {
if (isa<GlobalValue>(V)) { if (isa<GlobalValue>(V)) {
V.printAsOperand(OS, /*PrintType=*/false, MST); V.printAsOperand(OS, /*PrintType=*/false, MST);
@ -747,7 +720,7 @@ void MIPrinter::printIRValueReference(const Value &V) {
printLLVMNameWithoutPrefix(OS, V.getName()); printLLVMNameWithoutPrefix(OS, V.getName());
return; return;
} }
printIRSlotNumber(OS, MST.getLocalSlot(&V)); MachineOperand::printIRSlotNumber(OS, MST.getLocalSlot(&V));
} }
void MIPrinter::printStackObjectReference(int FrameIndex) { void MIPrinter::printStackObjectReference(int FrameIndex) {
@ -786,7 +759,8 @@ void MIPrinter::print(const MachineInstr &MI, unsigned OpIdx,
case MachineOperand::MO_MCSymbol: case MachineOperand::MO_MCSymbol:
case MachineOperand::MO_CFIIndex: case MachineOperand::MO_CFIIndex:
case MachineOperand::MO_IntrinsicID: case MachineOperand::MO_IntrinsicID:
case MachineOperand::MO_Predicate: { case MachineOperand::MO_Predicate:
case MachineOperand::MO_BlockAddress: {
unsigned TiedOperandIdx = 0; unsigned TiedOperandIdx = 0;
if (ShouldPrintRegisterTies && Op.isReg() && Op.isTied() && !Op.isDef()) if (ShouldPrintRegisterTies && Op.isReg() && Op.isTied() && !Op.isDef())
TiedOperandIdx = Op.getParent()->findTiedOperandIdx(OpIdx); TiedOperandIdx = Op.getParent()->findTiedOperandIdx(OpIdx);
@ -798,15 +772,6 @@ void MIPrinter::print(const MachineInstr &MI, unsigned OpIdx,
case MachineOperand::MO_FrameIndex: case MachineOperand::MO_FrameIndex:
printStackObjectReference(Op.getIndex()); printStackObjectReference(Op.getIndex());
break; break;
case MachineOperand::MO_BlockAddress:
OS << "blockaddress(";
Op.getBlockAddress()->getFunction()->printAsOperand(OS, /*PrintType=*/false,
MST);
OS << ", ";
printIRBlockReference(*Op.getBlockAddress()->getBasicBlock());
OS << ')';
MachineOperand::printOperandOffset(Op.getOffset());
break;
case MachineOperand::MO_RegisterMask: { case MachineOperand::MO_RegisterMask: {
auto RegMaskInfo = RegisterMaskIds.find(Op.getRegMask()); auto RegMaskInfo = RegisterMaskIds.find(Op.getRegMask());
if (RegMaskInfo != RegisterMaskIds.end()) if (RegMaskInfo != RegisterMaskIds.end())

View File

@ -417,6 +417,29 @@ static void printCFIRegister(unsigned DwarfReg, raw_ostream &OS,
OS << printReg(Reg, TRI); OS << printReg(Reg, TRI);
} }
static void printIRBlockReference(raw_ostream &OS, const BasicBlock &BB,
ModuleSlotTracker &MST) {
OS << "%ir-block.";
if (BB.hasName()) {
printLLVMNameWithoutPrefix(OS, BB.getName());
return;
}
Optional<int> Slot;
if (const Function *F = BB.getParent()) {
if (F == MST.getCurrentFunction()) {
Slot = MST.getLocalSlot(&BB);
} else if (const Module *M = F->getParent()) {
ModuleSlotTracker CustomMST(M, /*ShouldInitializeAllMetadata=*/false);
CustomMST.incorporateFunction(*F);
Slot = CustomMST.getLocalSlot(&BB);
}
}
if (Slot)
MachineOperand::printIRSlotNumber(OS, *Slot);
else
OS << "<unknown>";
}
void MachineOperand::printSubregIdx(raw_ostream &OS, uint64_t Index, void MachineOperand::printSubregIdx(raw_ostream &OS, uint64_t Index,
const TargetRegisterInfo *TRI) { const TargetRegisterInfo *TRI) {
OS << "%subreg."; OS << "%subreg.";
@ -505,6 +528,13 @@ void MachineOperand::printOperandOffset(raw_ostream &OS, int64_t Offset) {
OS << " + " << Offset; OS << " + " << Offset;
} }
void MachineOperand::printIRSlotNumber(raw_ostream &OS, int Slot) {
if (Slot == -1)
OS << "<badref>";
else
OS << Slot;
}
static void printCFI(raw_ostream &OS, const MCCFIInstruction &CFI, static void printCFI(raw_ostream &OS, const MCCFIInstruction &CFI,
const TargetRegisterInfo *TRI) { const TargetRegisterInfo *TRI) {
switch (CFI.getOperation()) { switch (CFI.getOperation()) {
@ -731,13 +761,16 @@ void MachineOperand::print(raw_ostream &OS, ModuleSlotTracker &MST,
printOperandOffset(OS, getOffset()); printOperandOffset(OS, getOffset());
break; break;
} }
case MachineOperand::MO_BlockAddress: case MachineOperand::MO_BlockAddress: {
OS << '<'; OS << "blockaddress(";
getBlockAddress()->printAsOperand(OS, /*PrintType=*/false, MST); getBlockAddress()->getFunction()->printAsOperand(OS, /*PrintType=*/false,
if (getOffset()) MST);
OS << "+" << getOffset(); OS << ", ";
OS << '>'; printIRBlockReference(OS, *getBlockAddress()->getBasicBlock(), MST);
OS << ')';
MachineOperand::printOperandOffset(OS, getOffset());
break; break;
}
case MachineOperand::MO_RegisterMask: { case MachineOperand::MO_RegisterMask: {
OS << "<regmask"; OS << "<regmask";
if (TRI) { if (TRI) {