//===-- AlphaTargetMachine.cpp - Define TargetMachine for Alpha -----------===// // // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // //===----------------------------------------------------------------------===// #include "Alpha.h" #include "AlphaTargetMachine.h" #include "llvm/Module.h" #include "llvm/CodeGen/Passes.h" #include "llvm/Target/TargetOptions.h" #include "llvm/Target/TargetMachineRegistry.h" #include "llvm/Transforms/Scalar.h" #include using namespace llvm; namespace { // Register the targets RegisterTarget X("alpha", " Alpha (incomplete)"); } namespace llvm { cl::opt EnableAlphaLSR("enable-lsr-for-alpha", cl::desc("Enable LSR for Alpha (beta option!)"), cl::Hidden); } unsigned AlphaTargetMachine::getModuleMatchQuality(const Module &M) { // We strongly match "alpha*". std::string TT = M.getTargetTriple(); if (TT.size() >= 5 && TT[0] == 'a' && TT[1] == 'l' && TT[2] == 'p' && TT[3] == 'h' && TT[4] == 'a') return 20; if (M.getEndianness() == Module::LittleEndian && M.getPointerSize() == Module::Pointer64) return 10; // Weak match else if (M.getEndianness() != Module::AnyEndianness || M.getPointerSize() != Module::AnyPointerSize) return 0; // Match for some other target return 0; } AlphaTargetMachine::AlphaTargetMachine( const Module &M, IntrinsicLowering *IL) : TargetMachine("alpha", IL, true), FrameInfo(TargetFrameInfo::StackGrowsDown, 8, 0) //TODO: check these {} /// addPassesToEmitAssembly - Add passes to the specified pass manager /// to implement a static compiler for this target. /// bool AlphaTargetMachine::addPassesToEmitAssembly(PassManager &PM, std::ostream &Out) { if (EnableAlphaLSR) { PM.add(createLoopStrengthReducePass()); PM.add(createCFGSimplificationPass()); } // FIXME: Implement efficient support for garbage collection intrinsics. PM.add(createLowerGCPass()); // FIXME: Implement the invoke/unwind instructions! PM.add(createLowerInvokePass()); // FIXME: Implement the switch instruction in the instruction selector! PM.add(createLowerSwitchPass()); // Make sure that no unreachable blocks are instruction selected. PM.add(createUnreachableBlockEliminationPass()); PM.add(createAlphaPatternInstructionSelector(*this)); if (PrintMachineCode) PM.add(createMachineFunctionPrinterPass(&std::cerr)); PM.add(createRegisterAllocator()); if (PrintMachineCode) PM.add(createMachineFunctionPrinterPass(&std::cerr)); PM.add(createPrologEpilogCodeInserter()); // Must run branch selection immediately preceding the asm printer //PM.add(createAlphaBranchSelectionPass()); PM.add(createAlphaCodePrinterPass(Out, *this)); PM.add(createMachineCodeDeleter()); return false; }