[llvm] [llvm-c][ocaml] Move DataLayout bindings from Target to Core/IR (PR #227714)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 2 00:32:07 PDT 2026


https://github.com/nikic updated https://github.com/llvm/llvm-project/pull/227714

>From 12465ac84c0557054f86b0a101a8e89207c61d8b Mon Sep 17 00:00:00 2001
From: Nikita Popov <npopov at redhat.com>
Date: Wed, 30 Sep 2026 15:01:27 +0200
Subject: [PATCH 1/3] [llvm-c][ocaml] Move DataLayout bindings from Target to
 Core/IR

DataLayout is part of IR (or "Core" in C API terminology),
so bindings for it should be defined there as well. They were
part of Target for historical reasons.

This is to avoid any layering issues with referencing DataLayout
from IR APIs.
---
 .../executionengine/executionengine_ocaml.c   |   2 +-
 .../executionengine/llvm_executionengine.ml   |   2 +-
 .../executionengine/llvm_executionengine.mli  |   2 +-
 llvm/bindings/ocaml/llvm/llvm.ml              |  40 ++++++
 llvm/bindings/ocaml/llvm/llvm.mli             |  79 +++++++++++
 llvm/bindings/ocaml/llvm/llvm_ocaml.c         | 114 +++++++++++++++
 llvm/bindings/ocaml/llvm/llvm_ocaml.h         |   3 +
 llvm/bindings/ocaml/target/llvm_target.ml     |  41 +-----
 llvm/bindings/ocaml/target/llvm_target.mli    |  80 +----------
 llvm/bindings/ocaml/target/target_ocaml.c     | 117 ----------------
 llvm/docs/ReleaseNotes.md                     |   5 +
 llvm/include/llvm-c/Core.h                    | 129 +++++++++++++++++
 llvm/include/llvm-c/Target.h                  | 132 +-----------------
 llvm/include/llvm-c/TargetMachine.h           |   2 +-
 llvm/lib/IR/Core.cpp                          |  94 +++++++++++++
 llvm/lib/Target/Target.cpp                    |  93 ------------
 llvm/test/Bindings/OCaml/debuginfo.ml         |   3 +-
 llvm/tools/llvm-c-test/targets.c              |   1 +
 18 files changed, 478 insertions(+), 461 deletions(-)

diff --git a/llvm/bindings/ocaml/executionengine/executionengine_ocaml.c b/llvm/bindings/ocaml/executionengine/executionengine_ocaml.c
index 9d77c086431df..44f28e02f0d5a 100644
--- a/llvm/bindings/ocaml/executionengine/executionengine_ocaml.c
+++ b/llvm/bindings/ocaml/executionengine/executionengine_ocaml.c
@@ -98,7 +98,7 @@ value llvm_ee_run_static_dtors(value EE) {
 
 extern value llvm_alloc_data_layout(LLVMTargetDataRef TargetData);
 
-/* ExecutionEngine.t -> Llvm_target.DataLayout.t */
+/* ExecutionEngine.t -> Llvm.DataLayout.t */
 value llvm_ee_get_data_layout(value EE) {
   value DataLayout;
   LLVMTargetDataRef OrigDataLayout;
diff --git a/llvm/bindings/ocaml/executionengine/llvm_executionengine.ml b/llvm/bindings/ocaml/executionengine/llvm_executionengine.ml
index 5b202e2ead196..8cf06a62df655 100644
--- a/llvm/bindings/ocaml/executionengine/llvm_executionengine.ml
+++ b/llvm/bindings/ocaml/executionengine/llvm_executionengine.ml
@@ -40,7 +40,7 @@ external run_static_ctors : llexecutionengine -> unit
   = "llvm_ee_run_static_ctors"
 external run_static_dtors : llexecutionengine -> unit
   = "llvm_ee_run_static_dtors"
-external data_layout : llexecutionengine -> Llvm_target.DataLayout.t
+external data_layout : llexecutionengine -> Llvm.DataLayout.t
   = "llvm_ee_get_data_layout"
 external add_global_mapping_ : Llvm.llvalue -> nativeint -> llexecutionengine -> unit
   = "llvm_ee_add_global_mapping"
diff --git a/llvm/bindings/ocaml/executionengine/llvm_executionengine.mli b/llvm/bindings/ocaml/executionengine/llvm_executionengine.mli
index 3c5a1c06a4e03..79c5e6ea098b5 100644
--- a/llvm/bindings/ocaml/executionengine/llvm_executionengine.mli
+++ b/llvm/bindings/ocaml/executionengine/llvm_executionengine.mli
@@ -67,7 +67,7 @@ val run_static_ctors : llexecutionengine -> unit
 val run_static_dtors : llexecutionengine -> unit
 
 (** [data_layout ee] is the data layout of the execution engine [ee]. *)
-val data_layout : llexecutionengine -> Llvm_target.DataLayout.t
+val data_layout : llexecutionengine -> Llvm.DataLayout.t
 
 (** [add_global_mapping gv ptr ee] tells the execution engine [ee] that
     the global [gv] is at the specified location [ptr], which must outlive
diff --git a/llvm/bindings/ocaml/llvm/llvm.ml b/llvm/bindings/ocaml/llvm/llvm.ml
index 359283725c7e9..ce57b4316e879 100644
--- a/llvm/bindings/ocaml/llvm/llvm.ml
+++ b/llvm/bindings/ocaml/llvm/llvm.ml
@@ -355,6 +355,46 @@ module ModuleFlagBehavior = struct
   | AppendUnique
 end
 
+module Endian = struct
+  type t =
+  | Big
+  | Little
+end
+
+module DataLayout = struct
+  type t
+
+  external of_string : string -> t = "llvm_datalayout_of_string"
+  external as_string : t -> string = "llvm_datalayout_as_string"
+  external byte_order : t -> Endian.t = "llvm_datalayout_byte_order"
+  external pointer_size : t -> int = "llvm_datalayout_pointer_size"
+  external intptr_type : llcontext -> t -> lltype
+                       = "llvm_datalayout_intptr_type"
+  external qualified_pointer_size : int -> t -> int
+                                  = "llvm_datalayout_qualified_pointer_size"
+  external qualified_intptr_type : llcontext -> int -> t -> lltype
+                                 = "llvm_datalayout_qualified_intptr_type"
+  external size_in_bits : lltype -> t -> Int64.t
+                        = "llvm_datalayout_size_in_bits"
+  external store_size : lltype -> t -> Int64.t
+                      = "llvm_datalayout_store_size"
+  external abi_size : lltype -> t -> Int64.t
+                    = "llvm_datalayout_abi_size"
+  external abi_align : lltype -> t -> int
+                     = "llvm_datalayout_abi_align"
+  external stack_align : lltype -> t -> int
+                       = "llvm_datalayout_stack_align"
+  external preferred_align : lltype -> t -> int
+                           = "llvm_datalayout_preferred_align"
+  external preferred_align_of_global : llvalue -> t -> int
+                                   = "llvm_datalayout_preferred_align_of_global"
+  external element_at_offset : lltype -> Int64.t -> t -> int
+                             = "llvm_datalayout_element_at_offset"
+  external offset_of_element : lltype -> int -> t -> Int64.t
+                             = "llvm_datalayout_offset_of_element"
+end
+
+
 exception IoError of string
 
 let () = Callback.register_exception "Llvm.IoError" (IoError "")
diff --git a/llvm/bindings/ocaml/llvm/llvm.mli b/llvm/bindings/ocaml/llvm/llvm.mli
index 6126d48937a6e..93e0364227ebc 100644
--- a/llvm/bindings/ocaml/llvm/llvm.mli
+++ b/llvm/bindings/ocaml/llvm/llvm.mli
@@ -394,6 +394,85 @@ module ModuleFlagBehavior :sig
   | AppendUnique
 end
 
+(** {6 Data Layout} *)
+
+module Endian : sig
+  type t =
+  | Big
+  | Little
+end
+
+module DataLayout : sig
+  type t
+
+  (** [of_string rep] parses the data layout string representation [rep].
+      See the constructor [llvm::DataLayout::DataLayout]. *)
+  val of_string : string -> t
+
+  (** [as_string dl] is the string representation of the data layout [dl].
+      See the method [llvm::DataLayout::getStringRepresentation]. *)
+  val as_string : t -> string
+
+  (** Returns the byte order of a target, either [Endian.Big] or
+      [Endian.Little].
+      See the method [llvm::DataLayout::isLittleEndian]. *)
+  val byte_order : t -> Endian.t
+
+  (** Returns the pointer size in bytes for a target.
+      See the method [llvm::DataLayout::getPointerSize]. *)
+  val pointer_size : t -> int
+
+  (** Returns the integer type that is the same size as a pointer on a target.
+      See the method [llvm::DataLayout::getIntPtrType]. *)
+  val intptr_type : llcontext -> t -> lltype
+
+  (** Returns the pointer size in bytes for a target in a given address space.
+      See the method [llvm::DataLayout::getPointerSize]. *)
+  val qualified_pointer_size : int -> t -> int
+
+  (** Returns the integer type that is the same size as a pointer on a target
+      in a given address space.
+      See the method [llvm::DataLayout::getIntPtrType]. *)
+  val qualified_intptr_type : llcontext -> int -> t -> lltype
+
+  (** Computes the size of a type in bits for a target.
+      See the method [llvm::DataLayout::getTypeSizeInBits]. *)
+  val size_in_bits : lltype -> t -> Int64.t
+
+  (** Computes the storage size of a type in bytes for a target.
+      See the method [llvm::DataLayout::getTypeStoreSize]. *)
+  val store_size : lltype -> t -> Int64.t
+
+  (** Computes the ABI size of a type in bytes for a target.
+      See the method [llvm::DataLayout::getTypeAllocSize]. *)
+  val abi_size : lltype -> t -> Int64.t
+
+  (** Computes the ABI alignment of a type in bytes for a target.
+      See the method [llvm::DataLayout::getTypeABISize]. *)
+  val abi_align : lltype -> t -> int
+
+  (** Computes the call frame alignment of a type in bytes for a target.
+      See the method [llvm::DataLayout::getTypeABISize]. *)
+  val stack_align : lltype -> t -> int
+
+  (** Computes the preferred alignment of a type in bytes for a target.
+      See the method [llvm::DataLayout::getTypeABISize]. *)
+  val preferred_align : lltype -> t -> int
+
+  (** Computes the preferred alignment of a global variable in bytes for
+      a target. See the method [llvm::DataLayout::getPreferredAlignment]. *)
+  val preferred_align_of_global : llvalue -> t -> int
+
+  (** Computes the structure element that contains the byte offset for a target.
+      See the method [llvm::StructLayout::getElementContainingOffset]. *)
+  val element_at_offset : lltype -> Int64.t -> t -> int
+
+  (** Computes the byte offset of the indexed struct element for a target.
+      See the method [llvm::StructLayout::getElementContainingOffset]. *)
+  val offset_of_element : lltype -> int -> t -> Int64.t
+end
+
+
 (** {6 Iteration} *)
 
 (** [Before b] and [At_end a] specify positions from the start of the ['b] list
diff --git a/llvm/bindings/ocaml/llvm/llvm_ocaml.c b/llvm/bindings/ocaml/llvm/llvm_ocaml.c
index 19445e7acc13e..42a07c8dc79a0 100644
--- a/llvm/bindings/ocaml/llvm/llvm_ocaml.c
+++ b/llvm/bindings/ocaml/llvm/llvm_ocaml.c
@@ -2777,3 +2777,117 @@ value llvm_memorybuffer_dispose(value MemBuf) {
   LLVMDisposeMemoryBuffer(MemoryBuffer_val(MemBuf));
   return Val_unit;
 }
+
+/*===---- Data Layout -----------------------------------------------------===*/
+
+#define DataLayout_val(v) (*(LLVMTargetDataRef *)(Data_custom_val(v)))
+
+static void llvm_finalize_data_layout(value DataLayout) {
+  LLVMDisposeTargetData(DataLayout_val(DataLayout));
+}
+
+static struct custom_operations llvm_data_layout_ops = {
+    (char *)"Llvm.DataLayout.t", llvm_finalize_data_layout,
+    custom_compare_default,      custom_hash_default,
+    custom_serialize_default,    custom_deserialize_default,
+    custom_compare_ext_default};
+
+value llvm_alloc_data_layout(LLVMTargetDataRef DataLayout) {
+  value V =
+      caml_alloc_custom(&llvm_data_layout_ops, sizeof(LLVMTargetDataRef), 0, 1);
+  DataLayout_val(V) = DataLayout;
+  return V;
+}
+
+/* string -> DataLayout.t */
+value llvm_datalayout_of_string(value StringRep) {
+  return llvm_alloc_data_layout(LLVMCreateTargetData(String_val(StringRep)));
+}
+
+/* DataLayout.t -> string */
+value llvm_datalayout_as_string(value TD) {
+  char *StringRep = LLVMCopyStringRepOfTargetData(DataLayout_val(TD));
+  value Copy = caml_copy_string(StringRep);
+  LLVMDisposeMessage(StringRep);
+  return Copy;
+}
+
+/* DataLayout.t -> Endian.t */
+value llvm_datalayout_byte_order(value DL) {
+  return Val_int(LLVMByteOrder(DataLayout_val(DL)));
+}
+
+/* DataLayout.t -> int */
+value llvm_datalayout_pointer_size(value DL) {
+  return Val_int(LLVMPointerSize(DataLayout_val(DL)));
+}
+
+/* Llvm.llcontext -> DataLayout.t -> Llvm.lltype */
+value llvm_datalayout_intptr_type(value C, value DL) {
+  LLVMTypeRef Type =
+      LLVMIntPtrTypeInContext(Context_val(C), DataLayout_val(DL));
+  return to_val(Type);
+}
+
+/* int -> DataLayout.t -> int */
+value llvm_datalayout_qualified_pointer_size(value AS, value DL) {
+  return Val_int(LLVMPointerSizeForAS(DataLayout_val(DL), Int_val(AS)));
+}
+
+/* Llvm.llcontext -> int -> DataLayout.t -> Llvm.lltype */
+value llvm_datalayout_qualified_intptr_type(value C, value AS, value DL) {
+  LLVMTypeRef Type = LLVMIntPtrTypeForASInContext(
+      Context_val(C), DataLayout_val(DL), Int_val(AS));
+  return to_val(Type);
+}
+
+/* Llvm.lltype -> DataLayout.t -> Int64.t */
+value llvm_datalayout_size_in_bits(value Ty, value DL) {
+  return caml_copy_int64(
+      LLVMSizeOfTypeInBits(DataLayout_val(DL), Type_val(Ty)));
+}
+
+/* Llvm.lltype -> DataLayout.t -> Int64.t */
+value llvm_datalayout_store_size(value Ty, value DL) {
+  return caml_copy_int64(LLVMStoreSizeOfType(DataLayout_val(DL), Type_val(Ty)));
+}
+
+/* Llvm.lltype -> DataLayout.t -> Int64.t */
+value llvm_datalayout_abi_size(value Ty, value DL) {
+  return caml_copy_int64(LLVMABISizeOfType(DataLayout_val(DL), Type_val(Ty)));
+}
+
+/* Llvm.lltype -> DataLayout.t -> int */
+value llvm_datalayout_abi_align(value Ty, value DL) {
+  return Val_int(LLVMABIAlignmentOfType(DataLayout_val(DL), Type_val(Ty)));
+}
+
+/* Llvm.lltype -> DataLayout.t -> int */
+value llvm_datalayout_stack_align(value Ty, value DL) {
+  return Val_int(
+      LLVMCallFrameAlignmentOfType(DataLayout_val(DL), Type_val(Ty)));
+}
+
+/* Llvm.lltype -> DataLayout.t -> int */
+value llvm_datalayout_preferred_align(value Ty, value DL) {
+  return Val_int(
+      LLVMPreferredAlignmentOfType(DataLayout_val(DL), Type_val(Ty)));
+}
+
+/* Llvm.llvalue -> DataLayout.t -> int */
+value llvm_datalayout_preferred_align_of_global(value GlobalVar, value DL) {
+  return Val_int(
+      LLVMPreferredAlignmentOfGlobal(DataLayout_val(DL), Value_val(GlobalVar)));
+}
+
+/* Llvm.lltype -> Int64.t -> DataLayout.t -> int */
+value llvm_datalayout_element_at_offset(value Ty, value Offset, value DL) {
+  return Val_int(
+      LLVMElementAtOffset(DataLayout_val(DL), Type_val(Ty), Int64_val(Offset)));
+}
+
+/* Llvm.lltype -> int -> DataLayout.t -> Int64.t */
+value llvm_datalayout_offset_of_element(value Ty, value Index, value DL) {
+  return caml_copy_int64(
+      LLVMOffsetOfElement(DataLayout_val(DL), Type_val(Ty), Int_val(Index)));
+}
diff --git a/llvm/bindings/ocaml/llvm/llvm_ocaml.h b/llvm/bindings/ocaml/llvm/llvm_ocaml.h
index ec60d6a5dad63..79cadba6275ee 100644
--- a/llvm/bindings/ocaml/llvm/llvm_ocaml.h
+++ b/llvm/bindings/ocaml/llvm/llvm_ocaml.h
@@ -21,6 +21,7 @@
 #include "caml/alloc.h"
 #include "caml/custom.h"
 #include "caml/version.h"
+#include "llvm-c/Core.h"
 
 #if OCAML_VERSION < 41200
 /* operations on OCaml option values, defined by OCaml 4.12 */
@@ -64,4 +65,6 @@ value ptr_to_option(void *Ptr);
 /* Convert a C string into an OCaml string */
 value cstr_to_string(const char *Str, mlsize_t Len);
 
+value llvm_alloc_data_layout(LLVMTargetDataRef DataLayout);
+
 #endif // LLVM_LLVM_OCAML_H
diff --git a/llvm/bindings/ocaml/target/llvm_target.ml b/llvm/bindings/ocaml/target/llvm_target.ml
index ff899f7b6d01a..130bacb62ed9b 100644
--- a/llvm/bindings/ocaml/target/llvm_target.ml
+++ b/llvm/bindings/ocaml/target/llvm_target.ml
@@ -6,12 +6,6 @@
  *
  *===----------------------------------------------------------------------===*)
 
-module Endian = struct
-  type t =
-  | Big
-  | Little
-end
-
 module CodeGenOptLevel = struct
   type t =
   | None
@@ -55,39 +49,6 @@ exception Error of string
 
 let () = Callback.register_exception "Llvm_target.Error" (Error "")
 
-module DataLayout = struct
-  type t
-
-  external of_string : string -> t = "llvm_datalayout_of_string"
-  external as_string : t -> string = "llvm_datalayout_as_string"
-  external byte_order : t -> Endian.t = "llvm_datalayout_byte_order"
-  external pointer_size : t -> int = "llvm_datalayout_pointer_size"
-  external intptr_type : Llvm.llcontext -> t -> Llvm.lltype
-                       = "llvm_datalayout_intptr_type"
-  external qualified_pointer_size : int -> t -> int
-                                  = "llvm_datalayout_qualified_pointer_size"
-  external qualified_intptr_type : Llvm.llcontext -> int -> t -> Llvm.lltype
-                                 = "llvm_datalayout_qualified_intptr_type"
-  external size_in_bits : Llvm.lltype -> t -> Int64.t
-                        = "llvm_datalayout_size_in_bits"
-  external store_size : Llvm.lltype -> t -> Int64.t
-                      = "llvm_datalayout_store_size"
-  external abi_size : Llvm.lltype -> t -> Int64.t
-                    = "llvm_datalayout_abi_size"
-  external abi_align : Llvm.lltype -> t -> int
-                     = "llvm_datalayout_abi_align"
-  external stack_align : Llvm.lltype -> t -> int
-                       = "llvm_datalayout_stack_align"
-  external preferred_align : Llvm.lltype -> t -> int
-                           = "llvm_datalayout_preferred_align"
-  external preferred_align_of_global : Llvm.llvalue -> t -> int
-                                   = "llvm_datalayout_preferred_align_of_global"
-  external element_at_offset : Llvm.lltype -> Int64.t -> t -> int
-                             = "llvm_datalayout_element_at_offset"
-  external offset_of_element : Llvm.lltype -> int -> t -> Int64.t
-                             = "llvm_datalayout_offset_of_element"
-end
-
 module Target = struct
   type t
 
@@ -127,7 +88,7 @@ module TargetMachine = struct
                = "llvm_targetmachine_cpu"
   external features : t -> string
                     = "llvm_targetmachine_features"
-  external data_layout : t -> DataLayout.t
+  external data_layout : t -> Llvm.DataLayout.t
                        = "llvm_targetmachine_data_layout"
   external set_verbose_asm : bool -> t -> unit
                            = "llvm_targetmachine_set_verbose_asm"
diff --git a/llvm/bindings/ocaml/target/llvm_target.mli b/llvm/bindings/ocaml/target/llvm_target.mli
index 4df15154feeb9..f5409f35712ae 100644
--- a/llvm/bindings/ocaml/target/llvm_target.mli
+++ b/llvm/bindings/ocaml/target/llvm_target.mli
@@ -11,12 +11,6 @@
     This interface provides an OCaml API for LLVM target information,
     the classes in the Target library. *)
 
-module Endian : sig
-  type t =
-  | Big
-  | Little
-end
-
 module CodeGenOptLevel : sig
   type t =
   | None
@@ -60,78 +54,6 @@ end
 
 exception Error of string
 
-(** {6 Data Layout} *)
-
-module DataLayout : sig
-  type t
-
-  (** [of_string rep] parses the data layout string representation [rep].
-      See the constructor [llvm::DataLayout::DataLayout]. *)
-  val of_string : string -> t
-
-  (** [as_string dl] is the string representation of the data layout [dl].
-      See the method [llvm::DataLayout::getStringRepresentation]. *)
-  val as_string : t -> string
-
-  (** Returns the byte order of a target, either [Endian.Big] or
-      [Endian.Little].
-      See the method [llvm::DataLayout::isLittleEndian]. *)
-  val byte_order : t -> Endian.t
-
-  (** Returns the pointer size in bytes for a target.
-      See the method [llvm::DataLayout::getPointerSize]. *)
-  val pointer_size : t -> int
-
-  (** Returns the integer type that is the same size as a pointer on a target.
-      See the method [llvm::DataLayout::getIntPtrType]. *)
-  val intptr_type : Llvm.llcontext -> t -> Llvm.lltype
-
-  (** Returns the pointer size in bytes for a target in a given address space.
-      See the method [llvm::DataLayout::getPointerSize]. *)
-  val qualified_pointer_size : int -> t -> int
-
-  (** Returns the integer type that is the same size as a pointer on a target
-      in a given address space.
-      See the method [llvm::DataLayout::getIntPtrType]. *)
-  val qualified_intptr_type : Llvm.llcontext -> int -> t -> Llvm.lltype
-
-  (** Computes the size of a type in bits for a target.
-      See the method [llvm::DataLayout::getTypeSizeInBits]. *)
-  val size_in_bits : Llvm.lltype -> t -> Int64.t
-
-  (** Computes the storage size of a type in bytes for a target.
-      See the method [llvm::DataLayout::getTypeStoreSize]. *)
-  val store_size : Llvm.lltype -> t -> Int64.t
-
-  (** Computes the ABI size of a type in bytes for a target.
-      See the method [llvm::DataLayout::getTypeAllocSize]. *)
-  val abi_size : Llvm.lltype -> t -> Int64.t
-
-  (** Computes the ABI alignment of a type in bytes for a target.
-      See the method [llvm::DataLayout::getTypeABISize]. *)
-  val abi_align : Llvm.lltype -> t -> int
-
-  (** Computes the call frame alignment of a type in bytes for a target.
-      See the method [llvm::DataLayout::getTypeABISize]. *)
-  val stack_align : Llvm.lltype -> t -> int
-
-  (** Computes the preferred alignment of a type in bytes for a target.
-      See the method [llvm::DataLayout::getTypeABISize]. *)
-  val preferred_align : Llvm.lltype -> t -> int
-
-  (** Computes the preferred alignment of a global variable in bytes for
-      a target. See the method [llvm::DataLayout::getPreferredAlignment]. *)
-  val preferred_align_of_global : Llvm.llvalue -> t -> int
-
-  (** Computes the structure element that contains the byte offset for a target.
-      See the method [llvm::StructLayout::getElementContainingOffset]. *)
-  val element_at_offset : Llvm.lltype -> Int64.t -> t -> int
-
-  (** Computes the byte offset of the indexed struct element for a target.
-      See the method [llvm::StructLayout::getElementContainingOffset]. *)
-  val offset_of_element : Llvm.lltype -> int -> t -> Int64.t
-end
-
 (** {6 Target} *)
 
 module Target : sig
@@ -201,7 +123,7 @@ module TargetMachine : sig
   val cpu : t -> string
 
   (** Returns the data layout of this target machine. *)
-  val data_layout : t -> DataLayout.t
+  val data_layout : t -> Llvm.DataLayout.t
 
   (** Returns the feature string used while creating this target machine. See
       [llvm::TargetMachine::getFeatureString]. *)
diff --git a/llvm/bindings/ocaml/target/target_ocaml.c b/llvm/bindings/ocaml/target/target_ocaml.c
index 94cf437b93486..c3d6e6ea61e8b 100644
--- a/llvm/bindings/ocaml/target/target_ocaml.c
+++ b/llvm/bindings/ocaml/target/target_ocaml.c
@@ -29,123 +29,6 @@
 void llvm_raise(value Prototype, char *Message);
 value llvm_string_of_message(char *Message);
 
-/*===---- Data Layout -----------------------------------------------------===*/
-
-#define DataLayout_val(v) (*(LLVMTargetDataRef *)(Data_custom_val(v)))
-
-static void llvm_finalize_data_layout(value DataLayout) {
-  LLVMDisposeTargetData(DataLayout_val(DataLayout));
-}
-
-static struct custom_operations llvm_data_layout_ops = {
-    (char *)"Llvm_target.DataLayout.t",
-    llvm_finalize_data_layout,
-    custom_compare_default,
-    custom_hash_default,
-    custom_serialize_default,
-    custom_deserialize_default,
-    custom_compare_ext_default};
-
-value llvm_alloc_data_layout(LLVMTargetDataRef DataLayout) {
-  value V =
-      caml_alloc_custom(&llvm_data_layout_ops, sizeof(LLVMTargetDataRef), 0, 1);
-  DataLayout_val(V) = DataLayout;
-  return V;
-}
-
-/* string -> DataLayout.t */
-value llvm_datalayout_of_string(value StringRep) {
-  return llvm_alloc_data_layout(LLVMCreateTargetData(String_val(StringRep)));
-}
-
-/* DataLayout.t -> string */
-value llvm_datalayout_as_string(value TD) {
-  char *StringRep = LLVMCopyStringRepOfTargetData(DataLayout_val(TD));
-  value Copy = caml_copy_string(StringRep);
-  LLVMDisposeMessage(StringRep);
-  return Copy;
-}
-
-/* DataLayout.t -> Endian.t */
-value llvm_datalayout_byte_order(value DL) {
-  return Val_int(LLVMByteOrder(DataLayout_val(DL)));
-}
-
-/* DataLayout.t -> int */
-value llvm_datalayout_pointer_size(value DL) {
-  return Val_int(LLVMPointerSize(DataLayout_val(DL)));
-}
-
-/* Llvm.llcontext -> DataLayout.t -> Llvm.lltype */
-value llvm_datalayout_intptr_type(value C, value DL) {
-  LLVMTypeRef Type =
-      LLVMIntPtrTypeInContext(Context_val(C), DataLayout_val(DL));
-  return to_val(Type);
-}
-
-/* int -> DataLayout.t -> int */
-value llvm_datalayout_qualified_pointer_size(value AS, value DL) {
-  return Val_int(LLVMPointerSizeForAS(DataLayout_val(DL), Int_val(AS)));
-}
-
-/* Llvm.llcontext -> int -> DataLayout.t -> Llvm.lltype */
-value llvm_datalayout_qualified_intptr_type(value C, value AS, value DL) {
-  LLVMTypeRef Type = LLVMIntPtrTypeForASInContext(
-      Context_val(C), DataLayout_val(DL), Int_val(AS));
-  return to_val(Type);
-}
-
-/* Llvm.lltype -> DataLayout.t -> Int64.t */
-value llvm_datalayout_size_in_bits(value Ty, value DL) {
-  return caml_copy_int64(
-      LLVMSizeOfTypeInBits(DataLayout_val(DL), Type_val(Ty)));
-}
-
-/* Llvm.lltype -> DataLayout.t -> Int64.t */
-value llvm_datalayout_store_size(value Ty, value DL) {
-  return caml_copy_int64(LLVMStoreSizeOfType(DataLayout_val(DL), Type_val(Ty)));
-}
-
-/* Llvm.lltype -> DataLayout.t -> Int64.t */
-value llvm_datalayout_abi_size(value Ty, value DL) {
-  return caml_copy_int64(LLVMABISizeOfType(DataLayout_val(DL), Type_val(Ty)));
-}
-
-/* Llvm.lltype -> DataLayout.t -> int */
-value llvm_datalayout_abi_align(value Ty, value DL) {
-  return Val_int(LLVMABIAlignmentOfType(DataLayout_val(DL), Type_val(Ty)));
-}
-
-/* Llvm.lltype -> DataLayout.t -> int */
-value llvm_datalayout_stack_align(value Ty, value DL) {
-  return Val_int(
-      LLVMCallFrameAlignmentOfType(DataLayout_val(DL), Type_val(Ty)));
-}
-
-/* Llvm.lltype -> DataLayout.t -> int */
-value llvm_datalayout_preferred_align(value Ty, value DL) {
-  return Val_int(
-      LLVMPreferredAlignmentOfType(DataLayout_val(DL), Type_val(Ty)));
-}
-
-/* Llvm.llvalue -> DataLayout.t -> int */
-value llvm_datalayout_preferred_align_of_global(value GlobalVar, value DL) {
-  return Val_int(
-      LLVMPreferredAlignmentOfGlobal(DataLayout_val(DL), Value_val(GlobalVar)));
-}
-
-/* Llvm.lltype -> Int64.t -> DataLayout.t -> int */
-value llvm_datalayout_element_at_offset(value Ty, value Offset, value DL) {
-  return Val_int(
-      LLVMElementAtOffset(DataLayout_val(DL), Type_val(Ty), Int64_val(Offset)));
-}
-
-/* Llvm.lltype -> int -> DataLayout.t -> Int64.t */
-value llvm_datalayout_offset_of_element(value Ty, value Index, value DL) {
-  return caml_copy_int64(
-      LLVMOffsetOfElement(DataLayout_val(DL), Type_val(Ty), Int_val(Index)));
-}
-
 /*===---- Target ----------------------------------------------------------===*/
 
 #define Target_val(v) ((LLVMTargetRef)from_val(v))
diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md
index 3b344fe96bc32..3430ba4154164 100644
--- a/llvm/docs/ReleaseNotes.md
+++ b/llvm/docs/ReleaseNotes.md
@@ -308,6 +308,8 @@ Makes programs 10x faster by doing Special New Thing.
 * Removed the `size_of` and `align_of` functions. Create a constant based on
   the result of `DataLayout.abi_size` or `DataLayout.abi_align` instead.
 
+* `DataLayout` has been moved from `Llvm_target` to `Llvm`.
+
 ### Changes to the Python bindings
 
 ### Changes to the C API
@@ -316,6 +318,9 @@ Makes programs 10x faster by doing Special New Thing.
   based on the result of `LLVMABIAlignmentOfType()` or `LLVMABISizeOfType()`
   instead.
 
+* Bindings operating on data layout (`LLVMTargetDataRef`) have been moved
+  from `Target.h` (`Target` library) to `Core.h` (`IR` library).
+
 ### Changes to the CodeGen infrastructure
 
 * Fixed a crash
diff --git a/llvm/include/llvm-c/Core.h b/llvm/include/llvm-c/Core.h
index 5d9cbf9859f5a..ecff14ee644ce 100644
--- a/llvm/include/llvm-c/Core.h
+++ b/llvm/include/llvm-c/Core.h
@@ -5364,6 +5364,135 @@ LLVM_C_ABI void LLVMStopMultithreaded(void);
     @see llvm::llvm_is_multithreaded */
 LLVM_C_ABI LLVMBool LLVMIsMultithreaded(void);
 
+/**
+ * @}
+ */
+
+/**
+ * @defgroup LLVMCCoreDataLayout Data Layout
+ *
+ * @{
+ */
+
+enum LLVMByteOrdering { LLVMBigEndian, LLVMLittleEndian };
+
+typedef struct LLVMOpaqueTargetData *LLVMTargetDataRef;
+
+/**
+ * Obtain the data layout for a module.
+ *
+ * @see Module::getDataLayout()
+ */
+LLVM_C_ABI LLVMTargetDataRef LLVMGetModuleDataLayout(LLVMModuleRef M);
+
+/**
+ * Set the data layout for a module.
+ *
+ * @see Module::setDataLayout()
+ */
+LLVM_C_ABI void LLVMSetModuleDataLayout(LLVMModuleRef M, LLVMTargetDataRef DL);
+
+/** Creates target data from a target layout string.
+    See the constructor llvm::DataLayout::DataLayout. */
+LLVM_C_ABI LLVMTargetDataRef LLVMCreateTargetData(const char *StringRep);
+
+/** Deallocates a TargetData.
+    See the destructor llvm::DataLayout::~DataLayout. */
+LLVM_C_ABI void LLVMDisposeTargetData(LLVMTargetDataRef TD);
+
+/** Converts target data to a target layout string. The string must be disposed
+    with LLVMDisposeMessage.
+    See the constructor llvm::DataLayout::DataLayout. */
+LLVM_C_ABI char *LLVMCopyStringRepOfTargetData(LLVMTargetDataRef TD);
+
+/** Returns the byte order of a target, either LLVMBigEndian or
+    LLVMLittleEndian.
+    See the method llvm::DataLayout::isLittleEndian. */
+LLVM_C_ABI enum LLVMByteOrdering LLVMByteOrder(LLVMTargetDataRef TD);
+
+/** Returns the pointer size in bytes for a target.
+    See the method llvm::DataLayout::getPointerSize. */
+LLVM_C_ABI unsigned LLVMPointerSize(LLVMTargetDataRef TD);
+
+/** Returns the pointer size in bytes for a target for a specified
+    address space.
+    See the method llvm::DataLayout::getPointerSize. */
+LLVM_C_ABI unsigned LLVMPointerSizeForAS(LLVMTargetDataRef TD, unsigned AS);
+
+/** Returns the integer type that is the same size as a pointer on a target.
+    See the method llvm::DataLayout::getIntPtrType. */
+LLVM_C_ABI
+LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef TD),
+                            "Use of the global context is deprecated, use "
+                            "LLVMIntPtrTypeInContext instead");
+
+/** Returns the integer type that is the same size as a pointer on a target.
+    This version allows the address space to be specified.
+    See the method llvm::DataLayout::getIntPtrType. */
+LLVM_C_ABI LLVM_ATTRIBUTE_C_DEPRECATED(
+    LLVMTypeRef LLVMIntPtrTypeForAS(LLVMTargetDataRef TD, unsigned AS),
+    "Use of the global context is deprecated, use LLVMIntPtrTypeForASInContext "
+    "instead");
+
+/** Returns the integer type that is the same size as a pointer on a target.
+    See the method llvm::DataLayout::getIntPtrType. */
+LLVM_C_ABI LLVMTypeRef LLVMIntPtrTypeInContext(LLVMContextRef C,
+                                               LLVMTargetDataRef TD);
+
+/** Returns the integer type that is the same size as a pointer on a target.
+    This version allows the address space to be specified.
+    See the method llvm::DataLayout::getIntPtrType. */
+LLVM_C_ABI LLVMTypeRef LLVMIntPtrTypeForASInContext(LLVMContextRef C,
+                                                    LLVMTargetDataRef TD,
+                                                    unsigned AS);
+
+/** Computes the size of a type in bits for a target.
+    See the method llvm::DataLayout::getTypeSizeInBits. */
+LLVM_C_ABI unsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef TD,
+                                                   LLVMTypeRef Ty);
+
+/** Computes the storage size of a type in bytes for a target.
+    See the method llvm::DataLayout::getTypeStoreSize. */
+LLVM_C_ABI unsigned long long LLVMStoreSizeOfType(LLVMTargetDataRef TD,
+                                                  LLVMTypeRef Ty);
+
+/** Computes the ABI size of a type in bytes for a target.
+    See the method llvm::DataLayout::getTypeAllocSize. */
+LLVM_C_ABI unsigned long long LLVMABISizeOfType(LLVMTargetDataRef TD,
+                                                LLVMTypeRef Ty);
+
+/** Computes the ABI alignment of a type in bytes for a target.
+    See the method llvm::DataLayout::getTypeABISize. */
+LLVM_C_ABI unsigned LLVMABIAlignmentOfType(LLVMTargetDataRef TD,
+                                           LLVMTypeRef Ty);
+
+/** Computes the call frame alignment of a type in bytes for a target.
+    See the method llvm::DataLayout::getTypeABISize. */
+LLVM_C_ABI unsigned LLVMCallFrameAlignmentOfType(LLVMTargetDataRef TD,
+                                                 LLVMTypeRef Ty);
+
+/** Computes the preferred alignment of a type in bytes for a target.
+    See the method llvm::DataLayout::getTypeABISize. */
+LLVM_C_ABI unsigned LLVMPreferredAlignmentOfType(LLVMTargetDataRef TD,
+                                                 LLVMTypeRef Ty);
+
+/** Computes the preferred alignment of a global variable in bytes for a target.
+    See the method llvm::DataLayout::getPreferredAlignment. */
+LLVM_C_ABI unsigned LLVMPreferredAlignmentOfGlobal(LLVMTargetDataRef TD,
+                                                   LLVMValueRef GlobalVar);
+
+/** Computes the structure element that contains the byte offset for a target.
+    See the method llvm::StructLayout::getElementContainingOffset. */
+LLVM_C_ABI unsigned LLVMElementAtOffset(LLVMTargetDataRef TD,
+                                        LLVMTypeRef StructTy,
+                                        unsigned long long Offset);
+
+/** Computes the byte offset of the indexed struct element for a target.
+    See the method llvm::StructLayout::getElementContainingOffset. */
+LLVM_C_ABI unsigned long long LLVMOffsetOfElement(LLVMTargetDataRef TD,
+                                                  LLVMTypeRef StructTy,
+                                                  unsigned Element);
+
 /**
  * @}
  */
diff --git a/llvm/include/llvm-c/Target.h b/llvm/include/llvm-c/Target.h
index 12bc1ac438729..cc0a13207c951 100644
--- a/llvm/include/llvm-c/Target.h
+++ b/llvm/include/llvm-c/Target.h
@@ -34,11 +34,14 @@ LLVM_C_EXTERN_C_BEGIN
  * @{
  */
 
-enum LLVMByteOrdering { LLVMBigEndian, LLVMLittleEndian };
-
-typedef struct LLVMOpaqueTargetData *LLVMTargetDataRef;
 typedef struct LLVMOpaqueTargetLibraryInfotData *LLVMTargetLibraryInfoRef;
 
+/** Adds target library information to a pass manager. This does not take
+    ownership of the target library info.
+    See the method llvm::PassManagerBase::add. */
+LLVM_C_ABI void LLVMAddTargetLibraryInfo(LLVMTargetLibraryInfoRef TLI,
+                                         LLVMPassManagerRef PM);
+
 /* Declare all of the target-initialization functions that are available. */
 #define LLVM_TARGET(TargetName)                                                \
   LLVM_C_ABI void LLVMInitialize##TargetName##TargetInfo(void);
@@ -179,129 +182,6 @@ static inline LLVMBool LLVMInitializeNativeDisassembler(void) {
 #endif
 }
 
-/*===-- Target Data -------------------------------------------------------===*/
-
-/**
- * Obtain the data layout for a module.
- *
- * @see Module::getDataLayout()
- */
-LLVM_C_ABI LLVMTargetDataRef LLVMGetModuleDataLayout(LLVMModuleRef M);
-
-/**
- * Set the data layout for a module.
- *
- * @see Module::setDataLayout()
- */
-LLVM_C_ABI void LLVMSetModuleDataLayout(LLVMModuleRef M, LLVMTargetDataRef DL);
-
-/** Creates target data from a target layout string.
-    See the constructor llvm::DataLayout::DataLayout. */
-LLVM_C_ABI LLVMTargetDataRef LLVMCreateTargetData(const char *StringRep);
-
-/** Deallocates a TargetData.
-    See the destructor llvm::DataLayout::~DataLayout. */
-LLVM_C_ABI void LLVMDisposeTargetData(LLVMTargetDataRef TD);
-
-/** Adds target library information to a pass manager. This does not take
-    ownership of the target library info.
-    See the method llvm::PassManagerBase::add. */
-LLVM_C_ABI void LLVMAddTargetLibraryInfo(LLVMTargetLibraryInfoRef TLI,
-                                         LLVMPassManagerRef PM);
-
-/** Converts target data to a target layout string. The string must be disposed
-    with LLVMDisposeMessage.
-    See the constructor llvm::DataLayout::DataLayout. */
-LLVM_C_ABI char *LLVMCopyStringRepOfTargetData(LLVMTargetDataRef TD);
-
-/** Returns the byte order of a target, either LLVMBigEndian or
-    LLVMLittleEndian.
-    See the method llvm::DataLayout::isLittleEndian. */
-LLVM_C_ABI enum LLVMByteOrdering LLVMByteOrder(LLVMTargetDataRef TD);
-
-/** Returns the pointer size in bytes for a target.
-    See the method llvm::DataLayout::getPointerSize. */
-LLVM_C_ABI unsigned LLVMPointerSize(LLVMTargetDataRef TD);
-
-/** Returns the pointer size in bytes for a target for a specified
-    address space.
-    See the method llvm::DataLayout::getPointerSize. */
-LLVM_C_ABI unsigned LLVMPointerSizeForAS(LLVMTargetDataRef TD, unsigned AS);
-
-/** Returns the integer type that is the same size as a pointer on a target.
-    See the method llvm::DataLayout::getIntPtrType. */
-LLVM_C_ABI
-LLVM_ATTRIBUTE_C_DEPRECATED(LLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef TD),
-                            "Use of the global context is deprecated, use "
-                            "LLVMIntPtrTypeInContext instead");
-
-/** Returns the integer type that is the same size as a pointer on a target.
-    This version allows the address space to be specified.
-    See the method llvm::DataLayout::getIntPtrType. */
-LLVM_C_ABI LLVM_ATTRIBUTE_C_DEPRECATED(
-    LLVMTypeRef LLVMIntPtrTypeForAS(LLVMTargetDataRef TD, unsigned AS),
-    "Use of the global context is deprecated, use LLVMIntPtrTypeForASInContext "
-    "instead");
-
-/** Returns the integer type that is the same size as a pointer on a target.
-    See the method llvm::DataLayout::getIntPtrType. */
-LLVM_C_ABI LLVMTypeRef LLVMIntPtrTypeInContext(LLVMContextRef C,
-                                               LLVMTargetDataRef TD);
-
-/** Returns the integer type that is the same size as a pointer on a target.
-    This version allows the address space to be specified.
-    See the method llvm::DataLayout::getIntPtrType. */
-LLVM_C_ABI LLVMTypeRef LLVMIntPtrTypeForASInContext(LLVMContextRef C,
-                                                    LLVMTargetDataRef TD,
-                                                    unsigned AS);
-
-/** Computes the size of a type in bits for a target.
-    See the method llvm::DataLayout::getTypeSizeInBits. */
-LLVM_C_ABI unsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef TD,
-                                                   LLVMTypeRef Ty);
-
-/** Computes the storage size of a type in bytes for a target.
-    See the method llvm::DataLayout::getTypeStoreSize. */
-LLVM_C_ABI unsigned long long LLVMStoreSizeOfType(LLVMTargetDataRef TD,
-                                                  LLVMTypeRef Ty);
-
-/** Computes the ABI size of a type in bytes for a target.
-    See the method llvm::DataLayout::getTypeAllocSize. */
-LLVM_C_ABI unsigned long long LLVMABISizeOfType(LLVMTargetDataRef TD,
-                                                LLVMTypeRef Ty);
-
-/** Computes the ABI alignment of a type in bytes for a target.
-    See the method llvm::DataLayout::getTypeABISize. */
-LLVM_C_ABI unsigned LLVMABIAlignmentOfType(LLVMTargetDataRef TD,
-                                           LLVMTypeRef Ty);
-
-/** Computes the call frame alignment of a type in bytes for a target.
-    See the method llvm::DataLayout::getTypeABISize. */
-LLVM_C_ABI unsigned LLVMCallFrameAlignmentOfType(LLVMTargetDataRef TD,
-                                                 LLVMTypeRef Ty);
-
-/** Computes the preferred alignment of a type in bytes for a target.
-    See the method llvm::DataLayout::getTypeABISize. */
-LLVM_C_ABI unsigned LLVMPreferredAlignmentOfType(LLVMTargetDataRef TD,
-                                                 LLVMTypeRef Ty);
-
-/** Computes the preferred alignment of a global variable in bytes for a target.
-    See the method llvm::DataLayout::getPreferredAlignment. */
-LLVM_C_ABI unsigned LLVMPreferredAlignmentOfGlobal(LLVMTargetDataRef TD,
-                                                   LLVMValueRef GlobalVar);
-
-/** Computes the structure element that contains the byte offset for a target.
-    See the method llvm::StructLayout::getElementContainingOffset. */
-LLVM_C_ABI unsigned LLVMElementAtOffset(LLVMTargetDataRef TD,
-                                        LLVMTypeRef StructTy,
-                                        unsigned long long Offset);
-
-/** Computes the byte offset of the indexed struct element for a target.
-    See the method llvm::StructLayout::getElementContainingOffset. */
-LLVM_C_ABI unsigned long long LLVMOffsetOfElement(LLVMTargetDataRef TD,
-                                                  LLVMTypeRef StructTy,
-                                                  unsigned Element);
-
 /**
  * @}
  */
