diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp --- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp +++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp @@ -1622,7 +1622,7 @@ dyn_cast(MI->getOperand(OpNum).getExpr()); int64_t TargetAddress; if (BranchTarget && BranchTarget->evaluateAsAbsolute(TargetAddress)) { - O << formatHex(TargetAddress); + O << formatHex((uint64_t)TargetAddress); } else { // Otherwise, just print the expression. MI->getOperand(OpNum).getExpr()->print(O, &MAI); diff --git a/llvm/unittests/Target/AArch64/AArch64InstPrinterTest.cpp b/llvm/unittests/Target/AArch64/AArch64InstPrinterTest.cpp new file mode 100644 --- /dev/null +++ b/llvm/unittests/Target/AArch64/AArch64InstPrinterTest.cpp @@ -0,0 +1,60 @@ +//===- AArch64InstPrinterTest.cpp - AArch64InstPrinter unit tests----------===// +// +// 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/MCAsmInfo.h" +#include "llvm/MC/MCContext.h" +#include "llvm/MC/MCExpr.h" +#include "llvm/MC/MCInst.h" +#include "llvm/MC/MCInstrInfo.h" +#include "llvm/MC/MCRegisterInfo.h" +#include "llvm/MC/MCSubtargetInfo.h" +#include "llvm/Support/raw_ostream.h" + +#include "MCTargetDesc/AArch64InstPrinter.h" + +#include "gtest/gtest.h" + +using namespace llvm; + +class AArch64InstPrinterTest : public AArch64InstPrinter { +public: + AArch64InstPrinterTest(const MCAsmInfo &MAI, const MCInstrInfo &MII, + const MCRegisterInfo &MRI) + : AArch64InstPrinter(MAI, MII, MRI) {} + void printAlignedLabel(const MCInst *MI, uint64_t Address, unsigned OpNum, + const MCSubtargetInfo &STI, raw_ostream &O) { + AArch64InstPrinter::printAlignedLabel(MI, Address, OpNum, STI, O); + } +}; + +static std::string AArch64InstPrinterTestPrintAlignedLabel(uint64_t value) { + MCAsmInfo MAI; + MCInstrInfo MII; + MCRegisterInfo MRI; + MCSubtargetInfo STI(Triple(""), "", "", "", + makeArrayRef((SubtargetFeatureKV *)NULL, 0), + makeArrayRef((SubtargetSubTypeKV *)NULL, 0), NULL, NULL, + NULL, NULL, NULL, NULL); + MCContext Ctx(Triple(""), &MAI, &MRI, &STI); + MCInst MI; + + MI.addOperand(MCOperand::createExpr(MCConstantExpr::create(value, Ctx))); + + std::string str; + raw_string_ostream O(str); + AArch64InstPrinterTest(MAI, MII, MRI).printAlignedLabel(&MI, 0, 0, STI, O); + return str; +} + +TEST(AArch64InstPrinterTest, PrintAlignedLabel) { + EXPECT_EQ(AArch64InstPrinterTestPrintAlignedLabel(0x0), "0x0"); + EXPECT_EQ(AArch64InstPrinterTestPrintAlignedLabel(0xffffffff001200eb), + "0xffffffff001200eb"); + EXPECT_EQ(AArch64InstPrinterTestPrintAlignedLabel(0x7c01445bcc10f), + "0x7c01445bcc10f"); +} diff --git a/llvm/unittests/Target/AArch64/CMakeLists.txt b/llvm/unittests/Target/AArch64/CMakeLists.txt --- a/llvm/unittests/Target/AArch64/CMakeLists.txt +++ b/llvm/unittests/Target/AArch64/CMakeLists.txt @@ -20,8 +20,9 @@ ) add_llvm_target_unittest(AArch64Tests - InstSizes.cpp + AArch64InstPrinterTest.cpp DecomposeStackOffsetTest.cpp + InstSizes.cpp MatrixRegisterAliasing.cpp SMEAttributesTest.cpp ) diff --git a/llvm/utils/gn/secondary/llvm/unittests/Target/AArch64/BUILD.gn b/llvm/utils/gn/secondary/llvm/unittests/Target/AArch64/BUILD.gn --- a/llvm/utils/gn/secondary/llvm/unittests/Target/AArch64/BUILD.gn +++ b/llvm/utils/gn/secondary/llvm/unittests/Target/AArch64/BUILD.gn @@ -15,6 +15,7 @@ ] include_dirs = [ "//llvm/lib/Target/AArch64" ] sources = [ + "AArch64InstPrinterTest.cpp", "DecomposeStackOffsetTest.cpp", "InstSizes.cpp", "MatrixRegisterAliasing.cpp",