Skip to content

Commit

Permalink
Deprecate a few C APIs.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
espindola committed Dec 18, 2015
1 parent bde8257 commit 8d184ad
Show file tree
Hide file tree
Showing 10 changed files with 129 additions and 27 deletions.
2 changes: 1 addition & 1 deletion bindings/go/llvm/bitreader.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down
10 changes: 4 additions & 6 deletions bindings/ocaml/bitreader/bitreader_ocaml.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,21 +23,19 @@ 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;
}

/* 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;
}
9 changes: 4 additions & 5 deletions bindings/python/llvm/bit_reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,15 @@
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)
6 changes: 6 additions & 0 deletions docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
26 changes: 24 additions & 2 deletions include/llvm-c/BitReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

/**
* @}
*/
Expand Down
46 changes: 46 additions & 0 deletions lib/Bitcode/Reader/BitReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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. */
Expand Down Expand Up @@ -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);
}
6 changes: 6 additions & 0 deletions test/Bindings/llvm-c/invalid-bitcode.test
Original file line number Diff line number Diff line change
Expand Up @@ -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)
2 changes: 1 addition & 1 deletion tools/llvm-c-test/llvm-c-test.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
15 changes: 12 additions & 3 deletions tools/llvm-c-test/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down Expand Up @@ -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")) {
Expand Down
34 changes: 25 additions & 9 deletions tools/llvm-c-test/module.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,14 @@
#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;
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 8d184ad

Please sign in to comment.