forked from OSchip/llvm-project
[CodeGen] Move printing MO_CFIIndex operands to MachineOperand::print
Work towards the unification of MIR and debug output by refactoring the interfaces. Before this patch we printed "<call frame instruction>" in the debug output. llvm-svn: 321084
This commit is contained in:
parent
6f648df1b9
commit
874ae6faa5
|
@ -692,6 +692,27 @@ The syntax is:
|
|||
|
||||
EH_LABEL <mcsymbol Ltmp1>
|
||||
|
||||
CFIIndex Operands
|
||||
^^^^^^^^^^^^^^^^^
|
||||
|
||||
A CFI Index operand is holding an index into a per-function side-table,
|
||||
``MachineFunction::getFrameInstructions()``, which references all the frame
|
||||
instructions in a ``MachineFunction``. A ``CFI_INSTRUCTION`` may look like it
|
||||
contains multiple operands, but the only operand it contains is the CFI Index.
|
||||
The other operands are tracked by the ``MCCFIInstruction`` object.
|
||||
|
||||
The syntax is:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
CFI_INSTRUCTION offset %w30, -16
|
||||
|
||||
which may be emitted later in the MC layer as:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
.cfi_offset w30, -16
|
||||
|
||||
.. TODO: Describe the parsers default behaviour when optional YAML attributes
|
||||
are missing.
|
||||
.. TODO: Describe the syntax for the bundled instructions.
|
||||
|
@ -702,7 +723,6 @@ The syntax is:
|
|||
.. TODO: Describe the syntax of the stack object machine operands and their
|
||||
YAML definitions.
|
||||
.. TODO: Describe the syntax of the block address machine operands.
|
||||
.. TODO: Describe the syntax of the CFI index machine operands.
|
||||
.. TODO: Describe the syntax of the metadata machine operands, and the
|
||||
instructions debug location attribute.
|
||||
.. TODO: Describe the syntax of the register live out machine operands.
|
||||
|
|
|
@ -29,6 +29,7 @@ class GlobalValue;
|
|||
class MachineBasicBlock;
|
||||
class MachineInstr;
|
||||
class MachineRegisterInfo;
|
||||
class MCCFIInstruction;
|
||||
class MDNode;
|
||||
class ModuleSlotTracker;
|
||||
class TargetMachine;
|
||||
|
|
|
@ -795,7 +795,8 @@ void MIPrinter::print(const MachineInstr &MI, unsigned OpIdx,
|
|||
case MachineOperand::MO_GlobalAddress:
|
||||
case MachineOperand::MO_RegisterLiveOut:
|
||||
case MachineOperand::MO_Metadata:
|
||||
case MachineOperand::MO_MCSymbol: {
|
||||
case MachineOperand::MO_MCSymbol:
|
||||
case MachineOperand::MO_CFIIndex: {
|
||||
unsigned TiedOperandIdx = 0;
|
||||
if (ShouldPrintRegisterTies && Op.isReg() && Op.isTied() && !Op.isDef())
|
||||
TiedOperandIdx = Op.getParent()->findTiedOperandIdx(OpIdx);
|
||||
|
@ -827,11 +828,6 @@ void MIPrinter::print(const MachineInstr &MI, unsigned OpIdx,
|
|||
printCustomRegMask(Op.getRegMask(), OS, TRI);
|
||||
break;
|
||||
}
|
||||
case MachineOperand::MO_CFIIndex: {
|
||||
const MachineFunction &MF = *Op.getParent()->getMF();
|
||||
print(MF.getFrameInstructions()[Op.getCFIIndex()], TRI);
|
||||
break;
|
||||
}
|
||||
case MachineOperand::MO_IntrinsicID: {
|
||||
Intrinsic::ID ID = Op.getIntrinsicID();
|
||||
if (ID < Intrinsic::num_intrinsics)
|
||||
|
@ -978,118 +974,6 @@ void MIPrinter::printSyncScope(const LLVMContext &Context, SyncScope::ID SSID) {
|
|||
}
|
||||
}
|
||||
|
||||
static void printCFIRegister(unsigned DwarfReg, raw_ostream &OS,
|
||||
const TargetRegisterInfo *TRI) {
|
||||
int Reg = TRI->getLLVMRegNum(DwarfReg, true);
|
||||
if (Reg == -1) {
|
||||
OS << "<badreg>";
|
||||
return;
|
||||
}
|
||||
OS << printReg(Reg, TRI);
|
||||
}
|
||||
|
||||
void MIPrinter::print(const MCCFIInstruction &CFI,
|
||||
const TargetRegisterInfo *TRI) {
|
||||
switch (CFI.getOperation()) {
|
||||
case MCCFIInstruction::OpSameValue:
|
||||
OS << "same_value ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
printCFIRegister(CFI.getRegister(), OS, TRI);
|
||||
break;
|
||||
case MCCFIInstruction::OpRememberState:
|
||||
OS << "remember_state ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
break;
|
||||
case MCCFIInstruction::OpRestoreState:
|
||||
OS << "restore_state ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
break;
|
||||
case MCCFIInstruction::OpOffset:
|
||||
OS << "offset ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
printCFIRegister(CFI.getRegister(), OS, TRI);
|
||||
OS << ", " << CFI.getOffset();
|
||||
break;
|
||||
case MCCFIInstruction::OpDefCfaRegister:
|
||||
OS << "def_cfa_register ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
printCFIRegister(CFI.getRegister(), OS, TRI);
|
||||
break;
|
||||
case MCCFIInstruction::OpDefCfaOffset:
|
||||
OS << "def_cfa_offset ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
OS << CFI.getOffset();
|
||||
break;
|
||||
case MCCFIInstruction::OpDefCfa:
|
||||
OS << "def_cfa ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
printCFIRegister(CFI.getRegister(), OS, TRI);
|
||||
OS << ", " << CFI.getOffset();
|
||||
break;
|
||||
case MCCFIInstruction::OpRelOffset:
|
||||
OS << "rel_offset ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
printCFIRegister(CFI.getRegister(), OS, TRI);
|
||||
OS << ", " << CFI.getOffset();
|
||||
break;
|
||||
case MCCFIInstruction::OpAdjustCfaOffset:
|
||||
OS << "adjust_cfa_offset ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
OS << CFI.getOffset();
|
||||
break;
|
||||
case MCCFIInstruction::OpRestore:
|
||||
OS << "restore ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
printCFIRegister(CFI.getRegister(), OS, TRI);
|
||||
break;
|
||||
case MCCFIInstruction::OpEscape: {
|
||||
OS << "escape ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
if (!CFI.getValues().empty()) {
|
||||
size_t e = CFI.getValues().size() - 1;
|
||||
for (size_t i = 0; i < e; ++i)
|
||||
OS << format("0x%02x", uint8_t(CFI.getValues()[i])) << ", ";
|
||||
OS << format("0x%02x", uint8_t(CFI.getValues()[e])) << ", ";
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MCCFIInstruction::OpUndefined:
|
||||
OS << "undefined ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
printCFIRegister(CFI.getRegister(), OS, TRI);
|
||||
break;
|
||||
case MCCFIInstruction::OpRegister:
|
||||
OS << "register ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
printCFIRegister(CFI.getRegister(), OS, TRI);
|
||||
OS << ", ";
|
||||
printCFIRegister(CFI.getRegister2(), OS, TRI);
|
||||
break;
|
||||
case MCCFIInstruction::OpWindowSave:
|
||||
OS << "window_save ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
break;
|
||||
default:
|
||||
// TODO: Print the other CFI Operations.
|
||||
OS << "<unserializable cfi operation>";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void llvm::printMIR(raw_ostream &OS, const Module &M) {
|
||||
yaml::Output Out(OS);
|
||||
Out << const_cast<Module &>(M);
|
||||
|
|
|
@ -412,6 +412,21 @@ static const char *getTargetFlagName(const TargetInstrInfo *TII, unsigned TF) {
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
static void printCFIRegister(unsigned DwarfReg, raw_ostream &OS,
|
||||
const TargetRegisterInfo *TRI) {
|
||||
if (!TRI) {
|
||||
OS << "%dwarfreg." << DwarfReg;
|
||||
return;
|
||||
}
|
||||
|
||||
int Reg = TRI->getLLVMRegNum(DwarfReg, true);
|
||||
if (Reg == -1) {
|
||||
OS << "<badreg>";
|
||||
return;
|
||||
}
|
||||
OS << printReg(Reg, TRI);
|
||||
}
|
||||
|
||||
void MachineOperand::printSubregIdx(raw_ostream &OS, uint64_t Index,
|
||||
const TargetRegisterInfo *TRI) {
|
||||
OS << "%subreg.";
|
||||
|
@ -490,6 +505,108 @@ void MachineOperand::printStackObjectReference(raw_ostream &OS,
|
|||
OS << '.' << Name;
|
||||
}
|
||||
|
||||
static void printCFI(raw_ostream &OS, const MCCFIInstruction &CFI,
|
||||
const TargetRegisterInfo *TRI) {
|
||||
switch (CFI.getOperation()) {
|
||||
case MCCFIInstruction::OpSameValue:
|
||||
OS << "same_value ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
printCFIRegister(CFI.getRegister(), OS, TRI);
|
||||
break;
|
||||
case MCCFIInstruction::OpRememberState:
|
||||
OS << "remember_state ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
break;
|
||||
case MCCFIInstruction::OpRestoreState:
|
||||
OS << "restore_state ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
break;
|
||||
case MCCFIInstruction::OpOffset:
|
||||
OS << "offset ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
printCFIRegister(CFI.getRegister(), OS, TRI);
|
||||
OS << ", " << CFI.getOffset();
|
||||
break;
|
||||
case MCCFIInstruction::OpDefCfaRegister:
|
||||
OS << "def_cfa_register ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
printCFIRegister(CFI.getRegister(), OS, TRI);
|
||||
break;
|
||||
case MCCFIInstruction::OpDefCfaOffset:
|
||||
OS << "def_cfa_offset ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
OS << CFI.getOffset();
|
||||
break;
|
||||
case MCCFIInstruction::OpDefCfa:
|
||||
OS << "def_cfa ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
printCFIRegister(CFI.getRegister(), OS, TRI);
|
||||
OS << ", " << CFI.getOffset();
|
||||
break;
|
||||
case MCCFIInstruction::OpRelOffset:
|
||||
OS << "rel_offset ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
printCFIRegister(CFI.getRegister(), OS, TRI);
|
||||
OS << ", " << CFI.getOffset();
|
||||
break;
|
||||
case MCCFIInstruction::OpAdjustCfaOffset:
|
||||
OS << "adjust_cfa_offset ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
OS << CFI.getOffset();
|
||||
break;
|
||||
case MCCFIInstruction::OpRestore:
|
||||
OS << "restore ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
printCFIRegister(CFI.getRegister(), OS, TRI);
|
||||
break;
|
||||
case MCCFIInstruction::OpEscape: {
|
||||
OS << "escape ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
if (!CFI.getValues().empty()) {
|
||||
size_t e = CFI.getValues().size() - 1;
|
||||
for (size_t i = 0; i < e; ++i)
|
||||
OS << format("0x%02x", uint8_t(CFI.getValues()[i])) << ", ";
|
||||
OS << format("0x%02x", uint8_t(CFI.getValues()[e])) << ", ";
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MCCFIInstruction::OpUndefined:
|
||||
OS << "undefined ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
printCFIRegister(CFI.getRegister(), OS, TRI);
|
||||
break;
|
||||
case MCCFIInstruction::OpRegister:
|
||||
OS << "register ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
printCFIRegister(CFI.getRegister(), OS, TRI);
|
||||
OS << ", ";
|
||||
printCFIRegister(CFI.getRegister2(), OS, TRI);
|
||||
break;
|
||||
case MCCFIInstruction::OpWindowSave:
|
||||
OS << "window_save ";
|
||||
if (MCSymbol *Label = CFI.getLabel())
|
||||
MachineOperand::printSymbol(OS, *Label);
|
||||
break;
|
||||
default:
|
||||
// TODO: Print the other CFI Operations.
|
||||
OS << "<unserializable cfi directive>";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void MachineOperand::print(raw_ostream &OS, const TargetRegisterInfo *TRI,
|
||||
const TargetIntrinsicInfo *IntrinsicInfo) const {
|
||||
tryToGetTargetInfo(*this, TRI, IntrinsicInfo);
|
||||
|
@ -693,9 +810,13 @@ void MachineOperand::print(raw_ostream &OS, ModuleSlotTracker &MST,
|
|||
case MachineOperand::MO_MCSymbol:
|
||||
printSymbol(OS, *getMCSymbol());
|
||||
break;
|
||||
case MachineOperand::MO_CFIIndex:
|
||||
OS << "<call frame instruction>";
|
||||
case MachineOperand::MO_CFIIndex: {
|
||||
if (const MachineFunction *MF = getMFIfAvailable(*this))
|
||||
printCFI(OS, MF->getFrameInstructions()[getCFIIndex()], TRI);
|
||||
else
|
||||
OS << "<cfi directive>";
|
||||
break;
|
||||
}
|
||||
case MachineOperand::MO_IntrinsicID: {
|
||||
Intrinsic::ID ID = getIntrinsicID();
|
||||
if (ID < Intrinsic::num_intrinsics)
|
||||
|
|
|
@ -336,4 +336,21 @@ TEST(MachineOperandTest, PrintMCSymbol) {
|
|||
ASSERT_TRUE(OS.str() == "<mcsymbol foo>");
|
||||
}
|
||||
|
||||
TEST(MachineOperandTest, PrintCFI) {
|
||||
// Create a MachineOperand with a CFI index but no function and print it.
|
||||
MachineOperand MO = MachineOperand::CreateCFIIndex(8);
|
||||
|
||||
// Checking some preconditions on the newly created
|
||||
// MachineOperand.
|
||||
ASSERT_TRUE(MO.isCFIIndex());
|
||||
ASSERT_TRUE(MO.getCFIIndex() == 8);
|
||||
|
||||
std::string str;
|
||||
// Print a MachineOperand containing a CFI Index node but no machine function
|
||||
// attached to it.
|
||||
raw_string_ostream OS(str);
|
||||
MO.print(OS, /*TRI=*/nullptr, /*IntrinsicInfo=*/nullptr);
|
||||
ASSERT_TRUE(OS.str() == "<cfi directive>");
|
||||
}
|
||||
|
||||
} // end namespace
|
||||
|
|
Loading…
Reference in New Issue