diff --git a/llvm/include/llvm-c/TargetMachine.h b/llvm/include/llvm-c/TargetMachine.h
index 1c2d1ed9bfff8..8d851ab2f0ef8 100644
--- a/llvm/include/llvm-c/TargetMachine.h
+++ b/llvm/include/llvm-c/TargetMachine.h
@@ -19,8 +19,8 @@
 #ifndef LLVM_C_TARGETMACHINE_H
 #define LLVM_C_TARGETMACHINE_H
 
+#include "llvm-c/Core.h"
 #include "llvm-c/ExternC.h"
-#include "llvm-c/Target.h"
 #include "llvm-c/Types.h"
 #include "llvm-c/Visibility.h"
 
diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp
index c8fe01709383c..e4e18000ff05f 100644
--- a/llvm/lib/IR/Core.cpp
+++ b/llvm/lib/IR/Core.cpp
@@ -4790,3 +4790,97 @@ void LLVMStopMultithreaded() {
 LLVMBool LLVMIsMultithreaded() {
   return llvm_is_multithreaded();
 }
+
+/*===-- Data Layout ----------------------------------------------------===*/
+
+LLVMTargetDataRef LLVMGetModuleDataLayout(LLVMModuleRef M) {
+  return wrap(&unwrap(M)->getDataLayout());
+}
+
+void LLVMSetModuleDataLayout(LLVMModuleRef M, LLVMTargetDataRef DL) {
+  unwrap(M)->setDataLayout(*unwrap(DL));
+}
+
+LLVMTargetDataRef LLVMCreateTargetData(const char *StringRep) {
+  return wrap(new DataLayout(StringRep));
+}
+
+void LLVMDisposeTargetData(LLVMTargetDataRef TD) { delete unwrap(TD); }
+
+char *LLVMCopyStringRepOfTargetData(LLVMTargetDataRef TD) {
+  std::string StringRep = unwrap(TD)->getStringRepresentation();
+  return strdup(StringRep.c_str());
+}
+
+LLVMByteOrdering LLVMByteOrder(LLVMTargetDataRef TD) {
+  return unwrap(TD)->isLittleEndian() ? LLVMLittleEndian : LLVMBigEndian;
+}
+
+unsigned LLVMPointerSize(LLVMTargetDataRef TD) {
+  return unwrap(TD)->getPointerSize(0);
+}
+
+unsigned LLVMPointerSizeForAS(LLVMTargetDataRef TD, unsigned AS) {
+  return unwrap(TD)->getPointerSize(AS);
+}
+
+LLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef TD) {
+  return wrap(unwrap(TD)->getIntPtrType(*unwrap(getGlobalContextForCAPI())));
+}
+
+LLVMTypeRef LLVMIntPtrTypeForAS(LLVMTargetDataRef TD, unsigned AS) {
+  return wrap(
+      unwrap(TD)->getIntPtrType(*unwrap(getGlobalContextForCAPI()), AS));
+}
+
+LLVMTypeRef LLVMIntPtrTypeInContext(LLVMContextRef C, LLVMTargetDataRef TD) {
+  return wrap(unwrap(TD)->getIntPtrType(*unwrap(C)));
+}
+
+LLVMTypeRef LLVMIntPtrTypeForASInContext(LLVMContextRef C, LLVMTargetDataRef TD,
+                                         unsigned AS) {
+  return wrap(unwrap(TD)->getIntPtrType(*unwrap(C), AS));
+}
+
+unsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
+  return unwrap(TD)->getTypeSizeInBits(unwrap(Ty));
+}
+
+unsigned long long LLVMStoreSizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
+  return unwrap(TD)->getTypeStoreSize(unwrap(Ty));
+}
+
+unsigned long long LLVMABISizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
+  return unwrap(TD)->getTypeAllocSize(unwrap(Ty));
+}
+
+unsigned LLVMABIAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
+  return unwrap(TD)->getABITypeAlign(unwrap(Ty)).value();
+}
+
+unsigned LLVMCallFrameAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
+  return unwrap(TD)->getABITypeAlign(unwrap(Ty)).value();
+}
+
+unsigned LLVMPreferredAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
+  return unwrap(TD)->getPrefTypeAlign(unwrap(Ty)).value();
+}
+
+unsigned LLVMPreferredAlignmentOfGlobal(LLVMTargetDataRef TD,
+                                        LLVMValueRef GlobalVar) {
+  return unwrap(TD)
+      ->getPreferredAlign(unwrap<GlobalVariable>(GlobalVar))
+      .value();
+}
+
+unsigned LLVMElementAtOffset(LLVMTargetDataRef TD, LLVMTypeRef StructTy,
+                             unsigned long long Offset) {
+  StructType *STy = unwrap<StructType>(StructTy);
+  return unwrap(TD)->getStructLayout(STy)->getElementContainingOffset(Offset);
+}
+
+unsigned long long LLVMOffsetOfElement(LLVMTargetDataRef TD,
+                                       LLVMTypeRef StructTy, unsigned Element) {
+  StructType *STy = unwrap<StructType>(StructTy);
+  return unwrap(TD)->getStructLayout(STy)->getElementOffset(Element);
+}
diff --git a/llvm/lib/Target/Target.cpp b/llvm/lib/Target/Target.cpp
index 2eab095da09f7..669788d7522ce 100644
--- a/llvm/lib/Target/Target.cpp
+++ b/llvm/lib/Target/Target.cpp
@@ -37,100 +37,7 @@ void llvm::initializeTarget(PassRegistry &Registry) {
   initializeTargetTransformInfoWrapperPassPass(Registry);
 }
 
