diff options
Diffstat (limited to 'llvm/lib/Target/X86/MCTargetDesc/X86InstPrinterCommon.cpp')
-rw-r--r-- | llvm/lib/Target/X86/MCTargetDesc/X86InstPrinterCommon.cpp | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86InstPrinterCommon.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86InstPrinterCommon.cpp index a21555076976..33d70fdb1214 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86InstPrinterCommon.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86InstPrinterCommon.cpp @@ -13,6 +13,7 @@ #include "X86InstPrinterCommon.h" #include "X86BaseInfo.h" +#include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCInst.h" #include "llvm/MC/MCInstrDesc.h" @@ -287,16 +288,23 @@ void X86InstPrinterCommon::printRoundingControl(const MCInst *MI, unsigned Op, } } -/// printPCRelImm - This is used to print an immediate value that ends up -/// being encoded as a pc-relative value (e.g. for jumps and calls). In -/// Intel-style these print slightly differently than normal immediates. -/// for example, a $ is not emitted. -void X86InstPrinterCommon::printPCRelImm(const MCInst *MI, unsigned OpNo, - raw_ostream &O) { +/// value (e.g. for jumps and calls). In Intel-style these print slightly +/// differently than normal immediates. For example, a $ is not emitted. +/// +/// \p Address The address of the next instruction. +/// \see MCInstPrinter::printInst +void X86InstPrinterCommon::printPCRelImm(const MCInst *MI, uint64_t Address, + unsigned OpNo, raw_ostream &O) { const MCOperand &Op = MI->getOperand(OpNo); - if (Op.isImm()) - O << formatImm(Op.getImm()); - else { + if (Op.isImm()) { + if (PrintBranchImmAsAddress) { + uint64_t Target = Address + Op.getImm(); + if (MAI.getCodePointerSize() == 4) + Target &= 0xffffffff; + O << formatHex(Target); + } else + O << formatImm(Op.getImm()); + } else { assert(Op.isExpr() && "unknown pcrel immediate operand"); // If a symbolic branch target was added as a constant expression then print // that address in hex. |