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