Path: blob/main/contrib/llvm-project/llvm/lib/Target/Lanai/LanaiTargetMachine.cpp
35271 views
//===-- LanaiTargetMachine.cpp - Define TargetMachine for Lanai ---------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// Implements the info about Lanai target spec.9//10//===----------------------------------------------------------------------===//1112#include "LanaiTargetMachine.h"1314#include "Lanai.h"15#include "LanaiMachineFunctionInfo.h"16#include "LanaiTargetObjectFile.h"17#include "LanaiTargetTransformInfo.h"18#include "TargetInfo/LanaiTargetInfo.h"19#include "llvm/Analysis/TargetTransformInfo.h"20#include "llvm/CodeGen/Passes.h"21#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"22#include "llvm/CodeGen/TargetPassConfig.h"23#include "llvm/MC/TargetRegistry.h"24#include "llvm/Support/FormattedStream.h"25#include "llvm/Target/TargetOptions.h"26#include <optional>2728using namespace llvm;2930namespace llvm {31void initializeLanaiMemAluCombinerPass(PassRegistry &);32} // namespace llvm3334extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeLanaiTarget() {35// Register the target.36RegisterTargetMachine<LanaiTargetMachine> registered_target(37getTheLanaiTarget());38PassRegistry &PR = *PassRegistry::getPassRegistry();39initializeLanaiDAGToDAGISelLegacyPass(PR);40}4142static std::string computeDataLayout() {43// Data layout (keep in sync with clang/lib/Basic/Targets.cpp)44return "E" // Big endian45"-m:e" // ELF name manging46"-p:32:32" // 32-bit pointers, 32 bit aligned47"-i64:64" // 64 bit integers, 64 bit aligned48"-a:0:32" // 32 bit alignment of objects of aggregate type49"-n32" // 32 bit native integer width50"-S64"; // 64 bit natural stack alignment51}5253static Reloc::Model getEffectiveRelocModel(std::optional<Reloc::Model> RM) {54return RM.value_or(Reloc::PIC_);55}5657LanaiTargetMachine::LanaiTargetMachine(58const Target &T, const Triple &TT, StringRef Cpu, StringRef FeatureString,59const TargetOptions &Options, std::optional<Reloc::Model> RM,60std::optional<CodeModel::Model> CodeModel, CodeGenOptLevel OptLevel,61bool JIT)62: LLVMTargetMachine(T, computeDataLayout(), TT, Cpu, FeatureString, Options,63getEffectiveRelocModel(RM),64getEffectiveCodeModel(CodeModel, CodeModel::Medium),65OptLevel),66Subtarget(TT, Cpu, FeatureString, *this, Options, getCodeModel(),67OptLevel),68TLOF(new LanaiTargetObjectFile()) {69initAsmInfo();70}7172TargetTransformInfo73LanaiTargetMachine::getTargetTransformInfo(const Function &F) const {74return TargetTransformInfo(LanaiTTIImpl(this, F));75}7677MachineFunctionInfo *LanaiTargetMachine::createMachineFunctionInfo(78BumpPtrAllocator &Allocator, const Function &F,79const TargetSubtargetInfo *STI) const {80return LanaiMachineFunctionInfo::create<LanaiMachineFunctionInfo>(Allocator,81F, STI);82}8384namespace {85// Lanai Code Generator Pass Configuration Options.86class LanaiPassConfig : public TargetPassConfig {87public:88LanaiPassConfig(LanaiTargetMachine &TM, PassManagerBase *PassManager)89: TargetPassConfig(TM, *PassManager) {}9091LanaiTargetMachine &getLanaiTargetMachine() const {92return getTM<LanaiTargetMachine>();93}9495void addIRPasses() override;96bool addInstSelector() override;97void addPreSched2() override;98void addPreEmitPass() override;99};100} // namespace101102TargetPassConfig *103LanaiTargetMachine::createPassConfig(PassManagerBase &PassManager) {104return new LanaiPassConfig(*this, &PassManager);105}106107void LanaiPassConfig::addIRPasses() {108addPass(createAtomicExpandLegacyPass());109110TargetPassConfig::addIRPasses();111}112113// Install an instruction selector pass.114bool LanaiPassConfig::addInstSelector() {115addPass(createLanaiISelDag(getLanaiTargetMachine()));116return false;117}118119// Implemented by targets that want to run passes immediately before120// machine code is emitted.121void LanaiPassConfig::addPreEmitPass() {122addPass(createLanaiDelaySlotFillerPass(getLanaiTargetMachine()));123}124125// Run passes after prolog-epilog insertion and before the second instruction126// scheduling pass.127void LanaiPassConfig::addPreSched2() {128addPass(createLanaiMemAluCombinerPass());129}130131132