Date: Thursday, March 28, 2019 @ 10:35:13 Author: foutrelis Revision: 445243
archrelease: copy trunk to community-staging-x86_64 Added: faust/repos/community-staging-x86_64/ faust/repos/community-staging-x86_64/PKGBUILD (from rev 445242, faust/trunk/PKGBUILD) faust/repos/community-staging-x86_64/llvm7.patch (from rev 445242, faust/trunk/llvm7.patch) -------------+ PKGBUILD | 87 +++++ llvm7.patch | 946 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1033 insertions(+) Copied: faust/repos/community-staging-x86_64/PKGBUILD (from rev 445242, faust/trunk/PKGBUILD) =================================================================== --- community-staging-x86_64/PKGBUILD (rev 0) +++ community-staging-x86_64/PKGBUILD 2019-03-28 10:35:13 UTC (rev 445243) @@ -0,0 +1,87 @@ +# Maintainer: David Runge <d...@sleepmap.de> +# Contributor: Albert Graef <aggraef at gmail.com> +# Contributor: Bernardo Barros <bernardobarros at gmail dot com> +# Contributor: bjoern lindig (bjoern _dot_ lindig _at_ google.com) + +pkgname=faust +pkgver=2.5.23 +pkgrel=5 +pkgdesc="A functional programming language for realtime audio signal processing." +arch=('x86_64') +url="https://faust.grame.fr/" +license=('GPL2') +groups=('pro-audio') +depends=('llvm7-libs' 'libsndfile' 'libmicrohttpd') +makedepends=('llvm7' 'xxd') +optdepends=('clang: needed for sound2reader' + 'java-environment=8: needed for faust2android' + 'python2: needed for faust2md and faust2atomsnippets' + 'ruby: needed for faust2sc and scbuilder') +options=('staticlibs') +source=("https://github.com/grame-cncm/${pkgname}/releases/download/${pkgver}/${pkgname}-${pkgver}.tar.gz" + 'llvm7.patch') +sha512sums=('7ffa165b865cea09b923cb1687e5b48a48186644f9efcf8b532f948368c825f0ce829a8d6ef64d9a59c81bac0597dbd6b05bd1ac40198f5d4e6403eda1e57e69' + 'db5465db46ee5cf1f20bfba7d54e373f02e7a23848a9af7bd613e6b1589fac47f437582b6934b21469ba082a6f8c54d8528a33c48a5a747a20b2fa0bf7479337') + +prepare() { + cd "${pkgname}-${pkgver}" + # fix scripts requiring python2 + sed -e '1s/python/&2/' \ + -i "tools/${pkgname}2appls/${pkgname}2"{md,atomsnippets} + # fix for llvm7 (derived partially from upstream fix of HEAD): + # https://github.com/grame-cncm/faust/issues/220 + patch -Np1 -i ../llvm7.patch + # RELRO for sound2faust and sound2file + sed -e "/\$(LIBS)/ s/$/ $LDFLAGS/g" \ + -i tools/sound2faust/Makefile +} + +build() { + cd "${pkgname}-${pkgver}" + make PREFIX=/usr world +} + +package() { + cd "${pkgname}-${pkgver}" + make install PREFIX=/usr DESTDIR="$pkgdir" + + # docs + install -t "${pkgdir}/usr/share/doc/${pkgname}" \ + -vDm 644 documentation/{,misc/}*.pdf + + # examples + install -vd "${pkgdir}/usr/share/${pkgname}/examples" + cp -vR "examples/"* "${pkgdir}/usr/share/${pkgname}/examples/" + + cd syntax-highlighting + # atom + install -vDm 644 "atom/language-${pkgname}/package.json" \ + -t "${pkgdir}/usr/lib/atom/dot-atom/packages/language-${pkgname}/" + install -vDm 644 "atom/language-${pkgname}/grammars/${pkgname}.cson" \ + -t "${pkgdir}/usr/lib/atom/dot-atom/packages/language-${pkgname}/grammars/" + install -vDm 644 "atom/language-${pkgname}/settings/language-${pkgname}.cson" \ + -t "${pkgdir}/usr/lib/atom/dot-atom/packages/language-${pkgname}/settings/" + install -vDm 644 "atom/language-${pkgname}/snippets/"* \ + -t "${pkgdir}/usr/lib/atom/dot-atom/packages/language-${pkgname}/snippets/" + install -vDm 644 "atom/language-${pkgname}/process-palette.json.linux" \ + "${pkgdir}/usr/share/doc/${pkgname}/process-palette.json" + # kate + install -vDm 644 "${pkgname}.xml" \ + -t "${pkgdir}/usr/share/apps/katepart/syntax/" + # gedit + install -vDm 644 "${pkgname}.lang" \ + -t "${pkgdir}/usr/share/gtksourceview-2.0/language-specs/" + install -vDm 644 "${pkgname}.lang" \ + -t "${pkgdir}/usr/share/gtksourceview-3.0/language-specs/" + # highlight + install -vDm 644 dsp.lang -t "$pkgdir/usr/share/highlight/langDefs/" + # nano + install -vDm 644 "${pkgname}.nanorc" -t "$pkgdir/usr/share/nano/" + # vim + install -vDm 644 "${pkgname}.vim" \ + -t "${pkgdir}/usr/share/vim/vimfiles/syntax/" + # emacs + install -vDm 644 "${pkgname}-mode.el" \ + -t "${pkgdir}/usr/share/emacs/site-lisp/" +} + Copied: faust/repos/community-staging-x86_64/llvm7.patch (from rev 445242, faust/trunk/llvm7.patch) =================================================================== --- community-staging-x86_64/llvm7.patch (rev 0) +++ community-staging-x86_64/llvm7.patch 2019-03-28 10:35:13 UTC (rev 445243) @@ -0,0 +1,946 @@ +diff -ruN faust-2.5.23/compiler/Makefile.unix faust-2.5.23-b/compiler/Makefile.unix +--- faust-2.5.23/compiler/Makefile.unix 2018-03-06 10:39:29.000000000 +0100 ++++ faust-2.5.23-b/compiler/Makefile.unix 2018-09-20 23:42:17.101639018 +0200 +@@ -160,6 +160,11 @@ + CLANGLIBS=$(CLANGLIBSLIST) + CXXFLAGS += -std=gnu++11 + ++else ifeq ($(LLVM_VERSION),$(filter $(LLVM_VERSION), 7.0.1 7.0.0 7.0.0svn)) ++ LLVM_VERSION = LLVM_70 ++ CLANGLIBS=$(CLANGLIBSLIST) ++ CXXFLAGS += -std=gnu++11 ++ + else + $(error "Unknown LLVM version $(LLVM_VERSION)") + +diff -ruN faust-2.5.23/compiler/generator/llvm/llvm_code_container.cpp faust-2.5.23-b/compiler/generator/llvm/llvm_code_container.cpp +--- faust-2.5.23/compiler/generator/llvm/llvm_code_container.cpp 2018-03-06 10:39:29.000000000 +0100 ++++ faust-2.5.23-b/compiler/generator/llvm/llvm_code_container.cpp 2018-09-23 18:03:49.035915270 +0200 +@@ -35,7 +35,7 @@ + TODO: in -mem mode, classInit and classDestroy will have to be called once at factory init and destroy time + */ + +-#if defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #define ModulePTR std::unique_ptr<Module> + #define MovePTR(ptr) std::move(ptr) + #else +@@ -67,15 +67,15 @@ + #endif + fBuilder = new IRBuilder<>(getContext()); + +-#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) ++#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) + // Set "-fast-math" + FastMathFlags FMF; +-#if defined(LLVM_60) ++#if (defined(LLVM_60) || defined(LLVM_70)) + FMF.setFast(); // has replaced the below function + #else + FMF.setUnsafeAlgebra(); + #endif +-#if (defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) ++#if (defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) + fBuilder->setFastMathFlags(FMF); + #else + fBuilder->SetFastMathFlags(FMF); +@@ -98,15 +98,15 @@ + fContext = context; + fBuilder = new IRBuilder<>(getContext()); + +-#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) ++#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) + // Set "-fast-math" + FastMathFlags FMF; +-#if defined(LLVM_60) ++#if (defined(LLVM_60) || defined(LLVM_70)) + FMF.setFast(); // has replaced the below function + #else + FMF.setUnsafeAlgebra(); + #endif +-#if (defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) ++#if (defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) + fBuilder->setFastMathFlags(FMF); + #else + fBuilder->SetFastMathFlags(FMF); +@@ -222,8 +222,8 @@ + Function* llvm_compute = Function::Create(llvm_compute_type, GlobalValue::ExternalLinkage, "compute" + fKlassName, fModule); + llvm_compute->setCallingConv(CallingConv::C); + +-#if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) +-#if !defined(LLVM_50) && !defined(LLVM_60) ++#if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) ++#if !defined(LLVM_50) && !defined(LLVM_60) && !defined(LLVM_70) + llvm_compute->setDoesNotAlias(3U); + llvm_compute->setDoesNotAlias(4U); + #endif +@@ -294,7 +294,7 @@ + + BasicBlock* block = BasicBlock::Create(getContext(), "entry_block", sr_fun); + fBuilder->SetInsertPoint(block); +-#if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + Value* zone_ptr = fBuilder->CreateStructGEP(0, dsp, field_index); + #else + Value* zone_ptr = fBuilder->CreateStructGEP(dsp, field_index); +@@ -656,7 +656,7 @@ + + Value* idx2[3]; + idx2[0] = load_meta_ptr; +- #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + idx2[1] = fBuilder->CreateConstGEP2_32(type_def1, llvm_label1, 0, 0); + idx2[2] = fBuilder->CreateConstGEP2_32(type_def2, llvm_label2, 0, 0); + #else +@@ -1231,7 +1231,7 @@ + + Function* llvm_computethreadInternal = fModule->getFunction("computeThread"); + faustassert(llvm_computethreadInternal); +-#if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + Value* fun_args[] = { fBuilder->CreateBitCast(arg1, fStructDSP), arg2 }; + CallInst* call_inst = fBuilder->CreateCall(llvm_computethreadInternal, fun_args); + #else +diff -ruN faust-2.5.23/compiler/generator/llvm/llvm_code_container.hh faust-2.5.23-b/compiler/generator/llvm/llvm_code_container.hh +--- faust-2.5.23/compiler/generator/llvm/llvm_code_container.hh 2018-03-06 10:39:29.000000000 +0100 ++++ faust-2.5.23-b/compiler/generator/llvm/llvm_code_container.hh 2018-09-21 00:10:08.190282639 +0200 +@@ -29,7 +29,7 @@ + #include "wss_code_container.hh" + #include "llvm_dynamic_dsp_aux.hh" + +-#if defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #include <llvm/Support/FileSystem.h> + #define sysfs_binary_flag sys::fs::F_None + #elif defined(LLVM_34) +@@ -38,7 +38,7 @@ + #define sysfs_binary_flag raw_fd_ostream::F_Binary + #endif + +-#if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #define STREAM_ERROR std::error_code + #else + #define STREAM_ERROR std::string +@@ -118,7 +118,7 @@ + + LlvmValue genFloat(const string& number) + { +- #if defined(LLVM_60) ++ #if defined(LLVM_60) || defined(LLVM_70) + return ConstantFP::get(getContext(), APFloat(APFloat::IEEEsingle(), number)); + #elif defined(LLVM_40) || defined(LLVM_50) + return ConstantFP::get(getContext(), APFloat(APFloat::IEEEsingle(), number)); +diff -ruN faust-2.5.23/compiler/generator/llvm/llvm_dsp_aux.cpp faust-2.5.23-b/compiler/generator/llvm/llvm_dsp_aux.cpp +--- faust-2.5.23/compiler/generator/llvm/llvm_dsp_aux.cpp 2018-03-06 10:39:29.000000000 +0100 ++++ faust-2.5.23-b/compiler/generator/llvm/llvm_dsp_aux.cpp 2018-09-25 22:59:57.342028461 +0200 +@@ -41,7 +41,7 @@ + //#include <llvm/Transforms/IPO/PassManagerBuilder.h> + //#include <llvm/Support/Threading.h> + +-#if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + //#include <llvm/IR/Module.h> + //#include <llvm/IR/LLVMContext.h> + //#include <llvm/IRReader/IRReader.h> +@@ -61,7 +61,7 @@ + #include <llvm/Support/IRReader.h> + #endif + +-#if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + /* + #include <llvm/Analysis/TargetLibraryInfo.h> + #include <llvm/Analysis/TargetTransformInfo.h> +@@ -77,7 +77,7 @@ + #define FUNCTION_PASS_MANAGER FunctionPassManager + #endif + +-#if defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + + #include <llvm/Bitcode/BitcodeWriter.h> + #include <llvm/Bitcode/BitcodeReader.h> +@@ -94,20 +94,20 @@ + */ + #if defined(LLVM_32) + #include <llvm/DataLayout.h> +-#elif !defined(LLVM_33) && !defined(LLVM_34) && !defined(LLVM_35) && !defined(LLVM_36) && !defined(LLVM_37) && !defined(LLVM_38) && !defined(LLVM_39) && !defined(LLVM_40) && !defined(LLVM_50) && !defined(LLVM_60) ++#elif !defined(LLVM_33) && !defined(LLVM_34) && !defined(LLVM_35) && !defined(LLVM_36) && !defined(LLVM_37) && !defined(LLVM_38) && !defined(LLVM_39) && !defined(LLVM_40) && !defined(LLVM_50) && !defined(LLVM_60) && !defined(LLVM_70) + #ifndef _WIN32 + //#include <llvm/Target/TargetData.h> + #endif + #endif + +-#if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #include <llvm/ExecutionEngine/MCJIT.h> + //#include <llvm/ExecutionEngine/ObjectCache.h> + #else + #include <llvm/ExecutionEngine/JIT.h> + #endif + +-#if defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + /* + #include <llvm/IR/LegacyPassNameParser.h> + #include <llvm/Linker/Linker.h> +@@ -130,11 +130,11 @@ + #define GET_CPU_NAME llvm::sys::getHostCPUName() + #endif + +-#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) && !defined(_MSC_VER) ++#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) && !defined(_MSC_VER) + //#include <llvm/ExecutionEngine/ObjectCache.h> + #endif + +-#if defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #define sysfs_binary_flag sys::fs::F_None + #elif defined(LLVM_34) + #define sysfs_binary_flag sys::fs::F_Binary +@@ -142,7 +142,7 @@ + #define sysfs_binary_flag raw_fd_ostream::F_Binary + #endif + +-#if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #define STREAM_ERROR std::error_code + #define MEMORY_BUFFER MemoryBufferRef + #define MEMORY_BUFFER_GET(buffer) (buffer.getBuffer()) +@@ -156,7 +156,7 @@ + #define MEMORY_BUFFER_CREATE(stringref) (MemoryBuffer::getMemBuffer(stringref)) + #endif + +-#if defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #define ModulePTR std::unique_ptr<Module> + #define MovePTR(ptr) std::move(ptr) + #else +@@ -177,7 +177,7 @@ + + void* llvm_dsp_factory_aux::loadOptimize(const string& function) + { +-#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) && !defined(_MSC_VER) ++#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) && !defined(_MSC_VER) + void* fun = (void*)fJIT->getFunctionAddress(function); + if (fun) { + return fun; +@@ -196,7 +196,7 @@ + + bool llvm_dsp_factory_aux::crossCompile(const string& target) + { +-#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) && !defined(_MSC_VER) ++#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) && !defined(_MSC_VER) + delete fObjectCache; + fObjectCache = new FaustObjectCache(); + setTarget(target); +@@ -211,10 +211,10 @@ + { + if (llvm_dsp_factory_aux::gInstance++ == 0) { + // Install a LLVM error handler +- #if defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + LLVMInstallFatalErrorHandler(llvm_dsp_factory_aux::LLVMFatalErrorHandler); + #endif +- #if (!defined(LLVM_35) && !defined(LLVM_36) && !defined(LLVM_37) && !defined(LLVM_38) && !defined(LLVM_39) && !defined(LLVM_40) && !defined(LLVM_50) && !defined(LLVM_60)) // In LLVM 3.5 this is gone. ++ #if (!defined(LLVM_35) && !defined(LLVM_36) && !defined(LLVM_37) && !defined(LLVM_38) && !defined(LLVM_39) && !defined(LLVM_40) && !defined(LLVM_50) && !defined(LLVM_60) && !defined(LLVM_70)) // In LLVM 3.5 this is gone. + if (!llvm_start_multithreaded()) { + std::cerr << "llvm_start_multithreaded error...\n"; + } +@@ -225,16 +225,16 @@ + void llvm_dsp_factory_aux::stopLLVMLibrary() + { + if (--llvm_dsp_factory_aux::gInstance == 0) { +- #if (!defined(LLVM_35)) && (!defined(LLVM_36)) && (!defined(LLVM_37)) && (!defined(LLVM_38)) && (!defined(LLVM_39)) && (!defined(LLVM_40)) && (!defined(LLVM_50) && !defined(LLVM_60)) // In LLVM 3.5 this is gone. ++ #if (!defined(LLVM_35)) && (!defined(LLVM_36)) && (!defined(LLVM_37)) && (!defined(LLVM_38)) && (!defined(LLVM_39)) && (!defined(LLVM_40)) && (!defined(LLVM_50) && !defined(LLVM_60) && !defined(LLVM_70)) // In LLVM 3.5 this is gone. + llvm_stop_multithreaded(); + #endif +- #if defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + LLVMResetFatalErrorHandler(); + #endif + } + } + +-#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) && !defined(_MSC_VER) ++#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) && !defined(_MSC_VER) + llvm_dsp_factory_aux::llvm_dsp_factory_aux(const string& sha_key, const string& machine_code, const string& target) + :dsp_factory_imp("MachineDSP", sha_key, "") + { +@@ -271,14 +271,14 @@ + fModule = module; + fContext = context; + +-#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) && !defined(_MSC_VER) ++#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) && !defined(_MSC_VER) + fObjectCache = nullptr; + #endif + } + + llvm_dsp_factory_aux::~llvm_dsp_factory_aux() + { +-#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) && !defined(_MSC_VER) ++#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) && !defined(_MSC_VER) + delete fObjectCache; + #endif + if (fJIT) { +@@ -290,7 +290,7 @@ + stopLLVMLibrary(); + } + +-#if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + void llvm_dsp_factory_aux::LLVMFatalErrorHandler(const char* reason) + { + throw faustexception(reason); +@@ -344,7 +344,11 @@ + string res; + raw_string_ostream out_str(res); + if (binary) { ++ #if defined(LLVM_70) ++ WriteBitcodeToFile(*fModule, out_str); ++ #else + WriteBitcodeToFile(fModule, out_str); ++ #endif + } else { + out_str << *fModule; + } +@@ -532,7 +536,7 @@ + + string llvm_dsp_factory_aux::writeDSPFactoryToMachineAux(const string& target) + { +-#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) && !defined(_MSC_VER) ++#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) && !defined(_MSC_VER) + if (target == "" || target == getTarget()) { + return fObjectCache->getMachineCode(); + } else { +@@ -563,7 +567,7 @@ + out.flush(); + } + +-#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) && !defined(_MSC_VER) ++#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) && !defined(_MSC_VER) + + static llvm_dsp_factory* readDSPFactoryFromMachineAux(MEMORY_BUFFER buffer, const string& target) + { +@@ -606,7 +610,7 @@ + { + TLock lock(llvm_dsp_factory_aux::gDSPFactoriesLock); + +-#if defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + ErrorOr<OwningPtr<MemoryBuffer>> buffer = MemoryBuffer::getFileOrSTDIN(machine_code_path); + if (error_code ec = buffer.getError()) { + std::cerr << "readDSPFactoryFromMachineFile failed : " << ec.message() << std::endl; +@@ -790,7 +794,7 @@ + } + } + +-#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) && !defined(_MSC_VER) ++#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) && !defined(_MSC_VER) + EXPORT llvm_dsp_factory* readCDSPFactoryFromMachine(const char* machine_code, const char* target) + { + return readDSPFactoryFromMachine(machine_code, target); +diff -ruN faust-2.5.23/compiler/generator/llvm/llvm_dsp_aux.hh faust-2.5.23-b/compiler/generator/llvm/llvm_dsp_aux.hh +--- faust-2.5.23/compiler/generator/llvm/llvm_dsp_aux.hh 2018-03-06 10:39:29.000000000 +0100 ++++ faust-2.5.23-b/compiler/generator/llvm/llvm_dsp_aux.hh 2018-09-20 23:42:17.164971704 +0200 +@@ -36,11 +36,11 @@ + #include "dsp_factory.hh" + #include "TMutex.h" + +-#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) && !defined(_MSC_VER) ++#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) && !defined(_MSC_VER) + #include <llvm/ExecutionEngine/ObjectCache.h> + #endif + +-#if defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #define LLVM_MAX_OPT_LEVEL 5 + #else + #define LLVM_MAX_OPT_LEVEL 4 +@@ -133,7 +133,7 @@ + }; + #endif + +-#if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + + /* + static std::string getFeaturesStr() +@@ -199,7 +199,7 @@ + + llvm::ExecutionEngine* fJIT; + +- #if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) && !defined(_MSC_VER) ++ #if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) && !defined(_MSC_VER) + FaustObjectCache* fObjectCache; + #endif + +@@ -233,7 +233,7 @@ + + bool crossCompile(const std::string& target); + +- #if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + static void LLVMFatalErrorHandler(const char* reason); + #endif + +@@ -251,7 +251,7 @@ + const std::string& target, + int opt_level = 0); + +- #if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) && !defined(_MSC_VER) ++ #if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) && !defined(_MSC_VER) + llvm_dsp_factory_aux(const std::string& sha_key, const std::string& machine_code, const std::string& target); + #endif + +diff -ruN faust-2.5.23/compiler/generator/llvm/llvm_dynamic_dsp_aux.cpp faust-2.5.23-b/compiler/generator/llvm/llvm_dynamic_dsp_aux.cpp +--- faust-2.5.23/compiler/generator/llvm/llvm_dynamic_dsp_aux.cpp 2018-03-06 10:39:29.000000000 +0100 ++++ faust-2.5.23-b/compiler/generator/llvm/llvm_dynamic_dsp_aux.cpp 2018-09-25 23:13:17.146825104 +0200 +@@ -43,7 +43,7 @@ + #include <llvm/Transforms/IPO/PassManagerBuilder.h> + #include <llvm/Support/Threading.h> + +-#if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #include <llvm/IR/Module.h> + #include <llvm/IR/LLVMContext.h> + #include <llvm/IRReader/IRReader.h> +@@ -62,7 +62,7 @@ + #include <llvm/Support/IRReader.h> + #endif + +-#if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #include <llvm/Analysis/TargetLibraryInfo.h> + #include <llvm/Analysis/TargetTransformInfo.h> + #include <llvm/IR/PassManager.h> +@@ -76,7 +76,7 @@ + #define FUNCTION_PASS_MANAGER FunctionPassManager + #endif + +-#if defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #include <llvm/Bitcode/BitcodeWriter.h> + #include <llvm/Bitcode/BitcodeReader.h> + #include <llvm/Transforms/IPO/AlwaysInliner.h> +@@ -90,20 +90,20 @@ + */ + #if defined(LLVM_32) + #include <llvm/DataLayout.h> +-#elif !defined(LLVM_33) && !defined(LLVM_34) && !defined(LLVM_35) && !defined(LLVM_36) && !defined(LLVM_37) && !defined(LLVM_38) && !defined(LLVM_39) && !defined(LLVM_40) && !defined(LLVM_50) && !defined(LLVM_60) ++#elif !defined(LLVM_33) && !defined(LLVM_34) && !defined(LLVM_35) && !defined(LLVM_36) && !defined(LLVM_37) && !defined(LLVM_38) && !defined(LLVM_39) && !defined(LLVM_40) && !defined(LLVM_50) && !defined(LLVM_60) && !defined(LLVM_70) + #ifndef _WIN32 + #include <llvm/Target/TargetData.h> + #endif + #endif + +-#if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #include <llvm/ExecutionEngine/MCJIT.h> + #include <llvm/ExecutionEngine/ObjectCache.h> + #else + #include <llvm/ExecutionEngine/JIT.h> + #endif + +-#if defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #include <llvm/IR/LegacyPassNameParser.h> + #include <llvm/Linker/Linker.h> + #include <llvm/IR/IRPrintingPasses.h> +@@ -123,11 +123,11 @@ + #define GET_CPU_NAME llvm::sys::getHostCPUName() + #endif + +-#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) && !defined(_MSC_VER) ++#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) && !defined(_MSC_VER) + #include "llvm/ExecutionEngine/ObjectCache.h" + #endif + +-#if defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #define sysfs_binary_flag sys::fs::F_None + #elif defined(LLVM_34) + #define sysfs_binary_flag sys::fs::F_Binary +@@ -135,7 +135,7 @@ + #define sysfs_binary_flag raw_fd_ostream::F_Binary + #endif + +-#if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #define STREAM_ERROR std::error_code + #define MEMORY_BUFFER MemoryBufferRef + #define MEMORY_BUFFER_GET(buffer) (buffer.getBuffer()) +@@ -149,7 +149,7 @@ + #define MEMORY_BUFFER_CREATE(stringref) (MemoryBuffer::getMemBuffer(stringref)) + #endif + +-#if defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #define ModulePTR std::unique_ptr<Module> + #define MovePTR(ptr) std::move(ptr) + #else +@@ -211,7 +211,7 @@ + } + #endif + +-#if defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + + static Module* ParseBitcodeFile(MEMORY_BUFFER Buffer, + LLVMContext& Context, +@@ -250,7 +250,11 @@ + { + string res; + raw_string_ostream out(res); ++#if (LLVM_70) ++ WriteBitcodeToFile(*fModule, out); ++#else + WriteBitcodeToFile(fModule, out); ++#endif + out.flush(); + return base64_encode(res); + } +@@ -259,7 +263,11 @@ + { + STREAM_ERROR err; + raw_fd_ostream out(bit_code_path.c_str(), err, sysfs_binary_flag); ++#if (LLVM_70) ++ WriteBitcodeToFile(*fModule, out); ++#else + WriteBitcodeToFile(fModule, out); ++#endif + } + + // IR +@@ -302,12 +310,12 @@ + fModule = module; + fContext = context; + +-#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) && !defined(_MSC_VER) ++#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) && !defined(_MSC_VER) + fObjectCache = nullptr; + #endif + } + +-#if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + /// AddOptimizationPasses - This routine adds optimization passes + /// based on selected optimization level, OptLevel. This routine + /// duplicates llvm-gcc behaviour. +@@ -336,7 +344,7 @@ + } + Builder.Inliner = createFunctionInliningPass(Threshold); + } else { +- #if defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + Builder.Inliner = createAlwaysInlinerLegacyPass(); + #else + Builder.Inliner = createAlwaysInlinerPass(); +@@ -377,22 +385,22 @@ + InitializeNativeTargetAsmParser(); + + // For ObjectCache to work... +-#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) && !defined(_MSC_VER) ++#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) && !defined(_MSC_VER) + LLVMLinkInMCJIT(); + #endif + + // Restoring from machine code +-#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) && !defined(_MSC_VER) ++#if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) && !defined(_MSC_VER) + if (fObjectCache) { + + // JIT +- #if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + EngineBuilder builder((unique_ptr<Module>(fModule))); + #else + EngineBuilder builder(fModule); + #endif + builder.setEngineKind(EngineKind::JIT); +- #if !defined(LLVM_36) && !defined(LLVM_37) && !defined(LLVM_38) && !defined(LLVM_39) && !defined(LLVM_40) && !defined(LLVM_50) && !defined(LLVM_60) ++ #if !defined(LLVM_36) && !defined(LLVM_37) && !defined(LLVM_38) && !defined(LLVM_39) && !defined(LLVM_40) && !defined(LLVM_50) && !defined(LLVM_60) && !defined(LLVM_70) + builder.setUseMCJIT(true); + #endif + TargetMachine* tm = builder.selectTarget(); +@@ -417,7 +425,7 @@ + initializeVectorization(Registry); + initializeIPO(Registry); + initializeAnalysis(Registry); +- #if !defined(LLVM_38) && !defined(LLVM_39) && !defined(LLVM_40) && !defined(LLVM_50) && !defined(LLVM_60) ++ #if !defined(LLVM_38) && !defined(LLVM_39) && !defined(LLVM_40) && !defined(LLVM_50) && !defined(LLVM_60) && !defined(LLVM_70) + initializeIPA(Registry); + #endif + initializeTransformUtils(Registry); +@@ -425,14 +433,14 @@ + initializeInstrumentation(Registry); + initializeTarget(Registry); + +- #if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + EngineBuilder builder((unique_ptr<Module>(fModule))); + #else + EngineBuilder builder(fModule); + #endif + builder.setOptLevel(CodeGenOpt::Aggressive); + builder.setEngineKind(EngineKind::JIT); +- #if !defined(LLVM_60) ++ #if !defined(LLVM_60) && !defined(LLVM_70) + builder.setCodeModel(CodeModel::JITDefault); + #endif + +@@ -442,7 +450,7 @@ + // MCJIT does not work correctly (incorrect float numbers ?) when used with dynamic libLLVM + #if (defined(LLVM_34) || defined(LLVM_35)) && !defined(_MSC_VER) + builder.setUseMCJIT(true); +- #elif !defined(LLVM_36) && !defined(LLVM_37) && !defined(LLVM_38) && !defined(LLVM_39) && !defined(LLVM_40) && !defined(LLVM_50) && !defined(LLVM_60) ++ #elif !defined(LLVM_36) && !defined(LLVM_37) && !defined(LLVM_38) && !defined(LLVM_39) && !defined(LLVM_40) && !defined(LLVM_50) && !defined(LLVM_60) && !defined(LLVM_70) + builder.setUseMCJIT(false); + #endif + +@@ -473,8 +481,8 @@ + + // -fastmath is activated at IR level, and has to be setup at JIT level also + +- #if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) +- #if !defined(LLVM_50) && !defined(LLVM_60) ++ #if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) ++ #if !defined(LLVM_50) && !defined(LLVM_60) && !defined(LLVM_70) + targetOptions.LessPreciseFPMADOption = true; + #endif + targetOptions.AllowFPOpFusion = FPOpFusion::Fast; +@@ -484,7 +492,7 @@ + targetOptions.GuaranteedTailCallOpt = true; + #endif + +- #if defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + targetOptions.NoTrappingFPMath = true; + targetOptions.FPDenormalMode = FPDenormal::IEEE; + #endif +@@ -512,7 +520,7 @@ + PASS_MANAGER pm; + FUNCTION_PASS_MANAGER fpm(fModule); + +- #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) // Code taken from opt.cpp ++ #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) // Code taken from opt.cpp + TargetLibraryInfoImpl TLII(Triple(fModule->getTargetTriple())); + pm.add(new TargetLibraryInfoWrapperPass(TLII)); + #else +@@ -521,7 +529,7 @@ + pm.add(tli); + #endif + +- #if defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + fModule->setDataLayout(fJIT->getDataLayout()); + #elif defined(LLVM_37) // Code taken from opt.cpp + fModule->setDataLayout(*fJIT->getDataLayout()); +@@ -535,7 +543,7 @@ + #endif + + // Add internal analysis passes from the target machine (mandatory for vectorization to work) +- #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) // Code taken from opt.cpp ++ #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) // Code taken from opt.cpp + pm.add(createTargetTransformInfoWrapperPass(tm->getTargetIRAnalysis())); + #else + tm->addAnalysisPasses(pm); +@@ -546,7 +554,7 @@ + } + + if ((debug_var != "") && (debug_var.find("FAUST_LLVM1") != string::npos)) { +- #if defined(LLVM_60) ++ #if defined(LLVM_60) | defined(LLVM_70) + // TargetRegistry::printRegisteredTargetsForVersion(std::cout); + #else + TargetRegistry::printRegisteredTargetsForVersion(); +@@ -563,7 +571,7 @@ + pm.add(createVerifierPass()); + + if ((debug_var != "") && (debug_var.find("FAUST_LLVM4") != string::npos)) { +- #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + // TODO + #else + tm->addPassesToEmitFile(pm, fouts(), TargetMachine::CGFT_AssemblyFile, true); +@@ -578,7 +586,7 @@ + } + } + +- #if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) && !defined(_MSC_VER) ++ #if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) && !defined(_MSC_VER) + fObjectCache = new FaustObjectCache(); + fJIT->setObjectCache(fObjectCache); + } +@@ -877,7 +885,7 @@ + { + TLock lock(llvm_dsp_factory_aux::gDSPFactoriesLock); + +-#if defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + ErrorOr<OwningPtr<MemoryBuffer>> buffer = MemoryBuffer::getFileOrSTDIN(bit_code_path); + if (error_code ec = buffer.getError()) { + std::cerr << "readDSPFactoryFromBitcodeFile failed : " << ec.message() << std::endl; +@@ -920,7 +928,7 @@ + setlocale(LC_ALL, "C"); + LLVMContext* context = new LLVMContext(); + SMDiagnostic err; +- #if defined(LLVM_36) || defined(LLVM_37) ||defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_36) || defined(LLVM_37) ||defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + Module* module = parseIR(buffer, err, *context).release(); // parseIR takes ownership of the given buffer, so don't delete it + #else + Module* module = ParseIR(buffer, err, *context); // ParseIR takes ownership of the given buffer, so don't delete it +@@ -962,7 +970,7 @@ + { + TLock lock(llvm_dsp_factory_aux::gDSPFactoriesLock); + +- #if defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + ErrorOr<OwningPtr<MemoryBuffer>> buffer = MemoryBuffer::getFileOrSTDIN(ir_code_path); + if (error_code ec = buffer.getError()) { + std::cerr << "readDSPFactoryFromIRFile failed : " << ec.message() << std::endl; +@@ -1009,7 +1017,7 @@ + ModulePTR loadSingleModule(const string filename, LLVMContext* context) + { + SMDiagnostic err; +-#if defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + ModulePTR module = parseIRFile(filename, err, *context); + #elif defined(LLVM_36) || defined(LLVM_37) + ModulePTR module = parseIRFile(filename, err, *context).release(); +@@ -1047,7 +1055,7 @@ + { + bool res = false; + +-#if defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + if (Linker::linkModules(*dst, MovePTR(src))) { + snprintf(error_msg, 256, "cannot link module"); + +diff -ruN faust-2.5.23/compiler/generator/llvm/llvm_instructions.hh faust-2.5.23-b/compiler/generator/llvm/llvm_instructions.hh +--- faust-2.5.23/compiler/generator/llvm/llvm_instructions.hh 2018-03-06 10:39:29.000000000 +0100 ++++ faust-2.5.23-b/compiler/generator/llvm/llvm_instructions.hh 2018-09-20 23:42:17.171638303 +0200 +@@ -41,7 +41,7 @@ + #include <llvm/Support/Host.h> + #include <llvm/Support/TargetSelect.h> + +-#if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #include <llvm/IR/IRBuilder.h> + #include <llvm/IR/DataLayout.h> + #include <llvm/IR/DerivedTypes.h> +@@ -57,25 +57,25 @@ + #include <llvm/Module.h> + #endif + +-#if defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #include <llvm/IR/Verifier.h> + #else + #include <llvm/Analysis/Verifier.h> + #endif + +-#if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #include <llvm/ExecutionEngine/MCJIT.h> + #else + #include <llvm/ExecutionEngine/JIT.h> + #endif + +-#if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #include <llvm/IR/PassManager.h> + #else + #include <llvm/PassManager.h> + #endif + +-#if defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #include <llvm/Bitcode/BitcodeWriter.h> + #include <llvm/Bitcode/BitcodeReader.h> + #else +@@ -90,7 +90,7 @@ + #define LLVM_FREE "free" + #endif + +-#if defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #define GET_ITERATOR(it) &(*(it)) + #else + #define GET_ITERATOR(it) it +@@ -291,7 +291,7 @@ + VECTOR_OF_TYPES fDSPFields; + int fDSPFieldsCounter; + string fPrefix; +- #if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + DataLayout* fDataLayout; + #endif + +@@ -396,7 +396,7 @@ + // llvm_create_dsp block + BasicBlock* entry_func_llvm_create_dsp = BasicBlock::Create(fModule->getContext(), "entry", func_llvm_create_dsp); + +- #if defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + llvm::CallInst* call_inst1 = CallInst::Create(func_malloc, genInt64(fModule, fDataLayout->getTypeSizeInBits(dsp_type)), "", entry_func_llvm_create_dsp); + #else + // Dynamically computed object size (see http://nondot.org/sabre/LLVMNotes/SizeOf-OffsetOf-VariableSizedStructs.txt) +@@ -614,7 +614,7 @@ + initTypes(module); + #if defined(LLVM_35) || defined(LLVM_36) + fDataLayout = new DataLayout(*module->getDataLayout()); +- #elif defined(LLVM_34) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #elif defined(LLVM_34) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + fDataLayout = new DataLayout(module->getDataLayout()); + #endif + } +@@ -623,7 +623,7 @@ + { + // External object not covered by Garbageable, so delete it here + delete fBuilder; +- #if defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + delete fDataLayout; + #endif + } +@@ -1001,7 +1001,7 @@ + GlobalVariable* llvm_key = addStringConstant(inst->fKey, type_def1); + GlobalVariable* llvm_value = addStringConstant(inst->fValue, type_def2); + +- #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + Value* const_string1 = fBuilder->CreateConstGEP2_32(type_def1, llvm_key, 0, 0); + Value* const_string2 = fBuilder->CreateConstGEP2_32(type_def2, llvm_value, 0, 0); + #else +@@ -1015,7 +1015,7 @@ + zone_ptr = Constant::getNullValue((itfloat() == Typed::kFloat) ? fTypeMap[Typed::kFloat_ptr] : fTypeMap[Typed::kDouble_ptr]); + } else { + int field_index = fDSPFieldsNames[inst->fZone]; +- #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + zone_ptr = fBuilder->CreateStructGEP(0, dsp, field_index); + #else + zone_ptr = fBuilder->CreateStructGEP(dsp, field_index); +@@ -1043,7 +1043,7 @@ + string name = replaceSpacesWithUnderscore(inst->fName); + llvm::Type* type_def = 0; + GlobalVariable* llvm_name = addStringConstant(inst->fName, type_def); +- #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + Value* const_string = fBuilder->CreateConstGEP2_32(type_def, llvm_name, 0, 0); + #else + Value* const_string = fBuilder->CreateConstGEP2_32(llvm_name, 0, 0); +@@ -1065,7 +1065,7 @@ + idx[1] = mth_index; + Value* mth_ptr = fBuilder->CreateInBoundsGEP(ui, MAKE_IXD(idx, idx+2)); + LoadInst* mth = fBuilder->CreateLoad(mth_ptr); +- #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + Value* fun_args[] = { fUIInterface_ptr, const_string }; + CallInst* call_inst = fBuilder->CreateCall(mth, fun_args); + #else +@@ -1102,7 +1102,7 @@ + string name = replaceSpacesWithUnderscore(label); + llvm::Type* type_def = 0; + GlobalVariable* llvm_label = addStringConstant(label, type_def); +- #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + Value* const_string = fBuilder->CreateConstGEP2_32(type_def, llvm_label, 0, 0); + #else + Value* const_string = fBuilder->CreateConstGEP2_32(llvm_label, 0, 0); +@@ -1116,7 +1116,7 @@ + + // Generates access to zone + int field_index = fDSPFieldsNames[zone]; +- #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + Value* zone_ptr = fBuilder->CreateStructGEP(0, dsp, field_index); + Value* fun_args[] = { fUIInterface_ptr, const_string, zone_ptr }; + CallInst* call_inst = fBuilder->CreateCall(mth, fun_args); +@@ -1153,7 +1153,7 @@ + string name = replaceSpacesWithUnderscore(label); + llvm::Type* type_def = 0; + GlobalVariable* llvm_label = addStringConstant(label, type_def); +- #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + Value* const_string = fBuilder->CreateConstGEP2_32(type_def, llvm_label, 0, 0); + #else + Value* const_string = fBuilder->CreateConstGEP2_32(llvm_label, 0, 0); +@@ -1166,7 +1166,7 @@ + + // Generates access to zone + int field_index = fDSPFieldsNames[zone]; +- #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + Value* zone_ptr = fBuilder->CreateStructGEP(0, dsp, field_index); + #else + Value* zone_ptr = fBuilder->CreateStructGEP(dsp, field_index); +@@ -1213,7 +1213,7 @@ + string name = replaceSpacesWithUnderscore(label); + llvm::Type* type_def = 0; + GlobalVariable* llvm_label = addStringConstant(label, type_def); +- #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + Value* const_string = fBuilder->CreateConstGEP2_32(type_def, llvm_label, 0, 0); + #else + Value* const_string = fBuilder->CreateConstGEP2_32(llvm_label, 0, 0); +@@ -1227,7 +1227,7 @@ + + // Generates access to zone + int field_index = fDSPFieldsNames[zone]; +- #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + Value* zone_ptr = fBuilder->CreateStructGEP(0, dsp, field_index); + #else + Value* zone_ptr = fBuilder->CreateStructGEP(dsp, field_index); +@@ -1378,7 +1378,7 @@ + inst->fName, fModule); + function->setCallingConv(CallingConv::C); + +- #if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + // In order for auto-vectorization to correctly work with vectorizable math functions + if (find(gMathLibTable.begin(), gMathLibTable.end(), inst->fName) != gMathLibTable.end()) { + function->setDoesNotAccessMemory(); +@@ -1499,7 +1499,7 @@ + { + if (named_address->fAccess & Address::kStruct) { + int field_index = fDSPFieldsNames[named_address->fName]; +- #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + return fBuilder->CreateStructGEP(0, getDSP(), field_index); + #else + return fBuilder->CreateStructGEP(getDSP(), field_index); +@@ -1672,7 +1672,7 @@ + + if (named_address->fAccess & Address::kStruct) { + int field_index = fDSPFieldsNames[named_address->fName]; +- #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++ #if defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + Value* store_ptr = fBuilder->CreateStructGEP(0, getDSP(), field_index); + #else + Value* store_ptr = fBuilder->CreateStructGEP(getDSP(), field_index); +@@ -2362,7 +2362,7 @@ + // Inst result for comparison + return generateScalarSelect(opcode, comp_value, genInt32(fModule, 1, size), genInt32(fModule, 0, size), size); + } else { +- #if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) ||defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60)) ++ #if (defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) ||defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70)) + LlvmValue value = fBuilder->CreateBinOp((Instruction::BinaryOps)gBinOpTable[opcode]->fLLVMFloatInst, arg1, arg2); + Instruction* inst = cast<Instruction>(value); + inst->setMetadata(LLVMContext::MD_fpmath, fBuilder->getDefaultFPMathTag()); +diff -ruN faust-2.5.23/compiler/signals/binop.cpp faust-2.5.23-b/compiler/signals/binop.cpp +--- faust-2.5.23/compiler/signals/binop.cpp 2018-03-06 10:39:29.000000000 +0100 ++++ faust-2.5.23-b/compiler/signals/binop.cpp 2018-09-20 23:42:17.064972726 +0200 +@@ -32,7 +32,7 @@ + + #if LLVM_BUILD + +-#if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) ++#if defined(LLVM_33) || defined(LLVM_34) || defined(LLVM_35) || defined(LLVM_36) || defined(LLVM_37) || defined(LLVM_38) || defined(LLVM_39) || defined(LLVM_40) || defined(LLVM_50) || defined(LLVM_60) || defined(LLVM_70) + #include <llvm/IR/Instructions.h> + #else + #include <llvm/Instructions.h>