llc.cpp revision cb465fc71ecb64d3d168a0cf754fa442abb0f6f9
1cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve// $Id$ 2cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve//*************************************************************************** 3cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve// File: 4cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve// llc.cpp 5cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve// 6cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve// Purpose: 7cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve// Driver for llc compiler. 8cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve// 9cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve// History: 10cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve// 7/15/01 - Vikram Adve - Created 11cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve// 12cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve//**************************************************************************/ 13cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 14cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve//************************** System Include Files **************************/ 15cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 16cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve//*************************** User Include Files ***************************/ 17cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 18cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve#include "llvm/Module.h" 19cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve#include "llvm/Method.h" 20cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve#include "llvm/Bytecode/Reader.h" 21cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve#include "llvm/Bytecode/Writer.h" 22cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve#include "llvm/Codegen/InstrForest.h" 23cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve#include "llvm/Codegen/InstrSelection.h" 24cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve#include "llvm/LLC/LLCOptions.h" 25cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve#include "llvm/LLC/CompileContext.h" 26cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 27cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve//************************** Forward Declarations **************************/ 28cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 29cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adveclass Module; 30cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adveclass CompileContext; 31cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 32cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 33cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Advestatic bool CompileModule (Module *module, 34cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve CompileContext& compileContext); 35cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 36cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adveint DebugInstrSelectLevel = DEBUG_INSTR_TREES; 37cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 38cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 39cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve//--------------------------------------------------------------------------- 40cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve// Function main() 41cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve// 42cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve// Entry point for the driver. 43cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve//--------------------------------------------------------------------------- 44cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 45cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 46cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adveint 47cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Advemain(int argc, const char** argv, const char** envp) 48cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve{ 49cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve CompileContext compileContext(argc, argv, envp); 50cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 51cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve Module *module = 52cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve ParseBytecodeFile(compileContext.getOptions().getInputFileName()); 53cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 54cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve if (module == 0) { 55cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve cerr << "bytecode didn't read correctly.\n"; 56cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve return 1; 57cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve } 58cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 59cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve bool failure = CompileModule(module, compileContext); 60cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 61cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve if (failure) 62cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve { 63cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve cerr << "Error compiling " 64cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve << compileContext.getOptions().getInputFileName() << "!\n"; 65cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve delete module; 66cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve return 1; 67cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve } 68cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 69cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve // Okay, we're done now... write out result... 70cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve // WriteBytecodeToFile(module, 71cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve // compileContext.getOptions().getOutputFileName); 72cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 73cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve // Clean up and exit 74cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve delete module; 75cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve return 0; 76cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve} 77cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 78cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 79cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Advestatic bool 80cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. AdveCompileModule(Module *module, 81cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve CompileContext& ccontext) 82cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve{ 83cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve bool failed = false; 84cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 85cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve for (Module::MethodListType::const_iterator 86cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve methodIter = module->getMethodList().begin(); 87cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve methodIter != module->getMethodList().end(); 88cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve ++methodIter) 89cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve { 90cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve Method* method = *methodIter; 91cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 92cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve if (SelectInstructionsForMethod(method, ccontext)) 93cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve { 94cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve failed = true; 95cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve cerr << "Instruction selection failed for method " 96cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve << (method->hasName()? method->getName() : "") 97cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve << endl << endl; 98cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve } 99cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve } 100cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 101cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve return failed; 102cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve} 103cb465fc71ecb64d3d168a0cf754fa442abb0f6f9Vikram S. Adve 104