/* * 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_ #define COMPILER_TRACED(X) #define COMPILER_TRACEE(X) typedef enum OatInstructionSetType { DALVIK_OAT_NONE = 0, DALVIK_OAT_ARM, DALVIK_OAT_THUMB2, } OatInstructionSetType; typedef 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 */ } OatMethodAttributes; #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 */ typedef 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 } DataFlowAnalysisMode; struct CompilationUnit; struct BasicBlock; struct SSARepresentation; struct GrowableList; struct MIR; void oatInit(const Compiler& compiler); bool oatArchInit(void); void oatArchDump(void); bool oatStartup(void); void oatShutdown(void); bool oatCompileMethod(const Compiler& compiler, Method* method, OatInstructionSetType); void oatDumpStats(void); void oatScanAllClassPointers(void (*callback)(void* ptr)); void oatInitializeSSAConversion(struct CompilationUnit* cUnit); int oatConvertSSARegToDalvik(const struct CompilationUnit* cUnit, int ssaReg); bool oatFindLocalLiveIn(struct CompilationUnit* cUnit, struct BasicBlock* bb); bool oatDoSSAConversion(struct CompilationUnit* cUnit, struct BasicBlock* bb); bool oatDoConstantPropagation(struct CompilationUnit* cUnit, struct BasicBlock* bb); bool oatFindInductionVariables(struct CompilationUnit* cUnit, struct BasicBlock* bb); /* Clear the visited flag for each BB */ bool oatClearVisitedFlag(struct CompilationUnit* cUnit, struct BasicBlock* bb); char *oatGetDalvikDisassembly(const DecodedInstruction* insn, const char* note); char *oatFullDisassembler(const struct CompilationUnit* cUnit, const struct MIR* mir); char *oatGetSSAString(struct CompilationUnit* cUnit, struct SSARepresentation* ssaRep); void oatDataFlowAnalysisDispatcher(struct CompilationUnit* cUnit, bool (*func)(struct CompilationUnit* , struct BasicBlock*), DataFlowAnalysisMode dfaMode, bool isIterative); void oatMethodSSATransformation(struct CompilationUnit* cUnit); u8 oatGetRegResourceMask(int reg); void oatDumpCFG(struct CompilationUnit* cUnit, const char* dirPrefix); void oatProcessSwitchTables(CompilationUnit* cUnit); #endif // ART_SRC_COMPILER_COMPILER_H_