/*
* Copyright (C) 2010 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.
*/
#include "Dalvik.h"
#include "libdex/DexOpcodes.h"
#include "../../CompilerInternals.h"
#include "X86LIR.h"
#include "Codegen.h"
#include <sys/mman.h> /* for protection change */
#define MAX_ASSEMBLER_RETRIES 10
/* Track the number of times that the code cache is patched */
#if defined(WITH_JIT_TUNING)
#define UPDATE_CODE_CACHE_PATCHES() (gDvmJit.codeCachePatches++)
#else
#define UPDATE_CODE_CACHE_PATCHES()
#endif
/*
* Translation layout in the code cache. Note that the codeAddress pointer
* in JitTable will point directly to the code body (field codeAddress). The
* chain cell offset codeAddress - 2, and (if present) executionCount is at
* codeAddress - 6.
*
* +----------------------------+
* | Execution count | -> [Optional] 4 bytes
* +----------------------------+
* +--| Offset to chain cell counts| -> 2 bytes
* | +----------------------------+
* | | Code body | -> Start address for translation
* | | | variable in 2-byte chunks
* | . . (JitTable's codeAddress points here)
* | . .
* | | |
* | +----------------------------+
* | | Chaining Cells | -> 16 bytes each, 8 byte aligned
* | . .
* | . .
* | | |
* | +----------------------------+
* | | Gap for large switch stmt | -> # cases >= MAX_CHAINED_SWITCH_CASES
* | +----------------------------+
* +->| Chaining cell counts | -> 8 bytes, chain cell counts by type
* +----------------------------+
* | Trace description | -> variable sized
* . .
* | |
* +----------------------------+
* | Literal pool | -> 4-byte aligned, variable size
* . . Note: for x86 literals will
* . . generally appear inline.
* | |
* +----------------------------+
*
* Go over each instruction in the list and calculate the offset from the top
* before sending them off to the assembler. If out-of-range branch distance is
* seen rearrange the instructions a bit to correct it.
*/
void dvmCompilerAssembleLIR(CompilationUnit *cUnit, JitTranslationInfo *info)
{
}
/*
* Perform translation chain operation.
*/
void* dvmJitChain(void* tgtAddr, u4* branchAddr)
{
return 0;
}
/*
* This method is called from the invoke templates for virtual and interface
* methods to speculatively setup a chain to the callee. The templates are
* written in assembly and have setup method, cell, and clazz at r0, r2, and
* r3 respectively, so there is a unused argument in the list. Upon return one
* of the following three results may happen:
* 1) Chain is not setup because the callee is native. Reset the rechain
* count to a big number so that it will take a long time before the next
* rechain attempt to happen.
* 2) Chain is not setup because the callee has not been created yet. Reset
* the rechain count to a small number and retry in the near future.
* 3) Enqueue the new content for the chaining cell which will be appled in
* next safe point.
*/
const Method *dvmJitToPatchPredictedChain(const Method *method,
Thread *self,
PredictedChainingCell *cell,
const ClassObject *clazz)
{
return 0;
}
/*
* Patch the inline cache content based on the content passed from the work
* order.
*/
void dvmCompilerPatchInlineCache(void)
{
}
/*
* Unchain a trace given the starting address of the translation
* in the code cache. Refer to the diagram in dvmCompilerAssembleLIR.
* Returns the address following the last cell unchained. Note that
* the incoming codeAddr is a thumb code address, and therefore has
* the low bit set.
*/
u4* dvmJitUnchain(void* codeAddr)
{
return 0;
}
/* Unchain all translation in the cache. */
void dvmJitUnchainAll()
{
}
/* Create a copy of the trace descriptor of an existing compilation */
JitTraceDescription *dvmCopyTraceDescriptor(const u2 *pc,
const JitEntry *knownEntry)
{
return 0;
}
/* Sort the trace profile counts and dump them */
void dvmCompilerSortAndPrintTraceProfiles()
{
}
void dvmJitScanAllClassPointers(void (*callback)(void *))
{
}