1 //===-- VM.h - Definitions for Virtual Machine ------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the top-level Virtual Machine data structure.
12 //===----------------------------------------------------------------------===//
17 #include "llvm/ExecutionEngine/ExecutionEngine.h"
18 #include "llvm/PassManager.h"
25 class MachineCodeEmitter;
27 class VM : public ExecutionEngine {
28 TargetMachine &TM; // The current target we are compiling to
29 FunctionPassManager PM; // Passes to compile a function
30 MachineCodeEmitter *MCE; // MCE object
33 VM(ModuleProvider *MP, TargetMachine *tm);
36 /// create - Create an return a new JIT compiler if there is one available
37 /// for the current target. Otherwise, return null.
39 static ExecutionEngine *create(ModuleProvider *MP);
41 /// run - Start execution with the specified function and arguments.
43 virtual GenericValue run(Function *F,
44 const std::vector<GenericValue> &ArgValues);
46 /// getPointerToNamedFunction - This method returns the address of the
47 /// specified function by using the dlsym function call. As such it is only
48 /// useful for resolving library symbols, not code generated symbols.
50 void *getPointerToNamedFunction(const std::string &Name);
52 // CompilationCallback - Invoked the first time that a call site is found,
53 // which causes lazy compilation of the target function.
55 static void CompilationCallback();
57 /// runAtExitHandlers - Before exiting the program, at_exit functions must be
58 /// called. This method calls them.
60 static void runAtExitHandlers();
62 /// getPointerToFunction - This returns the address of the specified function,
63 /// compiling it if necessary.
65 void *getPointerToFunction(Function *F);
67 /// recompileAndRelinkFunction - This method is used to force a function
68 /// which has already been compiled, to be compiled again, possibly
69 /// after it has been modified. Then the entry to the old copy is overwritten
70 /// with a branch to the new copy. If there was no old copy, this acts
71 /// just like VM::getPointerToFunction().
73 void *recompileAndRelinkFunction(Function *F);
76 static MachineCodeEmitter *createEmitter(VM &V);
77 void setupPassManager();
78 void runJITOnFunction (Function *F);