// Copyright 2011 Google Inc. All Rights Reserved. #ifndef ART_SRC_COMPILER_H_ #define ART_SRC_COMPILER_H_ #include "compiled_method.h" #include "constants.h" #include "dex_file.h" #include "jni_compiler.h" #include "oat_file.h" #include "object.h" #include "runtime.h" #include "unordered_map.h" namespace art { class Compiler { public: explicit Compiler(InstructionSet instruction_set); ~Compiler(); // Compile all Methods of all the Classes of all the DexFiles that are part of a ClassLoader. void CompileAll(const ClassLoader* class_loader); // Compile a single Method void CompileOne(const Method* method); void SetVerbose(bool verbose) { verbose_ = verbose; } InstructionSet GetInstructionSet() const { return instruction_set_; } bool IsVerbose() const { return verbose_; } // Stub to throw AbstractMethodError static ByteArray* CreateAbstractMethodErrorStub(InstructionSet instruction_set); // Generate the trampoline that's invoked by unresolved direct methods static ByteArray* CreateResolutionStub(InstructionSet instruction_set, Runtime::TrampolineType type); const CompiledMethod* GetCompiledMethod(const Method* method) const; const CompiledInvokeStub* GetCompiledInvokeStub(const Method* method) const; private: // Attempt to resolve all type, methods, fields, and strings // referenced from code in the dex file following PathClassLoader // ordering semantics. void Resolve(const ClassLoader* class_loader); void ResolveDexFile(const ClassLoader* class_loader, const DexFile& dex_file); void Verify(const ClassLoader* class_loader); void VerifyDexFile(const ClassLoader* class_loader, const DexFile& dex_file); void InitializeClassesWithoutClinit(const ClassLoader* class_loader); void InitializeClassesWithoutClinit(const ClassLoader* class_loader, const DexFile& dex_file); void Compile(const ClassLoader* class_loader); void CompileDexFile(const ClassLoader* class_loader, const DexFile& dex_file); void CompileClass(const Class* klass); void CompileMethod(const Method* method); // After compiling, walk all the DexCaches and set the code and // method pointers of CodeAndDirectMethods entries in the DexCaches. void SetCodeAndDirectMethods(const ClassLoader* class_loader); void SetCodeAndDirectMethodsDexFile(const DexFile& dex_file); InstructionSet instruction_set_; JniCompiler jni_compiler_; typedef std::tr1::unordered_map MethodTable; MethodTable compiled_methods_; typedef std::tr1::unordered_map InvokeStubTable; InvokeStubTable compiled_invoke_stubs_; bool verbose_; DISALLOW_COPY_AND_ASSIGN(Compiler); }; } // namespace art #endif // ART_SRC_COMPILER_H_