From 8d184ad258330ca24366d806ca7f03f7081563a4 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 18 Dec 2015 23:46:42 +0000 Subject: [PATCH] Deprecate a few C APIs. 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 | 2 +- bindings/ocaml/bitreader/bitreader_ocaml.c | 10 ++--- bindings/python/llvm/bit_reader.py | 9 ++--- docs/ReleaseNotes.rst | 6 +++ include/llvm-c/BitReader.h | 26 +++++++++++- lib/Bitcode/Reader/BitReader.cpp | 46 ++++++++++++++++++++++ test/Bindings/llvm-c/invalid-bitcode.test | 6 +++ tools/llvm-c-test/llvm-c-test.h | 2 +- tools/llvm-c-test/main.c | 15 +++++-- tools/llvm-c-test/module.c | 34 +++++++++++----- 10 files changed, 129 insertions(+), 27 deletions(-) diff --git a/bindings/go/llvm/bitreader.go b/bindings/go/llvm/bitreader.go index 92652863fdc..c3bf07a1904 100644 --- a/bindings/go/llvm/bitreader.go +++ b/bindings/go/llvm/bitreader.go @@ -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 } diff --git a/bindings/ocaml/bitreader/bitreader_ocaml.c b/bindings/ocaml/bitreader/bitreader_ocaml.c index 15ebd5f635f..f91b092d917 100644 --- a/bindings/ocaml/bitreader/bitreader_ocaml.c +++ b/bindings/ocaml/bitreader/bitreader_ocaml.c @@ -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; } diff --git a/bindings/python/llvm/bit_reader.py b/bindings/python/llvm/bit_reader.py index 5bf5e22025a..33b8211076b 100644 --- a/bindings/python/llvm/bit_reader.py +++ b/bindings/python/llvm/bit_reader.py @@ -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) diff --git a/docs/ReleaseNotes.rst b/docs/ReleaseNotes.rst index ccefad22c00..5d526b10baf 100644 --- a/docs/ReleaseNotes.rst +++ b/docs/ReleaseNotes.rst @@ -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. diff --git a/include/llvm-c/BitReader.h b/include/llvm-c/BitReader.h index 216cd1ee99b..d1fc302767b 100644 --- a/include/llvm-c/BitReader.h +++ b/include/llvm-c/BitReader.h @@ -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); + /** * @} */ diff --git a/lib/Bitcode/Reader/BitReader.cpp b/lib/Bitcode/Reader/BitReader.cpp index 883a5bcdd07..385c18a4000 100644 --- a/lib/Bitcode/Reader/BitReader.cpp +++ b/lib/Bitcode/Reader/BitReader.cpp @@ -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(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> 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 Owner(unwrap(MemBuf)); + + ErrorOr> 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); +} diff --git a/test/Bindings/llvm-c/invalid-bitcode.test b/test/Bindings/llvm-c/invalid-bitcode.test index 65b97e60281..afae0ea1092 100644 --- a/test/Bindings/llvm-c/invalid-bitcode.test +++ b/test/Bindings/llvm-c/invalid-bitcode.test @@ -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) diff --git a/tools/llvm-c-test/llvm-c-test.h b/tools/llvm-c-test/llvm-c-test.h index 5f49d702b21..7929fc4d19b 100644 --- a/tools/llvm-c-test/llvm-c-test.h +++ b/tools/llvm-c-test/llvm-c-test.h @@ -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); diff --git a/tools/llvm-c-test/main.c b/tools/llvm-c-test/main.c index 185ed4c0e04..e6b6e17098b 100644 --- a/tools/llvm-c-test/main.c +++ b/tools/llvm-c-test/main.c @@ -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")) { diff --git a/tools/llvm-c-test/module.c b/tools/llvm-c-test/module.c index 0f27337eb7c..a6c47bf5fa1 100644 --- a/tools/llvm-c-test/module.c +++ b/tools/llvm-c-test/module.c @@ -19,7 +19,14 @@ #include #include -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); -- 2.34.1