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