1dfc58e3bcfcb8f37796b2ca1c289dd202f26d03cSylvestre Ledru/*===-- target_ocaml.c - LLVM OCaml Glue ------------------------*- C++ -*-===*\
23e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen|*                                                                            *|
33e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen|*                     The LLVM Compiler Infrastructure                       *|
43e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen|*                                                                            *|
53e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen|* This file is distributed under the University of Illinois Open Source      *|
63e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen|* License. See LICENSE.TXT for details.                                      *|
73e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen|*                                                                            *|
83e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen|*===----------------------------------------------------------------------===*|
93e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen|*                                                                            *|
10dfc58e3bcfcb8f37796b2ca1c289dd202f26d03cSylvestre Ledru|* This file glues LLVM's OCaml interface to its C interface. These functions *|
113e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen|* are by and large transparent wrappers to the corresponding C functions.    *|
123e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen|*                                                                            *|
133e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen|* Note that these functions intentionally take liberties with the CAMLparamX *|
143e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen|* macros, since most of the parameters are not GC heap objects.              *|
153e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen|*                                                                            *|
163e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen\*===----------------------------------------------------------------------===*/
173e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen
18de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm-c/Core.h"
193e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen#include "llvm-c/Target.h"
20b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov#include "llvm-c/TargetMachine.h"
213e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen#include "caml/alloc.h"
22b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov#include "caml/fail.h"
23b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov#include "caml/memory.h"
2426f3bd89660e46a76a3b0267b23b00d917a45404Peter Zotov#include "caml/custom.h"
2537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "caml/callback.h"
2626f3bd89660e46a76a3b0267b23b00d917a45404Peter Zotov
2737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid llvm_raise(value Prototype, char *Message);
2837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvalue llvm_string_of_message(char* Message);
29b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
30b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/*===---- Data Layout -----------------------------------------------------===*/
31b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
3204deb4957ab253c02bce9d982d69396954744a41Peter Zotov#define DataLayout_val(v)  (*(LLVMTargetDataRef *)(Data_custom_val(v)))
3326f3bd89660e46a76a3b0267b23b00d917a45404Peter Zotov
3404deb4957ab253c02bce9d982d69396954744a41Peter Zotovstatic void llvm_finalize_data_layout(value DataLayout) {
3504deb4957ab253c02bce9d982d69396954744a41Peter Zotov  LLVMDisposeTargetData(DataLayout_val(DataLayout));
3626f3bd89660e46a76a3b0267b23b00d917a45404Peter Zotov}
3726f3bd89660e46a76a3b0267b23b00d917a45404Peter Zotov
3804deb4957ab253c02bce9d982d69396954744a41Peter Zotovstatic struct custom_operations llvm_data_layout_ops = {
3937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  (char *) "Llvm_target.DataLayout.t",
4004deb4957ab253c02bce9d982d69396954744a41Peter Zotov  llvm_finalize_data_layout,
4126f3bd89660e46a76a3b0267b23b00d917a45404Peter Zotov  custom_compare_default,
4226f3bd89660e46a76a3b0267b23b00d917a45404Peter Zotov  custom_hash_default,
4326f3bd89660e46a76a3b0267b23b00d917a45404Peter Zotov  custom_serialize_default,
4437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  custom_deserialize_default,
4537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  custom_compare_ext_default
4626f3bd89660e46a76a3b0267b23b00d917a45404Peter Zotov};
4726f3bd89660e46a76a3b0267b23b00d917a45404Peter Zotov
4804deb4957ab253c02bce9d982d69396954744a41Peter Zotovvalue llvm_alloc_data_layout(LLVMTargetDataRef DataLayout) {
49b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  value V = alloc_custom(&llvm_data_layout_ops, sizeof(LLVMTargetDataRef),
50b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov                         0, 1);
5104deb4957ab253c02bce9d982d69396954744a41Peter Zotov  DataLayout_val(V) = DataLayout;
5226f3bd89660e46a76a3b0267b23b00d917a45404Peter Zotov  return V;
5326f3bd89660e46a76a3b0267b23b00d917a45404Peter Zotov}
543e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen
55791cfc211a9801002bfda6b3eb4de7e041f04f53Micah Villmow/* string -> DataLayout.t */
5604deb4957ab253c02bce9d982d69396954744a41Peter ZotovCAMLprim value llvm_datalayout_of_string(value StringRep) {
5704deb4957ab253c02bce9d982d69396954744a41Peter Zotov  return llvm_alloc_data_layout(LLVMCreateTargetData(String_val(StringRep)));
583e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen}
593e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen
60791cfc211a9801002bfda6b3eb4de7e041f04f53Micah Villmow/* DataLayout.t -> string */
6104deb4957ab253c02bce9d982d69396954744a41Peter ZotovCAMLprim value llvm_datalayout_as_string(value TD) {
6204deb4957ab253c02bce9d982d69396954744a41Peter Zotov  char *StringRep = LLVMCopyStringRepOfTargetData(DataLayout_val(TD));
633e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen  value Copy = copy_string(StringRep);
643e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen  LLVMDisposeMessage(StringRep);
653e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen  return Copy;
663e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen}
673e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen
68791cfc211a9801002bfda6b3eb4de7e041f04f53Micah Villmow/* DataLayout.t -> Endian.t */
6904deb4957ab253c02bce9d982d69396954744a41Peter ZotovCAMLprim value llvm_datalayout_byte_order(value DL) {
7004deb4957ab253c02bce9d982d69396954744a41Peter Zotov  return Val_int(LLVMByteOrder(DataLayout_val(DL)));
713e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen}
723e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen
73791cfc211a9801002bfda6b3eb4de7e041f04f53Micah Villmow/* DataLayout.t -> int */
7404deb4957ab253c02bce9d982d69396954744a41Peter ZotovCAMLprim value llvm_datalayout_pointer_size(value DL) {
7504deb4957ab253c02bce9d982d69396954744a41Peter Zotov  return Val_int(LLVMPointerSize(DataLayout_val(DL)));
7626f3bd89660e46a76a3b0267b23b00d917a45404Peter Zotov}
7726f3bd89660e46a76a3b0267b23b00d917a45404Peter Zotov
7804deb4957ab253c02bce9d982d69396954744a41Peter Zotov/* Llvm.llcontext -> DataLayout.t -> Llvm.lltype */
7904deb4957ab253c02bce9d982d69396954744a41Peter ZotovCAMLprim LLVMTypeRef llvm_datalayout_intptr_type(LLVMContextRef C, value DL) {
8004deb4957ab253c02bce9d982d69396954744a41Peter Zotov  return LLVMIntPtrTypeInContext(C, DataLayout_val(DL));;
813e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen}
823e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen
8304deb4957ab253c02bce9d982d69396954744a41Peter Zotov/* int -> DataLayout.t -> int */
8404deb4957ab253c02bce9d982d69396954744a41Peter ZotovCAMLprim value llvm_datalayout_qualified_pointer_size(value AS, value DL) {
8504deb4957ab253c02bce9d982d69396954744a41Peter Zotov  return Val_int(LLVMPointerSizeForAS(DataLayout_val(DL), Int_val(AS)));
86fa6ab4393ebb7add77a4a957dc50453d07b54a62Peter Zotov}
87fa6ab4393ebb7add77a4a957dc50453d07b54a62Peter Zotov
8804deb4957ab253c02bce9d982d69396954744a41Peter Zotov/* Llvm.llcontext -> int -> DataLayout.t -> Llvm.lltype */
8904deb4957ab253c02bce9d982d69396954744a41Peter ZotovCAMLprim LLVMTypeRef llvm_datalayout_qualified_intptr_type(LLVMContextRef C,
9004deb4957ab253c02bce9d982d69396954744a41Peter Zotov                                                           value AS,
9104deb4957ab253c02bce9d982d69396954744a41Peter Zotov                                                           value DL) {
9204deb4957ab253c02bce9d982d69396954744a41Peter Zotov  return LLVMIntPtrTypeForASInContext(C, DataLayout_val(DL), Int_val(AS));
93fa6ab4393ebb7add77a4a957dc50453d07b54a62Peter Zotov}
94fa6ab4393ebb7add77a4a957dc50453d07b54a62Peter Zotov
9504deb4957ab253c02bce9d982d69396954744a41Peter Zotov/* Llvm.lltype -> DataLayout.t -> Int64.t */
9604deb4957ab253c02bce9d982d69396954744a41Peter ZotovCAMLprim value llvm_datalayout_size_in_bits(LLVMTypeRef Ty, value DL) {
9704deb4957ab253c02bce9d982d69396954744a41Peter Zotov  return caml_copy_int64(LLVMSizeOfTypeInBits(DataLayout_val(DL), Ty));
983e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen}
993e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen
10004deb4957ab253c02bce9d982d69396954744a41Peter Zotov/* Llvm.lltype -> DataLayout.t -> Int64.t */
10104deb4957ab253c02bce9d982d69396954744a41Peter ZotovCAMLprim value llvm_datalayout_store_size(LLVMTypeRef Ty, value DL) {
10204deb4957ab253c02bce9d982d69396954744a41Peter Zotov  return caml_copy_int64(LLVMStoreSizeOfType(DataLayout_val(DL), Ty));
1033e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen}
1043e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen
10504deb4957ab253c02bce9d982d69396954744a41Peter Zotov/* Llvm.lltype -> DataLayout.t -> Int64.t */
10604deb4957ab253c02bce9d982d69396954744a41Peter ZotovCAMLprim value llvm_datalayout_abi_size(LLVMTypeRef Ty, value DL) {
10704deb4957ab253c02bce9d982d69396954744a41Peter Zotov  return caml_copy_int64(LLVMABISizeOfType(DataLayout_val(DL), Ty));
1083e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen}
1093e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen
11004deb4957ab253c02bce9d982d69396954744a41Peter Zotov/* Llvm.lltype -> DataLayout.t -> int */
11104deb4957ab253c02bce9d982d69396954744a41Peter ZotovCAMLprim value llvm_datalayout_abi_align(LLVMTypeRef Ty, value DL) {
11204deb4957ab253c02bce9d982d69396954744a41Peter Zotov  return Val_int(LLVMABIAlignmentOfType(DataLayout_val(DL), Ty));
1133e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen}
1143e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen
11504deb4957ab253c02bce9d982d69396954744a41Peter Zotov/* Llvm.lltype -> DataLayout.t -> int */
11604deb4957ab253c02bce9d982d69396954744a41Peter ZotovCAMLprim value llvm_datalayout_stack_align(LLVMTypeRef Ty, value DL) {
11704deb4957ab253c02bce9d982d69396954744a41Peter Zotov  return Val_int(LLVMCallFrameAlignmentOfType(DataLayout_val(DL), Ty));
1183e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen}
1193e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen
12004deb4957ab253c02bce9d982d69396954744a41Peter Zotov/* Llvm.lltype -> DataLayout.t -> int */
12104deb4957ab253c02bce9d982d69396954744a41Peter ZotovCAMLprim value llvm_datalayout_preferred_align(LLVMTypeRef Ty, value DL) {
12204deb4957ab253c02bce9d982d69396954744a41Peter Zotov  return Val_int(LLVMPreferredAlignmentOfType(DataLayout_val(DL), Ty));
1233e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen}
1243e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen
12504deb4957ab253c02bce9d982d69396954744a41Peter Zotov/* Llvm.llvalue -> DataLayout.t -> int */
12604deb4957ab253c02bce9d982d69396954744a41Peter ZotovCAMLprim value llvm_datalayout_preferred_align_of_global(LLVMValueRef GlobalVar,
12704deb4957ab253c02bce9d982d69396954744a41Peter Zotov                                                         value DL) {
12804deb4957ab253c02bce9d982d69396954744a41Peter Zotov  return Val_int(LLVMPreferredAlignmentOfGlobal(DataLayout_val(DL), GlobalVar));
1293e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen}
1303e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen
13104deb4957ab253c02bce9d982d69396954744a41Peter Zotov/* Llvm.lltype -> Int64.t -> DataLayout.t -> int */
13204deb4957ab253c02bce9d982d69396954744a41Peter ZotovCAMLprim value llvm_datalayout_element_at_offset(LLVMTypeRef Ty, value Offset,
13304deb4957ab253c02bce9d982d69396954744a41Peter Zotov                                                 value DL) {
13404deb4957ab253c02bce9d982d69396954744a41Peter Zotov  return Val_int(LLVMElementAtOffset(DataLayout_val(DL), Ty,
13504deb4957ab253c02bce9d982d69396954744a41Peter Zotov                                     Int64_val(Offset)));
1363e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen}
1373e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen
13804deb4957ab253c02bce9d982d69396954744a41Peter Zotov/* Llvm.lltype -> int -> DataLayout.t -> Int64.t */
13904deb4957ab253c02bce9d982d69396954744a41Peter ZotovCAMLprim value llvm_datalayout_offset_of_element(LLVMTypeRef Ty, value Index,
14004deb4957ab253c02bce9d982d69396954744a41Peter Zotov                                                 value DL) {
14104deb4957ab253c02bce9d982d69396954744a41Peter Zotov  return caml_copy_int64(LLVMOffsetOfElement(DataLayout_val(DL), Ty,
14204deb4957ab253c02bce9d982d69396954744a41Peter Zotov                                             Int_val(Index)));
1433e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen}
144b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
145b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/*===---- Target ----------------------------------------------------------===*/
146b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
147b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotovstatic value llvm_target_option(LLVMTargetRef Target) {
148b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  if(Target != NULL) {
149b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov    value Result = caml_alloc_small(1, 0);
150b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov    Store_field(Result, 0, (value) Target);
151b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov    return Result;
152b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  }
153b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
154b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return Val_int(0);
155b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
156b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
157b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/* unit -> string */
158b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter ZotovCAMLprim value llvm_target_default_triple(value Unit) {
159b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  char *TripleCStr = LLVMGetDefaultTargetTriple();
160b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  value TripleStr = caml_copy_string(TripleCStr);
161b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  LLVMDisposeMessage(TripleCStr);
162b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
163b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return TripleStr;
164b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
165b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
166b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/* unit -> Target.t option */
167b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter ZotovCAMLprim value llvm_target_first(value Unit) {
168b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return llvm_target_option(LLVMGetFirstTarget());
169b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
170b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
171b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/* Target.t -> Target.t option */
172b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter ZotovCAMLprim value llvm_target_succ(LLVMTargetRef Target) {
173b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return llvm_target_option(LLVMGetNextTarget(Target));
174b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
175b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
176b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/* string -> Target.t option */
177b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter ZotovCAMLprim value llvm_target_by_name(value Name) {
178b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return llvm_target_option(LLVMGetTargetFromName(String_val(Name)));
179b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
180b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
181b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/* string -> Target.t */
182b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter ZotovCAMLprim LLVMTargetRef llvm_target_by_triple(value Triple) {
183b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  LLVMTargetRef T;
184b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  char *Error;
185b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
186b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  if(LLVMGetTargetFromTriple(String_val(Triple), &T, &Error))
18737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    llvm_raise(*caml_named_value("Llvm_target.Error"), Error);
188b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
189b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return T;
190b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
191b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
192b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/* Target.t -> string */
193b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter ZotovCAMLprim value llvm_target_name(LLVMTargetRef Target) {
194b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return caml_copy_string(LLVMGetTargetName(Target));
195b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
196b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
197b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/* Target.t -> string */
198b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter ZotovCAMLprim value llvm_target_description(LLVMTargetRef Target) {
199b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return caml_copy_string(LLVMGetTargetDescription(Target));
200b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
201b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
202b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/* Target.t -> bool */
203b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter ZotovCAMLprim value llvm_target_has_jit(LLVMTargetRef Target) {
204b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return Val_bool(LLVMTargetHasJIT(Target));
205b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
206b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
207b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/* Target.t -> bool */
208b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter ZotovCAMLprim value llvm_target_has_target_machine(LLVMTargetRef Target) {
209b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return Val_bool(LLVMTargetHasTargetMachine(Target));
210b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
211b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
212b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/* Target.t -> bool */
213b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter ZotovCAMLprim value llvm_target_has_asm_backend(LLVMTargetRef Target) {
214b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return Val_bool(LLVMTargetHasAsmBackend(Target));
215b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
216b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
217b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/*===---- Target Machine --------------------------------------------------===*/
218b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
219b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov#define TargetMachine_val(v)  (*(LLVMTargetMachineRef *)(Data_custom_val(v)))
220b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
221b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotovstatic void llvm_finalize_target_machine(value Machine) {
222b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  LLVMDisposeTargetMachine(TargetMachine_val(Machine));
223b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
224b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
225b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotovstatic struct custom_operations llvm_target_machine_ops = {
22637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  (char *) "Llvm_target.TargetMachine.t",
227b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  llvm_finalize_target_machine,
228b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  custom_compare_default,
229b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  custom_hash_default,
230b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  custom_serialize_default,
23137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  custom_deserialize_default,
23237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  custom_compare_ext_default
233b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov};
234b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
235b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotovstatic value llvm_alloc_targetmachine(LLVMTargetMachineRef Machine) {
236b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  value V = alloc_custom(&llvm_target_machine_ops, sizeof(LLVMTargetMachineRef),
237b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov                         0, 1);
238b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  TargetMachine_val(V) = Machine;
239b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return V;
240b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
241b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
242b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/* triple:string -> ?cpu:string -> ?features:string
243b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov   ?level:CodeGenOptLevel.t -> ?reloc_mode:RelocMode.t
244b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov   ?code_model:CodeModel.t -> Target.t -> TargetMachine.t */
245b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter ZotovCAMLprim value llvm_create_targetmachine_native(value Triple, value CPU,
246b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov                  value Features, value OptLevel, value RelocMode,
247b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov                  value CodeModel, LLVMTargetRef Target) {
248b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  LLVMTargetMachineRef Machine;
249b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  const char *CPUStr = "", *FeaturesStr = "";
250b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  LLVMCodeGenOptLevel OptLevelEnum = LLVMCodeGenLevelDefault;
251b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  LLVMRelocMode RelocModeEnum = LLVMRelocDefault;
252b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  LLVMCodeModel CodeModelEnum = LLVMCodeModelDefault;
253b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
254b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  if(CPU != Val_int(0))
255b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov    CPUStr = String_val(Field(CPU, 0));
256b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  if(Features != Val_int(0))
257b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov    FeaturesStr = String_val(Field(Features, 0));
258b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  if(OptLevel != Val_int(0))
259b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov    OptLevelEnum = Int_val(Field(OptLevel, 0));
260b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  if(RelocMode != Val_int(0))
261b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov    RelocModeEnum = Int_val(Field(RelocMode, 0));
262b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  if(CodeModel != Val_int(0))
263b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov    CodeModelEnum = Int_val(Field(CodeModel, 0));
264b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
265b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  Machine = LLVMCreateTargetMachine(Target, String_val(Triple), CPUStr,
266b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov                FeaturesStr, OptLevelEnum, RelocModeEnum, CodeModelEnum);
267b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
268b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return llvm_alloc_targetmachine(Machine);
269b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
270b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
271b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter ZotovCAMLprim value llvm_create_targetmachine_bytecode(value *argv, int argn) {
272b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return llvm_create_targetmachine_native(argv[0], argv[1], argv[2], argv[3],
273b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov                                    argv[4], argv[5], (LLVMTargetRef) argv[6]);
274b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
275b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
276b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/* TargetMachine.t -> Target.t */
277b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter ZotovCAMLprim LLVMTargetRef llvm_targetmachine_target(value Machine) {
278b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return LLVMGetTargetMachineTarget(TargetMachine_val(Machine));
279b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
280b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
281b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/* TargetMachine.t -> string */
282b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter ZotovCAMLprim value llvm_targetmachine_triple(value Machine) {
283b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return llvm_string_of_message(LLVMGetTargetMachineTriple(
284b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov                                TargetMachine_val(Machine)));
285b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
286b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
287b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/* TargetMachine.t -> string */
288b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter ZotovCAMLprim value llvm_targetmachine_cpu(value Machine) {
289b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return llvm_string_of_message(LLVMGetTargetMachineCPU(
290b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov                                TargetMachine_val(Machine)));
291b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
292b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
293b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/* TargetMachine.t -> string */
294b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter ZotovCAMLprim value llvm_targetmachine_features(value Machine) {
295b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return llvm_string_of_message(LLVMGetTargetMachineFeatureString(
296b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov                                TargetMachine_val(Machine)));
297b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
298b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
299b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/* TargetMachine.t -> DataLayout.t */
300b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter ZotovCAMLprim value llvm_targetmachine_data_layout(value Machine) {
301de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return llvm_alloc_data_layout(LLVMCreateTargetDataLayout(
302de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                TargetMachine_val(Machine)));
303b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
304b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
305c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines/* bool -> TargetMachine.t -> unit */
306c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen HinesCAMLprim value llvm_targetmachine_set_verbose_asm(value Verb, value Machine) {
307b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  LLVMSetTargetMachineAsmVerbosity(TargetMachine_val(Machine), Bool_val(Verb));
308b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return Val_unit;
309b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
310b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
311b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/* Llvm.llmodule -> CodeGenFileType.t -> string -> TargetMachine.t -> unit */
312b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter ZotovCAMLprim value llvm_targetmachine_emit_to_file(LLVMModuleRef Module,
313b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov                            value FileType, value FileName, value Machine) {
31437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  char *ErrorMessage;
315b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
316b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  if(LLVMTargetMachineEmitToFile(TargetMachine_val(Machine), Module,
317b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov                                 String_val(FileName), Int_val(FileType),
318b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov                                 &ErrorMessage)) {
31937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    llvm_raise(*caml_named_value("Llvm_target.Error"), ErrorMessage);
320b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  }
321b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
322b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return Val_unit;
323b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
324b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
325b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov/* Llvm.llmodule -> CodeGenFileType.t -> TargetMachine.t ->
326b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov   Llvm.llmemorybuffer */
327b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter ZotovCAMLprim LLVMMemoryBufferRef llvm_targetmachine_emit_to_memory_buffer(
328b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov                                LLVMModuleRef Module, value FileType,
329b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov                                value Machine) {
33037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  char *ErrorMessage;
331b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  LLVMMemoryBufferRef Buffer;
332b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
333b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  if(LLVMTargetMachineEmitToMemoryBuffer(TargetMachine_val(Machine), Module,
334b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov                                         Int_val(FileType), &ErrorMessage,
335b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov                                         &Buffer)) {
33637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    llvm_raise(*caml_named_value("Llvm_target.Error"), ErrorMessage);
337b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  }
338b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov
339b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov  return Buffer;
340b6703ff81b4739be67ae7b07f1bfcfb6f157f891Peter Zotov}
34137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
34237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/* TargetMachine.t -> Llvm.PassManager.t -> unit */
34337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesCAMLprim value llvm_targetmachine_add_analysis_passes(LLVMPassManagerRef PM,
34437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                                      value Machine) {
34537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  LLVMAddAnalysisPasses(TargetMachine_val(Machine), PM);
34637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return Val_unit;
34737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
348