[llvm-commits] CVS: llvm/lib/CodeGen/LLVMTargetMachine.cpp

Chris Lattner lattner at cs.uiuc.edu
Sun Sep 3 21:16:23 PDT 2006



Changes in directory llvm/lib/CodeGen:

LLVMTargetMachine.cpp added (r1.1)
---
Log message:

new file


---
Diffs of the changes:  (+154 -0)

 LLVMTargetMachine.cpp |  154 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 154 insertions(+)


Index: llvm/lib/CodeGen/LLVMTargetMachine.cpp
diff -c /dev/null llvm/lib/CodeGen/LLVMTargetMachine.cpp:1.1
*** /dev/null	Sun Sep  3 23:16:19 2006
--- llvm/lib/CodeGen/LLVMTargetMachine.cpp	Sun Sep  3 23:16:09 2006
***************
*** 0 ****
--- 1,154 ----
+ //===-- LLVMTargetMachine.cpp - Implement the LLVMTargetMachine class -----===//
+ //
+ //                     The LLVM Compiler Infrastructure
+ //
+ // This file was developed by Chris Lattner and is distributed under
+ // the University of Illinois Open Source License. See LICENSE.TXT for details.
+ //
+ //===----------------------------------------------------------------------===//
+ //
+ // This file implements the LLVMTargetMachine class.
+ //
+ //===----------------------------------------------------------------------===//
+ 
+ #include "llvm/Target/TargetMachine.h"
+ #include "llvm/PassManager.h"
+ #include "llvm/Pass.h"
+ #include "llvm/CodeGen/Passes.h"
+ #include "llvm/Target/TargetOptions.h"
+ #include "llvm/Transforms/Scalar.h"
+ #include <iostream>
+ using namespace llvm;
+ 
+ bool LLVMTargetMachine::addPassesToEmitFile(FunctionPassManager &PM,
+                                             std::ostream &Out,
+                                             CodeGenFileType FileType,
+                                             bool Fast) {
+   // Standard LLVM-Level Passes.
+   
+   // Run loop strength reduction before anything else.
+   if (!Fast) PM.add(createLoopStrengthReducePass(getTargetLowering()));
+   
+   // FIXME: Implement efficient support for garbage collection intrinsics.
+   PM.add(createLowerGCPass());
+   
+   // FIXME: Implement the invoke/unwind instructions!
+   PM.add(createLowerInvokePass());
+   
+   // Make sure that no unreachable blocks are instruction selected.
+   PM.add(createUnreachableBlockEliminationPass());
+   
+   
+   // Ask the target for an isel.
+   if (addInstSelector(PM, Fast))
+     return true;
+   
+   
+   // Print the instruction selected machine code...
+   if (PrintMachineCode)
+     PM.add(createMachineFunctionPrinterPass(&std::cerr));
+   
+   // Perform register allocation to convert to a concrete x86 representation
+   PM.add(createRegisterAllocator());
+   
+   if (PrintMachineCode)
+     PM.add(createMachineFunctionPrinterPass(&std::cerr));
+   
+   
+   // Run post-ra passes.
+   if (addPostRegAlloc(PM, Fast) && PrintMachineCode)
+     PM.add(createMachineFunctionPrinterPass(&std::cerr));
+   
+   
+   // Insert prolog/epilog code.  Eliminate abstract frame index references...
+   PM.add(createPrologEpilogCodeInserter());
+   
+   if (PrintMachineCode)  // Print the register-allocated code
+     PM.add(createMachineFunctionPrinterPass(&std::cerr));
+   
+   
+   if (addPreEmitPass(PM, Fast) && PrintMachineCode)
+     PM.add(createMachineFunctionPrinterPass(&std::cerr));
+   
+   
+   switch (FileType) {
+     default: return true;
+     case TargetMachine::AssemblyFile:
+       if (addAssemblyEmitter(PM, Fast, Out))
+         return true;
+       break;
+     case TargetMachine::ObjectFile:
+       if (addObjectWriter(PM, Fast, Out))
+         return true;
+       break;
+   }
+   
+   // Delete machine code for this function
+   PM.add(createMachineCodeDeleter());
+   
+   return false; // success!
+ }
+ 
+ /// addPassesToEmitMachineCode - Add passes to the specified pass manager to
+ /// get machine code emitted.  This uses a MachineCodeEmitter object to handle
+ /// actually outputting the machine code and resolving things like the address
+ /// of functions.  This method should returns true if machine code emission is
+ /// not supported.
+ ///
+ bool LLVMTargetMachine::addPassesToEmitMachineCode(FunctionPassManager &PM,
+                                                    MachineCodeEmitter &MCE,
+                                                    bool Fast) {
+   // Standard LLVM-Level Passes.
+   
+   // Run loop strength reduction before anything else.
+   if (!Fast) PM.add(createLoopStrengthReducePass(getTargetLowering()));
+   
+   // FIXME: Implement efficient support for garbage collection intrinsics.
+   PM.add(createLowerGCPass());
+   
+   // FIXME: Implement the invoke/unwind instructions!
+   PM.add(createLowerInvokePass());
+   
+   // Make sure that no unreachable blocks are instruction selected.
+   PM.add(createUnreachableBlockEliminationPass());
+   
+   
+   // Ask the target for an isel.
+   if (addInstSelector(PM, Fast))
+     return true;
+   
+   
+   // Print the instruction selected machine code...
+   if (PrintMachineCode)
+     PM.add(createMachineFunctionPrinterPass(&std::cerr));
+   
+   // Perform register allocation to convert to a concrete x86 representation
+   PM.add(createRegisterAllocator());
+   
+   if (PrintMachineCode)
+     PM.add(createMachineFunctionPrinterPass(&std::cerr));
+   
+   
+   // Run post-ra passes.
+   if (addPostRegAlloc(PM, Fast) && PrintMachineCode)
+     PM.add(createMachineFunctionPrinterPass(&std::cerr));
+   
+   
+   // Insert prolog/epilog code.  Eliminate abstract frame index references...
+   PM.add(createPrologEpilogCodeInserter());
+   
+   if (PrintMachineCode)  // Print the register-allocated code
+     PM.add(createMachineFunctionPrinterPass(&std::cerr));
+   
+   
+   if (addPreEmitPass(PM, Fast) && PrintMachineCode)
+     PM.add(createMachineFunctionPrinterPass(&std::cerr));
+   
+   
+   addCodeEmitter(PM, Fast, MCE);
+   
+   // Delete machine code for this function
+   PM.add(createMachineCodeDeleter());
+   
+   return false; // success!
+ }






More information about the llvm-commits mailing list