[llvm] r187614 - 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.
Daniel Malea
daniel.malea at intel.com
Thu Aug 1 14:18:17 PDT 2013
Author: dmalea
Date: Thu Aug 1 16:18:16 2013
New Revision: 187614
URL: http://llvm.org/viewvc/llvm-project?rev=187614&view=rev
Log:
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:
llvm/trunk/include/llvm/MC/MCInstPrinter.h
llvm/trunk/lib/MC/MCInstPrinter.cpp
llvm/trunk/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp
llvm/trunk/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp
Modified: llvm/trunk/include/llvm/MC/MCInstPrinter.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCInstPrinter.h?rev=187614&r1=187613&r2=187614&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCInstPrinter.h (original)
+++ llvm/trunk/include/llvm/MC/MCInstPrinter.h Thu Aug 1 16:18:16 2013
@@ -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: llvm/trunk/lib/MC/MCInstPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCInstPrinter.cpp?rev=187614&r1=187613&r2=187614&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCInstPrinter.cpp (original)
+++ llvm/trunk/lib/MC/MCInstPrinter.cpp Thu Aug 1 16:18:16 2013
@@ -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: llvm/trunk/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp?rev=187614&r1=187613&r2=187614&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp (original)
+++ llvm/trunk/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp Thu Aug 1 16:18:16 2013
@@ -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: llvm/trunk/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp?rev=187614&r1=187613&r2=187614&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp (original)
+++ llvm/trunk/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp Thu Aug 1 16:18:16 2013
@@ -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.
@@ -143,7 +142,7 @@ void X86IntelInstPrinter::printOperand(c
if (Op.isReg()) {
printRegName(O, 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();
@@ -195,7 +194,7 @@ void X86IntelInstPrinter::printMemRefere
DispVal = -DispVal;
}
}
- O << DispVal;
+ O << formatImm(DispVal);
}
}
More information about the llvm-commits
mailing list