Deprecate a few C APIs.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 18 Dec 2015 23:46:42 +0000 (23:46 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 18 Dec 2015 23:46:42 +0000 (23:46 +0000)
This deprecates:
* LLVMParseBitcode
* LLVMParseBitcodeInContext
* LLVMGetBitcodeModuleInContext
* LLVMGetBitcodeModule

They are replaced with the functions with a 2 suffix which do not record
a diagnostic.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256065 91177308-0d34-0410-b5e6-96231b3b80d8

bindings/go/llvm/bitreader.go
bindings/ocaml/bitreader/bitreader_ocaml.c
bindings/python/llvm/bit_reader.py
docs/ReleaseNotes.rst
include/llvm-c/BitReader.h
lib/Bitcode/Reader/BitReader.cpp
test/Bindings/llvm-c/invalid-bitcode.test
tools/llvm-c-test/llvm-c-test.h
tools/llvm-c-test/main.c
tools/llvm-c-test/module.c

index 9265286..c3bf07a 100644 (file)
@@ -41,7 +41,7 @@ func ParseBitcodeFile(name string) (Module, error) {
        defer C.LLVMDisposeMemoryBuffer(buf)
 
        var m Module
-       if C.LLVMParseBitcode(buf, &m.C, &errmsg) == 0 {
+       if C.LLVMParseBitcode2(buf, &m.C) == 0 {
                return m, nil
        }
 
index 15ebd5f..f91b092 100644 (file)
@@ -23,10 +23,9 @@ void llvm_raise(value Prototype, char *Message);
 /* Llvm.llcontext -> Llvm.llmemorybuffer -> Llvm.llmodule */
 CAMLprim LLVMModuleRef llvm_get_module(LLVMContextRef C, LLVMMemoryBufferRef MemBuf) {
   LLVMModuleRef M;
-  char *Message;
 
-  if (LLVMGetBitcodeModuleInContext(C, MemBuf, &M, &Message))
-    llvm_raise(*caml_named_value("Llvm_bitreader.Error"), Message);
+  if (LLVMGetBitcodeModuleInContext2(C, MemBuf, &M))
+    llvm_raise(*caml_named_value("Llvm_bitreader.Error"), "");
 
   return M;
 }
@@ -34,10 +33,9 @@ CAMLprim LLVMModuleRef llvm_get_module(LLVMContextRef C, LLVMMemoryBufferRef Mem
 /* Llvm.llcontext -> Llvm.llmemorybuffer -> Llvm.llmodule */
 CAMLprim LLVMModuleRef llvm_parse_bitcode(LLVMContextRef C, LLVMMemoryBufferRef MemBuf) {
   LLVMModuleRef M;
-  char *Message;
 
-  if (LLVMParseBitcodeInContext(C, MemBuf, &M, &Message))
-    llvm_raise(*caml_named_value("Llvm_bitreader.Error"), Message);
+  if (LLVMParseBitcodeInContext2(C, MemBuf, &M))
+    llvm_raise(*caml_named_value("Llvm_bitreader.Error"), "");
 
   return M;
 }
index 5bf5e22..33b8211 100644 (file)
@@ -16,16 +16,15 @@ lib = get_library()
 def parse_bitcode(mem_buffer):
     """Input is .core.MemoryBuffer"""
     module = c_object_p()
-    out = c_char_p(None)
-    result = lib.LLVMParseBitcode(mem_buffer, byref(module), byref(out))
+    result = lib.LLVMParseBitcode2(mem_buffer, byref(module))
     if result:
-        raise RuntimeError('LLVM Error: %s' % out.value)
+        raise RuntimeError('LLVM Error')
     m = Module(module)
     m.take_ownership(mem_buffer)
     return m
 
 def register_library(library):
-    library.LLVMParseBitcode.argtypes = [MemoryBuffer, POINTER(c_object_p), POINTER(c_char_p)]
-    library.LLVMParseBitcode.restype = bool
+    library.LLVMParseBitcode2.argtypes = [MemoryBuffer, POINTER(c_object_p)]
+    library.LLVMParseBitcode2.restype = bool
 
 register_library(lib)
index ccefad2..5d526b1 100644 (file)
@@ -49,6 +49,12 @@ Non-comprehensive list of changes in this release
    * Destroys the source instead of only damaging it.
    * Does not record a message. Use the diagnostic handler instead.
 
+* The C API functions LLVMParseBitcode, LLVMParseBitcodeInContext,
+  LLVMGetBitcodeModuleInContext and LLVMGetBitcodeModule have been deprecated.
+  They will be removed in 3.9. Please migrate to the versions with a 2 suffix.
+  Unlike the old ones the new ones do not record a diagnostic message. Use
+  the diagnostic handler instead.
+
 * The deprecated C APIs LLVMGetBitcodeModuleProviderInContext and
   LLVMGetBitcodeModuleProvider have been removed.
 
index 216cd1e..d1fc302 100644 (file)
@@ -34,24 +34,46 @@ extern "C" {
 
 /* Builds a module from the bitcode in the specified memory buffer, returning a
    reference to the module via the OutModule parameter. Returns 0 on success.
-   Optionally returns a human-readable error message via OutMessage. */
+   Optionally returns a human-readable error message via OutMessage.
+
+   This is deprecated. Use LLVMParseBitcode2. */
 LLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutModule,
                           char **OutMessage);
 
+/* Builds a module from the bitcode in the specified memory buffer, returning a
+   reference to the module via the OutModule parameter. Returns 0 on success. */
+LLVMBool LLVMParseBitcode2(LLVMMemoryBufferRef MemBuf,
+                           LLVMModuleRef *OutModule);
+
+/* This is deprecated. Use LLVMParseBitcodeInContext2. */
 LLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef,
                                    LLVMMemoryBufferRef MemBuf,
                                    LLVMModuleRef *OutModule, char **OutMessage);
 
+LLVMBool LLVMParseBitcodeInContext2(LLVMContextRef ContextRef,
+                                    LLVMMemoryBufferRef MemBuf,
+                                    LLVMModuleRef *OutModule);
+
 /** Reads a module from the specified path, returning via the OutMP parameter
     a module provider which performs lazy deserialization. Returns 0 on success.
-    Optionally returns a human-readable error message via OutMessage. */
+    Optionally returns a human-readable error message via OutMessage.
+    This is deprecated. Use LLVMGetBitcodeModuleInContext2. */
 LLVMBool LLVMGetBitcodeModuleInContext(LLVMContextRef ContextRef,
                                        LLVMMemoryBufferRef MemBuf,
                                        LLVMModuleRef *OutM, char **OutMessage);
 
+/** Reads a module from the specified path, returning via the OutMP parameter a
+ * module provider which performs lazy deserialization. Returns 0 on success. */
+LLVMBool LLVMGetBitcodeModuleInContext2(LLVMContextRef ContextRef,
+                                        LLVMMemoryBufferRef MemBuf,
+                                        LLVMModuleRef *OutM);
+
+/* This is deprecated. Use LLVMGetBitcodeModule2. */
 LLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM,
                               char **OutMessage);
 
+LLVMBool LLVMGetBitcodeModule2(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM);
+
 /**
  * @}
  */
index 883a5bc..385c18a 100644 (file)
@@ -29,6 +29,12 @@ LLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutModule,
                                    OutMessage);
 }
 
