[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.
Rafael Avila de Espindola
rafael.espindola at gmail.com
Fri Aug 2 09:50:01 PDT 2013
Test case?
Sent from my iPhone
On 2013-08-01, at 17:18, Daniel Malea <daniel.malea at intel.com> wrote:
> 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);
> }
> }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list