[PATCH] Fixed the Intel-syntax X86 disassembler to respect the option for hexadecimal immediates.
Richard Mitton
richard at codersnotes.com
Thu Aug 1 13:32:19 PDT 2013
- Fixed unreachable cases.
Hi dmalea,
http://llvm-reviews.chandlerc.com/D1243
CHANGE SINCE LAST DIFF
http://llvm-reviews.chandlerc.com/D1243?vs=3094&id=3131#toc
BRANCH
default
ARCANIST PROJECT
llvm
Files:
include/llvm/MC/MCInstPrinter.h
lib/MC/MCInstPrinter.cpp
lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp
lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp
Index: include/llvm/MC/MCInstPrinter.h
===================================================================
--- include/llvm/MC/MCInstPrinter.h
+++ include/llvm/MC/MCInstPrinter.h
@@ -21,6 +21,13 @@
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 @@
/// 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 @@
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
Index: lib/MC/MCInstPrinter.cpp
===================================================================
--- lib/MC/MCInstPrinter.cpp
+++ lib/MC/MCInstPrinter.cpp
@@ -52,10 +52,55 @@
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) {
+ default: llvm_unreachable("Invalid");
+ 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) {
+ default: llvm_unreachable("Invalid");
+ 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);
+ }
+}
Index: lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp
===================================================================
--- lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp
+++ lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp
@@ -139,8 +139,7 @@
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.
Index: lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp
===================================================================
--- lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp
+++ lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp
@@ -119,16 +119,15 @@
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
// that address in hex.
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 @@
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 @@
DispVal = -DispVal;
}
}
- O << DispVal;
+ O << formatImm(DispVal);
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D1243.3.patch
Type: text/x-patch
Size: 5837 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130801/cddee414/attachment.bin>
More information about the llvm-commits
mailing list