+LLVMBool LLVMParseBitcode2(LLVMMemoryBufferRef MemBuf,
+                           LLVMModuleRef *OutModule) {
+  return LLVMParseBitcodeInContext2(wrap(&getGlobalContext()), MemBuf,
+                                    OutModule);
+}
+
 static void diagnosticHandler(const DiagnosticInfo &DI, void *C) {
   auto *Message = reinterpret_cast<std::string *>(C);
   raw_string_ostream Stream(*Message);
@@ -64,6 +70,22 @@ LLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef,
   return 0;
 }
 
+LLVMBool LLVMParseBitcodeInContext2(LLVMContextRef ContextRef,
+                                    LLVMMemoryBufferRef MemBuf,
+                                    LLVMModuleRef *OutModule) {
+  MemoryBufferRef Buf = unwrap(MemBuf)->getMemBufferRef();
+  LLVMContext &Ctx = *unwrap(ContextRef);
+
+  ErrorOr<std::unique_ptr<Module>> ModuleOrErr = parseBitcodeFile(Buf, Ctx);
+  if (ModuleOrErr.getError()) {
+    *OutModule = wrap((Module *)nullptr);
+    return 1;
+  }
+
+  *OutModule = wrap(ModuleOrErr.get().release());
+  return 0;
+}
+
 /* Reads a module from the specified path, returning via the OutModule parameter
    a module provider which performs lazy deserialization. Returns 0 on success.
    Optionally returns a human-readable error message via OutMessage. */
