| /* |
| * Copyright (C) 2011 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef ART_SRC_COMPILER_COMPILER_H_ |
| #define ART_SRC_COMPILER_COMPILER_H_ |
| |
| #include "dex_file.h" |
| #include "dex_instruction.h" |
| |
| namespace art { |
| |
| #define COMPILER_TRACED(X) |
| #define COMPILER_TRACEE(X) |
| |
| /* |
| * Special offsets to denote method entry/exit for debugger update. |
| * NOTE: bit pattern must be loadable using 1 instruction and must |
| * not be a valid Dalvik offset. |
| */ |
| #define DEBUGGER_METHOD_ENTRY -1 |
| #define DEBUGGER_METHOD_EXIT -2 |
| |
| /* |
| * Assembly is an iterative process, and usually terminates within |
| * two or three passes. This should be high enough to handle bizarre |
| * cases, but detect an infinite loop bug. |
| */ |
| #define MAX_ASSEMBLER_RETRIES 50 |
| |
| /* Suppress optimization if corresponding bit set */ |
| enum optControlVector { |
| kLoadStoreElimination = 0, |
| kLoadHoisting, |
| kSuppressLoads, |
| kNullCheckElimination, |
| kPromoteRegs, |
| kTrackLiveTemps, |
| kSkipLargeMethodOptimization, |
| kSafeOptimizations, |
| kBBOpt, |
| kMatch, |
| kPromoteCompilerTemps, |
| }; |
| |
| /* Type of allocation for memory tuning */ |
| enum oatAllocKind { |
| kAllocMisc, |
| kAllocBB, |
| kAllocLIR, |
| kAllocMIR, |
| kAllocDFInfo, |
| kAllocGrowableList, |
| kAllocGrowableBitMap, |
| kAllocDalvikToSSAMap, |
| kAllocDebugInfo, |
| kAllocSuccessor, |
| kAllocRegAlloc, |
| kAllocData, |
| kAllocPredecessors, |
| kNumAllocKinds |
| }; |
| |
| /* Type of growable list for memory tuning */ |
| enum oatListKind { |
| kListMisc = 0, |
| kListBlockList, |
| kListSSAtoDalvikMap, |
| kListDfsOrder, |
| kListDfsPostOrder, |
| kListDomPostOrderTraversal, |
| kListThrowLaunchPads, |
| kListSuspendLaunchPads, |
| kListSwitchTables, |
| kListFillArrayData, |
| kListSuccessorBlocks, |
| kListPredecessors, |
| kNumListKinds |
| }; |
| |
| /* Type of growable bitmap for memory tuning */ |
| enum oatBitMapKind { |
| kBitMapMisc = 0, |
| kBitMapUse, |
| kBitMapDef, |
| kBitMapLiveIn, |
| kBitMapBMatrix, |
| kBitMapDominators, |
| kBitMapIDominated, |
| kBitMapDomFrontier, |
| kBitMapPhi, |
| kBitMapTmpBlocks, |
| kBitMapInputBlocks, |
| kBitMapRegisterV, |
| kBitMapTempSSARegisterV, |
| kBitMapNullCheck, |
| kBitMapTmpBlockV, |
| kBitMapPredecessors, |
| kNumBitMapKinds |
| }; |
| |
| /* Force code generation paths for testing */ |
| enum debugControlVector { |
| kDebugDisplayMissingTargets, |
| kDebugVerbose, |
| kDebugDumpCFG, |
| kDebugSlowFieldPath, |
| kDebugSlowInvokePath, |
| kDebugSlowStringPath, |
| kDebugSlowTypePath, |
| kDebugSlowestFieldPath, |
| kDebugSlowestStringPath, |
| kDebugExerciseResolveMethod, |
| kDebugVerifyDataflow, |
| kDebugShowMemoryUsage, |
| kDebugShowNops, |
| kDebugCountOpcodes, |
| }; |
| |
| enum OatMethodAttributes { |
| kIsCallee = 0, /* Code is part of a callee (invoked by a hot trace) */ |
| kIsHot, /* Code is part of a hot trace */ |
| kIsLeaf, /* Method is leaf */ |
| kIsEmpty, /* Method is empty */ |
| kIsThrowFree, /* Method doesn't throw */ |
| kIsGetter, /* Method fits the getter pattern */ |
| kIsSetter, /* Method fits the setter pattern */ |
| kCannotCompile, /* Method cannot be compiled */ |
| }; |
| |
| #define METHOD_IS_CALLEE (1 << kIsCallee) |
| #define METHOD_IS_HOT (1 << kIsHot) |
| #define METHOD_IS_LEAF (1 << kIsLeaf) |
| #define METHOD_IS_EMPTY (1 << kIsEmpty) |
| #define METHOD_IS_THROW_FREE (1 << kIsThrowFree) |
| #define METHOD_IS_GETTER (1 << kIsGetter) |
| #define METHOD_IS_SETTER (1 << kIsSetter) |
| #define METHOD_CANNOT_COMPILE (1 << kCannotCompile) |
| |
| /* Customized node traversal orders for different needs */ |
| enum DataFlowAnalysisMode { |
| kAllNodes = 0, // All nodes |
| kReachableNodes, // All reachable nodes |
| kPreOrderDFSTraversal, // Depth-First-Search / Pre-Order |
| kPostOrderDFSTraversal, // Depth-First-Search / Post-Order |
| kPostOrderDOMTraversal, // Dominator tree / Post-Order |
| kReversePostOrderTraversal, // Depth-First-Search / reverse Post-Order |
| }; |
| |
| struct CompilationUnit; |
| struct BasicBlock; |
| struct SSARepresentation; |
| struct GrowableList; |
| struct MIR; |
| |
| void oatInit(CompilationUnit* cUnit, const Compiler& compiler); |
| bool oatArchInit(void); |
| bool oatStartup(void); |
| void oatShutdown(void); |
| void oatScanAllClassPointers(void (*callback)(void* ptr)); |
| void oatInitializeSSAConversion(CompilationUnit* cUnit); |
| int SRegToVReg(const CompilationUnit* cUnit, int ssaReg); |
| int SRegToSubscript(const CompilationUnit* cUnit, int ssaReg); |
| bool oatFindLocalLiveIn(CompilationUnit* cUnit, BasicBlock* bb); |
| bool oatDoSSAConversion(CompilationUnit* cUnit, BasicBlock* bb); |
| bool oatDoConstantPropagation(CompilationUnit* cUnit, BasicBlock* bb); |
| bool oatFindInductionVariables(CompilationUnit* cUnit, BasicBlock* bb); |
| /* Clear the visited flag for each BB */ |
| bool oatClearVisitedFlag(CompilationUnit* cUnit, BasicBlock* bb); |
| char* oatGetDalvikDisassembly(CompilationUnit* cUnit, const DecodedInstruction& insn, |
| const char* note); |
| char* oatFullDisassembler(CompilationUnit* cUnit, const MIR* mir); |
| char* oatGetSSAString(CompilationUnit* cUnit, SSARepresentation* ssaRep); |
| void oatDataFlowAnalysisDispatcher(CompilationUnit* cUnit, |
| bool (*func)(CompilationUnit* , BasicBlock*), |
| DataFlowAnalysisMode dfaMode, |
| bool isIterative); |
| void oatMethodSSATransformation(CompilationUnit* cUnit); |
| u8 oatGetRegResourceMask(int reg); |
| void oatDumpCFG(CompilationUnit* cUnit, const char* dirPrefix); |
| void oatProcessSwitchTables(CompilationUnit* cUnit); |
| bool oatIsFpReg(int reg); |
| uint32_t oatFpRegMask(void); |
| |
| } // namespace art |
| |
| extern "C" art::CompiledMethod* ArtCompileMethod(art::Compiler& compiler, |
| const art::DexFile::CodeItem* code_item, |
| uint32_t access_flags, uint32_t method_idx, |
| const art::ClassLoader* class_loader, |
| const art::DexFile& dex_file); |
| |
| #endif // ART_SRC_COMPILER_COMPILER_H_ |