diff --git a/gnu/local.mk b/gnu/local.mk index a7006cb45f..e2cf40d4ae 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -658,6 +658,7 @@ dist_patch_DATA = \ %D%/packages/patches/libwmf-CVE-2015-4696.patch \ %D%/packages/patches/libxslt-generated-ids.patch \ %D%/packages/patches/lirc-localstatedir.patch \ + %D%/packages/patches/llvm-for-extempore.patch \ %D%/packages/patches/lm-sensors-hwmon-attrs.patch \ %D%/packages/patches/lua-CVE-2014-5461.patch \ %D%/packages/patches/lua-pkgconfig.patch \ diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm index a9eba798e0..b55a200bc5 100644 --- a/gnu/packages/llvm.scm +++ b/gnu/packages/llvm.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2015 Mark H Weaver ;;; Copyright © 2015 Ludovic Courtès ;;; Copyright © 2016 Dennis Mungai +;;; Copyright © 2016 Ricardo Wurmus ;;; ;;; This file is part of GNU Guix. ;;; @@ -267,3 +268,10 @@ code analysis tools.") (define-public clang-3.5 (clang-from-llvm llvm-3.5 clang-runtime-3.5 "0846h8vn3zlc00jkmvrmy88gc6ql6014c02l4jv78fpvfigmgssg")) + +(define-public llvm-for-extempore + (package (inherit llvm-3.7) + (source + (origin + (inherit (package-source llvm-3.7)) + (patches (list (search-patch "llvm-for-extempore.patch"))))))) diff --git a/gnu/packages/patches/llvm-for-extempore.patch b/gnu/packages/patches/llvm-for-extempore.patch new file mode 100644 index 0000000000..614682c6cb --- /dev/null +++ b/gnu/packages/patches/llvm-for-extempore.patch @@ -0,0 +1,118 @@ +This patch to LLVM is required by the developers of the Extempore language. +The following explanation was posted to the extemporelang@googlegroups.com +mailing list: + +"There is an assumption in the parser that all definitions occur within the +same compilation unit - i.e. the parser has local state about what has been +parsed in this unit of work. Extempore obviously does lots of little units +rather than one big unit and this causes problems for named types that were +defined in another unit - which they always are. The patch simply checks the +current module to see if the type has been previously defined, and intervenes +appropriately if it has." + +Message-ID: + +--- llvm-3.7.1.src/include/llvm/MC/MCSectionCOFF.h 2015-04-11 12:11:45.000000000 +1000 ++++ llvm-3.7.1.src/include/llvm/MC/MCSectionCOFF.h 2015-09-14 09:22:56.000000000 +1000 +@@ -16,7 +16,6 @@ + + #include "llvm/ADT/StringRef.h" + #include "llvm/MC/MCSection.h" +-#include "llvm/Support/COFF.h" + + namespace llvm { + class MCSymbol; + +--- llvm-3.7.1.src/lib/AsmParser/LLParser.cpp 2015-07-11 20:30:36.000000000 +1000 ++++ llvm-3.7.1.src/lib/AsmParser/LLParser.cpp 2015-09-14 09:20:57.000000000 +1000 +@@ -1754,8 +1754,14 @@ + // If the type hasn't been defined yet, create a forward definition and + // remember where that forward def'n was seen (in case it never is defined). + if (!Entry.first) { +- Entry.first = StructType::create(Context, Lex.getStrVal()); +- Entry.second = Lex.getLoc(); ++ // this here for extempore ++ if (M->getTypeByName(Lex.getStrVal())) { ++ Entry.first = M->getTypeByName(Lex.getStrVal()); ++ Entry.second = SMLoc(); ++ } else { ++ Entry.first = StructType::create(Context, Lex.getStrVal()); ++ Entry.second = Lex.getLoc(); ++ } + } + Result = Entry.first; + Lex.Lex(); + +--- llvm-3.7.1.src/lib/CodeGen/TargetLoweringObjectFileImpl.cpp 2015-07-01 05:10:31.000000000 +1000 ++++ llvm-3.7.1.src/lib/CodeGen/TargetLoweringObjectFileImpl.cpp 2015-09-14 09:23:40.000000000 +1000 +@@ -32,6 +32,7 @@ + #include "llvm/MC/MCStreamer.h" + #include "llvm/MC/MCSymbolELF.h" + #include "llvm/MC/MCValue.h" ++#include "llvm/Support/COFF.h" + #include "llvm/Support/Dwarf.h" + #include "llvm/Support/ELF.h" + #include "llvm/Support/ErrorHandling.h" + +--- llvm-3.7.1.src/lib/ExecutionEngine/MCJIT/MCJIT.cpp 2015-07-31 02:31:16.000000000 +1000 ++++ llvm-3.7.1.src/lib/ExecutionEngine/MCJIT/MCJIT.cpp 2015-09-14 09:21:28.000000000 +1000 +@@ -524,6 +524,17 @@ + rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue())); + return rv; + } ++ if (FTy->getNumParams() == 1 && ++ RetTy->isVoidTy() && ++ FTy->getParamType(0)->isPointerTy()) { ++ GenericValue rv; ++ //void (*PF)(char *) = (void(*)(char *))(intptr_t)FPtr; ++ //printf("are symbols available: %d\n",isSymbolSearchingDisabled()); ++ void (*PF)(char *) = (void(*)(char *))FPtr; ++ char* mzone = (char*) GVTOP(ArgValues[0]); ++ PF(mzone); ++ return rv; ++ } + break; + } + } + +--- llvm-3.7.1.src/lib/MC/MCContext.cpp 2015-06-23 21:31:32.000000000 +1000 ++++ llvm-3.7.1.src/lib/MC/MCContext.cpp 2015-09-14 09:24:01.000000000 +1000 +@@ -23,6 +23,7 @@ + #include "llvm/MC/MCSymbolCOFF.h" + #include "llvm/MC/MCSymbolELF.h" + #include "llvm/MC/MCSymbolMachO.h" ++#include "llvm/Support/COFF.h" + #include "llvm/Support/ELF.h" + #include "llvm/Support/ErrorHandling.h" + #include "llvm/Support/FileSystem.h" + +--- llvm-3.7.1.src/lib/MC/MCObjectFileInfo.cpp 2015-06-25 10:28:42.000000000 +1000 ++++ llvm-3.7.1.src/lib/MC/MCObjectFileInfo.cpp 2015-09-14 09:24:17.000000000 +1000 +@@ -16,6 +16,7 @@ + #include "llvm/MC/MCSectionCOFF.h" + #include "llvm/MC/MCSectionELF.h" + #include "llvm/MC/MCSectionMachO.h" ++#include "llvm/Support/COFF.h" + using namespace llvm; + + static bool useCompactUnwind(const Triple &T) { + +--- llvm-3.7.1.src/lib/MC/MCSectionCOFF.cpp 2015-06-09 10:31:39.000000000 +1000 ++++ llvm-3.7.1.src/lib/MC/MCSectionCOFF.cpp 2015-09-14 09:24:25.000000000 +1000 +@@ -11,6 +11,7 @@ + #include "llvm/MC/MCAsmInfo.h" + #include "llvm/MC/MCContext.h" + #include "llvm/MC/MCSymbol.h" ++#include "llvm/Support/COFF.h" + #include "llvm/Support/raw_ostream.h" + using namespace llvm; + +--- llvm-3.7.1.src/lib/Target/X86/X86TargetObjectFile.cpp 2015-06-27 04:55:48.000000000 +1000 ++++ llvm-3.7.1.src/lib/Target/X86/X86TargetObjectFile.cpp 2015-09-14 09:25:03.000000000 +1000 +@@ -16,6 +16,7 @@ + #include "llvm/MC/MCSectionCOFF.h" + #include "llvm/MC/MCSectionELF.h" + #include "llvm/MC/MCValue.h" ++#include "llvm/Support/COFF.h" + #include "llvm/Support/Dwarf.h" + #include "llvm/Target/TargetLowering.h"