LLVMTargetMachine.cpp revision e01eaa09c6be30497fde9bc4a8776752f27f74b6
147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner//===-- LLVMTargetMachine.cpp - Implement the LLVMTargetMachine class -----===//
247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner//
347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner//                     The LLVM Compiler Infrastructure
447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner//
547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// This file was developed by Chris Lattner and is distributed under
647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// the University of Illinois Open Source License. See LICENSE.TXT for details.
747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner//
847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner//===----------------------------------------------------------------------===//
947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner//
1047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner// This file implements the LLVMTargetMachine class.
1147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner//
1247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner//===----------------------------------------------------------------------===//
1347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
1447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include "llvm/Target/TargetMachine.h"
1547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include "llvm/PassManager.h"
1647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include "llvm/Pass.h"
1747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include "llvm/CodeGen/Passes.h"
1847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include "llvm/Target/TargetOptions.h"
1947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include "llvm/Transforms/Scalar.h"
2047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner#include <iostream>
2147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattnerusing namespace llvm;
2247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
2347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattnerbool LLVMTargetMachine::addPassesToEmitFile(FunctionPassManager &PM,
2447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner                                            std::ostream &Out,
2547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner                                            CodeGenFileType FileType,
2647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner                                            bool Fast) {
2747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Standard LLVM-Level Passes.
2847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
2947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Run loop strength reduction before anything else.
3047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (!Fast) PM.add(createLoopStrengthReducePass(getTargetLowering()));
3147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
3247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // FIXME: Implement efficient support for garbage collection intrinsics.
3347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  PM.add(createLowerGCPass());
3447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
3547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // FIXME: Implement the invoke/unwind instructions!
362a0013f59fb3b23010c0509fab8bf509eb30fb36Duraid Madina  PM.add(createLowerInvokePass(getTargetLowering()));
3747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
3847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Make sure that no unreachable blocks are instruction selected.
3947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  PM.add(createUnreachableBlockEliminationPass());
4047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
4147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
4247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Ask the target for an isel.
4347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (addInstSelector(PM, Fast))
4447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner    return true;
4547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
4647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
4747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Print the instruction selected machine code...
4847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (PrintMachineCode)
4947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner    PM.add(createMachineFunctionPrinterPass(&std::cerr));
5047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
5147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Perform register allocation to convert to a concrete x86 representation
5247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  PM.add(createRegisterAllocator());
5347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
5447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (PrintMachineCode)
5547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner    PM.add(createMachineFunctionPrinterPass(&std::cerr));
5647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
5747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
5847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Run post-ra passes.
5947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (addPostRegAlloc(PM, Fast) && PrintMachineCode)
6047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner    PM.add(createMachineFunctionPrinterPass(&std::cerr));
6147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
6247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
6347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Insert prolog/epilog code.  Eliminate abstract frame index references...
6447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  PM.add(createPrologEpilogCodeInserter());
6547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
664a84ad7a2bfd1795357776164e3bf80a2600d924Chris Lattner  // Branch folding must be run after regalloc and prolog/epilog insertion.
6762d07d6acef9f5fd807b98a509d164bd3d6f0187Jim Laskey  if (!Fast)
6862d07d6acef9f5fd807b98a509d164bd3d6f0187Jim Laskey    PM.add(createBranchFoldingPass());
699d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey
709d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey  // Fold redundant debug labels.
719d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey  PM.add(createDebugLabelFoldingPass());
724a84ad7a2bfd1795357776164e3bf80a2600d924Chris Lattner
7347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (PrintMachineCode)  // Print the register-allocated code
7447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner    PM.add(createMachineFunctionPrinterPass(&std::cerr));
7547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
7647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
7747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (addPreEmitPass(PM, Fast) && PrintMachineCode)
7847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner    PM.add(createMachineFunctionPrinterPass(&std::cerr));
7947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
8047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
8147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  switch (FileType) {
8247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner    default: return true;
8347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner    case TargetMachine::AssemblyFile:
8447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner      if (addAssemblyEmitter(PM, Fast, Out))
8547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner        return true;
8647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner      break;
8747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner    case TargetMachine::ObjectFile:
8847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner      if (addObjectWriter(PM, Fast, Out))
8947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner        return true;
9047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner      break;
9147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  }
9247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
9347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Delete machine code for this function
9447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  PM.add(createMachineCodeDeleter());
9547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
9647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  return false; // success!
9747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner}
9847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
9947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// addPassesToEmitMachineCode - Add passes to the specified pass manager to
10047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// get machine code emitted.  This uses a MachineCodeEmitter object to handle
10147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// actually outputting the machine code and resolving things like the address
10247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// of functions.  This method should returns true if machine code emission is
10347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner/// not supported.
10447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner///
10547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattnerbool LLVMTargetMachine::addPassesToEmitMachineCode(FunctionPassManager &PM,
10647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner                                                   MachineCodeEmitter &MCE,
10747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner                                                   bool Fast) {
10847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Standard LLVM-Level Passes.
10947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
11047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Run loop strength reduction before anything else.
11147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (!Fast) PM.add(createLoopStrengthReducePass(getTargetLowering()));
11247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
11347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // FIXME: Implement efficient support for garbage collection intrinsics.
11447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  PM.add(createLowerGCPass());
11547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
11647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // FIXME: Implement the invoke/unwind instructions!
1172a0013f59fb3b23010c0509fab8bf509eb30fb36Duraid Madina  PM.add(createLowerInvokePass(getTargetLowering()));
11847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
11947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Make sure that no unreachable blocks are instruction selected.
12047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  PM.add(createUnreachableBlockEliminationPass());
12147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
12247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
12347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Ask the target for an isel.
12447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (addInstSelector(PM, Fast))
12547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner    return true;
12647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
12747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
12847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Print the instruction selected machine code...
12947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (PrintMachineCode)
13047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner    PM.add(createMachineFunctionPrinterPass(&std::cerr));
13147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
13247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Perform register allocation to convert to a concrete x86 representation
13347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  PM.add(createRegisterAllocator());
13447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
13547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (PrintMachineCode)
13647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner    PM.add(createMachineFunctionPrinterPass(&std::cerr));
13747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
13847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
13947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Run post-ra passes.
14047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (addPostRegAlloc(PM, Fast) && PrintMachineCode)
14147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner    PM.add(createMachineFunctionPrinterPass(&std::cerr));
14247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
14347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
14447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Insert prolog/epilog code.  Eliminate abstract frame index references...
14547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  PM.add(createPrologEpilogCodeInserter());
14647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
14747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (PrintMachineCode)  // Print the register-allocated code
14847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner    PM.add(createMachineFunctionPrinterPass(&std::cerr));
14947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
150e01eaa09c6be30497fde9bc4a8776752f27f74b6Chris Lattner  // Branch folding must be run after regalloc and prolog/epilog insertion.
151e01eaa09c6be30497fde9bc4a8776752f27f74b6Chris Lattner  if (!Fast)
152e01eaa09c6be30497fde9bc4a8776752f27f74b6Chris Lattner    PM.add(createBranchFoldingPass());
15347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
15447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  if (addPreEmitPass(PM, Fast) && PrintMachineCode)
15547877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner    PM.add(createMachineFunctionPrinterPass(&std::cerr));
15647877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
15747877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
15847877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  addCodeEmitter(PM, Fast, MCE);
15947877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
16047877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  // Delete machine code for this function
16147877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  PM.add(createMachineCodeDeleter());
16247877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner
16347877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner  return false; // success!
16447877050e7ea02c3514497aba54eef1d4cee8452Chris Lattner}
165