diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2018-10-09 13:20:27 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-10-09 13:20:27 -0400 |
| commit | 9e38a81230bcaefb50fae610c071005449a7abfb (patch) | |
| tree | f706728a6b853da0b66379539018645df583519b /src/zig_llvm.cpp | |
| parent | d40c4e7c896c5dfed9dd35e8c0d2117f7cf5c53c (diff) | |
| parent | 81c6f087241b6b7a1c12de72a2061cb02df0f93f (diff) | |
| download | zig-9e38a81230bcaefb50fae610c071005449a7abfb.tar.gz zig-9e38a81230bcaefb50fae610c071005449a7abfb.zip | |
Merge pull request #1647 from ziglang/static-libs
Support building static libraries
Diffstat (limited to 'src/zig_llvm.cpp')
| -rw-r--r-- | src/zig_llvm.cpp | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp index ea270bcb5a..00023f6232 100644 --- a/src/zig_llvm.cpp +++ b/src/zig_llvm.cpp @@ -32,6 +32,8 @@ #include <llvm/IR/Verifier.h> #include <llvm/InitializePasses.h> #include <llvm/MC/SubtargetFeature.h> +#include <llvm/Object/Archive.h> +#include <llvm/Object/ArchiveWriter.h> #include <llvm/PassRegistry.h> #include <llvm/Support/FileSystem.h> #include <llvm/Support/TargetParser.h> @@ -40,8 +42,8 @@ #include <llvm/Target/TargetMachine.h> #include <llvm/Transforms/Coroutines.h> #include <llvm/Transforms/IPO.h> -#include <llvm/Transforms/IPO/PassManagerBuilder.h> #include <llvm/Transforms/IPO/AlwaysInliner.h> +#include <llvm/Transforms/IPO/PassManagerBuilder.h> #include <llvm/Transforms/Scalar.h> #include <llvm/Transforms/Utils.h> @@ -854,6 +856,42 @@ class MyOStream: public raw_ostream { size_t pos; }; +bool ZigLLVMWriteArchive(const char *archive_name, const char **file_names, size_t file_name_count, + ZigLLVM_OSType os_type) +{ + object::Archive::Kind kind; + switch (os_type) { + case ZigLLVM_Win32: + // For some reason llvm-lib passes K_GNU on windows. + // See lib/ToolDrivers/llvm-lib/LibDriver.cpp:168 in libDriverMain + kind = object::Archive::K_GNU; + break; + case ZigLLVM_Linux: + kind = object::Archive::K_GNU; + break; + case ZigLLVM_Darwin: + case ZigLLVM_IOS: + kind = object::Archive::K_DARWIN; + break; + case ZigLLVM_OpenBSD: + case ZigLLVM_FreeBSD: + kind = object::Archive::K_BSD; + break; + default: + kind = object::Archive::K_GNU; + } + SmallVector<NewArchiveMember, 4> new_members; + for (size_t i = 0; i < file_name_count; i += 1) { + Expected<NewArchiveMember> new_member = NewArchiveMember::getFile(file_names[i], true); + Error err = new_member.takeError(); + if (err) return true; + new_members.push_back(std::move(*new_member)); + } + Error err = writeArchive(archive_name, new_members, true, kind, true, false, nullptr); + if (err) return true; + return false; +} + bool ZigLLDLink(ZigLLVM_ObjectFormatType oformat, const char **args, size_t arg_count, void (*append_diagnostic)(void *, const char *, size_t), void *context) |
