I wouldn't say that this works well with gcc. I would recommend against keeping 
multiple versions of a port without a good and specific reason.


On 23 January 2016 22:16:16 GMT+00:00, Juan Francisco Cantero Hurtado 
<i...@juanfra.info> wrote:
>Can you modify the structure of devel/llvm/ to something like
>devel/llvm/version/? With lang/gcc works pretty well, we can work with
>the latest version while the ports tree uses the stable version by
>default.
>
>
>On Sat, Jan 23, 2016 at 07:39:22PM +0100, Pascal Stumpf wrote:
>> So here's an updated diff for LLVM 3.7.1.  With landry@'s recent
>commit,
>> xulrunner is no longer a showstopper.
>> 
>> 
>> Index: Makefile
>> ===================================================================
>> RCS file: /cvs/ports/devel/llvm/Makefile,v
>> retrieving revision 1.108
>> diff -u -p -r1.108 Makefile
>> --- Makefile 24 Aug 2015 07:45:56 -0000      1.108
>> +++ Makefile 23 Jan 2016 18:38:51 -0000
>> @@ -8,14 +8,17 @@ DPB_PROPERTIES = parallel
>>  
>>  COMMENT =   modular, fast C/C++/ObjC compiler, static analyzer and
>tools
>>  
>> -LLVM_V =    3.5
>> -DISTNAME =  llvm-${LLVM_V}.20140228
>> -REVISION =  35
>> +LLVM_V =    3.7.1
>> +DISTNAME =  llvm-${LLVM_V}.src
>> +PKGNAME =   llvm-${LLVM_V}
>>  CATEGORIES =        devel
>> -MASTER_SITES =      http://comstyle.com/source/
>> +DISTFILES = llvm-${LLVM_V}.src${EXTRACT_SUFX} \
>> +            cfe-${LLVM_V}.src${EXTRACT_SUFX}
>> +MASTER_SITES =      http://www.llvm.org/releases/${LLVM_V}/
>>  EXTRACT_SUFX =      .tar.xz
>>  
>> -SHARED_LIBS =       clang           1.0
>> +SHARED_LIBS =       clang           2.0 \
>> +            LTO             0.0
>>  
>>  # packager notes in http://llvm.org/docs/Packaging.html
>>  HOMEPAGE =  http://www.llvm.org/
>> @@ -25,15 +28,21 @@ MAINTAINER=      Brad Smith <b...@comstyle.co
>>  # BSD
>>  PERMIT_PACKAGE_CDROM =      Yes
>>  
>> -WANTLIB =   c m pthread stdc++ z
>> +WANTLIB =   c m pthread z
>>  
>>  MODULES =   devel/cmake \
>> -            lang/python
>> +            lang/python \
>> +            gcc4
>>  
>> -TEST_DEPENDS =      devel/dejagnu \
>> -            shells/bash
>> +MODGCC4_LANGS = c c++
>> +MODGCC4_ARCHS = *
>> +
>> +TEST_DEPENDS =              devel/dejagnu \
>> +                    shells/bash \
>> +                    lang/gcc/${MODGCC4_VERSION},-c++
>>  BUILD_DEPENDS +=    textproc/py-sphinx
>> -RUN_DEPENDS +=              devel/gtest
>> +RUN_DEPENDS +=              devel/gtest \
>> +                    lang/gcc/${MODGCC4_VERSION},-c++
>>  
>>  SEPARATE_BUILD =    Yes
>>  CONFIGURE_ARGS =    -DLLVM_ENABLE_FFI:Bool=False \
>> @@ -47,22 +56,34 @@ CONFIGURE_ARGS = -DLLVM_ENABLE_FFI:Bool=
>>  # introduced when PIE was enabled
>>  .if ${MACHINE_ARCH} == "powerpc"
>>  CONFIGURE_ARGS +=   -DCMAKE_EXE_LINKER_FLAGS="-Wl,--relax -nopie"
>> +CONFIGURE_ARGS +=   -DCMAKE_SHARED_LINKER_FLAGS="-Wl,--relax -nopie"
>>  .endif
>>  
>>  TEST_TARGET =               check
>>  
>> +# XXX sync
>> +GCC_VER =           4.9.3
>> +.if ${MACHINE_ARCH} == "amd64"
>> +GCC_CONFIG =                x86_64-unknown-openbsd${OSREV}
>> +.else
>> +GCC_CONFIG =                ${MACHINE_ARCH}-unknown-openbsd${OSREV}
>> +.endif
>>  CLANG_INCLUDE_PATH =        lib/clang/${LLVM_V}/include
>> -SUBST_VARS +=               CLANG_INCLUDE_PATH LLVM_V
>> +SUBST_VARS +=               CLANG_INCLUDE_PATH LLVM_V GCC_VER GCC_CONFIG
>> +
>> +post-extract:
>> +    mv ${WRKDIR}/cfe-${LLVM_V}.src ${WRKSRC}/tools/clang
>>  
>>  pre-configure:
>> -    @${SUBST_CMD} ${WRKSRC}/tools/clang/tools/scan-build/scan-build
>> +    @${SUBST_CMD} ${WRKSRC}/tools/clang/tools/scan-build/scan-build \
>> +            ${WRKSRC}/tools/clang/lib/Driver/ToolChains.cpp
>> +    @${SUBST_CMD} ${WRKSRC}/tools/clang/tools/scan-build/scan-build \
>> +            ${WRKSRC}/tools/clang/lib/Driver/Tools.cpp
>>      -@ln -s ${MODPY_BIN} ${WRKDIR}/bin/python
>>  
>>  post-build:
>>      cd ${WRKSRC}/docs && make -f Makefile.sphinx man
>> -    pod2man --release=CVS --center="LLVM" \
>> -        ${WRKSRC}/tools/clang/docs/tools/clang.pod \
>> -        ${WRKSRC}/docs/_build/man/clang.1
>> +    cd ${WRKSRC}/tools/clang/docs && make -f Makefile.sphinx man
>>  
>>  post-install:
>>      ${INSTALL_SCRIPT}
>${WRKSRC}/tools/clang/tools/scan-build/ccc-analyzer \
>> @@ -75,7 +96,10 @@ post-install:
>>          ${PREFIX}/man/man1
>>      ${INSTALL_DATA} ${WRKSRC}/tools/clang/tools/scan-build/scan-build.1
>\
>>          ${PREFIX}/man/man1
>> -    # lit is not installed anymore
>> +    ${INSTALL_DATA} ${WRKSRC}/tools/clang/docs/_build/man/clang.1 \
>> +        ${PREFIX}/man/man1
>> +    # lit and FileCheck are not installed
>>      @rm ${PREFIX}/man/man1/lit.1
>> +    @rm ${PREFIX}/man/man1/FileCheck.1
>>  
>>  .include <bsd.port.mk>
>> Index: distinfo
>> ===================================================================
>> RCS file: /cvs/ports/devel/llvm/distinfo,v
>> retrieving revision 1.13
>> diff -u -p -r1.13 distinfo
>> --- distinfo 18 Apr 2014 09:30:48 -0000      1.13
>> +++ distinfo 23 Jan 2016 18:38:51 -0000
>> @@ -1,2 +1,4 @@
>> -SHA256 (llvm-3.5.20140228.tar.xz) =
>vBFmbVEiY2CQZf7Boqcebh+s+ejpfpoZ8vY5c3cxgXw=
>> -SIZE (llvm-3.5.20140228.tar.xz) = 17945548
>> +SHA256 (cfe-3.7.1.src.tar.xz) =
>VuIWTHwqF3LV7So+V0hf9z/wbJff8S7b7qGsxEErBnQ=
>> +SHA256 (llvm-3.7.1.src.tar.xz) =
>vneU7QzsQtbGgsqONRdTW1RVWj3vq+yDVU28dNtUWtU=
>> +SIZE (cfe-3.7.1.src.tar.xz) = 9110616
>> +SIZE (llvm-3.7.1.src.tar.xz) = 14592544
>> Index: patches/patch-CMakeLists_txt
>> ===================================================================
>> RCS file: patches/patch-CMakeLists_txt
>> diff -N patches/patch-CMakeLists_txt
>> --- patches/patch-CMakeLists_txt     18 Apr 2014 09:30:48 -0000      1.4
>> +++ /dev/null        1 Jan 1970 00:00:00 -0000
>> @@ -1,15 +0,0 @@
>> -$OpenBSD: patch-CMakeLists_txt,v 1.4 2014/04/18 09:30:48 brad Exp $
>> -
>> -Don't confuse scripts who want the version with appended 'svn' goo.
>> -
>> ---- CMakeLists.txt.orig     Sun Mar  2 21:57:43 2014
>> -+++ CMakeLists.txt  Sun Mar  2 22:13:02 2014
>> -@@ -29,7 +29,7 @@ set(LLVM_VERSION_MAJOR 3)
>> - set(LLVM_VERSION_MINOR 5)
>> - 
>> - if (NOT PACKAGE_VERSION)
>> --  set(PACKAGE_VERSION
>"${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}svn")
>> -+  set(PACKAGE_VERSION
>"${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}")
>> - endif()
>> - 
>> - option(LLVM_INSTALL_TOOLCHAIN_ONLY "Only include toolchain files in
>the 'install' target." OFF)
>> Index: patches/patch-Makefile_config_in
>> ===================================================================
>> RCS file: /cvs/ports/devel/llvm/patches/patch-Makefile_config_in,v
>> retrieving revision 1.8
>> diff -u -p -r1.8 patch-Makefile_config_in
>> --- patches/patch-Makefile_config_in 18 Apr 2014 09:30:48 -0000      1.8
>> +++ patches/patch-Makefile_config_in 23 Jan 2016 18:38:51 -0000
>> @@ -1,7 +1,7 @@
>>  $OpenBSD: patch-Makefile_config_in,v 1.8 2014/04/18 09:30:48 brad
>Exp $
>> ---- Makefile.config.in.orig Sun Feb 16 19:19:46 2014
>> -+++ Makefile.config.in      Sun Feb 16 19:28:35 2014
>> -@@ -99,11 +99,11 @@ endif
>> +--- Makefile.config.in.orig Wed Aug 12 19:12:16 2015
>> ++++ Makefile.config.in      Tue Sep  8 21:53:49 2015
>> +@@ -106,11 +106,11 @@ endif
>>   PROJ_bindir     := $(PROJ_prefix)/bin
>>   PROJ_libdir     := $(PROJ_prefix)/lib
>>   PROJ_datadir    := $(PROJ_prefix)/share
>> Index: patches/patch-cmake_modules_AddLLVM_cmake
>> ===================================================================
>> RCS file: patches/patch-cmake_modules_AddLLVM_cmake
>> diff -N patches/patch-cmake_modules_AddLLVM_cmake
>> --- /dev/null        1 Jan 1970 00:00:00 -0000
>> +++ patches/patch-cmake_modules_AddLLVM_cmake        23 Jan 2016 18:38:51
>-0000
>> @@ -0,0 +1,12 @@
>> +$OpenBSD$
>> +--- cmake/modules/AddLLVM.cmake.orig        Fri Sep 11 17:38:23 2015
>> ++++ cmake/modules/AddLLVM.cmake     Fri Sep 11 17:39:48 2015
>> +@@ -178,7 +178,7 @@ function(add_link_opts target_name)
>> +       elseif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
>> +         set_property(TARGET ${target_name} APPEND_STRING PROPERTY
>> +                      LINK_FLAGS " -Wl,-z
>-Wl,discard-unused=sections")
>> +-      elseif(NOT WIN32 AND NOT LLVM_LINKER_IS_GOLD)
>> ++      elseif(NOT WIN32 AND NOT LLVM_LINKER_IS_GOLD AND NOT
>${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
>> +         # Object files are compiled with -ffunction-data-sections.
>> +         # Versions of bfd ld < 2.23.1 have a bug in --gc-sections
>that breaks
>> +         # tools that use plugins. Always pass --gc-sections once we
>require
>> Index: patches/patch-cmake_modules_HandleLLVMOptions_cmake
>> ===================================================================
>> RCS file:
>/cvs/ports/devel/llvm/patches/patch-cmake_modules_HandleLLVMOptions_cmake,v
>> retrieving revision 1.1
>> diff -u -p -r1.1 patch-cmake_modules_HandleLLVMOptions_cmake
>> --- patches/patch-cmake_modules_HandleLLVMOptions_cmake      18 Apr 2014
>09:30:48 -0000 1.1
>> +++ patches/patch-cmake_modules_HandleLLVMOptions_cmake      23 Jan 2016
>18:38:51 -0000
>> @@ -1,49 +1,13 @@
>> -$OpenBSD: patch-cmake_modules_HandleLLVMOptions_cmake,v 1.1
>2014/04/18 09:30:48 brad Exp $
>> ---- cmake/modules/HandleLLVMOptions.cmake.orig      Sat Feb  8 15:05:05
>2014
>> -+++ cmake/modules/HandleLLVMOptions.cmake   Sat Feb  8 15:05:17 2014
>> -@@ -7,45 +7,6 @@ include(AddLLVMDefinitions)
>> - include(CheckCCompilerFlag)
>> - include(CheckCXXCompilerFlag)
>> - 
>> --if(NOT LLVM_FORCE_USE_OLD_TOOLCHAIN)
>> --  if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
>> --    if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7)
>> --      message(FATAL_ERROR "Host GCC version must be at least 4.7!")
>> --    endif()
>> --  elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
>> --    if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.1)
>> --      message(FATAL_ERROR "Host Clang version must be at least
>3.1!")
>> --    endif()
>> --
>> --    # Also test that we aren't using too old of a version of
>libstdc++ with the
>> --    # Clang compiler. This is tricky as there is no real way to
>check the
>> --    # version of libstdc++ directly. Instead we test for a known
>bug in
>> --    # libstdc++4.6 that is fixed in libstdc++4.7.
>> --    if(NOT LLVM_ENABLE_LIBCXX)
>> --      set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
>> --      set(OLD_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
>> --      set(CMAKE_REQUIRED_FLAGS "-std=c++0x")
>> --      if (ANDROID)
>> --        set(CMAKE_REQUIRED_LIBRARIES "atomic")
>> --      endif()
>> --      check_cxx_source_compiles("
>> --#include <atomic>
>> --std::atomic<float> x(0.0f);
>> --int main() { return (float)x; }"
>> --        LLVM_NO_OLD_LIBSTDCXX)
>> --      if(NOT LLVM_NO_OLD_LIBSTDCXX)
>> --        message(FATAL_ERROR "Host Clang must be able to find
>libstdc++4.7 or newer!")
>> --      endif()
>> --      set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
>> --      set(CMAKE_REQUIRED_LIBRARIES ${OLD_CMAKE_REQUIRED_LIBRARIES})
>> --    endif()
>> --  elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
>> --    if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 17.0)
>> --      message(FATAL_ERROR "Host Visual Studio must be at least 2012
>(MSVC 17.0)")
>> --    endif()
>> --  endif()
>> --endif()
>> --
>> - if( LLVM_ENABLE_ASSERTIONS )
>> -   # MSVC doesn't like _DEBUG on release builds. See PR 4379.
>> -   if( NOT MSVC )
>> +$OpenBSD$
>> +--- cmake/modules/HandleLLVMOptions.cmake.orig      Wed Sep  9 14:34:05
>2015
>> ++++ cmake/modules/HandleLLVMOptions.cmake   Wed Sep  9 14:34:55 2015
>> +@@ -132,7 +132,8 @@ endif()
>> + # Pass -Wl,-z,defs. This makes sure all symbols are defined.
>Otherwise a DSO
>> + # build might work on ELF but fail on MachO/COFF.
>> + if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" OR WIN32 OR CYGWIN OR
>> +-        ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") AND
>> ++        ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" OR
>> ++   ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") AND
>> +    NOT LLVM_USE_SANITIZER)
>> +   set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}
>-Wl,-z,defs")
>> + endif()
>> Index: patches/patch-include_llvm_CodeGen_SelectionDAGISel_h
>> ===================================================================
>> RCS file: patches/patch-include_llvm_CodeGen_SelectionDAGISel_h
>> diff -N patches/patch-include_llvm_CodeGen_SelectionDAGISel_h
>> --- patches/patch-include_llvm_CodeGen_SelectionDAGISel_h    24 Aug 2015
>07:45:56 -0000 1.1
>> +++ /dev/null        1 Jan 1970 00:00:00 -0000
>> @@ -1,59 +0,0 @@
>> -$OpenBSD: patch-include_llvm_CodeGen_SelectionDAGISel_h,v 1.1
>2015/08/24 07:45:56 ajacoutot Exp $
>> -
>> -r219009
>> -[ISel] Keep matching state consistent when folding during X86
>address match
>> -
>> -In the X86 backend, matching an address is initiated by the 'addr'
>complex
>> -pattern and its friends.  During this process we may reassociate
>and-of-shift
>> -into shift-of-and (FoldMaskedShiftToScaledMask) to allow folding of
>the
>> -shift into the scale of the address.
>> -
>> -However as demonstrated by the testcase, this can trigger CSE of not
>only the
>> -shift and the AND which the code is prepared for but also the
>underlying load
>> -node.  In the testcase this node is sitting in the RecordedNode and
>MatchScope
>> -data structures of the matcher and becomes a deleted node upon CSE. 
>Returning
>> -from the complex pattern function, we try to access it again hitting
>an assert
>> -because the node is no longer a load even though this was checked
>before.
>> -
>> -Now obviously changing the DAG this late is bending the rules but I
>think it
>> -makes sense somewhat.  Outside of addresses we prefer and-of-shift
>because it
>> -may lead to smaller immediates (FoldMaskAndShiftToScale is an even
>better
>> -example because it create a non-canonical node).  We currently don't
>recognize
>> -addresses during DAGCombiner where arguably this canonicalization
>should be
>> -performed.  On the other hand, having this in the matcher allows us
>to cover
>> -all the cases where an address can be used in an instruction.
>> -
>> -I've also talked a little bit to Dan Gohman on llvm-dev who added
>the RAUW for
>> -the new shift node in FoldMaskedShiftToScaledMask.  This RAUW is
>responsible
>> -for initiating the recursive CSE on users
>>
>-(http://lists.cs.uiuc.edu/pipermail/llvmdev/2014-September/076903.html)
>but it
>> -is not strictly necessary since the shift is hooked into the visited
>user.  Of
>> -course it's safer to keep the DAG consistent at all times (e.g. for
>accurate
>> -number of uses, etc.).
>> -
>> -So rather than changing the fundamentals, I've decided to continue
>along the
>> -previous patches and detect the CSE.  This patch installs a very
>targeted
>> -DAGUpdateListener for the duration of a complex-pattern match and
>updates the
>> -matching state accordingly.  (Previous patches used HandleSDNode to
>detect the
>> -CSE but that's not practical here).  The listener is only installed
>on X86.
>> -
>> -I tested that there is no measurable overhead due to this while
>running
>> -through the spec2k BC files with llc.  The only thing we pay for is
>the
>> -creation of the listener.  The callback never ever triggers in
>spec2k since
>> -this is a corner case.
>> -
>> ---- include/llvm/CodeGen/SelectionDAGISel.h.orig    Tue Aug  4 22:44:44
>2015
>> -+++ include/llvm/CodeGen/SelectionDAGISel.h Tue Aug  4 22:46:22 2015
>> -@@ -238,6 +238,12 @@ class SelectionDAGISel : public
>MachineFunctionPass { 
>> -                            const unsigned char *MatcherTable,
>> -                            unsigned TableSize);
>> - 
>> -+  /// \brief Return true if complex patterns for this target can
>mutate the
>> -+  /// DAG.
>> -+  virtual bool ComplexPatternFuncMutatesDAG() const {
>> -+    return false;
>> -+  }
>> -+
>> - private:
>> - 
>> -   // Calls to these functions are generated by tblgen.
>> Index: patches/patch-include_llvm_CodeGen_SelectionDAG_h
>> ===================================================================
>> RCS file: patches/patch-include_llvm_CodeGen_SelectionDAG_h
>> diff -N patches/patch-include_llvm_CodeGen_SelectionDAG_h
>> --- patches/patch-include_llvm_CodeGen_SelectionDAG_h        15 Nov 2014
>03:26:40 -0000 1.1
>> +++ /dev/null        1 Jan 1970 00:00:00 -0000
>> @@ -1,30 +0,0 @@
>> -$OpenBSD: patch-include_llvm_CodeGen_SelectionDAG_h,v 1.1 2014/11/15
>03:26:40 brad Exp $
>> -
>> -r221709  
>> -Totally forget deallocated SDNodes in SDDbgInfo.
>> -
>> -What would happen before that commit is that the SDDbgValues
>associated with
>> -a deallocated SDNode would be marked Invalidated, but SDDbgInfo
>would keep
>> -a map entry keyed by the SDNode pointer pointing to this list of
>invalidated
>> -SDDbgNodes. As the memory gets reused, the list might get wrongly
>associated
>> -with another new SDNode. As the SDDbgValues are cloned when they are
>transfered,
>> -this can lead to an exponential number of SDDbgValues being produced
>during
>> -DAGCombine like in http://llvm.org/bugs/show_bug.cgi?id=20893
>> -
>> -Note that the previous behavior wasn't really buggy as the
>invalidation made
>> -sure that the SDDbgValues won't be used. This commit can be
>considered a
>> -memory optimization and as such is really hard to validate in a
>unit-test.
>> -
>> ---- include/llvm/CodeGen/SelectionDAG.h.orig        Fri Nov 14 21:08:36
>2014
>> -+++ include/llvm/CodeGen/SelectionDAG.h     Fri Nov 14 21:09:49 2014
>> -@@ -126,6 +126,10 @@ class SDDbgInfo { (public)
>> -       DbgValMap[Node].push_back(V);
>> -   }
>> - 
>> -+  /// \brief Invalidate all DbgValues attached to the node and
>remove
>> -+  /// it from the Node-to-DbgValues map.
>> -+  void erase(const SDNode *Node);
>> -+
>> -   void clear() {
>> -     DbgValMap.clear();
>> -     DbgValues.clear();
>> Index: patches/patch-include_llvm_Config_config_h_cmake
>> ===================================================================
>> RCS file: patches/patch-include_llvm_Config_config_h_cmake
>> diff -N patches/patch-include_llvm_Config_config_h_cmake
>> --- patches/patch-include_llvm_Config_config_h_cmake 26 Jul 2014
>09:27:29 -0000 1.1
>> +++ /dev/null        1 Jan 1970 00:00:00 -0000
>> @@ -1,16 +0,0 @@
>> -$OpenBSD: patch-include_llvm_Config_config_h_cmake,v 1.1 2014/07/26
>09:27:29 pascal Exp $
>> -
>> -r213966
>> -Fix arc4random detection.
>> -
>> ---- include/llvm/Config/config.h.cmake.orig Wed Jul  9 15:45:23 2014
>> -+++ include/llvm/Config/config.h.cmake      Wed Jul  9 15:59:51 2014
>> -@@ -34,7 +34,7 @@
>> - #undef GCC_INSTALL_PREFIX
>> - 
>> - /* Define to 1 if you have the `arc4random' function. */
>> --#cmakedefine HAVE_ARC4RANDOM
>> -+#cmakedefine HAVE_DECL_ARC4RANDOM ${HAVE_DECL_ARC4RANDOM}
>> - 
>> - /* Define to 1 if you have the `backtrace' function. */
>> - #cmakedefine HAVE_BACKTRACE ${HAVE_BACKTRACE}
>> Index: patches/patch-include_llvm_Support_ELF_h
>> ===================================================================
>> RCS file: patches/patch-include_llvm_Support_ELF_h
>> diff -N patches/patch-include_llvm_Support_ELF_h
>> --- patches/patch-include_llvm_Support_ELF_h 11 Sep 2014 17:54:13
>-0000  1.1
>> +++ /dev/null        1 Jan 1970 00:00:00 -0000
>> @@ -1,19 +0,0 @@
>> -$OpenBSD: patch-include_llvm_Support_ELF_h,v 1.1 2014/09/11 17:54:13
>brad Exp $
>> -
>> -r213427
>> -[PowerPC] 32-bit ELF PIC support
>> -
>> -This adds initial support for PPC32 ELF PIC (Position Independent
>Code; the
>> --fPIC variety), thus rectifying a long-standing deficiency in the
>PowerPC
>> -backend.
>> -
>> ---- include/llvm/Support/ELF.h.orig Sun Jul 27 00:01:21 2014
>> -+++ include/llvm/Support/ELF.h      Sun Jul 27 00:02:18 2014
>> -@@ -437,6 +437,7 @@ enum {
>> -   R_PPC_GOT16_LO              = 15,
>> -   R_PPC_GOT16_HI              = 16,
>> -   R_PPC_GOT16_HA              = 17,
>> -+  R_PPC_PLTREL24              = 18,
>> -   R_PPC_REL32                 = 26,
>> -   R_PPC_TLS                   = 67,
>> -   R_PPC_DTPMOD32              = 68,
>> Index: patches/patch-include_llvm_Target_TargetInstrInfo_h
>> ===================================================================
>> RCS file: patches/patch-include_llvm_Target_TargetInstrInfo_h
>> diff -N patches/patch-include_llvm_Target_TargetInstrInfo_h
>> --- patches/patch-include_llvm_Target_TargetInstrInfo_h      18 Sep 2014
>20:19:27 -0000 1.1
>> +++ /dev/null        1 Jan 1970 00:00:00 -0000
>> @@ -1,32 +0,0 @@
>> -$OpenBSD: patch-include_llvm_Target_TargetInstrInfo_h,v 1.1
>2014/09/18 20:19:27 brad Exp $
>> -
>> -r217801
>> -Fix a lot of confusion around inserting nops on empty functions.
>> -
>> -On MachO, and MachO only, we cannot have a truly empty function
>since that
>> -breaks the linker logic for atomizing the section.
>> -
>> -When we are emitting a frame pointer, the presence of an unreachable
>will
>> -create a cfi instruction pointing past the last instruction. This is
>perfectly
>> -fine. The FDE information encodes the pc range it applies to. If
>some tool
>> -cannot handle this, we should explicitly say which bug we are
>working around
>> -and only work around it when it is actually relevant (not for ELF
>for example).
>> -
>> -Given the unreachable we could omit the .cfi_def_cfa_register, but
>then
>> -again, we could also omit the entire function prologue if we wanted
>to.
>> -
>> ---- include/llvm/Target/TargetInstrInfo.h.orig      Mon Sep 15 16:00:35
>2014
>> -+++ include/llvm/Target/TargetInstrInfo.h   Mon Sep 15 16:01:15 2014
>> -@@ -661,10 +661,8 @@ class TargetInstrInfo : public MCInstrInfo {
>(public)
>> -                           MachineBasicBlock::iterator MI) const;
>> - 
>> - 
>> --  /// getNoopForMachoTarget - Return the noop instruction to use
>for a noop.
>> --  virtual void getNoopForMachoTarget(MCInst &NopInst) const {
>> --    // Default to just using 'nop' string.
>> --  }
>> -+  /// Return the noop instruction to use for a noop.
>> -+  virtual void getNoopForMachoTarget(MCInst &NopInst) const;
>> - 
>> - 
>> -   /// isPredicated - Returns true if the instruction is already
>predicated.
>> Index: patches/patch-lib_Analysis_IVUsers_cpp
>> ===================================================================
>> RCS file: patches/patch-lib_Analysis_IVUsers_cpp
>> diff -N patches/patch-lib_Analysis_IVUsers_cpp
>> --- patches/patch-lib_Analysis_IVUsers_cpp   10 Jul 2014 22:46:37
>-0000  1.1
>> +++ /dev/null        1 Jan 1970 00:00:00 -0000
>> @@ -1,45 +0,0 @@
>> -$OpenBSD: patch-lib_Analysis_IVUsers_cpp,v 1.1 2014/07/10 22:46:37
>brad Exp $
>> -
>> -r203719
>> -PR17473: Don't normalize an expression during postinc transformation
>unless it's
>> -invertible.
>> -
>> ---- lib/Analysis/IVUsers.cpp.orig   Sun Mar  2 21:57:38 2014
>> -+++ lib/Analysis/IVUsers.cpp        Sat Jun 14 03:56:54 2014
>> -@@ -186,15 +186,34 @@ bool IVUsers::AddUsersImpl(Instruction *I,
>> - 
>> -     if (AddUserToIVUsers) {
>> -       // Okay, we found a user that we cannot reduce.
>> --      IVUses.push_back(new IVStrideUse(this, User, I));
>> --      IVStrideUse &NewUse = IVUses.back();
>> -+      IVStrideUse &NewUse = AddUser(User, I);
>> -       // Autodetect the post-inc loop set, populating
>NewUse.PostIncLoops.
>> -       // The regular return value here is discarded; instead of
>recording
>> -       // it, we just recompute it when we need it.
>> -+      const SCEV *OriginalISE = ISE;
>> -       ISE = TransformForPostIncUse(NormalizeAutodetect,
>> -                                    ISE, User, I,
>> -                                    NewUse.PostIncLoops,
>> -                                    *SE, *DT);
>> -+
>> -+      // PostIncNormalization effectively simplifies the expression
>under
>> -+      // pre-increment assumptions. Those assumptions (no wrapping)
>might not
>> -+      // hold for the post-inc value. Catch such cases by making
>sure the
>> -+      // transformation is invertible.
>> -+      if (OriginalISE != ISE) {
>> -+        const SCEV *DenormalizedISE =
>> -+          TransformForPostIncUse(Denormalize, ISE, User, I,
>> -+              NewUse.PostIncLoops, *SE, *DT);
>> -+
>> -+        // If we normalized the expression, but denormalization
>doesn't give the
>> -+        // original one, discard this user.
>> -+        if (OriginalISE != DenormalizedISE) {
>> -+          DEBUG(dbgs() << "   DISCARDING (NORMALIZATION ISN'T
>INVERTIBLE): "
>> -+                       << *ISE << '\n');
>> -+          IVUses.pop_back();
>> -+          return false;
>> -+        }
>> -+      }
>> -       DEBUG(if (SE->getSCEV(I) != ISE)
>> -               dbgs() << "   NORMALIZED TO: " << *ISE << '\n');
>> -     }
>> Index: patches/patch-lib_CodeGen_AsmPrinter_AsmPrinter_cpp
>> ===================================================================
>> RCS file: patches/patch-lib_CodeGen_AsmPrinter_AsmPrinter_cpp
>> diff -N patches/patch-lib_CodeGen_AsmPrinter_AsmPrinter_cpp
>> --- patches/patch-lib_CodeGen_AsmPrinter_AsmPrinter_cpp      18 Sep 2014
>20:19:27 -0000 1.1
>> +++ /dev/null        1 Jan 1970 00:00:00 -0000
>> @@ -1,68 +0,0 @@
>> -$OpenBSD: patch-lib_CodeGen_AsmPrinter_AsmPrinter_cpp,v 1.1
>2014/09/18 20:19:27 brad Exp $
>> -
>> -r217801
>> -Fix a lot of confusion around inserting nops on empty functions.
>> -
>> -On MachO, and MachO only, we cannot have a truly empty function
>since that
>> -breaks the linker logic for atomizing the section.
>> -
>> -When we are emitting a frame pointer, the presence of an unreachable
>will
>> -create a cfi instruction pointing past the last instruction. This is
>perfectly
>> -fine. The FDE information encodes the pc range it applies to. If
>some tool
>> -cannot handle this, we should explicitly say which bug we are
>working around
>> -and only work around it when it is actually relevant (not for ELF
>for example).
>> -
>> -Given the unreachable we could omit the .cfi_def_cfa_register, but
>then
>> -again, we could also omit the entire function prologue if we wanted
>to.
>> -
>> -r217899
>> -Add back a fallback case for targets that do not or cannot implement
>getNoopForMachoTarget().
>> -
>> ---- lib/CodeGen/AsmPrinter/AsmPrinter.cpp.orig      Sun Mar  2 21:57:42
>2014
>> -+++ lib/CodeGen/AsmPrinter/AsmPrinter.cpp   Tue Sep 16 22:33:35 2014
>> -@@ -739,14 +739,12 @@ void AsmPrinter::EmitFunctionBody() {
>> - 
>> -   // Print out code for the function.
>> -   bool HasAnyRealCode = false;
>> --  const MachineInstr *LastMI = 0;
>> -   for (MachineFunction::const_iterator I = MF->begin(), E =
>MF->end();
>> -        I != E; ++I) {
>> -     // Print a label for the basic block.
>> -     EmitBasicBlockStart(I);
>> -     for (MachineBasicBlock::const_iterator II = I->begin(), IE =
>I->end();
>> -          II != IE; ++II) {
>> --      LastMI = II;
>> - 
>> -       // Print the assembly for the instruction.
>> -       if (!II->isLabel() && !II->isImplicitDef() && !II->isKill()
>&&
>> -@@ -807,24 +805,18 @@ void AsmPrinter::EmitFunctionBody() {
>> -     }
>> -   }
>> - 
>> --  // If the last instruction was a prolog label, then we have a
>situation where
>> --  // we emitted a prolog but no function body. This results in the
>ending prolog
>> --  // label equaling the end of function label and an invalid "row"
>in the
>> --  // FDE. We need to emit a noop in this situation so that the
>FDE's rows are
>> --  // valid.
>> --  bool RequiresNoop = LastMI && LastMI->isPrologLabel();
>> --
>> -   // If the function is empty and the object file uses
>.subsections_via_symbols,
>> -   // then we need to emit *something* to the function body to
>prevent the
>> -   // labels from collapsing together.  Just emit a noop.
>> --  if ((MAI->hasSubsectionsViaSymbols() && !HasAnyRealCode) ||
>RequiresNoop) {
>> -+  if ((MAI->hasSubsectionsViaSymbols() && !HasAnyRealCode)) {
>> -     MCInst Noop;
>> -     TM.getInstrInfo()->getNoopForMachoTarget(Noop);
>> --    if (Noop.getOpcode()) {
>> --      OutStreamer.AddComment("avoids zero-length function");
>> -+    OutStreamer.AddComment("avoids zero-length function");
>> -+
>> -+    // Targets can opt-out of emitting the noop here by leaving the
>opcode
>> -+    // unspecified.
>> -+    if (Noop.getOpcode())
>> -       OutStreamer.EmitInstruction(Noop, getSubtargetInfo());
>> --    } else  // Target not mc-ized yet.
>> --      OutStreamer.EmitRawText(StringRef("\tnop\n"));
>> -   }
>> - 
>> -   const Function *F = MF->getFunction();
>> Index: patches/patch-lib_CodeGen_SelectionDAG_LegalizeTypes_h
>> ===================================================================
>> RCS file: patches/patch-lib_CodeGen_SelectionDAG_LegalizeTypes_h
>> diff -N patches/patch-lib_CodeGen_SelectionDAG_LegalizeTypes_h
>> --- patches/patch-lib_CodeGen_SelectionDAG_LegalizeTypes_h   14 Aug
>2014 01:08:09 -0000    1.1
>> +++ /dev/null        1 Jan 1970 00:00:00 -0000
>> @@ -1,21 +0,0 @@
>> -$OpenBSD: patch-lib_CodeGen_SelectionDAG_LegalizeTypes_h,v 1.1
>2014/08/14 01:08:09 brad Exp $
>> -
>> -r211435
>> -Legalizer: Add support for splitting insert_subvectors.
>> -
>> -We handle this by spilling the whole thing to the stack and doing
>the
>> -insertion as a store.
>> -
>> -PR19492. This happens in real code because the vectorizer creates
>v2i128 when AVX is
>> -enabled.
>> -
>> ---- lib/CodeGen/SelectionDAG/LegalizeTypes.h.orig   Thu Jul 17
>01:03:52 2014
>> -+++ lib/CodeGen/SelectionDAG/LegalizeTypes.h        Thu Jul 17 01:04:56
>2014
>> -@@ -570,6 +570,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
>(priv
>> -   void SplitVecRes_BUILD_VECTOR(SDNode *N, SDValue &Lo, SDValue
>&Hi);
>> -   void SplitVecRes_CONCAT_VECTORS(SDNode *N, SDValue &Lo, SDValue
>&Hi);
>> -   void SplitVecRes_EXTRACT_SUBVECTOR(SDNode *N, SDValue &Lo,
>SDValue &Hi);
>> -+  void SplitVecRes_INSERT_SUBVECTOR(SDNode *N, SDValue &Lo, SDValue
>&Hi);
>> -   void SplitVecRes_FPOWI(SDNode *N, SDValue &Lo, SDValue &Hi);
>> -   void SplitVecRes_INSERT_VECTOR_ELT(SDNode *N, SDValue &Lo,
>SDValue &Hi);
>> -   void SplitVecRes_LOAD(LoadSDNode *N, SDValue &Lo, SDValue &Hi);
>> Index: patches/patch-lib_CodeGen_SelectionDAG_LegalizeVectorTypes_cpp
>> ===================================================================
>> RCS file:
>patches/patch-lib_CodeGen_SelectionDAG_LegalizeVectorTypes_cpp
>> diff -N
>patches/patch-lib_CodeGen_SelectionDAG_LegalizeVectorTypes_cpp
>> --- patches/patch-lib_CodeGen_SelectionDAG_LegalizeVectorTypes_cpp   14
>Aug 2014 01:08:09 -0000        1.2
>> +++ /dev/null        1 Jan 1970 00:00:00 -0000
>> @@ -1,92 +0,0 @@
>> -$OpenBSD: patch-lib_CodeGen_SelectionDAG_LegalizeVectorTypes_cpp,v
>1.2 2014/08/14 01:08:09 brad Exp $
>> -
>> -r211435
>> -Legalizer: Add support for splitting insert_subvectors.
>> -
>> -We handle this by spilling the whole thing to the stack and doing
>the
>> -insertion as a store.
>> -
>> -PR19492. This happens in real code because the vectorizer creates
>v2i128 when AVX is
>> -enabled.
>> -
>> -r203311
>> -ISel: Make VSELECT selection terminate in cases where the condition
>type has to
>> -be split and the result type widened.
>> -
>> -When the condition of a vselect has to be split it makes no sense
>widening the
>> -vselect and thereby widening the condition. We end up in an endless
>loop of
>> -widening (vselect result type) and splitting (condition mask type)
>doing this.
>> -Instead, split both the condition and the vselect and widen the
>result.
>> -
>> ---- lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp.orig   Sun Mar  2
>21:57:42 2014
>> -+++ lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp        Thu Jul 17
>01:10:16 2014
>> -@@ -518,6 +518,7 @@ void DAGTypeLegalizer::SplitVectorResult(SDNode
>*N, un
>> -   case ISD::BUILD_VECTOR:      SplitVecRes_BUILD_VECTOR(N, Lo, Hi);
>break;
>> -   case ISD::CONCAT_VECTORS:    SplitVecRes_CONCAT_VECTORS(N, Lo,
>Hi); break;
>> -   case ISD::EXTRACT_SUBVECTOR: SplitVecRes_EXTRACT_SUBVECTOR(N, Lo,
>Hi); break;
>> -+  case ISD::INSERT_SUBVECTOR:  SplitVecRes_INSERT_SUBVECTOR(N, Lo,
>Hi); break;
>> -   case ISD::FP_ROUND_INREG:    SplitVecRes_InregOp(N, Lo, Hi);
>break;
>> -   case ISD::FPOWI:             SplitVecRes_FPOWI(N, Lo, Hi); break;
>> -   case ISD::INSERT_VECTOR_ELT: SplitVecRes_INSERT_VECTOR_ELT(N, Lo,
>Hi); break;
>> -@@ -737,6 +738,43 @@ void
>DAGTypeLegalizer::SplitVecRes_EXTRACT_SUBVECTOR(S
>> -                                    TLI.getVectorIdxTy()));
>> - }
>> - 
>> -+void DAGTypeLegalizer::SplitVecRes_INSERT_SUBVECTOR(SDNode *N,
>SDValue &Lo,
>> -+                                                    SDValue &Hi) {
>> -+  SDValue Vec = N->getOperand(0);
>> -+  SDValue SubVec = N->getOperand(1);
>> -+  SDValue Idx = N->getOperand(2);
>> -+  SDLoc dl(N);
>> -+  GetSplitVector(Vec, Lo, Hi);
>> -+
>> -+  // Spill the vector to the stack.
>> -+  EVT VecVT = Vec.getValueType();
>> -+  EVT SubVecVT = VecVT.getVectorElementType();
>> -+  SDValue StackPtr = DAG.CreateStackTemporary(VecVT);
>> -+  SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, Vec,
>StackPtr,
>> -+                               MachinePointerInfo(), false, false,
>0);
>> -+
>> -+  // Store the new subvector into the specified index.
>> -+  SDValue SubVecPtr = GetVectorElementPointer(StackPtr, SubVecVT,
>Idx);
>> -+  Type *VecType = VecVT.getTypeForEVT(*DAG.getContext());
>> -+  unsigned Alignment =
>TLI.getDataLayout()->getPrefTypeAlignment(VecType);
>> -+  Store = DAG.getStore(Store, dl, SubVec, SubVecPtr,
>MachinePointerInfo(),
>> -+                       false, false, 0);
>> -+
>> -+  // Load the Lo part from the stack slot.
>> -+  Lo = DAG.getLoad(Lo.getValueType(), dl, Store, StackPtr,
>MachinePointerInfo(),
>> -+                   false, false, false, 0);
>> -+
>> -+  // Increment the pointer to the other part.
>> -+  unsigned IncrementSize = Lo.getValueType().getSizeInBits() / 8;
>> -+  StackPtr =
>> -+      DAG.getNode(ISD::ADD, dl, StackPtr.getValueType(), StackPtr,
>> -+                  DAG.getConstant(IncrementSize,
>StackPtr.getValueType

-- 
Sent from a phone, please excuse the formatting.

Reply via email to