svn commit: r254790 - in head/contrib/llvm: include/llvm/MC lib/MC lib/Target/X86/InstPrinter
Ed Maste
emaste at FreeBSD.org
Sat Aug 24 15:33:18 UTC 2013
Author: emaste
Date: Sat Aug 24 15:33:17 2013
New Revision: 254790
URL: http://svnweb.freebsd.org/changeset/base/254790
Log:
Import llvm r187614 (git 44c8e34), for lldb's use:
Author: Daniel Malea <daniel.malea at intel.com>
Date: Thu Aug 1 21:18:16 2013 +0000
Fixed the Intel-syntax X86 disassembler to respect the (existing)
option for hexadecimal immediates, to match AT&T syntax. This also
brings a new option for C-vs-MASM-style hex.
Patch by Richard Mitton
Reviewed: http://llvm-reviews.chandlerc.com/D1243
Modified:
head/contrib/llvm/include/llvm/MC/MCInstPrinter.h
head/contrib/llvm/lib/MC/MCInstPrinter.cpp
head/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp
head/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp
Modified: head/contrib/llvm/include/llvm/MC/MCInstPrinter.h
==============================================================================
--- head/contrib/llvm/include/llvm/MC/MCInstPrinter.h Sat Aug 24 15:09:05 2013 (r254789)
+++ head/contrib/llvm/include/llvm/MC/MCInstPrinter.h Sat Aug 24 15:33:17 2013 (r254790)
@@ -21,6 +21,13 @@ class MCInstrInfo;
class MCRegisterInfo;
class StringRef;
+namespace HexStyle {
+ enum Style {
+ C, ///< 0xff
+ Asm ///< 0ffh
+ };
+}
+
/// MCInstPrinter - This is an instance of a target assembly language printer
/// that converts an MCInst to valid target assembly syntax.
class MCInstPrinter {
@@ -42,13 +49,16 @@ protected:
/// True if we are printing immediates as hex.
bool PrintImmHex;
+ /// Which style to use for printing hexadecimal values.
+ HexStyle::Style PrintHexStyle;
+
/// Utility function for printing annotations.
void printAnnotation(raw_ostream &OS, StringRef Annot);
public:
MCInstPrinter(const MCAsmInfo &mai, const MCInstrInfo &mii,
const MCRegisterInfo &mri)
: CommentStream(0), MAI(mai), MII(mii), MRI(mri), AvailableFeatures(0),
- UseMarkup(0), PrintImmHex(0) {}
+ UseMarkup(0), PrintImmHex(0), PrintHexStyle(HexStyle::C) {}
virtual ~MCInstPrinter();
@@ -80,8 +90,16 @@ public:
bool getPrintImmHex() const { return PrintImmHex; }
void setPrintImmHex(bool Value) { PrintImmHex = Value; }
+ HexStyle::Style getPrintHexStyleHex() const { return PrintHexStyle; }
+ void setPrintImmHex(HexStyle::Style Value) { PrintHexStyle = Value; }
+
/// Utility function to print immediates in decimal or hex.
- format_object1<int64_t> formatImm(const int64_t Value) const;
+ format_object1<int64_t> formatImm(const int64_t Value) const { return PrintImmHex ? formatHex(Value) : formatDec(Value); }
+
+ /// Utility functions to print decimal/hexadecimal values.
+ format_object1<int64_t> formatDec(const int64_t Value) const;
+ format_object1<int64_t> formatHex(const int64_t Value) const;
+ format_object1<uint64_t> formatHex(const uint64_t Value) const;
};
} // namespace llvm
Modified: head/contrib/llvm/lib/MC/MCInstPrinter.cpp
==============================================================================
--- head/contrib/llvm/lib/MC/MCInstPrinter.cpp Sat Aug 24 15:09:05 2013 (r254789)
+++ head/contrib/llvm/lib/MC/MCInstPrinter.cpp Sat Aug 24 15:33:17 2013 (r254790)
@@ -52,10 +52,53 @@ StringRef MCInstPrinter::markup(StringRe
return b;
}
-/// Utility function to print immediates in decimal or hex.
-format_object1<int64_t> MCInstPrinter::formatImm(const int64_t Value) const {
- if (getPrintImmHex())
- return format("0x%" PRIx64, Value);
- else
- return format("%" PRId64, Value);
+// For asm-style hex (e.g. 0ffh) the first digit always has to be a number.
+static bool needsLeadingZero(uint64_t Value)
+{
+ while(Value)
+ {
+ uint64_t digit = (Value >> 60) & 0xf;
+ if (digit != 0)
+ return (digit >= 0xa);
+ Value <<= 4;
+ }
+ return false;
+}
+
+format_object1<int64_t> MCInstPrinter::formatDec(const int64_t Value) const {
+ return format("%" PRId64, Value);
+}
+
+format_object1<int64_t> MCInstPrinter::formatHex(const int64_t Value) const {
+ switch(PrintHexStyle) {
+ case HexStyle::C:
+ if (Value < 0)
+ return format("-0x%" PRIx64, -Value);
+ else
+ return format("0x%" PRIx64, Value);
+ case HexStyle::Asm:
+ if (Value < 0) {
+ if (needsLeadingZero((uint64_t)(-Value)))
+ return format("-0%" PRIx64 "h", -Value);
+ else
+ return format("-%" PRIx64 "h", -Value);
+ } else {
+ if (needsLeadingZero((uint64_t)(Value)))
+ return format("0%" PRIx64 "h", Value);
+ else
+ return format("%" PRIx64 "h", Value);
+ }
+ }
+}
+
+format_object1<uint64_t> MCInstPrinter::formatHex(const uint64_t Value) const {
+ switch(PrintHexStyle) {
+ case HexStyle::C:
+ return format("0x%" PRIx64, Value);
+ case HexStyle::Asm:
+ if (needsLeadingZero(Value))
+ return format("0%" PRIx64 "h", Value);
+ else
+ return format("%" PRIx64 "h", Value);
+ }
}
Modified: head/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp
==============================================================================
--- head/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp Sat Aug 24 15:09:05 2013 (r254789)
+++ head/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp Sat Aug 24 15:33:17 2013 (r254790)
@@ -139,8 +139,7 @@ void X86ATTInstPrinter::printPCRelImm(co
const MCConstantExpr *BranchTarget = dyn_cast<MCConstantExpr>(Op.getExpr());
int64_t Address;
if (BranchTarget && BranchTarget->EvaluateAsAbsolute(Address)) {
- O << "0x";
- O.write_hex(Address);
+ O << formatHex((uint64_t)Address);
}
else {
// Otherwise, just print the expression.
Modified: head/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp
==============================================================================
--- head/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp Sat Aug 24 15:09:05 2013 (r254789)
+++ head/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp Sat Aug 24 15:33:17 2013 (r254790)
@@ -119,7 +119,7 @@ void X86IntelInstPrinter::printPCRelImm(
raw_ostream &O) {
const MCOperand &Op = MI->getOperand(OpNo);
if (Op.isImm())
- O << Op.getImm();
+ 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
@@ -127,8 +127,7 @@ void X86IntelInstPrinter::printPCRelImm(
const MCConstantExpr *BranchTarget = dyn_cast<MCConstantExpr>(Op.getExpr());
int64_t Address;
if (BranchTarget && BranchTarget->EvaluateAsAbsolute(Address)) {
- O << "0x";
- O.write_hex(Address);
+ O << formatHex((uint64_t)Address);
}
else {
// Otherwise, just print the expression.
@@ -148,7 +147,7 @@ void X86IntelInstPrinter::printOperand(c
if (Op.isReg()) {
PrintRegName(O, getRegisterName(Op.getReg()));
} else if (Op.isImm()) {
- O << Op.getImm();
+ O << formatImm((int64_t)Op.getImm());
} else {
assert(Op.isExpr() && "unknown operand kind in printOperand");
O << *Op.getExpr();
@@ -200,7 +199,7 @@ void X86IntelInstPrinter::printMemRefere
DispVal = -DispVal;
}
}
- O << DispVal;
+ O << formatImm(DispVal);
}
}
More information about the svn-src-all
mailing list