Date: Sat, 24 Aug 2013 15:33:17 +0000 (UTC) From: Ed Maste <emaste@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r254790 - in head/contrib/llvm: include/llvm/MC lib/MC lib/Target/X86/InstPrinter Message-ID: <201308241533.r7OFXHtW088677@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: emaste Date: Sat Aug 24 15:33:17 2013 New Revision: 254790 URL: http://svnweb.freebsd.org/changeset/base/254790 Log: Import llvm r187614 (git 44c8e34), for lldb's use: Author: Daniel Malea <daniel.malea@intel.com> Date: Thu Aug 1 21:18:16 2013 +0000 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: head/contrib/llvm/include/llvm/MC/MCInstPrinter.h head/contrib/llvm/lib/MC/MCInstPrinter.cpp head/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp head/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp Modified: head/contrib/llvm/include/llvm/MC/MCInstPrinter.h ============================================================================== --- head/contrib/llvm/include/llvm/MC/MCInstPrinter.h Sat Aug 24 15:09:05 2013 (r254789) +++ head/contrib/llvm/include/llvm/MC/MCInstPrinter.h Sat Aug 24 15:33:17 2013 (r254790) @@ -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: head/contrib/llvm/lib/MC/MCInstPrinter.cpp ============================================================================== --- head/contrib/llvm/lib/MC/MCInstPrinter.cpp Sat Aug 24 15:09:05 2013 (r254789) +++ head/contrib/llvm/lib/MC/MCInstPrinter.cpp Sat Aug 24 15:33:17 2013 (r254790) @@ -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: head/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp ============================================================================== --- head/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp Sat Aug 24 15:09:05 2013 (r254789) +++ head/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp Sat Aug 24 15:33:17 2013 (r254790) @@ -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: head/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp ============================================================================== --- head/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp Sat Aug 24 15:09:05 2013 (r254789) +++ head/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp Sat Aug 24 15:33:17 2013 (r254790) @@ -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. @@ -148,7 +147,7 @@ void X86IntelInstPrinter::printOperand(c if (Op.isReg()) { PrintRegName(O, getRegisterName(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(); @@ -200,7 +199,7 @@ void X86IntelInstPrinter::printMemRefere DispVal = -DispVal; } } - O << DispVal; + O << formatImm(DispVal); } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201308241533.r7OFXHtW088677>