aboutsummaryrefslogtreecommitdiff
path: root/src/zig_llvm.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2017-03-13 11:54:56 -0400
committerAndrew Kelley <superjoe30@gmail.com>2017-03-13 11:54:56 -0400
commitd10bbd28e9576d000f04ac6d06c2a8493ffc72ef (patch)
tree9cee12ed88ec066c81567e021e2bb764c0eb2d32 /src/zig_llvm.cpp
parent7bc0145b802002c38a409dd9fe0b297c8af82391 (diff)
downloadzig-d10bbd28e9576d000f04ac6d06c2a8493ffc72ef.tar.gz
zig-d10bbd28e9576d000f04ac6d06c2a8493ffc72ef.zip
use lld instead of system linker
Diffstat (limited to 'src/zig_llvm.cpp')
-rw-r--r--src/zig_llvm.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp
index 21ea54b794..a837c896cc 100644
--- a/src/zig_llvm.cpp
+++ b/src/zig_llvm.cpp
@@ -42,6 +42,8 @@
#include <llvm/Transforms/IPO/PassManagerBuilder.h>
#include <llvm/Transforms/Scalar.h>
+#include <lld/Driver/Driver.h>
+
using namespace llvm;
void ZigLLVMInitializeLoopStrengthReducePass(LLVMPassRegistryRef R) {
@@ -790,3 +792,36 @@ Buf *get_dynamic_linker(LLVMTargetMachineRef target_machine_ref) {
}
}
+bool ZigLLDLink(ZigLLVM_ObjectFormatType oformat, const char **args, size_t arg_count, Buf *diag_buf) {
+ ArrayRef<const char *> array_ref_args(args, arg_count);
+
+ buf_resize(diag_buf, 0);
+ class MyOStream: public raw_ostream {
+ public:
+ MyOStream(Buf *_diag_buf) : raw_ostream(true), diag_buf(_diag_buf) {
+
+ }
+ void write_impl(const char *ptr, size_t len) override {
+ buf_append_mem(diag_buf, ptr, len);
+ }
+ uint64_t current_pos() const override {
+ return buf_len(diag_buf);
+ }
+ Buf *diag_buf;
+ } diag(diag_buf);
+
+ switch (oformat) {
+ case ZigLLVM_UnknownObjectFormat:
+ zig_unreachable();
+
+ case ZigLLVM_COFF:
+ return lld::coff::link(array_ref_args);
+
+ case ZigLLVM_ELF:
+ return lld::elf::link(array_ref_args, false, diag);
+
+ case ZigLLVM_MachO:
+ return lld::mach_o::link(array_ref_args, diag);
+ }
+ zig_unreachable();
+}