From a2c4f94a1d7dceab432d5764c756be8bccad78c3 Mon Sep 17 00:00:00 2001 From: Hans Wennborg Date: Wed, 25 Feb 2015 02:00:21 +0000 Subject: [PATCH] Revert 224782: "Finish removing DestroySource." Filip Pizlo pointed out that this changes the C API. It's too late in the release process to figure out how we want to handle this. Reverting the patch is essentially a way of buying time: we don't change the API at the source level for now, we're not trying to fix it with a last-minute patch with a risk of unintended effects, and we preserve our options for fixing this in 3.6.1. This is not ideal, but I think it's the best compromise at this stage. git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_36@230431 91177308-0d34-0410-b5e6-96231b3b80d8 --- bindings/go/llvm/linker.go | 11 +++++++++-- bindings/ocaml/linker/linker_ocaml.c | 6 +++--- bindings/ocaml/linker/llvm_linker.ml | 8 +++++++- bindings/ocaml/linker/llvm_linker.mli | 9 ++++++++- docs/ReleaseNotes.rst | 3 +++ include/llvm-c/Linker.h | 10 +++++++++- lib/Linker/LinkModules.cpp | 2 +- test/Bindings/OCaml/linker.ml | 2 +- 8 files changed, 41 insertions(+), 10 deletions(-) diff --git a/bindings/go/llvm/linker.go b/bindings/go/llvm/linker.go index 64d794efb94..31e9ad24bf5 100644 --- a/bindings/go/llvm/linker.go +++ b/bindings/go/llvm/linker.go @@ -20,9 +20,16 @@ package llvm import "C" import "errors" -func LinkModules(Dest, Src Module) error { +type LinkerMode C.LLVMLinkerMode + +const ( + LinkerDestroySource = C.LLVMLinkerDestroySource + LinkerPreserveSource = C.LLVMLinkerPreserveSource +) + +func LinkModules(Dest, Src Module, Mode LinkerMode) error { var cmsg *C.char - failed := C.LLVMLinkModules(Dest.C, Src.C, 0, &cmsg) + failed := C.LLVMLinkModules(Dest.C, Src.C, C.LLVMLinkerMode(Mode), &cmsg) if failed != 0 { err := errors.New(C.GoString(cmsg)) C.LLVMDisposeMessage(cmsg) diff --git a/bindings/ocaml/linker/linker_ocaml.c b/bindings/ocaml/linker/linker_ocaml.c index 3b8512aa595..ed37777d852 100644 --- a/bindings/ocaml/linker/linker_ocaml.c +++ b/bindings/ocaml/linker/linker_ocaml.c @@ -23,11 +23,11 @@ void llvm_raise(value Prototype, char *Message); -/* llmodule -> llmodule -> unit */ -CAMLprim value llvm_link_modules(LLVMModuleRef Dst, LLVMModuleRef Src) { +/* llmodule -> llmodule -> Mode.t -> unit */ +CAMLprim value llvm_link_modules(LLVMModuleRef Dst, LLVMModuleRef Src, value Mode) { char* Message; - if (LLVMLinkModules(Dst, Src, 0, &Message)) + if (LLVMLinkModules(Dst, Src, Int_val(Mode), &Message)) llvm_raise(*caml_named_value("Llvm_linker.Error"), Message); return Val_unit; diff --git a/bindings/ocaml/linker/llvm_linker.ml b/bindings/ocaml/linker/llvm_linker.ml index 3044abd8b6c..5854d70bb52 100644 --- a/bindings/ocaml/linker/llvm_linker.ml +++ b/bindings/ocaml/linker/llvm_linker.ml @@ -11,5 +11,11 @@ exception Error of string let () = Callback.register_exception "Llvm_linker.Error" (Error "") -external link_modules : Llvm.llmodule -> Llvm.llmodule -> unit +module Mode = struct + type t = + | DestroySource + | PreserveSource +end + +external link_modules : Llvm.llmodule -> Llvm.llmodule -> Mode.t -> unit = "llvm_link_modules" diff --git a/bindings/ocaml/linker/llvm_linker.mli b/bindings/ocaml/linker/llvm_linker.mli index 06c3b92a577..4def7a8cc98 100644 --- a/bindings/ocaml/linker/llvm_linker.mli +++ b/bindings/ocaml/linker/llvm_linker.mli @@ -14,6 +14,13 @@ exception Error of string +(** Linking mode. *) +module Mode : sig + type t = + | DestroySource + | PreserveSource +end + (** [link_modules dst src mode] links [src] into [dst], raising [Error] if the linking fails. *) -val link_modules : Llvm.llmodule -> Llvm.llmodule -> unit \ No newline at end of file +val link_modules : Llvm.llmodule -> Llvm.llmodule -> Mode.t -> unit \ No newline at end of file diff --git a/docs/ReleaseNotes.rst b/docs/ReleaseNotes.rst index edd20278158..04d7f526651 100644 --- a/docs/ReleaseNotes.rst +++ b/docs/ReleaseNotes.rst @@ -383,6 +383,9 @@ The PreserveSource linker mode was removed It was fairly broken and was removed. +The mode is currently still available in the C API for source +compatibility, but it doesn't have any effect. + Garbage Collection ------------------ diff --git a/include/llvm-c/Linker.h b/include/llvm-c/Linker.h index cedde5ea8e3..a932c6d0f07 100644 --- a/include/llvm-c/Linker.h +++ b/include/llvm-c/Linker.h @@ -20,13 +20,21 @@ extern "C" { #endif + +/* Note: LLVMLinkerPreserveSource has no effect. */ +typedef enum { + LLVMLinkerDestroySource = 0, /* Allow source module to be destroyed. */ + LLVMLinkerPreserveSource = 1 /* Preserve the source module. */ +} LLVMLinkerMode; + + /* Links the source module into the destination module, taking ownership * of the source module away from the caller. Optionally returns a * human-readable description of any errors that occurred in linking. * OutMessage must be disposed with LLVMDisposeMessage. The return value * is true if an error occurred, false otherwise. */ LLVMBool LLVMLinkModules(LLVMModuleRef Dest, LLVMModuleRef Src, - unsigned Unused, char **OutMessage); + LLVMLinkerMode Mode, char **OutMessage); #ifdef __cplusplus } diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index 767d465d1be..d5170adb36a 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -1749,7 +1749,7 @@ bool Linker::LinkModules(Module *Dest, Module *Src) { //===----------------------------------------------------------------------===// LLVMBool LLVMLinkModules(LLVMModuleRef Dest, LLVMModuleRef Src, - unsigned Unused, char **OutMessages) { + LLVMLinkerMode Mode, char **OutMessages) { Module *D = unwrap(Dest); std::string Message; raw_string_ostream Stream(Message); diff --git a/test/Bindings/OCaml/linker.ml b/test/Bindings/OCaml/linker.ml index 1ea0be9d3dc..0a365ff8148 100644 --- a/test/Bindings/OCaml/linker.ml +++ b/test/Bindings/OCaml/linker.ml @@ -45,7 +45,7 @@ let test_linker () = let m1 = make_module "one" and m2 = make_module "two" in - link_modules m1 m2; + link_modules m1 m2 Mode.DestroySource; dispose_module m1; let m1 = make_module "one" -- 2.40.0