[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