@@ -96,8 +118,32 @@ LLVMBool LLVMGetBitcodeModuleInContext(LLVMContextRef ContextRef,
   return 0;
 }
 
+LLVMBool LLVMGetBitcodeModuleInContext2(LLVMContextRef ContextRef,
+                                        LLVMMemoryBufferRef MemBuf,
+                                        LLVMModuleRef *OutM) {
+  LLVMContext &Ctx = *unwrap(ContextRef);
+  std::unique_ptr<MemoryBuffer> Owner(unwrap(MemBuf));
+
+  ErrorOr<std::unique_ptr<Module>> ModuleOrErr =
+      getLazyBitcodeModule(std::move(Owner), Ctx);
+  Owner.release();
+
+  if (ModuleOrErr.getError()) {
+    *OutM = wrap((Module *)nullptr);
+    return 1;
+  }
+
+  *OutM = wrap(ModuleOrErr.get().release());
+  return 0;
+}
+
 LLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM,
                               char **OutMessage) {
   return LLVMGetBitcodeModuleInContext(LLVMGetGlobalContext(), MemBuf, OutM,
                                        OutMessage);
 }
+
+LLVMBool LLVMGetBitcodeModule2(LLVMMemoryBufferRef MemBuf,
+                               LLVMModuleRef *OutM) {
+  return LLVMGetBitcodeModuleInContext2(LLVMGetGlobalContext(), MemBuf, OutM);
+}
index 65b97e6..afae0ea 100644 (file)
@@ -2,3 +2,9 @@
 ; RUN: not llvm-c-test --lazy-module-dump < %S/Inputs/invalid.ll.bc 2>&1 | FileCheck %s
 
 CHECK: Error parsing bitcode: Unknown attribute kind (52)
+
+
+; RUN: not llvm-c-test --new-module-dump < %S/Inputs/invalid.ll.bc 2>&1 | FileCheck --check-prefix=NEW %s
+; RUN: not llvm-c-test --lazy-new-module-dump < %S/Inputs/invalid.ll.bc 2>&1 | FileCheck --check-prefix=NEW %s
+
+NEW: Error with new bitcode parser: Unknown attribute kind (52)
index 5f49d70..7929fc4 100644 (file)
@@ -19,7 +19,7 @@
 void tokenize_stdin(void (*cb)(char **tokens, int ntokens));
 
 // module.c
-int module_dump(bool Lazy);
+int module_dump(bool Lazy, bool New);
 int module_list_functions(void);
 int module_list_globals(void);
 
