blob: 3b316ebaf9f41d374e6983e2e5597c464a133669 [file] [log] [blame]
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
3#ifndef ART_SRC_COMPILER_H_
4#define ART_SRC_COMPILER_H_
5
Ian Rogers2c8f6532011-09-02 17:16:34 -07006#include "constants.h"
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -07007#include "dex_file.h"
Ian Rogers2c8f6532011-09-02 17:16:34 -07008#include "jni_compiler.h"
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -07009#include "object.h"
10
Ian Rogersd6b1f612011-09-27 13:38:14 -070011int oatVRegOffsetFromMethod(art::Method* method, int reg);
12
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -070013namespace art {
14
15class Compiler {
16 public:
Shih-wei Liaoc486c112011-09-13 16:43:52 -070017 explicit Compiler(InstructionSet insns);
Ian Rogers2c8f6532011-09-02 17:16:34 -070018
Brian Carlstrom8a487412011-08-29 20:08:52 -070019 // Compile all Methods of all the Classes of all the DexFiles that are part of a ClassLoader.
20 void CompileAll(const ClassLoader* class_loader);
21
22 // Compile a single Method
23 void CompileOne(Method* method);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -070024
Brian Carlstrom16192862011-09-12 17:50:06 -070025 void SetVerbose(bool verbose) {
26 verbose_ = verbose;
27 }
28
29 bool IsVerbose() const {
30 return verbose_;
31 }
32
Brian Carlstrome24fa612011-09-29 00:53:55 -070033 // Stub to throw AbstractMethodError
Brian Carlstrome24fa612011-09-29 00:53:55 -070034 static ByteArray* CreateAbstractMethodErrorStub(InstructionSet instruction_set);
35
Ian Rogersad25ac52011-10-04 19:13:33 -070036 // Generate the trampoline that's invoked by unresolved direct methods
37 static ByteArray* CreateResolutionStub(InstructionSet instruction_set, bool is_static);
38
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -070039 private:
40 // Attempt to resolve all type, methods, fields, and strings
41 // referenced from code in the dex file following PathClassLoader
42 // ordering semantics.
43 void Resolve(const ClassLoader* class_loader);
44 void ResolveDexFile(const ClassLoader* class_loader, const DexFile& dex_file);
45
jeffhao98eacac2011-09-14 16:11:53 -070046 void Verify(const ClassLoader* class_loader);
47 void VerifyDexFile(const ClassLoader* class_loader, const DexFile& dex_file);
48
Brian Carlstroma5a97a22011-09-15 14:08:49 -070049 void InitializeClassesWithoutClinit(const ClassLoader* class_loader);
50 void InitializeClassesWithoutClinit(const ClassLoader* class_loader, const DexFile& dex_file);
51
Brian Carlstrom83db7722011-08-26 17:32:56 -070052 void Compile(const ClassLoader* class_loader);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -070053 void CompileDexFile(const ClassLoader* class_loader, const DexFile& dex_file);
54 void CompileClass(Class* klass);
55 void CompileMethod(Method* klass);
Brian Carlstrom83db7722011-08-26 17:32:56 -070056
57 // After compiling, walk all the DexCaches and set the code and
Brian Carlstrom9cc262e2011-08-28 12:45:30 -070058 // method pointers of CodeAndDirectMethods entries in the DexCaches.
59 void SetCodeAndDirectMethods(const ClassLoader* class_loader);
Brian Carlstrom8a487412011-08-29 20:08:52 -070060 void SetCodeAndDirectMethodsDexFile(const DexFile& dex_file);
Ian Rogers2c8f6532011-09-02 17:16:34 -070061
62 InstructionSet instruction_set_;
63 JniCompiler jni_compiler_;
64
Brian Carlstrom16192862011-09-12 17:50:06 -070065 bool verbose_;
66
Ian Rogers2c8f6532011-09-02 17:16:34 -070067 DISALLOW_COPY_AND_ASSIGN(Compiler);
Brian Carlstrom9ea1cb12011-08-24 23:18:18 -070068};
69
70} // namespace art
71
72#endif // ART_SRC_COMPILER_H_