diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2018-11-05 10:56:42 -0500 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2018-11-05 10:56:42 -0500 |
| commit | f8d6f5daff5ac9b9f69319b9bd827ccc34ea9d72 (patch) | |
| tree | fc0da10e6a69eb167e7d994f348148917c8ef98b /src/zig_llvm.cpp | |
| parent | ce912e29640e0a3b39a5c304c86bdbb5fff67169 (diff) | |
| parent | 973e0abe79abf33cb5e9f4550fe323cb93eb6ee1 (diff) | |
| download | zig-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.cpp | 51 |
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) |
