+#include <assert.h>
+#include <stdint.h>
+
+#include "vm/jit/codegen-common.hpp"
+#include "vm/jit/methodtree.h"
+
+
+/* inline functions ***********************************************************/
+
+/**
+ * Returns the size (in bytes) of the current stackframe, specified by
+ * the passed codeinfo structure.
+ */
+inline static int32_t md_stacktrace_get_framesize(codeinfo* code)
+{
+ // Check for the asm_vm_call_method special case.
+ if (code == NULL)
+ return 0;
+
+ // On x86_64 we use 8-byte stackslots.
+ return code->stackframesize * 8;
+}
+
+
+/* md_stacktrace_get_returnaddress *********************************************
+
+ Returns the return address of the current stackframe, specified by
+ the passed stack pointer and the stack frame size.
+
+*******************************************************************************/
+
+inline static void *md_stacktrace_get_returnaddress(void *sp, int32_t stackframesize)
+{
+ void *ra;
+
+ /* On x86_64 the return address is above the current stack
+ frame. */
+
+ ra = *((void **) (((uintptr_t) sp) + stackframesize));
+
+ return ra;
+}
+
+
+/* md_codegen_get_pv_from_pc ***************************************************
+
+ On this architecture this is just a wrapper to methodtree_find.
+
+*******************************************************************************/
+
+inline static void *md_codegen_get_pv_from_pc(void *ra)
+{
+ void *pv;
+
+ /* Get the start address of the function which contains this
+ address from the method tree. */
+
+ pv = methodtree_find(ra);
+
+ return pv;
+}
+
+
+/* md_cacheflush ***************************************************************
+
+ Calls the system's function to flush the instruction and data
+ cache.
+
+*******************************************************************************/
+
+inline static void md_cacheflush(void* addr, int nbytes)
+{
+ // Compiler optimization barrier (see PR97).
+ __asm__ __volatile__ ("" : : : "memory");
+}
+
+
+/* md_icacheflush **************************************************************
+
+ Calls the system's function to flush the instruction cache.
+
+*******************************************************************************/
+
+inline static void md_icacheflush(void* addr, int nbytes)
+{
+ // Compiler optimization barrier (see PR97).
+ __asm__ __volatile__ ("" : : : "memory");
+}
+
+
+/* md_dcacheflush **************************************************************
+
+ Calls the system's function to flush the data cache.
+
+*******************************************************************************/
+
+inline static void md_dcacheflush(void* addr, int nbytes)
+{
+ // Compiler optimization barrier (see PR97).
+ __asm__ __volatile__ ("" : : : "memory");
+}
+
+
+/* md_get_cycle_count **********************************************************
+
+ Get the current time-stamp counter from the CPU.
+
+*******************************************************************************/