Home | History | Annotate | Download | only in dex
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ART_COMPILER_DEX_FRONTEND_H_
     18 #define ART_COMPILER_DEX_FRONTEND_H_
     19 
     20 #include "dex_file.h"
     21 #include "invoke_type.h"
     22 
     23 namespace llvm {
     24   class Module;
     25   class LLVMContext;
     26 }
     27 
     28 namespace art {
     29 namespace llvm {
     30   class IntrinsicHelper;
     31   class IRBuilder;
     32 }
     33 
     34 /*
     35  * Assembly is an iterative process, and usually terminates within
     36  * two or three passes.  This should be high enough to handle bizarre
     37  * cases, but detect an infinite loop bug.
     38  */
     39 #define MAX_ASSEMBLER_RETRIES 50
     40 
     41 // Suppress optimization if corresponding bit set.
     42 enum opt_control_vector {
     43   kLoadStoreElimination = 0,
     44   kLoadHoisting,
     45   kSuppressLoads,
     46   kNullCheckElimination,
     47   kClassInitCheckElimination,
     48   kGlobalValueNumbering,
     49   kPromoteRegs,
     50   kTrackLiveTemps,
     51   kSafeOptimizations,
     52   kBBOpt,
     53   kMatch,
     54   kPromoteCompilerTemps,
     55   kBranchFusing,
     56   kSuppressExceptionEdges,
     57   kSuppressMethodInlining,
     58 };
     59 
     60 // Force code generation paths for testing.
     61 enum debugControlVector {
     62   kDebugVerbose,
     63   kDebugDumpCFG,
     64   kDebugSlowFieldPath,
     65   kDebugSlowInvokePath,
     66   kDebugSlowStringPath,
     67   kDebugSlowTypePath,
     68   kDebugSlowestFieldPath,
     69   kDebugSlowestStringPath,
     70   kDebugExerciseResolveMethod,
     71   kDebugVerifyDataflow,
     72   kDebugShowMemoryUsage,
     73   kDebugShowNops,
     74   kDebugCountOpcodes,
     75   kDebugDumpCheckStats,
     76   kDebugDumpBitcodeFile,
     77   kDebugVerifyBitcode,
     78   kDebugShowSummaryMemoryUsage,
     79   kDebugShowFilterStats,
     80   kDebugTimings,
     81   kDebugCodegenDump
     82 };
     83 
     84 class LLVMInfo {
     85   public:
     86     LLVMInfo();
     87     ~LLVMInfo();
     88 
     89     ::llvm::LLVMContext* GetLLVMContext() {
     90       return llvm_context_.get();
     91     }
     92 
     93     ::llvm::Module* GetLLVMModule() {
     94       return llvm_module_;
     95     }
     96 
     97     art::llvm::IntrinsicHelper* GetIntrinsicHelper() {
     98       return intrinsic_helper_.get();
     99     }
    100 
    101     art::llvm::IRBuilder* GetIRBuilder() {
    102       return ir_builder_.get();
    103     }
    104 
    105   private:
    106     std::unique_ptr< ::llvm::LLVMContext> llvm_context_;
    107     ::llvm::Module* llvm_module_;  // Managed by context_.
    108     std::unique_ptr<art::llvm::IntrinsicHelper> intrinsic_helper_;
    109     std::unique_ptr<art::llvm::IRBuilder> ir_builder_;
    110 };
    111 
    112 class CompiledMethod;
    113 class CompilerDriver;
    114 
    115 }  // namespace art
    116 
    117 extern "C" art::CompiledMethod* ArtCompileMethod(art::CompilerDriver& driver,
    118                                                  const art::DexFile::CodeItem* code_item,
    119                                                  uint32_t access_flags,
    120                                                  art::InvokeType invoke_type,
    121                                                  uint16_t class_def_idx,
    122                                                  uint32_t method_idx,
    123                                                  jobject class_loader,
    124                                                  const art::DexFile& dex_file);
    125 
    126 
    127 
    128 #endif  // ART_COMPILER_DEX_FRONTEND_H_
    129