[PATCH] Fixed the Intel-syntax X86 disassembler to respect the option for hexadecimal immediates.

Richard Mitton richard at codersnotes.com
Wed Jul 31 14:03:51 PDT 2013


Any chance someone could commit this if it's OK?

Richard Mitton
richard at codersnotes.com

On 07/30/2013 05:33 PM, Richard Mitton wrote:
>    I hate arcanist so much already. I fixed this diff to *only* include the files actually relevant to this single patch.
>
> http://llvm-reviews.chandlerc.com/D1243
>
> CHANGE SINCE LAST DIFF
>    http://llvm-reviews.chandlerc.com/D1243?vs=3091&id=3094#toc
>
> 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: // unreachable
> +  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: // unreachable
> +  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);
>       }
>     }




More information about the llvm-commits mailing list