index 185ed4c..e6b6e17 100644 (file)
@@ -24,6 +24,11 @@ static void print_usage(void) {
   fprintf(stderr, "  * --module-dump\n");
   fprintf(stderr, "    Read bytecode from stdin - print disassembly\n\n");
   fprintf(stderr, "  * --lazy-module-dump\n");
+  fprintf(stderr,
+          "    Lazily read bytecode from stdin - print disassembly\n\n");
+  fprintf(stderr, "  * --new-module-dump\n");
+  fprintf(stderr, "    Read bytecode from stdin - print disassembly\n\n");
+  fprintf(stderr, "  * --lazy-new-module-dump\n");
   fprintf(stderr,
           "    Lazily read bytecode from stdin - print disassembly\n\n");
   fprintf(stderr, "  * --module-list-functions\n");
@@ -52,10 +57,14 @@ int main(int argc, char **argv) {
 
   LLVMInitializeCore(pr);
 
-  if (argc == 2 && !strcmp(argv[1], "--lazy-module-dump")) {
-    return module_dump(true);
+  if (argc == 2 && !strcmp(argv[1], "--lazy-new-module-dump")) {
+    return module_dump(true, true);
+  } else if (argc == 2 && !strcmp(argv[1], "--new-module-dump")) {
+    return module_dump(false, true);
+  } else if (argc == 2 && !strcmp(argv[1], "--lazy-module-dump")) {
+    return module_dump(true, false);
   } else if (argc == 2 && !strcmp(argv[1], "--module-dump")) {
-    return module_dump(false);
+    return module_dump(false, false);
   } else if (argc == 2 && !strcmp(argv[1], "--module-list-functions")) {
     return module_list_functions();
   } else if (argc == 2 && !strcmp(argv[1], "--module-list-globals")) {
index 0f27337..a6c47bf 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 
-static LLVMModuleRef load_module(bool Lazy) {
+static void diagnosticHandler(LLVMDiagnosticInfoRef DI, void *C) {
+  char *CErr = LLVMGetDiagInfoDescription(DI);
+  fprintf(stderr, "Error with new bitcode parser: %s\n", CErr);
+  LLVMDisposeMessage(CErr);
+  exit(1);
+}
+
+static LLVMModuleRef load_module(bool Lazy, bool New) {
   LLVMMemoryBufferRef MB;
   LLVMModuleRef M;
   char *msg = NULL;
@@ -30,10 +37,19 @@ static LLVMModuleRef load_module(bool Lazy) {
   }
 
   LLVMBool Ret;
-  if (Lazy)
-    Ret = LLVMGetBitcodeModule(MB, &M, &msg);
-  else
-    Ret = LLVMParseBitcode(MB, &M, &msg);
+  if (New) {
+    LLVMContextRef C = LLVMGetGlobalContext();
+    LLVMContextSetDiagnosticHandler(C, diagnosticHandler, NULL);
+    if (Lazy)
+      Ret = LLVMGetBitcodeModule2(MB, &M);
+    else
+      Ret = LLVMParseBitcode2(MB, &M);
+  } else {
+    if (Lazy)
+      Ret = LLVMGetBitcodeModule(MB, &M, &msg);
+    else
+      Ret = LLVMParseBitcode(MB, &M, &msg);
+  }
 
   if (Ret) {
     fprintf(stderr, "Error parsing bitcode: %s\n", msg);
@@ -47,8 +63,8 @@ static LLVMModuleRef load_module(bool Lazy) {
   return M;
 }
 
-int module_dump(bool Lazy) {
-  LLVMModuleRef M = load_module(Lazy);
+int module_dump(bool Lazy, bool New) {
+  LLVMModuleRef M = load_module(Lazy, New);
 
   char *irstr = LLVMPrintModuleToString(M);
   puts(irstr);
@@ -60,7 +76,7 @@ int module_dump(bool Lazy) {
 }
 
 int module_list_functions(void) {
-  LLVMModuleRef M = load_module(false);
+  LLVMModuleRef M = load_module(false, false);
   LLVMValueRef f;
 
   f = LLVMGetFirstFunction(M);
@@ -101,7 +117,7 @@ int module_list_functions(void) {
 }
 
 int module_list_globals(void) {
-  LLVMModuleRef M = load_module(false);
+  LLVMModuleRef M = load_module(false, false);
   LLVMValueRef g;
 
   g = LLVMGetFirstGlobal(M);