mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	C and Objective Caml bindings for PassManagers.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48413 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -483,6 +483,24 @@ module MemoryBuffer = struct | |||||||
| end | end | ||||||
|  |  | ||||||
|  |  | ||||||
|  | (*===-- Pass Manager ------------------------------------------------------===*) | ||||||
|  |  | ||||||
|  | module PassManager = struct | ||||||
|  |   type 'a t | ||||||
|  |   type any = [ `Module | `Function ] | ||||||
|  |   external create : unit -> [ `Module ] t = "llvm_passmanager_create" | ||||||
|  |   external create_function : llmoduleprovider -> [ `Function ] t | ||||||
|  |                            = "LLVMCreateFunctionPassManager" | ||||||
|  |   external run_module : llmodule -> [ `Module ] t -> bool | ||||||
|  |                       = "llvm_passmanager_run_module" | ||||||
|  |   external initialize : [ `Function ] t -> bool = "llvm_passmanager_initialize" | ||||||
|  |   external run_function : llvalue -> [ `Function ] t -> bool | ||||||
|  |                         = "llvm_passmanager_run_function" | ||||||
|  |   external finalize : [ `Function ] t -> bool = "llvm_passmanager_finalize" | ||||||
|  |   external dispose : [< any ] t -> unit = "llvm_passmanager_dispose" | ||||||
|  | end | ||||||
|  |  | ||||||
|  |  | ||||||
| (*===-- Non-Externs -------------------------------------------------------===*) | (*===-- Non-Externs -------------------------------------------------------===*) | ||||||
| (* These functions are built using the externals, so must be declared late.   *) | (* These functions are built using the externals, so must be declared late.   *) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1357,3 +1357,57 @@ module MemoryBuffer : sig | |||||||
|   (** Disposes of a memory buffer. *) |   (** Disposes of a memory buffer. *) | ||||||
|   external dispose : llmemorybuffer -> unit = "llvm_memorybuffer_dispose" |   external dispose : llmemorybuffer -> unit = "llvm_memorybuffer_dispose" | ||||||
| end | end | ||||||
|  |  | ||||||
|  |  | ||||||
|  | (** {6 Pass Managers} *) | ||||||
|  |  | ||||||
|  | module PassManager : sig | ||||||
|  |   (**  *) | ||||||
|  |   type 'a t | ||||||
|  |   type any = [ `Module | `Function ] | ||||||
|  |    | ||||||
|  |   (** [PassManager.create ()] constructs a new whole-module pass pipeline. This | ||||||
|  |       type of pipeline is suitable for link-time optimization and whole-module | ||||||
|  |       transformations. | ||||||
|  |       See the constructor of [llvm::PassManager]. *) | ||||||
|  |   external create : unit -> [ `Module ] t = "llvm_passmanager_create" | ||||||
|  |    | ||||||
|  |   (** [PassManager.create_function mp] constructs a new function-by-function | ||||||
|  |       pass pipeline over the module provider [mp]. It does not take ownership of | ||||||
|  |       [mp]. This type of pipeline is suitable for code generation and JIT | ||||||
|  |       compilation tasks. | ||||||
|  |       See the constructor of [llvm::FunctionPassManager]. *) | ||||||
|  |   external create_function : llmoduleprovider -> [ `Function ] t | ||||||
|  |                            = "LLVMCreateFunctionPassManager" | ||||||
|  |    | ||||||
|  |   (** [run_module m pm] initializes, executes on the module [m], and finalizes | ||||||
|  |       all of the passes scheduled in the pass manager [pm]. Returns [true] if | ||||||
|  |       any of the passes modified the module, [false] otherwise. | ||||||
|  |       See the [llvm::PassManager::run] method. *) | ||||||
|  |   external run_module : llmodule -> [ `Module ] t -> bool | ||||||
|  |                       = "llvm_passmanager_run_module" | ||||||
|  |    | ||||||
|  |   (** [initialize fpm] initializes all of the function passes scheduled in the | ||||||
|  |       function pass manager [fpm]. Returns [true] if any of the passes modified | ||||||
|  |       the module, [false] otherwise. | ||||||
|  |       See the [llvm::FunctionPassManager::doInitialization] method. *) | ||||||
|  |   external initialize : [ `Function ] t -> bool = "llvm_passmanager_initialize" | ||||||
|  |    | ||||||
|  |   (** [run_function f fpm] executes all of the function passes scheduled in the | ||||||
|  |       function pass manager [fpm] over the function [f]. Returns [true] if any | ||||||
|  |       of the passes modified [f], [false] otherwise. | ||||||
|  |       See the [llvm::FunctionPassManager::run] method. *) | ||||||
|  |   external run_function : llvalue -> [ `Function ] t -> bool | ||||||
|  |                         = "llvm_passmanager_run_function" | ||||||
|  |    | ||||||
|  |   (** [finalize fpm] finalizes all of the function passes scheduled in in the | ||||||
|  |       function pass manager [fpm]. Returns [true] if any of the passes | ||||||
|  |       modified the module, [false] otherwise. | ||||||
|  |       See the [llvm::FunctionPassManager::doFinalization] method. *) | ||||||
|  |   external finalize : [ `Function ] t -> bool = "llvm_passmanager_finalize" | ||||||
|  |    | ||||||
|  |   (** Frees the memory of a pass pipeline. For function pipelines, does not free | ||||||
|  |       the module provider. | ||||||
|  |       See the destructor of [llvm::BasePassManager]. *) | ||||||
|  |   external dispose : [< any ] t -> unit = "llvm_passmanager_dispose" | ||||||
|  | end | ||||||
|   | |||||||
| @@ -1180,3 +1180,37 @@ CAMLprim value llvm_memorybuffer_dispose(LLVMMemoryBufferRef MemBuf) { | |||||||
|   return Val_unit; |   return Val_unit; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /*===-- Pass Managers -----------------------------------------------------===*/ | ||||||
|  |  | ||||||
|  | /* unit -> [ `Module ] PassManager.t */ | ||||||
|  | CAMLprim LLVMPassManagerRef llvm_passmanager_create(value Unit) { | ||||||
|  |   return LLVMCreatePassManager(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* llmodule -> [ `Function ] PassManager.t -> bool */ | ||||||
|  | CAMLprim value llvm_passmanager_run_module(LLVMModuleRef M, | ||||||
|  |                                            LLVMPassManagerRef PM) { | ||||||
|  |   return Val_bool(LLVMRunPassManager(PM, M)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* [ `Function ] PassManager.t -> bool */ | ||||||
|  | CAMLprim value llvm_passmanager_initialize(LLVMPassManagerRef FPM) { | ||||||
|  |   return Val_bool(LLVMInitializeFunctionPassManager(FPM)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* llvalue -> [ `Function ] PassManager.t -> bool */ | ||||||
|  | CAMLprim value llvm_passmanager_run_function(LLVMValueRef F, | ||||||
|  |                                              LLVMPassManagerRef FPM) { | ||||||
|  |   return Val_bool(LLVMRunFunctionPassManager(FPM, F)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* [ `Function ] PassManager.t -> bool */ | ||||||
|  | CAMLprim value llvm_passmanager_finalize(LLVMPassManagerRef FPM) { | ||||||
|  |   return Val_bool(LLVMFinalizeFunctionPassManager(FPM)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* PassManager.any PassManager.t -> unit */ | ||||||
|  | CAMLprim value llvm_passmanager_dispose(LLVMPassManagerRef PM) { | ||||||
|  |   LLVMDisposePassManager(PM); | ||||||
|  |   return Val_unit; | ||||||
|  | } | ||||||
|   | |||||||
| @@ -39,6 +39,8 @@ | |||||||
|    and 'unwrap' conversion functions. */ |    and 'unwrap' conversion functions. */ | ||||||
| #include "llvm/Module.h" | #include "llvm/Module.h" | ||||||
| #include "llvm/Support/LLVMBuilder.h" | #include "llvm/Support/LLVMBuilder.h" | ||||||
|  | #include "llvm/Pass.h" | ||||||
|  | #include "llvm/PassManager.h" | ||||||
|  |  | ||||||
| extern "C" { | extern "C" { | ||||||
| #endif | #endif | ||||||
| @@ -79,6 +81,9 @@ typedef struct LLVMOpaqueModuleProvider *LLVMModuleProviderRef; | |||||||
|  */ |  */ | ||||||
| typedef struct LLVMOpaqueMemoryBuffer *LLVMMemoryBufferRef; | typedef struct LLVMOpaqueMemoryBuffer *LLVMMemoryBufferRef; | ||||||
|  |  | ||||||
|  | /** See the llvm::PassManagerBase class. */ | ||||||
|  | typedef struct LLVMOpaquePassManager *LLVMPassManagerRef; | ||||||
|  |  | ||||||
| typedef enum { | typedef enum { | ||||||
|   LLVMVoidTypeKind,        /**< type with no size */ |   LLVMVoidTypeKind,        /**< type with no size */ | ||||||
|   LLVMFloatTypeKind,       /**< 32 bit floating point type */ |   LLVMFloatTypeKind,       /**< 32 bit floating point type */ | ||||||
| @@ -575,6 +580,47 @@ int LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf, | |||||||
|                                     char **OutMessage); |                                     char **OutMessage); | ||||||
| void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf); | void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /*===-- Pass Managers -----------------------------------------------------===*/ | ||||||
|  |  | ||||||
|  | /** Constructs a new whole-module pass pipeline. This type of pipeline is | ||||||
|  |     suitable for link-time optimization and whole-module transformations. | ||||||
|  |     See llvm::PassManager::PassManager. */ | ||||||
|  | LLVMPassManagerRef LLVMCreatePassManager(); | ||||||
|  |  | ||||||
|  | /** Constructs a new function-by-function pass pipeline over the module | ||||||
|  |     provider. It does not take ownership of the module provider. This type of | ||||||
|  |     pipeline is suitable for code generation and JIT compilation tasks. | ||||||
|  |     See llvm::FunctionPassManager::FunctionPassManager. */ | ||||||
|  | LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef MP); | ||||||
|  |  | ||||||
|  | /** Initializes, executes on the provided module, and finalizes all of the | ||||||
|  |     passes scheduled in the pass manager. Returns 1 if any of the passes | ||||||
|  |     modified the module, 0 otherwise. See llvm::PassManager::run(Module&). */ | ||||||
|  | int LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M); | ||||||
|  |  | ||||||
|  | /** Initializes all of the function passes scheduled in the function pass | ||||||
|  |     manager. Returns 1 if any of the passes modified the module, 0 otherwise. | ||||||
|  |     See llvm::FunctionPassManager::doInitialization. */ | ||||||
|  | int LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM); | ||||||
|  |  | ||||||
|  | /** Executes all of the function passes scheduled in the function pass manager | ||||||
|  |     on the provided function. Returns 1 if any of the passes modified the | ||||||
|  |     function, false otherwise. | ||||||
|  |     See llvm::FunctionPassManager::run(Function&). */ | ||||||
|  | int LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F); | ||||||
|  |  | ||||||
|  | /** Finalizes all of the function passes scheduled in in the function pass | ||||||
|  |     manager. Returns 1 if any of the passes modified the module, 0 otherwise. | ||||||
|  |     See llvm::FunctionPassManager::doFinalization. */ | ||||||
|  | int LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM); | ||||||
|  |  | ||||||
|  | /** Frees the memory of a pass pipeline. For function pipelines, does not free | ||||||
|  |     the module provider. | ||||||
|  |     See llvm::PassManagerBase::~PassManagerBase. */ | ||||||
|  | void LLVMDisposePassManager(LLVMPassManagerRef PM); | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -591,24 +637,40 @@ namespace llvm { | |||||||
|       return reinterpret_cast<ref>(const_cast<ty*>(P)); \ |       return reinterpret_cast<ref>(const_cast<ty*>(P)); \ | ||||||
|     } |     } | ||||||
|    |    | ||||||
|   DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Type,               LLVMTypeRef          ) |   #define DEFINE_ISA_CONVERSION_FUNCTIONS(ty, ref)  \ | ||||||
|   DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Value,              LLVMValueRef         ) |     DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref)         \ | ||||||
|  |                                                         \ | ||||||
|  |     template<typename T>                                \ | ||||||
|  |     inline T *unwrap(ref P) {                           \ | ||||||
|  |       return cast<T>(unwrap(P));                        \ | ||||||
|  |     } | ||||||
|  |    | ||||||
|  |   #define DEFINE_STDCXX_CONVERSION_FUNCTIONS(ty, ref)   \ | ||||||
|  |     DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref)         \ | ||||||
|  |                                                         \ | ||||||
|  |     template<typename T>                                \ | ||||||
|  |     inline T *unwrap(ref P) {                           \ | ||||||
|  |       T *Q = dynamic_cast<T*>(unwrap(P));               \ | ||||||
|  |       assert(Q && "Invalid cast!");                     \ | ||||||
|  |       return Q;                                         \ | ||||||
|  |     } | ||||||
|  |    | ||||||
|  |   DEFINE_ISA_CONVERSION_FUNCTIONS   (Type,               LLVMTypeRef          ) | ||||||
|  |   DEFINE_ISA_CONVERSION_FUNCTIONS   (Value,              LLVMValueRef         ) | ||||||
|   DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Module,             LLVMModuleRef        ) |   DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Module,             LLVMModuleRef        ) | ||||||
|   DEFINE_SIMPLE_CONVERSION_FUNCTIONS(BasicBlock,         LLVMBasicBlockRef    ) |   DEFINE_SIMPLE_CONVERSION_FUNCTIONS(BasicBlock,         LLVMBasicBlockRef    ) | ||||||
|   DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMFoldingBuilder, LLVMBuilderRef       ) |   DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMFoldingBuilder, LLVMBuilderRef       ) | ||||||
|   DEFINE_SIMPLE_CONVERSION_FUNCTIONS(PATypeHolder,       LLVMTypeHandleRef    ) |   DEFINE_SIMPLE_CONVERSION_FUNCTIONS(PATypeHolder,       LLVMTypeHandleRef    ) | ||||||
|   DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ModuleProvider,     LLVMModuleProviderRef) |   DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ModuleProvider,     LLVMModuleProviderRef) | ||||||
|   DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MemoryBuffer,       LLVMMemoryBufferRef  ) |   DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MemoryBuffer,       LLVMMemoryBufferRef  ) | ||||||
|  |   DEFINE_STDCXX_CONVERSION_FUNCTIONS(PassManagerBase,    LLVMPassManagerRef   ) | ||||||
|    |    | ||||||
|  |   #undef DEFINE_STDCXX_CONVERSION_FUNCTIONS | ||||||
|  |   #undef DEFINE_ISA_CONVERSION_FUNCTIONS | ||||||
|   #undef DEFINE_SIMPLE_CONVERSION_FUNCTIONS |   #undef DEFINE_SIMPLE_CONVERSION_FUNCTIONS | ||||||
|    |    | ||||||
|   /* Specialized opaque type conversions. |   /* Specialized opaque type conversions. | ||||||
|    */ |    */ | ||||||
|   template<typename T> |  | ||||||
|   inline T *unwrap(LLVMTypeRef Ty) { |  | ||||||
|     return cast<T>(unwrap(Ty)); |  | ||||||
|   } |  | ||||||
|    |  | ||||||
|   inline Type **unwrap(LLVMTypeRef* Tys) { |   inline Type **unwrap(LLVMTypeRef* Tys) { | ||||||
|     return reinterpret_cast<Type**>(Tys); |     return reinterpret_cast<Type**>(Tys); | ||||||
|   } |   } | ||||||
| @@ -619,11 +681,6 @@ namespace llvm { | |||||||
|    |    | ||||||
|   /* Specialized opaque value conversions. |   /* Specialized opaque value conversions. | ||||||
|    */  |    */  | ||||||
|   template<typename T> |  | ||||||
|   inline T *unwrap(LLVMValueRef Val) { |  | ||||||
|     return cast<T>(unwrap(Val)); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   inline Value **unwrap(LLVMValueRef *Vals) { |   inline Value **unwrap(LLVMValueRef *Vals) { | ||||||
|     return reinterpret_cast<Value**>(Vals); |     return reinterpret_cast<Value**>(Vals); | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -19,6 +19,7 @@ | |||||||
| #include "llvm/ModuleProvider.h" | #include "llvm/ModuleProvider.h" | ||||||
| #include "llvm/Support/Streams.h" | #include "llvm/Support/Streams.h" | ||||||
| #include "llvm/Support/ManagedStatic.h" | #include "llvm/Support/ManagedStatic.h" | ||||||
|  | #include "llvm-c/Core.h" | ||||||
| #include <algorithm> | #include <algorithm> | ||||||
| #include <vector> | #include <vector> | ||||||
| #include <map> | #include <map> | ||||||
| @@ -1526,3 +1527,33 @@ void BasicBlockPass::assignPassManager(PMStack &PMS, | |||||||
| } | } | ||||||
|  |  | ||||||
| PassManagerBase::~PassManagerBase() {} | PassManagerBase::~PassManagerBase() {} | ||||||
|  |    | ||||||
|  | /*===-- C Bindings --------------------------------------------------------===*/ | ||||||
|  |  | ||||||
|  | LLVMPassManagerRef LLVMCreatePassManager() { | ||||||
|  |   return wrap(new PassManager()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef P) { | ||||||
|  |   return wrap(new FunctionPassManager(unwrap(P))); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M) { | ||||||
|  |   return unwrap<PassManager>(PM)->run(*unwrap(M)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM) { | ||||||
|  |   return unwrap<FunctionPassManager>(FPM)->doInitialization(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F) { | ||||||
|  |   return unwrap<FunctionPassManager>(FPM)->run(*unwrap<Function>(F)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM) { | ||||||
|  |   return unwrap<FunctionPassManager>(FPM)->doFinalization(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void LLVMDisposePassManager(LLVMPassManagerRef PM) { | ||||||
|  |   delete unwrap(PM); | ||||||
|  | } | ||||||
|   | |||||||
| @@ -34,6 +34,7 @@ let suite name f = | |||||||
|  |  | ||||||
| let filename = Sys.argv.(1) | let filename = Sys.argv.(1) | ||||||
| let m = create_module filename | let m = create_module filename | ||||||
|  | let mp = ModuleProvider.create m | ||||||
|  |  | ||||||
|  |  | ||||||
| (*===-- Target ------------------------------------------------------------===*) | (*===-- Target ------------------------------------------------------------===*) | ||||||
| @@ -836,6 +837,30 @@ let test_module_provider () = | |||||||
|   ModuleProvider.dispose mp |   ModuleProvider.dispose mp | ||||||
|  |  | ||||||
|  |  | ||||||
|  | (*===-- Pass Managers -----------------------------------------------------===*) | ||||||
|  |  | ||||||
|  | let test_pass_manager () = | ||||||
|  |   let (++) x f = ignore (f x); x in | ||||||
|  |  | ||||||
|  |   begin group "module pass manager"; | ||||||
|  |     ignore (PassManager.create () | ||||||
|  |              ++ PassManager.run_module m | ||||||
|  |              ++ PassManager.dispose) | ||||||
|  |   end; | ||||||
|  |    | ||||||
|  |   begin group "function pass manager"; | ||||||
|  |     let fty = function_type void_type [| |] in | ||||||
|  |     let fn = define_function "FunctionPassManager" fty m in | ||||||
|  |     ignore (build_ret_void (builder_at_end (entry_block fn))); | ||||||
|  |      | ||||||
|  |     ignore (PassManager.create_function mp | ||||||
|  |              ++ PassManager.initialize | ||||||
|  |              ++ PassManager.run_function fn | ||||||
|  |              ++ PassManager.finalize | ||||||
|  |              ++ PassManager.dispose) | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |  | ||||||
| (*===-- Writer ------------------------------------------------------------===*) | (*===-- Writer ------------------------------------------------------------===*) | ||||||
|  |  | ||||||
| let test_writer () = | let test_writer () = | ||||||
| @@ -847,7 +872,7 @@ let test_writer () = | |||||||
|   group "writer"; |   group "writer"; | ||||||
|   insist (write_bitcode_file m filename); |   insist (write_bitcode_file m filename); | ||||||
|    |    | ||||||
|   dispose_module m |   ModuleProvider.dispose mp | ||||||
|  |  | ||||||
|  |  | ||||||
| (*===-- Driver ------------------------------------------------------------===*) | (*===-- Driver ------------------------------------------------------------===*) | ||||||
| @@ -862,5 +887,6 @@ let _ = | |||||||
|   suite "basic blocks"     test_basic_blocks; |   suite "basic blocks"     test_basic_blocks; | ||||||
|   suite "builder"          test_builder; |   suite "builder"          test_builder; | ||||||
|   suite "module provider"  test_module_provider; |   suite "module provider"  test_module_provider; | ||||||
|   suite "writer"           test_writer; |   suite "pass manager"     test_pass_manager; | ||||||
|  |   suite "writer"           test_writer; (* Keep this last; it disposes m. *) | ||||||
|   exit !exit_status |   exit !exit_status | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user