1193323Sed//===-- MSP430TargetMachine.cpp - Define TargetMachine for MSP430 ---------===// 2193323Sed// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6193323Sed// 7193323Sed//===----------------------------------------------------------------------===// 8193323Sed// 9193323Sed// Top-level implementation for the MSP430 target. 10193323Sed// 11193323Sed//===----------------------------------------------------------------------===// 12193323Sed 13234353Sdim#include "MSP430TargetMachine.h" 14193323Sed#include "MSP430.h" 15353358Sdim#include "TargetInfo/MSP430TargetInfo.h" 16193323Sed#include "llvm/CodeGen/Passes.h" 17280031Sdim#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" 18309124Sdim#include "llvm/CodeGen/TargetPassConfig.h" 19288943Sdim#include "llvm/IR/LegacyPassManager.h" 20198090Srdivacky#include "llvm/MC/MCAsmInfo.h" 21226633Sdim#include "llvm/Support/TargetRegistry.h" 22193323Sedusing namespace llvm; 23193323Sed 24360784Sdimextern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeMSP430Target() { 25198090Srdivacky // Register the target. 26314564Sdim RegisterTargetMachine<MSP430TargetMachine> X(getTheMSP430Target()); 27198090Srdivacky} 28193323Sed 29309124Sdimstatic Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM) { 30309124Sdim if (!RM.hasValue()) 31309124Sdim return Reloc::Static; 32309124Sdim return *RM; 33309124Sdim} 34309124Sdim 35321369Sdimstatic std::string computeDataLayout(const Triple &TT, StringRef CPU, 36321369Sdim const TargetOptions &Options) { 37321369Sdim return "e-m:e-p:16:16-i32:16-i64:16-f32:16-f64:16-a:8-n8:16-S16"; 38321369Sdim} 39321369Sdim 40288943SdimMSP430TargetMachine::MSP430TargetMachine(const Target &T, const Triple &TT, 41276479Sdim StringRef CPU, StringRef FS, 42234353Sdim const TargetOptions &Options, 43309124Sdim Optional<Reloc::Model> RM, 44327952Sdim Optional<CodeModel::Model> CM, 45327952Sdim CodeGenOpt::Level OL, bool JIT) 46321369Sdim : LLVMTargetMachine(T, computeDataLayout(TT, CPU, Options), TT, CPU, FS, 47327952Sdim Options, getEffectiveRelocModel(RM), 48344779Sdim getEffectiveCodeModel(CM, CodeModel::Small), OL), 49360784Sdim TLOF(std::make_unique<TargetLoweringObjectFileELF>()), 50276479Sdim Subtarget(TT, CPU, FS, *this) { 51261991Sdim initAsmInfo(); 52261991Sdim} 53193323Sed 54280031SdimMSP430TargetMachine::~MSP430TargetMachine() {} 55280031Sdim 56234353Sdimnamespace { 57234353Sdim/// MSP430 Code Generator Pass Configuration Options. 58234353Sdimclass MSP430PassConfig : public TargetPassConfig { 59234353Sdimpublic: 60321369Sdim MSP430PassConfig(MSP430TargetMachine &TM, PassManagerBase &PM) 61234353Sdim : TargetPassConfig(TM, PM) {} 62193323Sed 63234353Sdim MSP430TargetMachine &getMSP430TargetMachine() const { 64234353Sdim return getTM<MSP430TargetMachine>(); 65234353Sdim } 66234353Sdim 67276479Sdim bool addInstSelector() override; 68280031Sdim void addPreEmitPass() override; 69234353Sdim}; 70234353Sdim} // namespace 71234353Sdim 72234353SdimTargetPassConfig *MSP430TargetMachine::createPassConfig(PassManagerBase &PM) { 73321369Sdim return new MSP430PassConfig(*this, PM); 74234353Sdim} 75234353Sdim 76234353Sdimbool MSP430PassConfig::addInstSelector() { 77193323Sed // Install an instruction selector. 78239462Sdim addPass(createMSP430ISelDag(getMSP430TargetMachine(), getOptLevel())); 79193323Sed return false; 80193323Sed} 81193323Sed 82280031Sdimvoid MSP430PassConfig::addPreEmitPass() { 83202878Srdivacky // Must run branch selection immediately preceding the asm printer. 84280031Sdim addPass(createMSP430BranchSelectionPass(), false); 85202878Srdivacky} 86