diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2017-03-13 11:54:56 -0400 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2017-03-13 11:54:56 -0400 |
| commit | d10bbd28e9576d000f04ac6d06c2a8493ffc72ef (patch) | |
| tree | 9cee12ed88ec066c81567e021e2bb764c0eb2d32 /src/zig_llvm.cpp | |
| parent | 7bc0145b802002c38a409dd9fe0b297c8af82391 (diff) | |
| download | zig-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.cpp | 35 |
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(); +} |
