}
format_object<int64_t> MCInstPrinter::formatHex(int64_t Value) const {
- switch(PrintHexStyle) {
+ switch (PrintHexStyle) {
case HexStyle::C:
- if (Value < 0)
+ if (Value < 0) {
+ if (Value == std::numeric_limits<int64_t>::min())
+ return format<int64_t>("-0x8000000000000000", Value);
return format("-0x%" PRIx64, -Value);
- else
- return format("0x%" PRIx64, Value);
+ }
+ return format("0x%" PRIx64, Value);
case HexStyle::Asm:
if (Value < 0) {
- if (needsLeadingZero((uint64_t)(-Value)))
+ if (Value == std::numeric_limits<int64_t>::min())
+ return format<int64_t>("-8000000000000000h", Value);
+ 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);
+ return format("-%" PRIx64 "h", -Value);
}
+ if (needsLeadingZero((uint64_t)(Value)))
+ return format("0%" PRIx64 "h", Value);
+ return format("%" PRIx64 "h", Value);
}
llvm_unreachable("unsupported print style");
}
--- /dev/null
+//===- llvm/unittest/MC/MCInstPrinter.cpp ---------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/MC/MCInstPrinter.h"
+#include "llvm/MC/MCAsmInfo.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/Support/TargetRegistry.h"
+#include "llvm/Support/TargetSelect.h"
+#include "llvm/Target/TargetMachine.h"
+#include "llvm/Target/TargetOptions.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+
+namespace {
+class MCInstPrinterTest : public ::testing::Test {
+public:
+ std::unique_ptr<MCRegisterInfo> MRI;
+ std::unique_ptr<MCAsmInfo> MAI;
+ std::unique_ptr<const MCInstrInfo> MII;
+ std::unique_ptr<MCInstPrinter> Printer;
+
+ MCInstPrinterTest() {
+ llvm::InitializeAllTargetInfos();
+ llvm::InitializeAllTargetMCs();
+
+ std::string TripleName = "x86_64-pc-linux";
+ std::string ErrorStr;
+
+ const Target *TheTarget =
+ TargetRegistry::lookupTarget(TripleName, ErrorStr);
+
+ // If we didn't build x86, do not run the test.
+ if (!TheTarget)
+ return;
+
+ MRI.reset(TheTarget->createMCRegInfo(TripleName));
+ MAI.reset(TheTarget->createMCAsmInfo(*MRI, TripleName));
+ MII.reset(TheTarget->createMCInstrInfo());
+ Printer.reset(TheTarget->createMCInstPrinter(
+ Triple(TripleName), MAI->getAssemblerDialect(), *MAI, *MII, *MRI));
+ }
+
+ template <typename T> std::string formatHex(T i) {
+ std::string Buffer;
+ raw_string_ostream OS(Buffer);
+ OS << Printer->formatHex(i);
+ OS.flush();
+ return Buffer;
+ }
+};
+} // namespace
+
+TEST_F(MCInstPrinterTest, formatHex) {
+ if (!Printer)
+ return;
+
+ EXPECT_EQ("0x1", formatHex<int64_t>(1));
+ EXPECT_EQ("0x7fffffffffffffff",
+ formatHex(std::numeric_limits<int64_t>::max()));
+ EXPECT_EQ("-0x8000000000000000",
+ formatHex(std::numeric_limits<int64_t>::min()));
+}