aboutsummaryrefslogtreecommitdiff
path: root/src/zig_llvm.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2018-11-05 10:56:42 -0500
committerAndrew Kelley <superjoe30@gmail.com>2018-11-05 10:56:42 -0500
commitf8d6f5daff5ac9b9f69319b9bd827ccc34ea9d72 (patch)
treefc0da10e6a69eb167e7d994f348148917c8ef98b /src/zig_llvm.cpp
parentce912e29640e0a3b39a5c304c86bdbb5fff67169 (diff)
parent973e0abe79abf33cb5e9f4550fe323cb93eb6ee1 (diff)
downloadzig-f8d6f5daff5ac9b9f69319b9bd827ccc34ea9d72.tar.gz
zig-f8d6f5daff5ac9b9f69319b9bd827ccc34ea9d72.zip
Merge remote-tracking branch 'origin/master' into llvm8
Diffstat (limited to 'src/zig_llvm.cpp')
-rw-r--r--src/zig_llvm.cpp51
1 files changed, 49 insertions, 2 deletions
diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp
index ad8edb4cda..00023f6232 100644
--- a/src/zig_llvm.cpp
+++ b/src/zig_llvm.cpp
@@ -15,6 +15,11 @@
#include "zig_llvm.h"
+#if __GNUC__ >= 8
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wclass-memaccess"
+#endif
+
#include <llvm/Analysis/TargetLibraryInfo.h>
#include <llvm/Analysis/TargetTransformInfo.h>
#include <llvm/IR/DIBuilder.h>
@@ -27,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>
@@ -35,13 +42,17 @@
#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>
#include <lld/Common/Driver.h>
+#if __GNUC__ >= 8
+#pragma GCC diagnostic pop
+#endif
+
#include <new>
#include <stdlib.h>
@@ -703,7 +714,7 @@ void ZigLLVMGetNativeTarget(ZigLLVM_ArchType *arch_type, ZigLLVM_SubArchType *su
ZigLLVM_ObjectFormatType *oformat)
{
char *native_triple = LLVMGetDefaultTargetTriple();
- Triple triple(native_triple);
+ Triple triple(Triple::normalize(native_triple));
*arch_type = (ZigLLVM_ArchType)triple.getArch();
*sub_arch_type = (ZigLLVM_SubArchType)triple.getSubArch();
@@ -845,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)