From 409eaff5dd55dec61211486c91959c1c4b327fb3 Mon Sep 17 00:00:00 2001 From: Woody Lin Date: Wed, 2 Nov 2022 18:51:14 +0800 Subject: [PATCH] [AArch64InstPrinter] Print TargetAddress as an uint64_t Outputs readable addresses by printed 'TargetAddress' as an uint64_t value. `bl -0x37efd56628` => `bl 0xffffffc8102a99d8` Reviewed By: dmgreen Differential Revision: https://reviews.llvm.org/D137260 --- .../AArch64/MCTargetDesc/AArch64InstPrinter.cpp | 2 +- .../Target/AArch64/AArch64InstPrinterTest.cpp | 60 ++++++++++++++++++++++ llvm/unittests/Target/AArch64/CMakeLists.txt | 3 +- .../llvm/unittests/Target/AArch64/BUILD.gn | 1 + 4 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 llvm/unittests/Target/AArch64/AArch64InstPrinterTest.cpp diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp index 41533c7..5d3faa4 100644 --- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp +++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp @@ -1622,7 +1622,7 @@ void AArch64InstPrinter::printAlignedLabel(const MCInst *MI, uint64_t Address, 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 index 0000000..9605d93 --- /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 index 995e952..df3d2a7 100644 --- a/llvm/unittests/Target/AArch64/CMakeLists.txt +++ b/llvm/unittests/Target/AArch64/CMakeLists.txt @@ -20,8 +20,9 @@ set(LLVM_LINK_COMPONENTS ) 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 index 4f94ecd..e3e6fd0 100644 --- 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 @@ unittest("AArch64Tests") { ] include_dirs = [ "//llvm/lib/Target/AArch64" ] sources = [ + "AArch64InstPrinterTest.cpp", "DecomposeStackOffsetTest.cpp", "InstSizes.cpp", "MatrixRegisterAliasing.cpp", -- 2.7.4