forked from OSchip/llvm-project
[llvm-exegesis] Add an AArch64 target
The target does just enough to be able to run llvm-exegesis in latency mode for at least some opcodes. Differential Revision: https://reviews.llvm.org/D48780 llvm-svn: 336187
This commit is contained in:
parent
7fc8543208
commit
c4ed60042f
|
@ -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")
|
|
@ -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
|
|
@ -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<BenchmarkRunner>
|
||||
createLatencyBenchmarkRunner(const LLVMState &State) const override {
|
||||
return llvm::make_unique<AArch64LatencyBenchmarkRunner>(State);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
static ExegesisTarget *getTheExegesisAArch64Target() {
|
||||
static ExegesisAArch64Target Target;
|
||||
return &Target;
|
||||
}
|
||||
|
||||
void InitializeAArch64ExegesisTarget() {
|
||||
ExegesisTarget::registerTarget(getTheExegesisAArch64Target());
|
||||
}
|
||||
|
||||
} // namespace exegesis
|
|
@ -2,6 +2,10 @@ if (LLVM_TARGETS_TO_BUILD MATCHES "X86")
|
|||
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
|
||||
|
|
|
@ -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)
|
|
@ -0,0 +1,38 @@
|
|||
#include "Target.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <memory>
|
||||
|
||||
#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
|
|
@ -23,3 +23,6 @@ endif()
|
|||
if(LLVM_TARGETS_TO_BUILD MATCHES "ARM")
|
||||
add_subdirectory(ARM)
|
||||
endif()
|
||||
if(LLVM_TARGETS_TO_BUILD MATCHES "AArch64")
|
||||
add_subdirectory(AArch64)
|
||||
endif()
|
||||
|
|
Loading…
Reference in New Issue