mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 02:52:53 +02:00
[MCInstPrinter] Pass Address
parameter to MCOI::OPERAND_PCREL typed operands. NFC
Follow-up of D72172 and D72180 This patch passes `uint64_t Address` to print methods of PC-relative operands so that subsequent target specific patches can change `*InstPrinter::print{Operand,PCRelImm,...}` to customize the output. Add MCInstPrinter::PrintBranchImmAsAddress which is set to true by llvm-objdump. ``` // Current llvm-objdump -d output aarch64: 20000: bl #0 ppc: 20000: bl .+4 x86: 20000: callq 0 // Ideal output aarch64: 20000: bl 0x20000 ppc: 20000: bl 0x20004 x86: 20000: callq 0x20005 // GNU objdump -d. The lack of 0x is not ideal because the result cannot be re-assembled aarch64: 20000: bl 20000 ppc: 20000: bl 0x20004 x86: 20000: callq 20005 ``` In `lib/Target/X86/X86GenAsmWriter1.inc` (generated by `llvm-tblgen -gen-asm-writer`): ``` case 12: // CALL64pcrel32, CALLpcrel16, CALLpcrel32, EH_SjLj_Setup, JCXZ, JECXZ, J... - printPCRelImm(MI, 0, O); + printPCRelImm(MI, Address, 0, O); return; ``` Some targets have 2 `printOperand` overloads, one without `Address` and one with `Address`. They should annotate derived `Operand` properly with `let OperandType = "OPERAND_PCREL"`. Reviewed By: jhenderson Differential Revision: https://reviews.llvm.org/D76574
This commit is contained in:
parent
bee7db5b02
commit
7f7bfe12ea
@ -58,6 +58,11 @@ protected:
|
|||||||
/// Which style to use for printing hexadecimal values.
|
/// Which style to use for printing hexadecimal values.
|
||||||
HexStyle::Style PrintHexStyle = HexStyle::C;
|
HexStyle::Style PrintHexStyle = HexStyle::C;
|
||||||
|
|
||||||
|
/// If true, a branch immediate (e.g. bl 4) will be printed as a hexadecimal
|
||||||
|
/// address (e.g. bl 0x20004). This is useful for a stream disassembler
|
||||||
|
/// (llvm-objdump -d).
|
||||||
|
bool PrintBranchImmAsAddress = false;
|
||||||
|
|
||||||
/// Utility function for printing annotations.
|
/// Utility function for printing annotations.
|
||||||
void printAnnotation(raw_ostream &OS, StringRef Annot);
|
void printAnnotation(raw_ostream &OS, StringRef Annot);
|
||||||
|
|
||||||
@ -100,6 +105,10 @@ public:
|
|||||||
|
|
||||||
void setPrintHexStyle(HexStyle::Style Value) { PrintHexStyle = Value; }
|
void setPrintHexStyle(HexStyle::Style Value) { PrintHexStyle = Value; }
|
||||||
|
|
||||||
|
void setPrintBranchImmAsAddress(bool Value) {
|
||||||
|
PrintBranchImmAsAddress = Value;
|
||||||
|
}
|
||||||
|
|
||||||
/// Utility function to print immediates in decimal or hex.
|
/// Utility function to print immediates in decimal or hex.
|
||||||
format_object<int64_t> formatImm(int64_t Value) const {
|
format_object<int64_t> formatImm(int64_t Value) const {
|
||||||
return PrintImmHex ? formatHex(Value) : formatDec(Value);
|
return PrintImmHex ? formatHex(Value) : formatDec(Value);
|
||||||
|
@ -1347,7 +1347,8 @@ void AArch64InstPrinter::printVectorIndex(const MCInst *MI, unsigned OpNum,
|
|||||||
O << "[" << MI->getOperand(OpNum).getImm() << "]";
|
O << "[" << MI->getOperand(OpNum).getImm() << "]";
|
||||||
}
|
}
|
||||||
|
|
||||||
void AArch64InstPrinter::printAlignedLabel(const MCInst *MI, unsigned OpNum,
|
void AArch64InstPrinter::printAlignedLabel(const MCInst *MI, uint64_t Address,
|
||||||
|
unsigned OpNum,
|
||||||
const MCSubtargetInfo &STI,
|
const MCSubtargetInfo &STI,
|
||||||
raw_ostream &O) {
|
raw_ostream &O) {
|
||||||
const MCOperand &Op = MI->getOperand(OpNum);
|
const MCOperand &Op = MI->getOperand(OpNum);
|
||||||
@ -1362,10 +1363,9 @@ void AArch64InstPrinter::printAlignedLabel(const MCInst *MI, unsigned OpNum,
|
|||||||
// If the branch target is simply an address then print it in hex.
|
// If the branch target is simply an address then print it in hex.
|
||||||
const MCConstantExpr *BranchTarget =
|
const MCConstantExpr *BranchTarget =
|
||||||
dyn_cast<MCConstantExpr>(MI->getOperand(OpNum).getExpr());
|
dyn_cast<MCConstantExpr>(MI->getOperand(OpNum).getExpr());
|
||||||
int64_t Address;
|
int64_t TargetAddress;
|
||||||
if (BranchTarget && BranchTarget->evaluateAsAbsolute(Address)) {
|
if (BranchTarget && BranchTarget->evaluateAsAbsolute(TargetAddress)) {
|
||||||
O << "0x";
|
O << formatHex(TargetAddress);
|
||||||
O.write_hex(Address);
|
|
||||||
} else {
|
} else {
|
||||||
// Otherwise, just print the expression.
|
// Otherwise, just print the expression.
|
||||||
MI->getOperand(OpNum).getExpr()->print(O, &MAI);
|
MI->getOperand(OpNum).getExpr()->print(O, &MAI);
|
||||||
|
@ -100,7 +100,7 @@ protected:
|
|||||||
const MCSubtargetInfo &STI, raw_ostream &O);
|
const MCSubtargetInfo &STI, raw_ostream &O);
|
||||||
void printInverseCondCode(const MCInst *MI, unsigned OpNum,
|
void printInverseCondCode(const MCInst *MI, unsigned OpNum,
|
||||||
const MCSubtargetInfo &STI, raw_ostream &O);
|
const MCSubtargetInfo &STI, raw_ostream &O);
|
||||||
void printAlignedLabel(const MCInst *MI, unsigned OpNum,
|
void printAlignedLabel(const MCInst *MI, uint64_t Address, unsigned OpNum,
|
||||||
const MCSubtargetInfo &STI, raw_ostream &O);
|
const MCSubtargetInfo &STI, raw_ostream &O);
|
||||||
void printUImm12Offset(const MCInst *MI, unsigned OpNum, unsigned Scale,
|
void printUImm12Offset(const MCInst *MI, unsigned OpNum, unsigned Scale,
|
||||||
raw_ostream &O);
|
raw_ostream &O);
|
||||||
|
@ -115,6 +115,10 @@ private:
|
|||||||
raw_ostream &O);
|
raw_ostream &O);
|
||||||
void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
|
void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
|
||||||
raw_ostream &O);
|
raw_ostream &O);
|
||||||
|
void printOperand(const MCInst *MI, uint64_t /*Address*/, unsigned OpNum,
|
||||||
|
const MCSubtargetInfo &STI, raw_ostream &O) {
|
||||||
|
printOperand(MI, OpNum, STI, O);
|
||||||
|
}
|
||||||
void printOperandAndFPInputMods(const MCInst *MI, unsigned OpNo,
|
void printOperandAndFPInputMods(const MCInst *MI, unsigned OpNo,
|
||||||
const MCSubtargetInfo &STI, raw_ostream &O);
|
const MCSubtargetInfo &STI, raw_ostream &O);
|
||||||
void printOperandAndIntInputMods(const MCInst *MI, unsigned OpNo,
|
void printOperandAndIntInputMods(const MCInst *MI, unsigned OpNo,
|
||||||
|
@ -36,6 +36,10 @@ public:
|
|||||||
private:
|
private:
|
||||||
void printMemOperandRI(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
void printMemOperandRI(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
||||||
void printOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
void printOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
||||||
|
void printOperand(const MCInst *MI, uint64_t /*Address*/, unsigned OpNum,
|
||||||
|
raw_ostream &O) {
|
||||||
|
printOperand(MI, OpNum, O);
|
||||||
|
}
|
||||||
void printPredicateOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
void printPredicateOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
||||||
void printBRCCPredicateOperand(const MCInst *MI, unsigned OpNum,
|
void printBRCCPredicateOperand(const MCInst *MI, unsigned OpNum,
|
||||||
raw_ostream &O);
|
raw_ostream &O);
|
||||||
|
@ -43,6 +43,10 @@ public:
|
|||||||
|
|
||||||
void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
|
void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
|
||||||
raw_ostream &O);
|
raw_ostream &O);
|
||||||
|
void printOperand(const MCInst *MI, uint64_t /*Address*/, unsigned OpNum,
|
||||||
|
const MCSubtargetInfo &STI, raw_ostream &O) {
|
||||||
|
printOperand(MI, OpNum, STI, O);
|
||||||
|
}
|
||||||
|
|
||||||
void printSORegRegOperand(const MCInst *MI, unsigned OpNum,
|
void printSORegRegOperand(const MCInst *MI, unsigned OpNum,
|
||||||
const MCSubtargetInfo &STI, raw_ostream &O);
|
const MCSubtargetInfo &STI, raw_ostream &O);
|
||||||
@ -109,6 +113,12 @@ public:
|
|||||||
template <unsigned scale>
|
template <unsigned scale>
|
||||||
void printAdrLabelOperand(const MCInst *MI, unsigned OpNum,
|
void printAdrLabelOperand(const MCInst *MI, unsigned OpNum,
|
||||||
const MCSubtargetInfo &STI, raw_ostream &O);
|
const MCSubtargetInfo &STI, raw_ostream &O);
|
||||||
|
template <unsigned scale>
|
||||||
|
void printAdrLabelOperand(const MCInst *MI, uint64_t /*Address*/,
|
||||||
|
unsigned OpNum, const MCSubtargetInfo &STI,
|
||||||
|
raw_ostream &O) {
|
||||||
|
printAdrLabelOperand<scale>(MI, OpNum, STI, O);
|
||||||
|
}
|
||||||
void printThumbS4ImmOperand(const MCInst *MI, unsigned OpNum,
|
void printThumbS4ImmOperand(const MCInst *MI, unsigned OpNum,
|
||||||
const MCSubtargetInfo &STI, raw_ostream &O);
|
const MCSubtargetInfo &STI, raw_ostream &O);
|
||||||
void printThumbSRImm(const MCInst *MI, unsigned OpNum,
|
void printThumbSRImm(const MCInst *MI, unsigned OpNum,
|
||||||
@ -206,6 +216,11 @@ public:
|
|||||||
const MCSubtargetInfo &STI, raw_ostream &O);
|
const MCSubtargetInfo &STI, raw_ostream &O);
|
||||||
void printThumbLdrLabelOperand(const MCInst *MI, unsigned OpNum,
|
void printThumbLdrLabelOperand(const MCInst *MI, unsigned OpNum,
|
||||||
const MCSubtargetInfo &STI, raw_ostream &O);
|
const MCSubtargetInfo &STI, raw_ostream &O);
|
||||||
|
void printThumbLdrLabelOperand(const MCInst *MI, uint64_t /*Address*/,
|
||||||
|
unsigned OpNum, const MCSubtargetInfo &STI,
|
||||||
|
raw_ostream &O) {
|
||||||
|
printThumbLdrLabelOperand(MI, OpNum, STI, O);
|
||||||
|
}
|
||||||
void printFBits16(const MCInst *MI, unsigned OpNum,
|
void printFBits16(const MCInst *MI, unsigned OpNum,
|
||||||
const MCSubtargetInfo &STI, raw_ostream &O);
|
const MCSubtargetInfo &STI, raw_ostream &O);
|
||||||
void printFBits32(const MCInst *MI, unsigned OpNum,
|
void printFBits32(const MCInst *MI, unsigned OpNum,
|
||||||
|
@ -38,6 +38,10 @@ private:
|
|||||||
|
|
||||||
void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
||||||
void printPCRelImm(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
void printPCRelImm(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
||||||
|
void printPCRelImm(const MCInst *MI, uint64_t /*Address*/, unsigned OpNo,
|
||||||
|
raw_ostream &O) {
|
||||||
|
printPCRelImm(MI, OpNo, O);
|
||||||
|
}
|
||||||
void printMemri(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
void printMemri(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
||||||
|
|
||||||
// Autogenerated by TableGen.
|
// Autogenerated by TableGen.
|
||||||
|
@ -92,6 +92,10 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
||||||
|
void printOperand(const MCInst *MI, uint64_t /*Address*/, unsigned OpNum,
|
||||||
|
raw_ostream &O) {
|
||||||
|
printOperand(MI, OpNum, O);
|
||||||
|
}
|
||||||
template <unsigned Bits, unsigned Offset = 0>
|
template <unsigned Bits, unsigned Offset = 0>
|
||||||
void printUImm(const MCInst *MI, int opNum, raw_ostream &O);
|
void printUImm(const MCInst *MI, int opNum, raw_ostream &O);
|
||||||
void printMemOperand(const MCInst *MI, int opNum, raw_ostream &O);
|
void printMemOperand(const MCInst *MI, int opNum, raw_ostream &O);
|
||||||
|
@ -65,6 +65,10 @@ public:
|
|||||||
void printU16ImmOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
void printU16ImmOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
||||||
void printImmZeroOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
void printImmZeroOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
||||||
void printBranchOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
void printBranchOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
||||||
|
void printBranchOperand(const MCInst *MI, uint64_t /*Address*/, unsigned OpNo,
|
||||||
|
raw_ostream &O) {
|
||||||
|
printBranchOperand(MI, OpNo, O);
|
||||||
|
}
|
||||||
void printAbsBranchOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
void printAbsBranchOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
||||||
void printTLSCall(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
void printTLSCall(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
||||||
|
|
||||||
|
@ -155,7 +155,8 @@ void SystemZInstPrinter::printPCRelOperand(const MCInst *MI, int OpNum,
|
|||||||
MO.getExpr()->print(O, &MAI);
|
MO.getExpr()->print(O, &MAI);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SystemZInstPrinter::printPCRelTLSOperand(const MCInst *MI, int OpNum,
|
void SystemZInstPrinter::printPCRelTLSOperand(const MCInst *MI,
|
||||||
|
uint64_t Address, int OpNum,
|
||||||
raw_ostream &O) {
|
raw_ostream &O) {
|
||||||
// Output the PC-relative operand.
|
// Output the PC-relative operand.
|
||||||
printPCRelOperand(MI, OpNum, O);
|
printPCRelOperand(MI, OpNum, O);
|
||||||
|
@ -46,6 +46,10 @@ public:
|
|||||||
private:
|
private:
|
||||||
// Print various types of operand.
|
// Print various types of operand.
|
||||||
void printOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
void printOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||||
|
void printOperand(const MCInst *MI, uint64_t /*Address*/, unsigned OpNum,
|
||||||
|
raw_ostream &O) {
|
||||||
|
printOperand(MI, OpNum, O);
|
||||||
|
}
|
||||||
void printBDAddrOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
void printBDAddrOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||||
void printBDXAddrOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
void printBDXAddrOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||||
void printBDLAddrOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
void printBDLAddrOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||||
@ -65,7 +69,12 @@ private:
|
|||||||
void printU32ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
void printU32ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||||
void printU48ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
void printU48ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||||
void printPCRelOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
void printPCRelOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
||||||
void printPCRelTLSOperand(const MCInst *MI, int OpNum, raw_ostream &O);
|
void printPCRelOperand(const MCInst *MI, uint64_t /*Address*/, int OpNum,
|
||||||
|
raw_ostream &O) {
|
||||||
|
printPCRelOperand(MI, OpNum, O);
|
||||||
|
}
|
||||||
|
void printPCRelTLSOperand(const MCInst *MI, uint64_t Address, int OpNum,
|
||||||
|
raw_ostream &O);
|
||||||
|
|
||||||
// Print the mnemonic for a condition-code mask ("ne", "lh", etc.)
|
// Print the mnemonic for a condition-code mask ("ne", "lh", etc.)
|
||||||
// This forms part of the instruction name rather than the operand list.
|
// This forms part of the instruction name rather than the operand list.
|
||||||
|
@ -56,7 +56,7 @@ void X86ATTInstPrinter::printInst(const MCInst *MI, uint64_t Address,
|
|||||||
if (MI->getOpcode() == X86::CALLpcrel32 &&
|
if (MI->getOpcode() == X86::CALLpcrel32 &&
|
||||||
(STI.getFeatureBits()[X86::Mode64Bit])) {
|
(STI.getFeatureBits()[X86::Mode64Bit])) {
|
||||||
OS << "\tcallq\t";
|
OS << "\tcallq\t";
|
||||||
printPCRelImm(MI, 0, OS);
|
printPCRelImm(MI, Address, 0, OS);
|
||||||
}
|
}
|
||||||
// data16 and data32 both have the same encoding of 0x66. While data32 is
|
// data16 and data32 both have the same encoding of 0x66. While data32 is
|
||||||
// valid only in 16 bit systems, data16 is valid in the rest.
|
// valid only in 16 bit systems, data16 is valid in the rest.
|
||||||
|
@ -291,8 +291,8 @@ void X86InstPrinterCommon::printRoundingControl(const MCInst *MI, unsigned Op,
|
|||||||
/// being encoded as a pc-relative value (e.g. for jumps and calls). In
|
/// being encoded as a pc-relative value (e.g. for jumps and calls). In
|
||||||
/// Intel-style these print slightly differently than normal immediates.
|
/// Intel-style these print slightly differently than normal immediates.
|
||||||
/// for example, a $ is not emitted.
|
/// for example, a $ is not emitted.
|
||||||
void X86InstPrinterCommon::printPCRelImm(const MCInst *MI, unsigned OpNo,
|
void X86InstPrinterCommon::printPCRelImm(const MCInst *MI, uint64_t Address,
|
||||||
raw_ostream &O) {
|
unsigned OpNo, raw_ostream &O) {
|
||||||
const MCOperand &Op = MI->getOperand(OpNo);
|
const MCOperand &Op = MI->getOperand(OpNo);
|
||||||
if (Op.isImm())
|
if (Op.isImm())
|
||||||
O << formatImm(Op.getImm());
|
O << formatImm(Op.getImm());
|
||||||
|
@ -29,7 +29,9 @@ public:
|
|||||||
void printVPCMPMnemonic(const MCInst *MI, raw_ostream &OS);
|
void printVPCMPMnemonic(const MCInst *MI, raw_ostream &OS);
|
||||||
void printCMPMnemonic(const MCInst *MI, bool IsVCmp, raw_ostream &OS);
|
void printCMPMnemonic(const MCInst *MI, bool IsVCmp, raw_ostream &OS);
|
||||||
void printRoundingControl(const MCInst *MI, unsigned Op, raw_ostream &O);
|
void printRoundingControl(const MCInst *MI, unsigned Op, raw_ostream &O);
|
||||||
void printPCRelImm(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
void printPCRelImm(const MCInst *MI, uint64_t Address, unsigned OpNo,
|
||||||
|
raw_ostream &O);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void printInstFlags(const MCInst *MI, raw_ostream &O);
|
void printInstFlags(const MCInst *MI, raw_ostream &O);
|
||||||
void printOptionalSegReg(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
void printOptionalSegReg(const MCInst *MI, unsigned OpNo, raw_ostream &O);
|
||||||
|
@ -1635,6 +1635,7 @@ static void disassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
|
|||||||
reportError(Obj->getFileName(),
|
reportError(Obj->getFileName(),
|
||||||
"no instruction printer for target " + TripleName);
|
"no instruction printer for target " + TripleName);
|
||||||
IP->setPrintImmHex(PrintImmHex);
|
IP->setPrintImmHex(PrintImmHex);
|
||||||
|
IP->setPrintBranchImmAsAddress(true);
|
||||||
|
|
||||||
PrettyPrinter &PIP = selectPrettyPrinter(Triple(TripleName));
|
PrettyPrinter &PIP = selectPrettyPrinter(Triple(TripleName));
|
||||||
SourcePrinter SP(Obj, TheTarget->getName());
|
SourcePrinter SP(Obj, TheTarget->getName());
|
||||||
|
@ -36,6 +36,8 @@ std::string AsmWriterOperand::getCode(bool PassSubtarget) const {
|
|||||||
return Str;
|
return Str;
|
||||||
|
|
||||||
std::string Result = Str + "(MI";
|
std::string Result = Str + "(MI";
|
||||||
|
if (PCRel)
|
||||||
|
Result += ", Address";
|
||||||
if (MIOpNo != ~0U)
|
if (MIOpNo != ~0U)
|
||||||
Result += ", " + utostr(MIOpNo);
|
Result += ", " + utostr(MIOpNo);
|
||||||
if (PassSubtarget)
|
if (PassSubtarget)
|
||||||
@ -179,7 +181,9 @@ AsmWriterInst::AsmWriterInst(const CodeGenInstruction &CGI, unsigned CGIIndex,
|
|||||||
CGIOperandList::OperandInfo OpInfo = CGI.Operands[OpNo];
|
CGIOperandList::OperandInfo OpInfo = CGI.Operands[OpNo];
|
||||||
|
|
||||||
unsigned MIOp = OpInfo.MIOperandNo;
|
unsigned MIOp = OpInfo.MIOperandNo;
|
||||||
Operands.emplace_back(OpInfo.PrinterMethodName, MIOp, Modifier);
|
Operands.emplace_back(OpInfo.PrinterMethodName, MIOp, Modifier,
|
||||||
|
AsmWriterOperand::isMachineInstrOperand,
|
||||||
|
OpInfo.OperandType == "MCOI::OPERAND_PCREL");
|
||||||
}
|
}
|
||||||
LastEmitted = VarEnd;
|
LastEmitted = VarEnd;
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,8 @@ namespace llvm {
|
|||||||
/// an operand, specified with syntax like ${opname:modifier}.
|
/// an operand, specified with syntax like ${opname:modifier}.
|
||||||
std::string MiModifier;
|
std::string MiModifier;
|
||||||
|
|
||||||
|
bool PCRel = false;
|
||||||
|
|
||||||
// To make VS STL happy
|
// To make VS STL happy
|
||||||
AsmWriterOperand(OpType op = isLiteralTextOperand):OperandType(op) {}
|
AsmWriterOperand(OpType op = isLiteralTextOperand):OperandType(op) {}
|
||||||
|
|
||||||
@ -55,11 +57,11 @@ namespace llvm {
|
|||||||
OpType op = isLiteralTextOperand)
|
OpType op = isLiteralTextOperand)
|
||||||
: OperandType(op), Str(LitStr) {}
|
: OperandType(op), Str(LitStr) {}
|
||||||
|
|
||||||
AsmWriterOperand(const std::string &Printer,
|
AsmWriterOperand(const std::string &Printer, unsigned _MIOpNo,
|
||||||
unsigned _MIOpNo,
|
|
||||||
const std::string &Modifier,
|
const std::string &Modifier,
|
||||||
OpType op = isMachineInstrOperand)
|
OpType op = isMachineInstrOperand, bool PCRel = false)
|
||||||
: OperandType(op), MIOpNo(_MIOpNo), Str(Printer), MiModifier(Modifier) {}
|
: OperandType(op), MIOpNo(_MIOpNo), Str(Printer), MiModifier(Modifier),
|
||||||
|
PCRel(PCRel) {}
|
||||||
|
|
||||||
bool operator!=(const AsmWriterOperand &Other) const {
|
bool operator!=(const AsmWriterOperand &Other) const {
|
||||||
if (OperandType != Other.OperandType || Str != Other.Str) return true;
|
if (OperandType != Other.OperandType || Str != Other.Str) return true;
|
||||||
|
Loading…
Reference in New Issue
Block a user