aboutsummaryrefslogtreecommitdiff
path: root/src/zig_llvm.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2018-10-09 13:20:27 -0400
committerGitHub <noreply@github.com>2018-10-09 13:20:27 -0400
commit9e38a81230bcaefb50fae610c071005449a7abfb (patch)
treef706728a6b853da0b66379539018645df583519b /src/zig_llvm.cpp
parentd40c4e7c896c5dfed9dd35e8c0d2117f7cf5c53c (diff)
parent81c6f087241b6b7a1c12de72a2061cb02df0f93f (diff)
downloadzig-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.cpp40
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)