diff options
author | emaste <emaste@FreeBSD.org> | 2013-08-24 15:33:17 +0000 |
---|---|---|
committer | emaste <emaste@FreeBSD.org> | 2013-08-24 15:33:17 +0000 |
commit | 6f1bda6a94ca4e77773663da92af6c51f3bae421 (patch) | |
tree | 0a0607c66655543095e8a08c0fa9c77b9d5538f8 /contrib/llvm/lib/MC | |
parent | 8d8ac3d3c9671918b750794be8b7227ed242d633 (diff) | |
download | FreeBSD-src-6f1bda6a94ca4e77773663da92af6c51f3bae421.zip FreeBSD-src-6f1bda6a94ca4e77773663da92af6c51f3bae421.tar.gz |
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
Diffstat (limited to 'contrib/llvm/lib/MC')
-rw-r--r-- | contrib/llvm/lib/MC/MCInstPrinter.cpp | 55 |
1 files changed, 49 insertions, 6 deletions
diff --git a/contrib/llvm/lib/MC/MCInstPrinter.cpp b/contrib/llvm/lib/MC/MCInstPrinter.cpp index 73f30ff..c729d49 100644 --- a/contrib/llvm/lib/MC/MCInstPrinter.cpp +++ b/contrib/llvm/lib/MC/MCInstPrinter.cpp @@ -52,10 +52,53 @@ StringRef MCInstPrinter::markup(StringRef a, StringRef b) const { 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); + } } |