-LLVMTargetDataRef LLVMGetModuleDataLayout(LLVMModuleRef M) {
-  return wrap(&unwrap(M)->getDataLayout());
-}
-
-void LLVMSetModuleDataLayout(LLVMModuleRef M, LLVMTargetDataRef DL) {
-  unwrap(M)->setDataLayout(*unwrap(DL));
-}
-
-LLVMTargetDataRef LLVMCreateTargetData(const char *StringRep) {
-  return wrap(new DataLayout(StringRep));
-}
-
-void LLVMDisposeTargetData(LLVMTargetDataRef TD) {
-  delete unwrap(TD);
-}
-
 void LLVMAddTargetLibraryInfo(LLVMTargetLibraryInfoRef TLI,
                               LLVMPassManagerRef PM) {
   unwrap(PM)->add(new TargetLibraryInfoWrapperPass(*unwrap(TLI)));
 }
-
-char *LLVMCopyStringRepOfTargetData(LLVMTargetDataRef TD) {
-  std::string StringRep = unwrap(TD)->getStringRepresentation();
-  return strdup(StringRep.c_str());
-}
-
-LLVMByteOrdering LLVMByteOrder(LLVMTargetDataRef TD) {
-  return unwrap(TD)->isLittleEndian() ? LLVMLittleEndian : LLVMBigEndian;
-}
-
-unsigned LLVMPointerSize(LLVMTargetDataRef TD) {
-  return unwrap(TD)->getPointerSize(0);
-}
-
-unsigned LLVMPointerSizeForAS(LLVMTargetDataRef TD, unsigned AS) {
-  return unwrap(TD)->getPointerSize(AS);
-}
-
-LLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef TD) {
-  return wrap(unwrap(TD)->getIntPtrType(*unwrap(getGlobalContextForCAPI())));
-}
-
-LLVMTypeRef LLVMIntPtrTypeForAS(LLVMTargetDataRef TD, unsigned AS) {
-  return wrap(
-      unwrap(TD)->getIntPtrType(*unwrap(getGlobalContextForCAPI()), AS));
-}
-
-LLVMTypeRef LLVMIntPtrTypeInContext(LLVMContextRef C, LLVMTargetDataRef TD) {
-  return wrap(unwrap(TD)->getIntPtrType(*unwrap(C)));
-}
-
-LLVMTypeRef LLVMIntPtrTypeForASInContext(LLVMContextRef C, LLVMTargetDataRef TD, unsigned AS) {
-  return wrap(unwrap(TD)->getIntPtrType(*unwrap(C), AS));
-}
-
-unsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
-  return unwrap(TD)->getTypeSizeInBits(unwrap(Ty));
-}
-
-unsigned long long LLVMStoreSizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
-  return unwrap(TD)->getTypeStoreSize(unwrap(Ty));
-}
-
-unsigned long long LLVMABISizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
-  return unwrap(TD)->getTypeAllocSize(unwrap(Ty));
-}
-
-unsigned LLVMABIAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
-  return unwrap(TD)->getABITypeAlign(unwrap(Ty)).value();
-}
-
-unsigned LLVMCallFrameAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
-  return unwrap(TD)->getABITypeAlign(unwrap(Ty)).value();
-}
-
-unsigned LLVMPreferredAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
-  return unwrap(TD)->getPrefTypeAlign(unwrap(Ty)).value();
-}
-
-unsigned LLVMPreferredAlignmentOfGlobal(LLVMTargetDataRef TD,
-                                        LLVMValueRef GlobalVar) {
-  return unwrap(TD)
-      ->getPreferredAlign(unwrap<GlobalVariable>(GlobalVar))
-      .value();
-}
-
-unsigned LLVMElementAtOffset(LLVMTargetDataRef TD, LLVMTypeRef StructTy,
-                             unsigned long long Offset) {
-  StructType *STy = unwrap<StructType>(StructTy);
-  return unwrap(TD)->getStructLayout(STy)->getElementContainingOffset(Offset);
-}
-
-unsigned long long LLVMOffsetOfElement(LLVMTargetDataRef TD, LLVMTypeRef StructTy,
-                                       unsigned Element) {
-  StructType *STy = unwrap<StructType>(StructTy);
-  return unwrap(TD)->getStructLayout(STy)->getElementOffset(Element);
-}
diff --git a/llvm/test/Bindings/OCaml/debuginfo.ml b/llvm/test/Bindings/OCaml/debuginfo.ml
index 7edc6e900011c..1f1d5c2c4c3ce 100644
--- a/llvm/test/Bindings/OCaml/debuginfo.ml
+++ b/llvm/test/Bindings/OCaml/debuginfo.ml
@@ -28,8 +28,7 @@ let prepare_target llmod =
   let triple = Llvm_target.Target.default_triple () in
   let lltarget = Llvm_target.Target.by_triple triple in
   let llmachine = Llvm_target.TargetMachine.create ~triple lltarget in
-  let lldly =
-    Llvm_target.DataLayout.as_string
+  let lldly = Llvm.DataLayout.as_string
       (Llvm_target.TargetMachine.data_layout llmachine)
   in
   let _ = Llvm.set_target_triple triple llmod in
diff --git a/llvm/tools/llvm-c-test/targets.c b/llvm/tools/llvm-c-test/targets.c
index 685598e1a5eaa..7c630af3db048 100644
--- a/llvm/tools/llvm-c-test/targets.c
+++ b/llvm/tools/llvm-c-test/targets.c
@@ -11,6 +11,7 @@
 |*                                                                            *|
 \*===----------------------------------------------------------------------===*/
 
+#include "llvm-c/Target.h"
 #include "llvm-c/TargetMachine.h"
 #include <stdio.h>
 

>From d598242a6a7c4bc51e3a9180238e3ccb43c2e99c Mon Sep 17 00:00:00 2001
From: Nikita Popov <npopov at redhat.com>
Date: Wed, 30 Sep 2026 17:34:27 +0200
Subject: [PATCH 2/3] fix unit tests

---
 llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp               | 1 +
 .../Passes/PassBuilderBindings/PassBuilderBindingsTest.cpp       | 1 +
 llvm/unittests/Target/TargetMachineOptionsTest.cpp               | 1 +
 3 files changed, 3 insertions(+)

diff --git a/llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp b/llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp
index 2827554a74c5e..dc2c9f5029556 100644
--- a/llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp
@@ -11,6 +11,7 @@
 #include "llvm-c/LLJIT.h"
 #include "llvm-c/LLJITUtils.h"
 #include "llvm-c/Orc.h"
+#include "llvm-c/Target.h"
 #include "gtest/gtest.h"
 
 #include "llvm/Analysis/TargetLibraryInfo.h"
diff --git a/llvm/unittests/Passes/PassBuilderBindings/PassBuilderBindingsTest.cpp b/llvm/unittests/Passes/PassBuilderBindings/PassBuilderBindingsTest.cpp
index 4e17b1ad09e2b..060e2ab891fca 100644
--- a/llvm/unittests/Passes/PassBuilderBindings/PassBuilderBindingsTest.cpp
+++ b/llvm/unittests/Passes/PassBuilderBindings/PassBuilderBindingsTest.cpp
@@ -7,6 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm-c/Core.h"
+#include "llvm-c/Target.h"
 #include "llvm-c/Transforms/PassBuilder.h"
 #include "llvm-c/Types.h"
 #include "gtest/gtest.h"
diff --git a/llvm/unittests/Target/TargetMachineOptionsTest.cpp b/llvm/unittests/Target/TargetMachineOptionsTest.cpp
index 27f8855b47551..95a07821f2e9f 100644
--- a/llvm/unittests/Target/TargetMachineOptionsTest.cpp
+++ b/llvm/unittests/Target/TargetMachineOptionsTest.cpp
@@ -14,6 +14,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm-c/Core.h"
+#include "llvm-c/Target.h"
 #include "llvm-c/TargetMachine.h"
 #include "llvm/Config/llvm-config.h"
 #include "gtest/gtest.h"

>From cfa2dad7bfa7cb666f07d7254d5f134cc58f57a1 Mon Sep 17 00:00:00 2001
From: Nikita Popov <npopov at redhat.com>
Date: Thu, 1 Oct 2026 12:30:55 +0200
Subject: [PATCH 3/3] remove includes

---
 llvm/lib/Target/Target.cpp | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/llvm/lib/Target/Target.cpp b/llvm/lib/Target/Target.cpp
index 669788d7522ce..718e865a1868f 100644
--- a/llvm/lib/Target/Target.cpp
+++ b/llvm/lib/Target/Target.cpp
@@ -13,11 +13,7 @@
 
 #include "llvm-c/Target.h"
 #include "llvm/Analysis/TargetLibraryInfo.h"
-#include "llvm/IR/DataLayout.h"
-#include "llvm/IR/LLVMContext.h"
 #include "llvm/IR/LegacyPassManager.h"
-#include "llvm/IR/Module.h"
-#include "llvm/IR/Value.h"
 #include "llvm/InitializePasses.h"
 
 using namespace llvm;



More information about the llvm-commits mailing list