From c44943ed4f4f2d44b6668e6b51eb355f8310660c Mon Sep 17 00:00:00 2001 From: Torok Edwin Date: Thu, 6 Oct 2011 12:12:50 +0000 Subject: [PATCH] C/OCaml API to retrieve struct name. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@141285 91177308-0d34-0410-b5e6-96231b3b80d8 --- bindings/ocaml/llvm/llvm.ml | 1 + bindings/ocaml/llvm/llvm.mli | 4 ++++ bindings/ocaml/llvm/llvm_ocaml.c | 14 ++++++++++++++ include/llvm-c/Core.h | 1 + lib/VMCore/Core.cpp | 8 ++++++++ 5 files changed, 28 insertions(+) diff --git a/bindings/ocaml/llvm/llvm.ml b/bindings/ocaml/llvm/llvm.ml index e335eb8d39d..e46ea040d92 100644 --- a/bindings/ocaml/llvm/llvm.ml +++ b/bindings/ocaml/llvm/llvm.ml @@ -197,6 +197,7 @@ external param_types : lltype -> lltype array = "llvm_param_types" external struct_type : llcontext -> lltype array -> lltype = "llvm_struct_type" external packed_struct_type : llcontext -> lltype array -> lltype = "llvm_packed_struct_type" +external struct_name : lltype -> string option = "llvm_struct_name" external struct_element_types : lltype -> lltype array = "llvm_struct_element_types" external is_packed : lltype -> bool = "llvm_is_packed" diff --git a/bindings/ocaml/llvm/llvm.mli b/bindings/ocaml/llvm/llvm.mli index ef7c986e91c..c0701701344 100644 --- a/bindings/ocaml/llvm/llvm.mli +++ b/bindings/ocaml/llvm/llvm.mli @@ -372,6 +372,10 @@ val struct_type : llcontext -> lltype array -> lltype [llvm::StructType::get]. *) val packed_struct_type : llcontext -> lltype array -> lltype +(** [struct_name ty] returns the name of the named structure type [ty], + * or None if the structure type is not named *) +val struct_name : lltype -> string option + (** [struct_element_types sty] returns the constituent types of the struct type [sty]. See the method [llvm::StructType::getElementType]. *) diff --git a/bindings/ocaml/llvm/llvm_ocaml.c b/bindings/ocaml/llvm/llvm_ocaml.c index 1c1a526fd71..28f0977aba2 100644 --- a/bindings/ocaml/llvm/llvm_ocaml.c +++ b/bindings/ocaml/llvm/llvm_ocaml.c @@ -287,6 +287,20 @@ CAMLprim LLVMTypeRef llvm_packed_struct_type(LLVMContextRef C, Wosize_val(ElementTypes), 1); } +/* lltype -> string option */ +CAMLprim value llvm_struct_name(LLVMTypeRef Ty) +{ + CAMLparam0(); + const char *C = LLVMGetStructName(Ty); + if (C) { + CAMLlocal1(result); + result = caml_alloc_small(1, 0); + Store_field(result, 0, caml_copy_string(C)); + CAMLreturn(result); + } + CAMLreturn(Val_int(0)); +} + /* lltype -> lltype array */ CAMLprim value llvm_struct_element_types(LLVMTypeRef StructTy) { value Tys = alloc(LLVMCountStructElementTypes(StructTy), 0); diff --git a/include/llvm-c/Core.h b/include/llvm-c/Core.h index 84ddfbcf890..4569109b7cb 100644 --- a/include/llvm-c/Core.h +++ b/include/llvm-c/Core.h @@ -403,6 +403,7 @@ LLVMTypeRef LLVMStructTypeInContext(LLVMContextRef C, LLVMTypeRef *ElementTypes, LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes, unsigned ElementCount, LLVMBool Packed); LLVMTypeRef LLVMStructCreateNamed(LLVMContextRef C, const char *Name); +const char *LLVMGetStructName(LLVMTypeRef Ty); void LLVMStructSetBody(LLVMTypeRef StructTy, LLVMTypeRef *ElementTypes, unsigned ElementCount, LLVMBool Packed); diff --git a/lib/VMCore/Core.cpp b/lib/VMCore/Core.cpp index e2b659b6a2b..8560de4455c 100644 --- a/lib/VMCore/Core.cpp +++ b/lib/VMCore/Core.cpp @@ -302,6 +302,14 @@ LLVMTypeRef LLVMStructCreateNamed(LLVMContextRef C, const char *Name) return wrap(StructType::create(*unwrap(C), Name)); } +const char *LLVMGetStructName(LLVMTypeRef Ty) +{ + StructType *Type = unwrap(Ty); + if (!Type->hasName()) + return 0; + return Type->getName().data(); +} + void LLVMStructSetBody(LLVMTypeRef StructTy, LLVMTypeRef *ElementTypes, unsigned ElementCount, LLVMBool Packed) { ArrayRef Tys(unwrap(ElementTypes), ElementCount); -- 2.34.1