Index: llvm/trunk/tools/llvm-exegesis/lib/AArch64/CMakeLists.txt =================================================================== --- llvm/trunk/tools/llvm-exegesis/lib/AArch64/CMakeLists.txt +++ llvm/trunk/tools/llvm-exegesis/lib/AArch64/CMakeLists.txt @@ -0,0 +1,18 @@ +include_directories( + ${LLVM_MAIN_SRC_DIR}/lib/Target/AArch64 + ${LLVM_BINARY_DIR}/lib/Target/AArch64 + ) + +add_library(LLVMExegesisAArch64 + STATIC + Target.cpp + ) + +llvm_update_compile_flags(LLVMExegesisAArch64) +llvm_map_components_to_libnames(libs + AArch64 + Exegesis + ) + +target_link_libraries(LLVMExegesisAArch64 ${libs}) +set_target_properties(LLVMExegesisAArch64 PROPERTIES FOLDER "Libraries") Index: llvm/trunk/tools/llvm-exegesis/lib/AArch64/LLVMBuild.txt =================================================================== --- llvm/trunk/tools/llvm-exegesis/lib/AArch64/LLVMBuild.txt +++ llvm/trunk/tools/llvm-exegesis/lib/AArch64/LLVMBuild.txt @@ -0,0 +1,22 @@ +;===- ./tools/llvm-exegesis/lib/AArch64/LLVMBuild.txt ----------*- Conf -*--===; +; +; The LLVM Compiler Infrastructure +; +; This file is distributed under the University of Illinois Open Source +; License. See LICENSE.TXT for details. +; +;===------------------------------------------------------------------------===; +; +; This is an LLVMBuild description file for the components in this subdirectory. +; +; For more information on the LLVMBuild system, please see: +; +; http://llvm.org/docs/LLVMBuild.html +; +;===------------------------------------------------------------------------===; + +[component_0] +type = Library +name = ExegesisAArch64 +parent = Libraries +required_libraries = AArch64 Index: llvm/trunk/tools/llvm-exegesis/lib/AArch64/Target.cpp =================================================================== --- llvm/trunk/tools/llvm-exegesis/lib/AArch64/Target.cpp +++ llvm/trunk/tools/llvm-exegesis/lib/AArch64/Target.cpp @@ -0,0 +1,54 @@ +//===-- Target.cpp ----------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +#include "../Target.h" +#include "../Latency.h" +#include "AArch64.h" + +namespace exegesis { + +namespace { + +class AArch64LatencyBenchmarkRunner : public LatencyBenchmarkRunner { +public: + AArch64LatencyBenchmarkRunner(const LLVMState &State) + : LatencyBenchmarkRunner(State) {} + +private: + const char *getCounterName() const override { + // All AArch64 subtargets have CPU_CYCLES as the cycle counter name + return "CPU_CYCLES"; + } +}; + +class ExegesisAArch64Target : public ExegesisTarget { + bool matchesArch(llvm::Triple::ArchType Arch) const override { + return Arch == llvm::Triple::aarch64 || Arch == llvm::Triple::aarch64_be; + } + void addTargetSpecificPasses(llvm::PassManagerBase &PM) const override { + // Function return is a pseudo-instruction that needs to be expanded + PM.add(llvm::createAArch64ExpandPseudoPass()); + } + std::unique_ptr + createLatencyBenchmarkRunner(const LLVMState &State) const override { + return llvm::make_unique(State); + } +}; + +} // namespace + +static ExegesisTarget *getTheExegesisAArch64Target() { + static ExegesisAArch64Target Target; + return &Target; +} + +void InitializeAArch64ExegesisTarget() { + ExegesisTarget::registerTarget(getTheExegesisAArch64Target()); +} + +} // namespace exegesis Index: llvm/trunk/tools/llvm-exegesis/lib/CMakeLists.txt =================================================================== --- llvm/trunk/tools/llvm-exegesis/lib/CMakeLists.txt +++ llvm/trunk/tools/llvm-exegesis/lib/CMakeLists.txt @@ -2,6 +2,10 @@ add_subdirectory(X86) set(LLVM_EXEGESIS_TARGETS "${LLVM_EXEGESIS_TARGETS} X86" PARENT_SCOPE) endif() +if (LLVM_TARGETS_TO_BUILD MATCHES "AArch64") + add_subdirectory(AArch64) + set(LLVM_EXEGESIS_TARGETS "${LLVM_EXEGESIS_TARGETS} AArch64" PARENT_SCOPE) +endif() add_library(LLVMExegesis STATIC Index: llvm/trunk/unittests/tools/llvm-exegesis/AArch64/CMakeLists.txt =================================================================== --- llvm/trunk/unittests/tools/llvm-exegesis/AArch64/CMakeLists.txt +++ llvm/trunk/unittests/tools/llvm-exegesis/AArch64/CMakeLists.txt @@ -0,0 +1,21 @@ +include_directories( + ${LLVM_MAIN_SRC_DIR}/lib/Target/AArch64 + ${LLVM_BINARY_DIR}/lib/Target/AArch64 + ${LLVM_MAIN_SRC_DIR}/tools/llvm-exegesis/lib + ) + +set(LLVM_LINK_COMPONENTS + MC + MCParser + Object + Support + Symbolize + AArch64 + ) + +add_llvm_unittest(LLVMExegesisAArch64Tests + TargetTest.cpp + ) +target_link_libraries(LLVMExegesisAArch64Tests PRIVATE + LLVMExegesis + LLVMExegesisAArch64) Index: llvm/trunk/unittests/tools/llvm-exegesis/AArch64/TargetTest.cpp =================================================================== --- llvm/trunk/unittests/tools/llvm-exegesis/AArch64/TargetTest.cpp +++ llvm/trunk/unittests/tools/llvm-exegesis/AArch64/TargetTest.cpp @@ -0,0 +1,38 @@ +#include "Target.h" + +#include +#include + +#include "MCTargetDesc/AArch64MCTargetDesc.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +namespace exegesis { + +void InitializeAArch64ExegesisTarget(); + +namespace { + +using testing::Gt; +using testing::NotNull; +using testing::SizeIs; + +class AArch64TargetTest : public ::testing::Test { +protected: + AArch64TargetTest() + : Target_(ExegesisTarget::lookup(llvm::Triple("aarch64-unknown-linux"))) { + EXPECT_THAT(Target_, NotNull()); + } + static void SetUpTestCase() { InitializeAArch64ExegesisTarget(); } + + const ExegesisTarget *const Target_; +}; + +TEST_F(AArch64TargetTest, SetRegToConstant) { + // The AArch64 target currently doesn't know how to set register values + const auto Insts = Target_->setRegToConstant(llvm::AArch64::X0); + EXPECT_THAT(Insts, SizeIs(0)); +} + +} // namespace +} // namespace exegesis Index: llvm/trunk/unittests/tools/llvm-exegesis/CMakeLists.txt =================================================================== --- llvm/trunk/unittests/tools/llvm-exegesis/CMakeLists.txt +++ llvm/trunk/unittests/tools/llvm-exegesis/CMakeLists.txt @@ -23,3 +23,6 @@ if(LLVM_TARGETS_TO_BUILD MATCHES "ARM") add_subdirectory(ARM) endif() +if(LLVM_TARGETS_TO_BUILD MATCHES "AArch64") + add_subdirectory(AArch64) +endif()