LLVMTargetMachine.cpp revision 3988226d5d4559c6518793c6aeb25b12c89dac47
18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//===-- LLVMTargetMachine.cpp - Implement the LLVMTargetMachine class -----===// 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// The LLVM Compiler Infrastructure 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// This file is distributed under the University of Illinois Open Source 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// License. See LICENSE.TXT for details. 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// 85d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner//===----------------------------------------------------------------------===// 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// This file implements the LLVMTargetMachine class. 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//===----------------------------------------------------------------------===// 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "llvm/Target/TargetMachine.h" 155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "llvm/PassManager.h" 165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "llvm/Pass.h" 175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "llvm/Assembly/PrintModulePass.h" 185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "llvm/Analysis/LoopPass.h" 195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "llvm/CodeGen/Passes.h" 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "llvm/Target/TargetOptions.h" 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "llvm/Transforms/Scalar.h" 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "llvm/Support/CommandLine.h" 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectusing namespace llvm; 245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic cl::opt<bool> PrintLSR("print-lsr-output", cl::Hidden, 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cl::desc("Print LLVM IR produced by the loop-reduce pass")); 275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic cl::opt<bool> PrintISelInput("print-isel-input", cl::Hidden, 285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner cl::desc("Print LLVM IR input to isel pass")); 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic cl::opt<bool> PrintEmittedAsm("print-emitted-asm", cl::Hidden, 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project cl::desc("Dump emitter generated instructions as assembly")); 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// Hidden options to help debugging 335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic cl::opt<bool> 345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerEnableSinking("enable-sinking", cl::init(false), cl::Hidden, 355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner cl::desc("Perform sinking on machine code")); 365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectFileModel::Model 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectLLVMTargetMachine::addPassesToEmitFile(FunctionPassManager &PM, 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project std::ostream &Out, 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CodeGenFileType FileType, 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool Fast) { 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Standard LLVM-Level Passes. 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Run loop strength reduction before anything else. 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!Fast) { 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createLoopStrengthReducePass(getTargetLowering())); 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (PrintLSR) 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(new PrintFunctionPass("\n\n*** Code after LSR *** \n", &cerr)); 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner // FIXME: Implement efficient support for garbage collection intrinsics. 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createLowerGCPass()); 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!ExceptionHandling) 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createLowerInvokePass(getTargetLowering())); 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Make sure that no unreachable blocks are instruction selected. 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createUnreachableBlockEliminationPass()); 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!Fast) 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createCodeGenPreparePass(getTargetLowering())); 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (PrintISelInput) 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(new PrintFunctionPass("\n\n*** Final LLVM Code input to ISel *** \n", 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &cerr)); 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Ask the target for an isel. 695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (addInstSelector(PM, Fast)) 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return FileModel::Error; 715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Print the instruction selected machine code... 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (PrintMachineCode) 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createMachineFunctionPrinterPass(cerr)); 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createMachineLICMPass()); 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (EnableSinking) 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createMachineSinkingPass()); 805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Perform register allocation to convert to a concrete x86 representation 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createRegisterAllocator()); 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (PrintMachineCode) 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createMachineFunctionPrinterPass(cerr)); 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createLowerSubregsPass()); 885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (PrintMachineCode) // Print the subreg lowered code 905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner PM.add(createMachineFunctionPrinterPass(cerr)); 915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner // Run post-ra passes. 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (addPostRegAlloc(PM, Fast) && PrintMachineCode) 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createMachineFunctionPrinterPass(cerr)); 955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Insert prolog/epilog code. Eliminate abstract frame index references... 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createPrologEpilogCodeInserter()); 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Second pass scheduler. 1005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!Fast) 1015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner PM.add(createPostRAScheduler()); 1025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Branch folding must be run after regalloc and prolog/epilog insertion. 1045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!Fast) 1055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner PM.add(createBranchFoldingPass(getEnableTailMergeDefault())); 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Fold redundant debug labels. 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createDebugLabelFoldingPass()); 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (PrintMachineCode) // Print the register-allocated code 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createMachineFunctionPrinterPass(cerr)); 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (addPreEmitPass(PM, Fast) && PrintMachineCode) 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createMachineFunctionPrinterPass(cerr)); 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (FileType) { 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TargetMachine::AssemblyFile: 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (addAssemblyEmitter(PM, Fast, Out)) 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return FileModel::Error; 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return FileModel::AsmFile; 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TargetMachine::ObjectFile: 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (getMachOWriterInfo()) 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return FileModel::MachOFile; 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (getELFWriterInfo()) 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return FileModel::ElfFile; 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return FileModel::Error; 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// addPassesToEmitFileFinish - If the passes to emit the specified file had to 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// be split up (e.g., to add an object writer pass), this method can be used to 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// finish up adding passes to emit the file, if necessary. 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool LLVMTargetMachine::addPassesToEmitFileFinish(FunctionPassManager &PM, 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project MachineCodeEmitter *MCE, 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool Fast) { 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (MCE) 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project addSimpleCodeEmitter(PM, Fast, PrintEmittedAsm, *MCE); 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Delete machine code for this function 1435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner PM.add(createMachineCodeDeleter()); 1445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return false; // success! 1465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 1475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/// addPassesToEmitMachineCode - Add passes to the specified pass manager to 1495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/// get machine code emitted. This uses a MachineCodeEmitter object to handle 1505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/// actually outputting the machine code and resolving things like the address 1515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/// of functions. This method should returns true if machine code emission is 1525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/// not supported. 1535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/// 1545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerbool LLVMTargetMachine::addPassesToEmitMachineCode(FunctionPassManager &PM, 1555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner MachineCodeEmitter &MCE, 1565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bool Fast) { 1575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner // Standard LLVM-Level Passes. 1585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner // Run loop strength reduction before anything else. 1605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!Fast) { 1615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner PM.add(createLoopStrengthReducePass(getTargetLowering())); 1625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (PrintLSR) 1635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner PM.add(new PrintFunctionPass("\n\n*** Code after LSR *** \n", &cerr)); 1645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 1655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner // FIXME: Implement efficient support for garbage collection intrinsics. 1675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner PM.add(createLowerGCPass()); 1685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // FIXME: Implement the invoke/unwind instructions! 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createLowerInvokePass(getTargetLowering())); 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Make sure that no unreachable blocks are instruction selected. 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createUnreachableBlockEliminationPass()); 1745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!Fast) 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createCodeGenPreparePass(getTargetLowering())); 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (PrintISelInput) 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(new PrintFunctionPass("\n\n*** Final LLVM Code input to ISel *** \n", 1805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner &cerr)); 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Ask the target for an isel. 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (addInstSelector(PM, Fast)) 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Print the instruction selected machine code... 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (PrintMachineCode) 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createMachineFunctionPrinterPass(cerr)); 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createMachineLICMPass()); 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Perform register allocation to convert to a concrete x86 representation 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createRegisterAllocator()); 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (PrintMachineCode) 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createMachineFunctionPrinterPass(cerr)); 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createLowerSubregsPass()); 1995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (PrintMachineCode) // Print the subreg lowered code 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createMachineFunctionPrinterPass(cerr)); 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Run post-ra passes. 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (addPostRegAlloc(PM, Fast) && PrintMachineCode) 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createMachineFunctionPrinterPass(cerr)); 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Insert prolog/epilog code. Eliminate abstract frame index references... 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createPrologEpilogCodeInserter()); 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (PrintMachineCode) // Print the register-allocated code 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PM.add(createMachineFunctionPrinterPass(cerr)); 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Second pass scheduler. 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!Fast) 2155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner PM.add(createPostRAScheduler()); 2165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner // Branch folding must be run after regalloc and prolog/epilog insertion. 2185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!Fast) 2195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner PM.add(createBranchFoldingPass(getEnableTailMergeDefault())); 2205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (addPreEmitPass(PM, Fast) && PrintMachineCode) 2225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner PM.add(createMachineFunctionPrinterPass(cerr)); 2235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner addCodeEmitter(PM, Fast, PrintEmittedAsm, MCE); 2255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner // Delete machine code for this function 2275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner PM.add(createMachineCodeDeleter()); 2285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return false; // success! 2305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 2315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner