| //===-- Passes.cpp - Target independent code generation passes ------------===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file defines interfaces to access the target independent code | |
| // generation passes provided by the LLVM backend. | |
| // | |
| //===---------------------------------------------------------------------===// | |
| #include "llvm/CodeGen/RegAllocRegistry.h" | |
| #include "llvm/CodeGen/Passes.h" | |
| using namespace llvm; | |
| //===---------------------------------------------------------------------===// | |
| /// | |
| /// RegisterRegAlloc class - Track the registration of register allocators. | |
| /// | |
| //===---------------------------------------------------------------------===// | |
| MachinePassRegistry RegisterRegAlloc::Registry; | |
| static FunctionPass *createDefaultRegisterAllocator() { return 0; } | |
| static RegisterRegAlloc | |
| defaultRegAlloc("default", | |
| "pick register allocator based on -O option", | |
| createDefaultRegisterAllocator); | |
| //===---------------------------------------------------------------------===// | |
| /// | |
| /// RegAlloc command line options. | |
| /// | |
| //===---------------------------------------------------------------------===// | |
| static cl::opt<RegisterRegAlloc::FunctionPassCtor, false, | |
| RegisterPassParser<RegisterRegAlloc> > | |
| RegAlloc("regalloc", | |
| cl::init(&createDefaultRegisterAllocator), | |
| cl::desc("Register allocator to use")); | |
| //===---------------------------------------------------------------------===// | |
| /// | |
| /// createRegisterAllocator - choose the appropriate register allocator. | |
| /// | |
| //===---------------------------------------------------------------------===// | |
| FunctionPass *llvm::createRegisterAllocator(CodeGenOpt::Level OptLevel) { | |
| RegisterRegAlloc::FunctionPassCtor Ctor = RegisterRegAlloc::getDefault(); | |
| if (!Ctor) { | |
| Ctor = RegAlloc; | |
| RegisterRegAlloc::setDefault(RegAlloc); | |
| } | |
| // This forces linking of the linear scan register allocator, | |
| // so -regalloc=linearscan still works in clang. | |
| if (Ctor == createLinearScanRegisterAllocator) | |
| return createLinearScanRegisterAllocator(); | |
| if (Ctor != createDefaultRegisterAllocator) | |
| return Ctor(); | |
| // When the 'default' allocator is requested, pick one based on OptLevel. | |
| switch (OptLevel) { | |
| case CodeGenOpt::None: | |
| return createFastRegisterAllocator(); | |
| default: | |
| return createGreedyRegisterAllocator(); | |
| } | |
| } |