Browse Source

Merge branch 'master' of https://github.com/llvm-mirror/llvm

HOLZSCHUCH Nicolas 5 years ago
parent
commit
195e132a08
100 changed files with 1767 additions and 936 deletions
  1. 1 1
      .clang-tidy
  2. 10 3
      .gitattributes
  3. 8 0
      .gitignore
  4. 252 175
      CMakeLists.txt
  5. 14 6
      CODE_OWNERS.TXT
  6. 59 7
      CREDITS.TXT
  7. 237 26
      LICENSE.TXT
  8. 3 4
      LLVMBuild.txt
  9. 2 2
      README.txt
  10. 4 9
      RELEASE_TESTERS.TXT
  11. 4 0
      benchmarks/CMakeLists.txt
  12. 13 0
      benchmarks/DummyYAML.cpp
  13. 3 4
      bindings/LLVMBuild.txt
  14. 1 1
      bindings/go/README.txt
  15. 0 30
      bindings/go/llvm/DIBuilderBindings.cpp
  16. 0 40
      bindings/go/llvm/DIBuilderBindings.h
  17. 5 19
      bindings/go/llvm/IRBindings.cpp
  18. 6 10
      bindings/go/llvm/IRBindings.h
  19. 10 8
      bindings/go/llvm/InstrumentationBindings.cpp
  20. 4 5
      bindings/go/llvm/InstrumentationBindings.h
  21. 3 4
      bindings/go/llvm/SupportBindings.cpp
  22. 3 4
      bindings/go/llvm/SupportBindings.h
  23. 3 4
      bindings/go/llvm/analysis.go
  24. 3 4
      bindings/go/llvm/bitreader.go
  25. 3 4
      bindings/go/llvm/bitwriter.go
  26. 146 36
      bindings/go/llvm/dibuilder.go
  27. 3 4
      bindings/go/llvm/executionengine.go
  28. 3 4
      bindings/go/llvm/executionengine_test.go
  29. 157 67
      bindings/go/llvm/ir.go
  30. 5 7
      bindings/go/llvm/ir_test.go
  31. 3 4
      bindings/go/llvm/linker.go
  32. 1 1
      bindings/go/llvm/llvm_config.go.in
  33. 3 4
      bindings/go/llvm/llvm_dep.go
  34. 3 4
      bindings/go/llvm/string.go
  35. 3 4
      bindings/go/llvm/string_test.go
  36. 3 4
      bindings/go/llvm/support.go
  37. 4 4
      bindings/go/llvm/target.go
  38. 23 0
      bindings/go/llvm/transforms_coroutines.go
  39. 5 6
      bindings/go/llvm/transforms_instrumentation.go
  40. 3 4
      bindings/go/llvm/transforms_ipo.go
  41. 3 4
      bindings/go/llvm/transforms_pmbuilder.go
  42. 3 4
      bindings/go/llvm/transforms_scalar.go
  43. 3 4
      bindings/go/llvm/version.go
  44. 4 4
      bindings/ocaml/all_backends/all_backends_ocaml.c
  45. 3 4
      bindings/ocaml/all_backends/llvm_all_backends.ml
  46. 3 4
      bindings/ocaml/all_backends/llvm_all_backends.mli
  47. 4 4
      bindings/ocaml/analysis/analysis_ocaml.c
  48. 3 4
      bindings/ocaml/analysis/llvm_analysis.ml
  49. 3 4
      bindings/ocaml/analysis/llvm_analysis.mli
  50. 4 4
      bindings/ocaml/backends/backend_ocaml.c
  51. 3 4
      bindings/ocaml/backends/llvm_backend.ml.in
  52. 3 4
      bindings/ocaml/backends/llvm_backend.mli.in
  53. 4 4
      bindings/ocaml/bitreader/bitreader_ocaml.c
  54. 3 4
      bindings/ocaml/bitreader/llvm_bitreader.ml
  55. 3 4
      bindings/ocaml/bitreader/llvm_bitreader.mli
  56. 4 4
      bindings/ocaml/bitwriter/bitwriter_ocaml.c
  57. 3 4
      bindings/ocaml/bitwriter/llvm_bitwriter.ml
  58. 3 4
      bindings/ocaml/bitwriter/llvm_bitwriter.mli
  59. 4 4
      bindings/ocaml/executionengine/executionengine_ocaml.c
  60. 3 4
      bindings/ocaml/executionengine/llvm_executionengine.ml
  61. 3 4
      bindings/ocaml/executionengine/llvm_executionengine.mli
  62. 4 4
      bindings/ocaml/irreader/irreader_ocaml.c
  63. 3 4
      bindings/ocaml/irreader/llvm_irreader.ml
  64. 3 4
      bindings/ocaml/irreader/llvm_irreader.mli
  65. 4 4
      bindings/ocaml/linker/linker_ocaml.c
  66. 3 4
      bindings/ocaml/linker/llvm_linker.ml
  67. 3 4
      bindings/ocaml/linker/llvm_linker.mli
  68. 20 5
      bindings/ocaml/llvm/llvm.ml
  69. 43 8
      bindings/ocaml/llvm/llvm.mli
  70. 39 9
      bindings/ocaml/llvm/llvm_ocaml.c
  71. 3 4
      bindings/ocaml/target/llvm_target.ml
  72. 3 4
      bindings/ocaml/target/llvm_target.mli
  73. 4 4
      bindings/ocaml/target/target_ocaml.c
  74. 10 4
      bindings/ocaml/transforms/ipo/ipo_ocaml.c
  75. 6 4
      bindings/ocaml/transforms/ipo/llvm_ipo.ml
  76. 8 4
      bindings/ocaml/transforms/ipo/llvm_ipo.mli
  77. 3 4
      bindings/ocaml/transforms/passmgr_builder/llvm_passmgr_builder.ml
  78. 3 4
      bindings/ocaml/transforms/passmgr_builder/llvm_passmgr_builder.mli
  79. 4 4
      bindings/ocaml/transforms/passmgr_builder/passmgr_builder_ocaml.c
  80. 15 4
      bindings/ocaml/transforms/scalar_opts/llvm_scalar_opts.ml
  81. 23 4
      bindings/ocaml/transforms/scalar_opts/llvm_scalar_opts.mli
  82. 28 4
      bindings/ocaml/transforms/scalar_opts/scalar_opts_ocaml.c
  83. 3 4
      bindings/ocaml/transforms/utils/llvm_transform_utils.ml
  84. 3 4
      bindings/ocaml/transforms/utils/llvm_transform_utils.mli
  85. 5 5
      bindings/ocaml/transforms/utils/transform_utils_ocaml.c
  86. 3 7
      bindings/ocaml/transforms/vectorize/llvm_vectorize.ml
  87. 3 9
      bindings/ocaml/transforms/vectorize/llvm_vectorize.mli
  88. 4 10
      bindings/ocaml/transforms/vectorize/vectorize_ocaml.c
  89. 3 4
      bindings/python/llvm/common.py
  90. 21 10
      bindings/python/llvm/core.py
  91. 3 4
      bindings/python/llvm/disassembler.py
  92. 3 4
      bindings/python/llvm/enumerations.py
  93. 3 4
      bindings/python/llvm/object.py
  94. 5 0
      bindings/python/llvm/tests/base.py
  95. 4 2
      bindings/python/llvm/tests/test_bitreader.py
  96. 3 1
      bindings/python/llvm/tests/test_core.py
  97. 4 2
      bindings/python/llvm/tests/test_disassembler.py
  98. 9 7
      bindings/python/llvm/tests/test_object.py
  99. 62 10
      cmake/config-ix.cmake
  100. 309 148
      cmake/modules/AddLLVM.cmake

+ 1 - 1
.clang-tidy

@@ -1,4 +1,4 @@
-Checks: '-*,clang-diagnostic-*,llvm-*,misc-*,-misc-unused-parameters,readability-identifier-naming'
+Checks: '-*,clang-diagnostic-*,llvm-*,misc-*,-misc-unused-parameters,-misc-non-private-member-variables-in-classes,readability-identifier-naming'
 CheckOptions:
 CheckOptions:
   - key:             readability-identifier-naming.ClassCase
   - key:             readability-identifier-naming.ClassCase
     value:           CamelCase
     value:           CamelCase

+ 10 - 3
.gitattributes

@@ -1,6 +1,11 @@
 # binary files
 # binary files
 test/Object/Inputs/*.a-* binary
 test/Object/Inputs/*.a-* binary
-test/tools/dsymutil/Inputs/* binary
+test/tools/dsymutil/Inputs/*.o binary
+test/tools/dsymutil/Inputs/*.a binary
+test/tools/dsymutil/Inputs/*.i386 binary
+test/tools/dsymutil/Inputs/*.x86_64 binary
+test/tools/dsymutil/Inputs/*.armv7m binary
+test/tools/dsymutil/Inputs/*.dylib binary
 test/tools/llvm-ar/Inputs/*.lib binary
 test/tools/llvm-ar/Inputs/*.lib binary
 test/tools/llvm-objdump/Inputs/*.a binary
 test/tools/llvm-objdump/Inputs/*.a binary
 test/tools/llvm-rc/Inputs/* binary
 test/tools/llvm-rc/Inputs/* binary
@@ -8,5 +13,7 @@ test/tools/llvm-strings/Inputs/numbers binary
 test/MC/AsmParser/incbin_abcd binary
 test/MC/AsmParser/incbin_abcd binary
 test/YAMLParser/spec-09-02.test binary
 test/YAMLParser/spec-09-02.test binary
 
 
-# Windows line ending test
-test/MC/AsmParser/preserve-comments-crlf.s text eol=crlf
+# This file must have CRLF line endings, therefore git should treat it as
+# binary and not autoconvert line endings (for example, when core.autocrlf is
+# on).
+test/MC/AsmParser/preserve-comments-crlf.s binary

+ 8 - 0
.gitignore

@@ -41,6 +41,12 @@ cscope.out
 autoconf/aclocal.m4
 autoconf/aclocal.m4
 autoconf/autom4te.cache
 autoconf/autom4te.cache
 /compile_commands.json
 /compile_commands.json
+# Visual Studio built-in CMake configuration
+/CMakeSettings.json
+# CLion project configuration
+/.idea
+# Qt Creator project configuration
+/CMakeLists.txt.user
 
 
 #==============================================================================#
 #==============================================================================#
 # Directories to ignore (do not add trailing '/'s, they skip symlinks).
 # Directories to ignore (do not add trailing '/'s, they skip symlinks).
@@ -68,6 +74,8 @@ docs/_build
 # VS2017 and VSCode config files.
 # VS2017 and VSCode config files.
 .vscode
 .vscode
 .vs
 .vs
+# clangd index
+.clangd
 
 
 #==============================================================================#
 #==============================================================================#
 # Files created in tree by the Go bindings.
 # Files created in tree by the Go bindings.

+ 252 - 175
CMakeLists.txt

@@ -2,28 +2,21 @@
 
 
 cmake_minimum_required(VERSION 3.4.3)
 cmake_minimum_required(VERSION 3.4.3)
 
 
-cmake_policy(SET CMP0022 NEW)
-
-cmake_policy(SET CMP0048 NEW)
-
-# CMake 3.1 and higher include generator expressions of the form
-# $<TARGETLIB:obj> in the SOURCES property.  These need to be
-# stripped everywhere that access the SOURCES property, so we just
-# defer to the OLD behavior of not including generator expressions
-# in the output for now.
-cmake_policy(SET CMP0051 OLD)
-
-cmake_policy(SET CMP0056 NEW)
-
-cmake_policy(SET CMP0057 NEW)
-
 if(POLICY CMP0068)
 if(POLICY CMP0068)
   cmake_policy(SET CMP0068 NEW)
   cmake_policy(SET CMP0068 NEW)
   set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)
   set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)
 endif()
 endif()
 
 
+if(POLICY CMP0075)
+  cmake_policy(SET CMP0075 NEW)
+endif()
+
+if(POLICY CMP0077)
+  cmake_policy(SET CMP0077 NEW)
+endif()
+
 if(NOT DEFINED LLVM_VERSION_MAJOR)
 if(NOT DEFINED LLVM_VERSION_MAJOR)
-  set(LLVM_VERSION_MAJOR 7)
+  set(LLVM_VERSION_MAJOR 10)
 endif()
 endif()
 if(NOT DEFINED LLVM_VERSION_MINOR)
 if(NOT DEFINED LLVM_VERSION_MINOR)
   set(LLVM_VERSION_MINOR 0)
   set(LLVM_VERSION_MINOR 0)
@@ -47,6 +40,12 @@ if ((CMAKE_GENERATOR MATCHES "Visual Studio") AND (CMAKE_GENERATOR_TOOLSET STREQ
                   "host compiler, pass -Thost=x64 on the CMake command line.")
                   "host compiler, pass -Thost=x64 on the CMake command line.")
 endif()
 endif()
 
 
+if (CMAKE_GENERATOR STREQUAL "Xcode" AND NOT CMAKE_OSX_ARCHITECTURES)
+  # Some CMake features like object libraries get confused if you don't
+  # explicitly specify an architecture setting with the Xcode generator.
+  set(CMAKE_OSX_ARCHITECTURES "x86_64")
+endif()
+
 project(LLVM
 project(LLVM
   VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}
   VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}
   LANGUAGES C CXX ASM)
   LANGUAGES C CXX ASM)
@@ -56,86 +55,71 @@ if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
   set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build type (default Debug)" FORCE)
   set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build type (default Debug)" FORCE)
 endif()
 endif()
 
 
-# This should only apply if you are both on an Apple host, and targeting Apple.
-if(CMAKE_HOST_APPLE AND APPLE)
-  # if CMAKE_LIBTOOL is not set, try and find it with xcrun or find_program
-  if(NOT CMAKE_LIBTOOL)
-    if(NOT CMAKE_XCRUN)
-      find_program(CMAKE_XCRUN NAMES xcrun)
-    endif()
-    if(CMAKE_XCRUN)
-      execute_process(COMMAND ${CMAKE_XCRUN} -find libtool
-        OUTPUT_VARIABLE CMAKE_LIBTOOL
-        OUTPUT_STRIP_TRAILING_WHITESPACE)
-    endif()
-
-    if(NOT CMAKE_LIBTOOL OR NOT EXISTS CMAKE_LIBTOOL)
-      find_program(CMAKE_LIBTOOL NAMES libtool)
-    endif()
-  endif()
-
-  get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES)
-  if(CMAKE_LIBTOOL)
-    set(CMAKE_LIBTOOL ${CMAKE_LIBTOOL} CACHE PATH "libtool executable")
-    message(STATUS "Found libtool - ${CMAKE_LIBTOOL}")
-
-    execute_process(COMMAND ${CMAKE_LIBTOOL} -V
-      OUTPUT_VARIABLE LIBTOOL_V_OUTPUT
-      OUTPUT_STRIP_TRAILING_WHITESPACE)
-    if("${LIBTOOL_V_OUTPUT}" MATCHES ".*cctools-([0-9.]+).*")
-      string(REGEX REPLACE ".*cctools-([0-9.]+).*" "\\1" LIBTOOL_VERSION
-        ${LIBTOOL_V_OUTPUT})
-      if(NOT LIBTOOL_VERSION VERSION_LESS "862")
-        set(LIBTOOL_NO_WARNING_FLAG "-no_warning_for_no_symbols")
-      endif()
-    endif()
-
-    foreach(lang ${languages})
-      set(CMAKE_${lang}_CREATE_STATIC_LIBRARY
-        "${CMAKE_LIBTOOL} -static ${LIBTOOL_NO_WARNING_FLAG} -o <TARGET> \
-        <LINK_FLAGS> <OBJECTS> ")
-    endforeach()
-  endif()
-
-  # If DYLD_LIBRARY_PATH is set we need to set it on archiver commands
-  if(DYLD_LIBRARY_PATH)
-    set(dyld_envar "DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}")
-    foreach(lang ${languages})
-      foreach(cmd ${CMAKE_${lang}_CREATE_STATIC_LIBRARY})
-        list(APPEND CMAKE_${lang}_CREATE_STATIC_LIBRARY_NEW
-             "${dyld_envar} ${cmd}")
-      endforeach()
-      set(CMAKE_${lang}_CREATE_STATIC_LIBRARY
-        ${CMAKE_${lang}_CREATE_STATIC_LIBRARY_NEW})
-    endforeach()
-  endif()
-endif()
-
 # Side-by-side subprojects layout: automatically set the
 # Side-by-side subprojects layout: automatically set the
 # LLVM_EXTERNAL_${project}_SOURCE_DIR using LLVM_ALL_PROJECTS
 # LLVM_EXTERNAL_${project}_SOURCE_DIR using LLVM_ALL_PROJECTS
 # This allows an easy way of setting up a build directory for llvm and another
 # This allows an easy way of setting up a build directory for llvm and another
 # one for llvm+clang+... using the same sources.
 # one for llvm+clang+... using the same sources.
-set(LLVM_ALL_PROJECTS "clang;libcxx;libcxxabi;lldb;compiler-rt;lld;polly;debuginfo-tests")
+set(LLVM_ALL_PROJECTS "clang;clang-tools-extra;compiler-rt;debuginfo-tests;libc;libclc;libcxx;libcxxabi;libunwind;lld;lldb;llgo;openmp;parallel-libs;polly;pstl")
 set(LLVM_ENABLE_PROJECTS "" CACHE STRING
 set(LLVM_ENABLE_PROJECTS "" CACHE STRING
 	"Semicolon-separated list of projects to build (${LLVM_ALL_PROJECTS}), or \"all\".")
 	"Semicolon-separated list of projects to build (${LLVM_ALL_PROJECTS}), or \"all\".")
 if( LLVM_ENABLE_PROJECTS STREQUAL "all" )
 if( LLVM_ENABLE_PROJECTS STREQUAL "all" )
   set( LLVM_ENABLE_PROJECTS ${LLVM_ALL_PROJECTS})
   set( LLVM_ENABLE_PROJECTS ${LLVM_ALL_PROJECTS})
 endif()
 endif()
-foreach(proj ${LLVM_ENABLE_PROJECTS})
-  set(PROJ_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}")
-  if(NOT EXISTS "${PROJ_DIR}" OR NOT IS_DIRECTORY "${PROJ_DIR}")
-    message(FATAL_ERROR "LLVM_ENABLE_PROJECTS requests ${proj} but directory not found: ${PROJ_DIR}")
-  endif()
-  string(TOUPPER "${proj}" upper_proj)
-  STRING(REGEX REPLACE "-" "_" upper_proj ${upper_proj})
-  set(LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR   "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}")
-  # There is a widely spread opinion that clang-tools-extra should be merged
-  # into clang. The following simulates it by always enabling clang-tools-extra
-  # when enabling clang.
-  if (proj STREQUAL "clang")
-    set(LLVM_EXTERNAL_CLANG_TOOLS_EXTRA_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../clang-tools-extra")
-  endif()
-endforeach()
+
+# LLVM_ENABLE_PROJECTS_USED is `ON` if the user has ever used the
+# `LLVM_ENABLE_PROJECTS` CMake cache variable.  This exists for
+# several reasons:
+#
+# * As an indicator that the `LLVM_ENABLE_PROJECTS` list is now the single
+# source of truth for which projects to build. This means we will ignore user
+# supplied `LLVM_TOOL_<project>_BUILD` CMake cache variables and overwrite
+# them.
+#
+# * The case where the user previously had `LLVM_ENABLE_PROJECTS` set to a
+# non-empty list but now the user wishes to disable building all other projects
+# by setting `LLVM_ENABLE_PROJECTS` to an empty string. In that case we still
+# need to set the `LLVM_TOOL_${upper_proj}_BUILD` variables so that we disable
+# building all the projects that were previously enabled.
+set(LLVM_ENABLE_PROJECTS_USED OFF CACHE BOOL "")
+mark_as_advanced(LLVM_ENABLE_PROJECTS_USED)
+
+if (LLVM_ENABLE_PROJECTS_USED OR NOT LLVM_ENABLE_PROJECTS STREQUAL "")
+  set(LLVM_ENABLE_PROJECTS_USED ON CACHE BOOL "" FORCE)
+  foreach(proj ${LLVM_ALL_PROJECTS} ${LLVM_EXTERNAL_PROJECTS})
+    string(TOUPPER "${proj}" upper_proj)
+    string(REGEX REPLACE "-" "_" upper_proj ${upper_proj})
+    if ("${proj}" IN_LIST LLVM_ENABLE_PROJECTS)
+      message(STATUS "${proj} project is enabled")
+      set(SHOULD_ENABLE_PROJECT TRUE)
+      set(PROJ_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}")
+      if(NOT EXISTS "${PROJ_DIR}" OR NOT IS_DIRECTORY "${PROJ_DIR}")
+        message(FATAL_ERROR "LLVM_ENABLE_PROJECTS requests ${proj} but directory not found: ${PROJ_DIR}")
+      endif()
+      if( LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR STREQUAL "" )
+        set(LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}" CACHE PATH "" FORCE)
+      else()
+        set(LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}" CACHE PATH "")
+      endif()
+    elseif ("${proj}" IN_LIST LLVM_EXTERNAL_PROJECTS)
+      message(STATUS "${proj} project is enabled")
+      set(SHOULD_ENABLE_PROJECT TRUE)
+    else()
+      message(STATUS "${proj} project is disabled")
+      set(SHOULD_ENABLE_PROJECT FALSE)
+    endif()
+    # Force `LLVM_TOOL_${upper_proj}_BUILD` variables to have values that
+    # corresponds with `LLVM_ENABLE_PROJECTS`. This prevents the user setting
+    # `LLVM_TOOL_${upper_proj}_BUILD` variables externally. At some point
+    # we should deprecate allowing users to set these variables by turning them
+    # into normal CMake variables rather than cache variables.
+    set(LLVM_TOOL_${upper_proj}_BUILD
+      ${SHOULD_ENABLE_PROJECT}
+      CACHE
+      BOOL "Whether to build ${upper_proj} as part of LLVM" FORCE
+    )
+  endforeach()
+endif()
+unset(SHOULD_ENABLE_PROJECT)
 
 
 # Build llvm with ccache if the package is present
 # Build llvm with ccache if the package is present
 set(LLVM_CCACHE_BUILD OFF CACHE BOOL "Set to ON for a ccache enabled build")
 set(LLVM_CCACHE_BUILD OFF CACHE BOOL "Set to ON for a ccache enabled build")
@@ -194,10 +178,18 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
 option(LLVM_INSTALL_BINUTILS_SYMLINKS
 option(LLVM_INSTALL_BINUTILS_SYMLINKS
   "Install symlinks from the binutils tool names to the corresponding LLVM tools." OFF)
   "Install symlinks from the binutils tool names to the corresponding LLVM tools." OFF)
 
 
+option(LLVM_INSTALL_CCTOOLS_SYMLINKS
+  "Install symlinks from the cctools tool names to the corresponding LLVM tools." OFF)
+
 option(LLVM_INSTALL_UTILS "Include utility binaries in the 'install' target." OFF)
 option(LLVM_INSTALL_UTILS "Include utility binaries in the 'install' target." OFF)
 
 
 option(LLVM_INSTALL_TOOLCHAIN_ONLY "Only include toolchain files in the 'install' target." OFF)
 option(LLVM_INSTALL_TOOLCHAIN_ONLY "Only include toolchain files in the 'install' target." OFF)
 
 
+# Unfortunatly Clang is too eager to search directories for module maps, which can cause the
+# installed version of the maps to be found when building LLVM from source. Therefore we turn off
+# the installation by default. See llvm.org/PR31905.
+option(LLVM_INSTALL_MODULEMAPS "Install the modulemap files in the 'install' target." OFF)
+
 option(LLVM_USE_FOLDERS "Enable solution folders in Visual Studio. Disable for Express versions." ON)
 option(LLVM_USE_FOLDERS "Enable solution folders in Visual Studio. Disable for Express versions." ON)
 if ( LLVM_USE_FOLDERS )
 if ( LLVM_USE_FOLDERS )
   set_property(GLOBAL PROPERTY USE_FOLDERS ON)
   set_property(GLOBAL PROPERTY USE_FOLDERS ON)
@@ -206,7 +198,7 @@ endif()
 include(VersionFromVCS)
 include(VersionFromVCS)
 
 
 option(LLVM_APPEND_VC_REV
 option(LLVM_APPEND_VC_REV
-  "Embed the version control system revision id in LLVM" ON)
+  "Embed the version control system revision in LLVM" ON)
 
 
 set(PACKAGE_NAME LLVM)
 set(PACKAGE_NAME LLVM)
 set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
 set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
@@ -231,10 +223,6 @@ if(WIN32 AND NOT UNIX)
   set(CPACK_NSIS_MUI_UNIICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_icon.ico")
   set(CPACK_NSIS_MUI_UNIICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_icon.ico")
   set(CPACK_NSIS_MODIFY_PATH "ON")
   set(CPACK_NSIS_MODIFY_PATH "ON")
   set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL "ON")
   set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL "ON")
-  set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS
-    "ExecWait '$INSTDIR/tools/msbuild/install.bat'")
-  set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS
-    "ExecWait '$INSTDIR/tools/msbuild/uninstall.bat'")
   if( CMAKE_CL_64 )
   if( CMAKE_CL_64 )
     set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")
     set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")
   endif()
   endif()
@@ -248,29 +236,11 @@ include(CPack)
 # versions).
 # versions).
 if( CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR AND NOT MSVC_IDE )
 if( CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR AND NOT MSVC_IDE )
   message(FATAL_ERROR "In-source builds are not allowed.
   message(FATAL_ERROR "In-source builds are not allowed.
-CMake would overwrite the makefiles distributed with LLVM.
 Please create a directory and run cmake from there, passing the path
 Please create a directory and run cmake from there, passing the path
 to this source directory as the last argument.
 to this source directory as the last argument.
 This process created the file `CMakeCache.txt' and the directory `CMakeFiles'.
 This process created the file `CMakeCache.txt' and the directory `CMakeFiles'.
 Please delete them.")
 Please delete them.")
 endif()
 endif()
-if( NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR )
-  file(GLOB_RECURSE
-    tablegenned_files_on_include_dir
-    "${CMAKE_CURRENT_SOURCE_DIR}/include/llvm/*.gen")
-  file(GLOB_RECURSE
-    tablegenned_files_on_lib_dir
-    "${CMAKE_CURRENT_SOURCE_DIR}/lib/Target/*.inc")
-  if( tablegenned_files_on_include_dir OR tablegenned_files_on_lib_dir)
-    message(FATAL_ERROR "Apparently there is a previous in-source build,
-probably as the result of running `configure' and `make' on
-${CMAKE_CURRENT_SOURCE_DIR}.
-This may cause problems. The suspicious files are:
-${tablegenned_files_on_lib_dir}
-${tablegenned_files_on_include_dir}
-Please clean the source directory.")
-  endif()
-endif()
 
 
 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
 
 
@@ -322,8 +292,10 @@ set(LLVM_ALL_TARGETS
   MSP430
   MSP430
   NVPTX
   NVPTX
   PowerPC
   PowerPC
+  RISCV
   Sparc
   Sparc
   SystemZ
   SystemZ
+  WebAssembly
   X86
   X86
   XCore
   XCore
   )
   )
@@ -345,11 +317,15 @@ if(LLVM_ENABLE_BACKTRACES)
   set(ENABLE_BACKTRACES 1)
   set(ENABLE_BACKTRACES 1)
 endif()
 endif()
 
 
+option(LLVM_ENABLE_UNWIND_TABLES "Emit unwind tables for the libraries" ON)
+
 option(LLVM_ENABLE_CRASH_OVERRIDES "Enable crash overrides." ON)
 option(LLVM_ENABLE_CRASH_OVERRIDES "Enable crash overrides." ON)
 if(LLVM_ENABLE_CRASH_OVERRIDES)
 if(LLVM_ENABLE_CRASH_OVERRIDES)
   set(ENABLE_CRASH_OVERRIDES 1)
   set(ENABLE_CRASH_OVERRIDES 1)
 endif()
 endif()
 
 
+option(LLVM_ENABLE_CRASH_DUMPS "Turn on memory dumps on crashes. Currently only implemented on Windows." OFF)
+
 option(LLVM_ENABLE_FFI "Use libffi to call external functions from the interpreter" OFF)
 option(LLVM_ENABLE_FFI "Use libffi to call external functions from the interpreter" OFF)
 set(FFI_LIBRARY_DIR "" CACHE PATH "Additional directory, where CMake should search for libffi.so")
 set(FFI_LIBRARY_DIR "" CACHE PATH "Additional directory, where CMake should search for libffi.so")
 set(FFI_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should search for ffi.h or ffi/ffi.h")
 set(FFI_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should search for ffi.h or ffi/ffi.h")
@@ -369,6 +345,31 @@ option(LLVM_ENABLE_THREADS "Use threads if available." ON)
 
 
 option(LLVM_ENABLE_ZLIB "Use zlib for compression/decompression if available." ON)
 option(LLVM_ENABLE_ZLIB "Use zlib for compression/decompression if available." ON)
 
 
+set(LLVM_Z3_INSTALL_DIR "" CACHE STRING "Install directory of the Z3 solver.")
+
+find_package(Z3 4.7.1)
+
+if (LLVM_Z3_INSTALL_DIR)
+  if (NOT Z3_FOUND)
+    message(FATAL_ERROR "Z3 >= 4.7.1 has not been found in LLVM_Z3_INSTALL_DIR: ${LLVM_Z3_INSTALL_DIR}.")
+  endif()
+endif()
+
+set(LLVM_ENABLE_Z3_SOLVER_DEFAULT "${Z3_FOUND}")
+
+option(LLVM_ENABLE_Z3_SOLVER
+  "Enable Support for the Z3 constraint solver in LLVM."
+  ${LLVM_ENABLE_Z3_SOLVER_DEFAULT}
+)
+
+if (LLVM_ENABLE_Z3_SOLVER)
+  if (NOT Z3_FOUND)
+    message(FATAL_ERROR "LLVM_ENABLE_Z3_SOLVER cannot be enabled when Z3 is not available.")
+  endif()
+
+  set(LLVM_WITH_Z3 1)
+endif()
+
 if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
 if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
   set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
   set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
 endif()
 endif()
@@ -388,9 +389,8 @@ else()
   option(LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." OFF)
   option(LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." OFF)
   option(LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY "Compile with -fmodules-local-submodule-visibility." ON)
   option(LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY "Compile with -fmodules-local-submodule-visibility." ON)
 endif()
 endif()
-option(LLVM_ENABLE_CXX1Y "Compile with C++1y enabled." OFF)
-option(LLVM_ENABLE_CXX1Z "Compile with C++1z enabled." OFF)
 option(LLVM_ENABLE_LIBCXX "Use libc++ if available." OFF)
 option(LLVM_ENABLE_LIBCXX "Use libc++ if available." OFF)
+option(LLVM_STATIC_LINK_CXX_STDLIB "Statically link the standard library." OFF)
 option(LLVM_ENABLE_LLD "Use lld as C and C++ linker." OFF)
 option(LLVM_ENABLE_LLD "Use lld as C and C++ linker." OFF)
 option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
 option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
 option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
 option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
@@ -408,9 +408,12 @@ option(LLVM_ENABLE_EXPENSIVE_CHECKS "Enable expensive checks" OFF)
 set(LLVM_ABI_BREAKING_CHECKS "WITH_ASSERTS" CACHE STRING
 set(LLVM_ABI_BREAKING_CHECKS "WITH_ASSERTS" CACHE STRING
   "Enable abi-breaking checks.  Can be WITH_ASSERTS, FORCE_ON or FORCE_OFF.")
   "Enable abi-breaking checks.  Can be WITH_ASSERTS, FORCE_ON or FORCE_OFF.")
 
 
-option(LLVM_FORCE_USE_OLD_HOST_TOOLCHAIN
+option(LLVM_FORCE_USE_OLD_TOOLCHAIN
        "Set to ON to force using an old, unsupported host toolchain." OFF)
        "Set to ON to force using an old, unsupported host toolchain." OFF)
 
 
+option(LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN
+       "Set to ON to only warn when using a toolchain which is about to be deprecated, instead of emitting an error." OFF)
+
 option(LLVM_USE_INTEL_JITEVENTS
 option(LLVM_USE_INTEL_JITEVENTS
   "Use Intel JIT API to inform Intel(R) VTune(TM) Amplifier XE 2011 about JIT code"
   "Use Intel JIT API to inform Intel(R) VTune(TM) Amplifier XE 2011 about JIT code"
   OFF)
   OFF)
@@ -429,6 +432,9 @@ option(LLVM_USE_OPROFILE
 option(LLVM_EXTERNALIZE_DEBUGINFO
 option(LLVM_EXTERNALIZE_DEBUGINFO
   "Generate dSYM files and strip executables and libraries (Darwin Only)" OFF)
   "Generate dSYM files and strip executables and libraries (Darwin Only)" OFF)
 
 
+set(LLVM_CODESIGNING_IDENTITY "" CACHE STRING
+  "Sign executables and dylibs with the given identity or skip if empty (Darwin Only)")
+
 # If enabled, verify we are on a platform that supports oprofile.
 # If enabled, verify we are on a platform that supports oprofile.
 if( LLVM_USE_OPROFILE )
 if( LLVM_USE_OPROFILE )
   if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
   if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
@@ -436,8 +442,19 @@ if( LLVM_USE_OPROFILE )
   endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
   endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
 endif( LLVM_USE_OPROFILE )
 endif( LLVM_USE_OPROFILE )
 
 
+option(LLVM_USE_PERF
+  "Use perf JIT interface to inform perf about JIT code" OFF)
+
+# If enabled, verify we are on a platform that supports perf.
+if( LLVM_USE_PERF )
+  if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
+    message(FATAL_ERROR "perf support is available on Linux only.")
+  endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
+endif( LLVM_USE_PERF )
+
 set(LLVM_USE_SANITIZER "" CACHE STRING
 set(LLVM_USE_SANITIZER "" CACHE STRING
   "Define the sanitizer used to build binaries and tests.")
   "Define the sanitizer used to build binaries and tests.")
+option(LLVM_OPTIMIZE_SANITIZED_BUILDS "Pass -O1 on debug sanitizer builds" ON)
 set(LLVM_LIB_FUZZING_ENGINE "" CACHE PATH
 set(LLVM_LIB_FUZZING_ENGINE "" CACHE PATH
   "Path to fuzzing library for linking with fuzz targets")
   "Path to fuzzing library for linking with fuzz targets")
 
 
@@ -514,11 +531,16 @@ option(LLVM_BUILD_TESTS
 option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON)
 option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON)
 option(LLVM_INCLUDE_GO_TESTS "Include the Go bindings tests in test build targets." ON)
 option(LLVM_INCLUDE_GO_TESTS "Include the Go bindings tests in test build targets." ON)
 
 
+option(LLVM_BUILD_BENCHMARKS "Add LLVM benchmark targets to the list of default
+targets. If OFF, benchmarks still could be built using Benchmarks target." OFF)
+option(LLVM_INCLUDE_BENCHMARKS "Generate benchmark targets. If OFF, benchmarks can't be built." ON)
+
 option (LLVM_BUILD_DOCS "Build the llvm documentation." OFF)
 option (LLVM_BUILD_DOCS "Build the llvm documentation." OFF)
 option (LLVM_INCLUDE_DOCS "Generate build targets for llvm documentation." ON)
 option (LLVM_INCLUDE_DOCS "Generate build targets for llvm documentation." ON)
 option (LLVM_ENABLE_DOXYGEN "Use doxygen to generate llvm API documentation." OFF)
 option (LLVM_ENABLE_DOXYGEN "Use doxygen to generate llvm API documentation." OFF)
 option (LLVM_ENABLE_SPHINX "Use Sphinx to generate llvm documentation." OFF)
 option (LLVM_ENABLE_SPHINX "Use Sphinx to generate llvm documentation." OFF)
 option (LLVM_ENABLE_OCAMLDOC "Build OCaml bindings documentation." ON)
 option (LLVM_ENABLE_OCAMLDOC "Build OCaml bindings documentation." ON)
+option (LLVM_ENABLE_BINDINGS "Build bindings." ON)
 
 
 set(LLVM_INSTALL_DOXYGEN_HTML_DIR "share/doc/llvm/doxygen-html"
 set(LLVM_INSTALL_DOXYGEN_HTML_DIR "share/doc/llvm/doxygen-html"
     CACHE STRING "Doxygen-generated HTML documentation install directory")
     CACHE STRING "Doxygen-generated HTML documentation install directory")
@@ -539,24 +561,24 @@ if(NOT DEFINED LLVM_DYLIB_COMPONENTS)
     "Semicolon-separated list of components to include in libLLVM, or \"all\".")
     "Semicolon-separated list of components to include in libLLVM, or \"all\".")
 endif()
 endif()
 option(LLVM_LINK_LLVM_DYLIB "Link tools against the libllvm dynamic library" OFF)
 option(LLVM_LINK_LLVM_DYLIB "Link tools against the libllvm dynamic library" OFF)
-option(LLVM_BUILD_LLVM_C_DYLIB "Build libllvm-c re-export library (Darwin Only)" OFF)
+if(MSVC)
+  option(LLVM_BUILD_LLVM_C_DYLIB "Build LLVM-C.dll (Windows only)" ON)
+else()
+  option(LLVM_BUILD_LLVM_C_DYLIB "Build libllvm-c re-export library (Darwin only)" OFF)
+endif()
 set(LLVM_BUILD_LLVM_DYLIB_default OFF)
 set(LLVM_BUILD_LLVM_DYLIB_default OFF)
-if(LLVM_LINK_LLVM_DYLIB OR LLVM_BUILD_LLVM_C_DYLIB)
+if(LLVM_LINK_LLVM_DYLIB OR (LLVM_BUILD_LLVM_C_DYLIB AND NOT MSVC))
   set(LLVM_BUILD_LLVM_DYLIB_default ON)
   set(LLVM_BUILD_LLVM_DYLIB_default ON)
 endif()
 endif()
 option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" ${LLVM_BUILD_LLVM_DYLIB_default})
 option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" ${LLVM_BUILD_LLVM_DYLIB_default})
 
 
-option(LLVM_DYLIB_SYMBOL_VERSIONING OFF)
-
 option(LLVM_OPTIMIZED_TABLEGEN "Force TableGen to be built with optimization" OFF)
 option(LLVM_OPTIMIZED_TABLEGEN "Force TableGen to be built with optimization" OFF)
 if(CMAKE_CROSSCOMPILING OR (LLVM_OPTIMIZED_TABLEGEN AND (LLVM_ENABLE_ASSERTIONS OR CMAKE_CONFIGURATION_TYPES)))
 if(CMAKE_CROSSCOMPILING OR (LLVM_OPTIMIZED_TABLEGEN AND (LLVM_ENABLE_ASSERTIONS OR CMAKE_CONFIGURATION_TYPES)))
   set(LLVM_USE_HOST_TOOLS ON)
   set(LLVM_USE_HOST_TOOLS ON)
 endif()
 endif()
 
 
-if (MSVC_IDE AND NOT (MSVC_VERSION LESS 1900))
+if (MSVC_IDE)
   option(LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION "Configure project to use Visual Studio native visualizers" TRUE)
   option(LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION "Configure project to use Visual Studio native visualizers" TRUE)
-else()
-  set(LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION FALSE CACHE INTERNAL "For Visual Studio 2013, manually copy natvis files to Documents\\Visual Studio 2013\\Visualizers" FORCE)
 endif()
 endif()
 
 
 if (LLVM_BUILD_INSTRUMENTED OR LLVM_BUILD_INSTRUMENTED_COVERAGE OR
 if (LLVM_BUILD_INSTRUMENTED OR LLVM_BUILD_INSTRUMENTED_COVERAGE OR
@@ -572,16 +594,33 @@ if (LLVM_BUILD_INSTRUMENTED OR LLVM_BUILD_INSTRUMENTED_COVERAGE OR
     endif()
     endif()
 		file(TO_NATIVE_PATH "${LLVM_PROFILE_DATA_DIR}/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_PROFILE_FILE_PATTERN)
 		file(TO_NATIVE_PATH "${LLVM_PROFILE_DATA_DIR}/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_PROFILE_FILE_PATTERN)
   endif()
   endif()
+  if(NOT LLVM_CSPROFILE_FILE_PATTERN)
+    if(NOT LLVM_CSPROFILE_DATA_DIR)
+      file(TO_NATIVE_PATH "${LLVM_BINARY_DIR}/csprofiles" LLVM_CSPROFILE_DATA_DIR)
+    endif()
+    file(TO_NATIVE_PATH "${LLVM_CSPROFILE_DATA_DIR}/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_CSPROFILE_FILE_PATTERN)
+  endif()
 endif()
 endif()
 
 
 if (LLVM_BUILD_STATIC)
 if (LLVM_BUILD_STATIC)
   set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
   set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
 endif()
 endif()
 
 
+# Use libtool instead of ar if you are both on an Apple host, and targeting Apple.
+if(CMAKE_HOST_APPLE AND APPLE)
+  include(UseLibtool)
+endif()
+
 # Override the default target with an environment variable named by LLVM_TARGET_TRIPLE_ENV.
 # Override the default target with an environment variable named by LLVM_TARGET_TRIPLE_ENV.
 set(LLVM_TARGET_TRIPLE_ENV CACHE STRING "The name of environment variable to override default target. Disabled by blank.")
 set(LLVM_TARGET_TRIPLE_ENV CACHE STRING "The name of environment variable to override default target. Disabled by blank.")
 mark_as_advanced(LLVM_TARGET_TRIPLE_ENV)
 mark_as_advanced(LLVM_TARGET_TRIPLE_ENV)
 
 
+set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR OFF CACHE BOOL
+  "Enable per-target runtimes directory")
+
+set(LLVM_PROFDATA_FILE "" CACHE FILEPATH
+  "Profiling data file to use when compiling in order to improve runtime performance.")
+
 # All options referred to from HandleLLVMOptions have to be specified
 # All options referred to from HandleLLVMOptions have to be specified
 # BEFORE this include, otherwise options will not be correctly set on
 # BEFORE this include, otherwise options will not be correctly set on
 # first cmake run
 # first cmake run
@@ -599,12 +638,19 @@ set(TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}")
 message(STATUS "LLVM host triple: ${LLVM_HOST_TRIPLE}")
 message(STATUS "LLVM host triple: ${LLVM_HOST_TRIPLE}")
 message(STATUS "LLVM default target triple: ${LLVM_DEFAULT_TARGET_TRIPLE}")
 message(STATUS "LLVM default target triple: ${LLVM_DEFAULT_TARGET_TRIPLE}")
 
 
+if(WIN32 OR CYGWIN)
+  if(BUILD_SHARED_LIBS OR LLVM_BUILD_LLVM_DYLIB)
+    set(LLVM_ENABLE_PLUGINS_default ON)
+  else()
+    set(LLVM_ENABLE_PLUGINS_default OFF)
+  endif()
+else()
+  set(LLVM_ENABLE_PLUGINS_default ${LLVM_ENABLE_PIC})
+endif()
+option(LLVM_ENABLE_PLUGINS "Enable plugin support" ${LLVM_ENABLE_PLUGINS_default})
+
 include(HandleLLVMOptions)
 include(HandleLLVMOptions)
 
 
-# Verify that we can find a Python 2 interpreter.  Python 3 is unsupported.
-# FIXME: We should support systems with only Python 3, but that requires work
-# on LLDB.
-set(Python_ADDITIONAL_VERSIONS 2.7)
 include(FindPythonInterp)
 include(FindPythonInterp)
 if( NOT PYTHONINTERP_FOUND )
 if( NOT PYTHONINTERP_FOUND )
   message(FATAL_ERROR
   message(FATAL_ERROR
@@ -629,7 +675,7 @@ endif()
 #  - We generate the library table used by llvm-config.
 #  - We generate the library table used by llvm-config.
 #
 #
 #  - We generate the dependencies for the CMake fragment, so that we will
 #  - We generate the dependencies for the CMake fragment, so that we will
-#    automatically reconfigure outselves.
+#    automatically reconfigure ourselves.
 
 
 set(LLVMBUILDTOOL "${LLVM_MAIN_SRC_DIR}/utils/llvm-build/llvm-build")
 set(LLVMBUILDTOOL "${LLVM_MAIN_SRC_DIR}/utils/llvm-build/llvm-build")
 set(LLVMCONFIGLIBRARYDEPENDENCIESINC
 set(LLVMCONFIGLIBRARYDEPENDENCIESINC
@@ -644,6 +690,9 @@ endif (LLVM_USE_INTEL_JITEVENTS)
 if (LLVM_USE_OPROFILE)
 if (LLVM_USE_OPROFILE)
   set(LLVMOPTIONALCOMPONENTS ${LLVMOPTIONALCOMPONENTS} OProfileJIT)
   set(LLVMOPTIONALCOMPONENTS ${LLVMOPTIONALCOMPONENTS} OProfileJIT)
 endif (LLVM_USE_OPROFILE)
 endif (LLVM_USE_OPROFILE)
+if (LLVM_USE_PERF)
+  set(LLVMOPTIONALCOMPONENTS ${LLVMOPTIONALCOMPONENTS} PerfJITEvents)
+endif (LLVM_USE_PERF)
 
 
 message(STATUS "Constructing LLVMBuild project information")
 message(STATUS "Constructing LLVMBuild project information")
 execute_process(
 execute_process(
@@ -750,13 +799,12 @@ set(LLVM_SRPM_USER_BINARY_SPECFILE ${CMAKE_CURRENT_SOURCE_DIR}/llvm.spec.in
 set(LLVM_SRPM_BINARY_SPECFILE ${CMAKE_CURRENT_BINARY_DIR}/llvm.spec)
 set(LLVM_SRPM_BINARY_SPECFILE ${CMAKE_CURRENT_BINARY_DIR}/llvm.spec)
 set(LLVM_SRPM_DIR "${CMAKE_CURRENT_BINARY_DIR}/srpm")
 set(LLVM_SRPM_DIR "${CMAKE_CURRENT_BINARY_DIR}/srpm")
 
 
-# SVN_REVISION and GIT_COMMIT get set by the call to add_version_info_from_vcs.
-# DUMMY_VAR contains a version string which we don't care about.
-add_version_info_from_vcs(DUMMY_VAR)
-if ( SVN_REVISION )
-  set(LLVM_RPM_SPEC_REVISION "r${SVN_REVISION}")
-elseif ( GIT_COMMIT )
-  set (LLVM_RPM_SPEC_REVISION "g${GIT_COMMIT}")
+get_source_info(${CMAKE_CURRENT_SOURCE_DIR} revision repository)
+string(LENGTH "${revision}" revision_length)
+if(revision MATCHES "^[0-9]+$" AND revision_length LESS 40)
+  set(LLVM_RPM_SPEC_REVISION "r${revision}")
+else()
+  set(LLVM_RPM_SPEC_REVISION "${revision}")
 endif()
 endif()
 
 
 configure_file(
 configure_file(
@@ -783,6 +831,18 @@ if(APPLE AND DARWIN_LTO_LIBRARY)
     "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
     "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
 endif()
 endif()
 
 
+# Build with _XOPEN_SOURCE on AIX, as stray macros in _ALL_SOURCE mode tend to
+# break things. In this case we need to enable the large-file API as well.
+if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
+          add_definitions("-D_XOPEN_SOURCE=700")
+          add_definitions("-D_LARGE_FILE_API")
+endif()
+
+# Build with _FILE_OFFSET_BITS=64 on Solaris to match g++ >= 9.
+if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
+          add_definitions("-D_FILE_OFFSET_BITS=64")
+endif()
+
 # Work around a broken bfd ld behavior. When linking a binary with a
 # Work around a broken bfd ld behavior. When linking a binary with a
 # foo.so library, it will try to find any library that foo.so uses and
 # foo.so library, it will try to find any library that foo.so uses and
 # check its symbols. This is wasteful (the check was done when foo.so
 # check its symbols. This is wasteful (the check was done when foo.so
@@ -800,6 +860,7 @@ include_directories( ${LLVM_INCLUDE_DIR} ${LLVM_MAIN_INCLUDE_DIR})
 # when crosscompiling import the executable targets from a file
 # when crosscompiling import the executable targets from a file
 if(LLVM_USE_HOST_TOOLS)
 if(LLVM_USE_HOST_TOOLS)
   include(CrossCompile)
   include(CrossCompile)
+  llvm_create_cross_target(LLVM NATIVE "" Release)
 endif(LLVM_USE_HOST_TOOLS)
 endif(LLVM_USE_HOST_TOOLS)
 if(LLVM_TARGET_IS_CROSSCOMPILE_HOST)
 if(LLVM_TARGET_IS_CROSSCOMPILE_HOST)
 # Dummy use to avoid CMake Warning: Manually-specified variables were not used
 # Dummy use to avoid CMake Warning: Manually-specified variables were not used
@@ -822,17 +883,6 @@ endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
 # use export_executable_symbols(target).
 # use export_executable_symbols(target).
 set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
 set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
 
 
-set(LLVM_PROFDATA_FILE "" CACHE FILEPATH
-  "Profiling data file to use when compiling in order to improve runtime performance.")
-
-if(LLVM_PROFDATA_FILE AND EXISTS ${LLVM_PROFDATA_FILE})
-  if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
-    add_definitions("-fprofile-instr-use=${LLVM_PROFDATA_FILE}")
-  else()
-    message(FATAL_ERROR "LLVM_PROFDATA_FILE can only be specified when compiling with clang")
-  endif()
-endif()
-
 include(AddLLVM)
 include(AddLLVM)
 include(TableGen)
 include(TableGen)
 
 
@@ -862,7 +912,7 @@ if( LLVM_INCLUDE_UTILS )
 else()
 else()
   if ( LLVM_INCLUDE_TESTS )
   if ( LLVM_INCLUDE_TESTS )
     message(FATAL_ERROR "Including tests when not building utils will not work.
     message(FATAL_ERROR "Including tests when not building utils will not work.
-    Either set LLVM_INCLUDE_UTILS to On, or set LLVM_INCLDE_TESTS to Off.")
+    Either set LLVM_INCLUDE_UTILS to On, or set LLVM_INCLUDE_TESTS to Off.")
   endif()
   endif()
 endif()
 endif()
 
 
@@ -976,51 +1026,78 @@ if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
     PATTERN ".svn" EXCLUDE
     PATTERN ".svn" EXCLUDE
     )
     )
 
 
+  if (LLVM_INSTALL_MODULEMAPS)
+    install(DIRECTORY include/llvm include/llvm-c
+            DESTINATION include
+            COMPONENT llvm-headers
+            FILES_MATCHING
+            PATTERN "module.modulemap"
+            )
+    install(FILES include/llvm/module.install.modulemap
+            DESTINATION include/llvm
+            COMPONENT llvm-headers
+            RENAME "module.extern.modulemap"
+            )
+  endif(LLVM_INSTALL_MODULEMAPS)
+
   # Installing the headers needs to depend on generating any public
   # Installing the headers needs to depend on generating any public
   # tablegen'd headers.
   # tablegen'd headers.
   add_custom_target(llvm-headers DEPENDS intrinsics_gen)
   add_custom_target(llvm-headers DEPENDS intrinsics_gen)
   set_target_properties(llvm-headers PROPERTIES FOLDER "Misc")
   set_target_properties(llvm-headers PROPERTIES FOLDER "Misc")
 
 
-  if (NOT CMAKE_CONFIGURATION_TYPES)
+  if (NOT LLVM_ENABLE_IDE)
     add_llvm_install_targets(install-llvm-headers
     add_llvm_install_targets(install-llvm-headers
+                             DEPENDS llvm-headers
                              COMPONENT llvm-headers)
                              COMPONENT llvm-headers)
   endif()
   endif()
+
+  # Custom target to install all libraries.
+  add_custom_target(llvm-libraries)
+  set_target_properties(llvm-libraries PROPERTIES FOLDER "Misc")
+
+  if (NOT LLVM_ENABLE_IDE)
+    add_llvm_install_targets(install-llvm-libraries
+                             DEPENDS llvm-libraries
+                             COMPONENT llvm-libraries)
+  endif()
+
+  get_property(LLVM_LIBS GLOBAL PROPERTY LLVM_LIBS)
+  if(LLVM_LIBS)
+    list(REMOVE_DUPLICATES LLVM_LIBS)
+    foreach(lib ${LLVM_LIBS})
+      add_dependencies(llvm-libraries ${lib})
+      if (NOT LLVM_ENABLE_IDE)
+        add_dependencies(install-llvm-libraries install-${lib})
+      endif()
+    endforeach()
+  endif()
 endif()
 endif()
 
 
 # This must be at the end of the LLVM root CMakeLists file because it must run
 # This must be at the end of the LLVM root CMakeLists file because it must run
 # after all targets are created.
 # after all targets are created.
-if(LLVM_DISTRIBUTION_COMPONENTS)
-  if(CMAKE_CONFIGURATION_TYPES)
-    message(FATAL_ERROR "LLVM_DISTRIBUTION_COMPONENTS cannot be specified with multi-configuration generators (i.e. Xcode or Visual Studio)")
-  endif()
-
-  add_custom_target(distribution)
-  add_custom_target(install-distribution)
-  add_custom_target(install-distribution-stripped)
-  foreach(target ${LLVM_DISTRIBUTION_COMPONENTS})
-    if(TARGET ${target})
-      add_dependencies(distribution ${target})
-    else()
-      message(SEND_ERROR "Specified distribution component '${target}' doesn't have a target")
-    endif()
+include(LLVMDistributionSupport)
+llvm_distribution_add_targets()
 
 
-    if(TARGET install-${target})
-      add_dependencies(install-distribution install-${target})
-    else()
-      message(SEND_ERROR "Specified distribution component '${target}' doesn't have an install target")
-    endif()
+# This allows us to deploy the Universal CRT DLLs by passing -DCMAKE_INSTALL_UCRT_LIBRARIES=ON to CMake
+if (MSVC AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows" AND CMAKE_INSTALL_UCRT_LIBRARIES)
+  include(InstallRequiredSystemLibraries)
+endif()
 
 
-    if(TARGET install-${target}-stripped)
-      add_dependencies(install-distribution-stripped install-${target}-stripped)
-    else()
-      message(SEND_ERROR "Specified distribution component '${target}' doesn't have an install-stripped target."
-                         " Its installation target creation should be changed to use add_llvm_install_targets,"
-                         " or you should manually create the 'install-${target}-stripped' target.")
-    endif()
-  endforeach()
+if (LLVM_INCLUDE_BENCHMARKS)
+  # Override benchmark defaults so that when the library itself is updated these
+  # modifications are not lost.
+  set(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "Disable benchmark testing" FORCE)
+  set(BENCHMARK_ENABLE_EXCEPTIONS OFF CACHE BOOL "Disable benchmark exceptions" FORCE)
+  set(BENCHMARK_ENABLE_INSTALL OFF CACHE BOOL "Don't install benchmark" FORCE)
+  set(BENCHMARK_DOWNLOAD_DEPENDENCIES OFF CACHE BOOL "Don't download dependencies" FORCE)
+  set(BENCHMARK_ENABLE_GTEST_TESTS OFF CACHE BOOL "Disable Google Test in benchmark" FORCE)
+  # Since LLVM requires C++11 it is safe to assume that std::regex is available.
+  set(HAVE_STD_REGEX ON CACHE BOOL "OK" FORCE)
+
+  add_subdirectory(utils/benchmark)
+  add_subdirectory(benchmarks)
 endif()
 endif()
 
 
-# This allows us to deploy the Universal CRT DLLs by passing -DCMAKE_INSTALL_UCRT_LIBRARIES=ON to CMake
-if (MSVC AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
-  include(InstallRequiredSystemLibraries)
+if (LLVM_INCLUDE_UTILS AND LLVM_INCLUDE_TOOLS)
+  add_subdirectory(utils/llvm-locstats)
 endif()
 endif()

+ 14 - 6
CODE_OWNERS.TXT

@@ -9,6 +9,10 @@ beautification by scripts. The fields are: name (N), email (E), web-address
 (S) and (I) IRC handle. Each entry should contain at least the (N), (E) and
 (S) and (I) IRC handle. Each entry should contain at least the (N), (E) and
 (D) fields.
 (D) fields.
 
 
+N: Simon Atanasyan
+E: simon@atanasyan.com
+D: MIPS Backend (lib/Target/Mips/*)
+
 N: Justin Bogner
 N: Justin Bogner
 E: mail@justinbogner.com
 E: mail@justinbogner.com
 D: InstrProfiling and related parts of ProfileData
 D: InstrProfiling and related parts of ProfileData
@@ -64,14 +68,10 @@ N: Quentin Colombet
 E: quentin.colombet@gmail.com
 E: quentin.colombet@gmail.com
 D: Loop Strength Reduction, Register allocators
 D: Loop Strength Reduction, Register allocators
 
 
-N: Simon Dardis
-E: simon.dardis@mips.com
-D: MIPS Backend (lib/Target/Mips/*)
-
 N: Andrea Di Biagio
 N: Andrea Di Biagio
 E: andrea.dibiagio@sony.com
 E: andrea.dibiagio@sony.com
 E: andrea.dibiagio@gmail.com
 E: andrea.dibiagio@gmail.com
-D: llvm-mca
+D: MCA, llvm-mca
 
 
 N: Duncan P. N. Exon Smith
 N: Duncan P. N. Exon Smith
 E: dexonsmith@apple.com
 E: dexonsmith@apple.com
@@ -163,7 +163,7 @@ E: stoklund@2pi.dk
 D: TableGen
 D: TableGen
 
 
 N: Krzysztof Parzyszek
 N: Krzysztof Parzyszek
-E: kparzysz@codeaurora.org
+E: kparzysz@quicinc.com
 D: Hexagon Backend
 D: Hexagon Backend
 
 
 N: Jacques Pienaar
 N: Jacques Pienaar
@@ -218,3 +218,11 @@ D: Release management (x.y.0 releases)
 N: whitequark
 N: whitequark
 E: whitequark@whitequark.org
 E: whitequark@whitequark.org
 D: C API, OCaml bindings
 D: C API, OCaml bindings
+
+N: Jake Ehrlich
+E: jakehehrlich@google.com
+D: llvm-objcopy (tools/llvm-objcopy)
+
+N: Martin Storsjö
+E: martin@martin.st
+D: MinGW

+ 59 - 7
CREDITS.TXT

@@ -1,5 +1,5 @@
 This file is a partial list of people who have contributed to the LLVM
 This file is a partial list of people who have contributed to the LLVM
-project.  If you have contributed a patch or made some other contribution to
+project. If you have contributed a patch or made some other contribution to
 LLVM, please submit a patch to this file to add yourself, and it will be
 LLVM, please submit a patch to this file to add yourself, and it will be
 done!
 done!
 
 
@@ -23,7 +23,8 @@ D: MingW Win32 API portability layer
 
 
 N: Aaron Ballman
 N: Aaron Ballman
 E: aaron@aaronballman.com
 E: aaron@aaronballman.com
-D: __declspec attributes, Windows support, general bug fixing
+D: Clang frontend, frontend attributes, Windows support, general bug fixing
+I: AaronBallman
 
 
 N: Nate Begeman
 N: Nate Begeman
 E: natebegeman@mac.com
 E: natebegeman@mac.com
@@ -35,6 +36,13 @@ E: dberlin@dberlin.org
 D: ET-Forest implementation.
 D: ET-Forest implementation.
 D: Sparse bitmap
 D: Sparse bitmap
 
 
+N: Geoff Berry
+E: gberry@codeaurora.org
+E: gcb@acm.org
+D: AArch64 backend improvements
+D: Added EarlyCSE MemorySSA support
+D: CodeGen improvements
+
 N: David Blaikie
 N: David Blaikie
 E: dblaikie@gmail.com
 E: dblaikie@gmail.com
 D: General bug fixing/fit & finish, mostly in Clang
 D: General bug fixing/fit & finish, mostly in Clang
@@ -107,8 +115,8 @@ E: stefanus.du.toit@intel.com
 D: Bug fixes and minor improvements
 D: Bug fixes and minor improvements
 
 
 N: Rafael Avila de Espindola
 N: Rafael Avila de Espindola
-E: rafael.espindola@gmail.com
-D: The ARM backend
+E: rafael@espindo.la
+D: MC and LLD work
 
 
 N: Dave Estes
 N: Dave Estes
 E: cestes@codeaurora.org
 E: cestes@codeaurora.org
@@ -124,7 +132,7 @@ D: Basic-block autovectorization, PowerPC backend improvements
 
 
 N: Eric Fiselier
 N: Eric Fiselier
 E: eric@efcs.ca
 E: eric@efcs.ca
-D: LIT patches and documentation.
+D: LIT patches and documentation
 
 
 N: Ryan Flynn
 N: Ryan Flynn
 E: pizza@parseerror.com
 E: pizza@parseerror.com
@@ -159,6 +167,17 @@ E: sunfish@mozilla.com
 D: Miscellaneous bug fixes
 D: Miscellaneous bug fixes
 D: WebAssembly Backend
 D: WebAssembly Backend
 
 
+N: Renato Golin
+E: rengolin@systemcall.eu
+E: renato.golin@linaro.org
+E: rengolin@gmail.com
+D: ARM/AArch64 back-end improvements
+D: Loop Vectorizer improvements
+D: Regression and Test Suite improvements
+D: Linux compatibility (GNU, musl, etc)
+D: Initial Linux kernel / Android support effort
+I: rengolin
+
 N: David Goodwin
 N: David Goodwin
 E: david@goodwinz.net
 E: david@goodwinz.net
 D: Thumb-2 code generator
 D: Thumb-2 code generator
@@ -224,6 +243,11 @@ N: Rod Kay
 E: rkay@auroraux.org
 E: rkay@auroraux.org
 D: Author of LLVM Ada bindings
 D: Author of LLVM Ada bindings
 
 
+N: Erich Keane
+E: erich.keane@intel.com
+D: A variety of Clang contributions including function multiversioning, regcall/vectorcall.
+I: ErichKeane
+
 N: Eric Kidd
 N: Eric Kidd
 W: http://randomhacks.net/
 W: http://randomhacks.net/
 D: llvm-config script
 D: llvm-config script
@@ -388,6 +412,10 @@ W: http://vladimir_prus.blogspot.com
 E: ghost@cs.msu.su
 E: ghost@cs.msu.su
 D: Made inst_iterator behave like a proper iterator, LowerConstantExprs pass
 D: Made inst_iterator behave like a proper iterator, LowerConstantExprs pass
 
 
+N: QIU Chaofan
+E: qiucofan@cn.ibm.com
+D: PowerPC Backend Developer
+
 N: Kalle Raiskila
 N: Kalle Raiskila
 E: kalle.rasikila@nokia.com
 E: kalle.rasikila@nokia.com
 D: Some bugfixes to CellSPU
 D: Some bugfixes to CellSPU
@@ -479,9 +507,33 @@ D: Thread Local Storage implementation
 N: Bill Wendling
 N: Bill Wendling
 I: wendling
 I: wendling
 E: isanbard@gmail.com
 E: isanbard@gmail.com
-D: Release manager, IR Linker, LTO
-D: Bunches of stuff
+D: Release manager, IR Linker, LTO.
+D: Bunches of stuff.
 
 
 N: Bob Wilson
 N: Bob Wilson
 E: bob.wilson@acm.org
 E: bob.wilson@acm.org
 D: Advanced SIMD (NEON) support in the ARM backend.
 D: Advanced SIMD (NEON) support in the ARM backend.
+
+N: QingShan Zhang
+E: qshanz@cn.ibm.com
+D: PowerPC Backend Developer
+
+N: Li Jia He
+E: hljhehlj@cn.ibm.com
+D: PowerPC Backend Developer
+
+N: Zixuan Wu
+E: wuzish@cn.ibm.com
+D: PowerPC Backend Developer
+
+N: Kang Zhang
+E: shkzhang@cn.ibm.com
+D: PowerPC Backend Developer
+
+N: Zheng Chen
+E: czhengsz@cn.ibm.com
+D: PowerPC Backend Developer
+
+N: Djordje Todorovic
+E: djordje.todorovic@rt-rk.com
+D: Debug Information

+ 237 - 26
LICENSE.TXT

@@ -1,10 +1,245 @@
 ==============================================================================
 ==============================================================================
-LLVM Release License
+The LLVM Project is under the Apache License v2.0 with LLVM Exceptions:
+==============================================================================
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+    1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+    2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+    3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+    4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+    5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+    6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+    7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+    8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+    9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+    END OF TERMS AND CONDITIONS
+
+    APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+    Copyright [yyyy] [name of copyright owner]
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+
+---- LLVM Exceptions to the Apache 2.0 License ----
+
+As an exception, if, as a result of your compiling your source code, portions
+of this Software are embedded into an Object form of such source code, you
+may redistribute such embedded portions in such Object form without complying
+with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
+
+In addition, if you combine or link compiled forms of this Software with
+software that is licensed under the GPLv2 ("Combined Software") and if a
+court of competent jurisdiction determines that the patent provision (Section
+3), the indemnity provision (Section 9) or other Section of the License
+conflicts with the conditions of the GPLv2, you may retroactively and
+prospectively choose to deem waived or otherwise exclude such Section(s) of
+the License, but only in their entirety and only with respect to the Combined
+Software.
+
+==============================================================================
+Software from third parties included in the LLVM Project:
+==============================================================================
+The LLVM Project contains third party software which is under different license
+terms. All such code will be identified clearly using at least one of two
+mechanisms:
+1) It will be in a separate directory tree with its own `LICENSE.txt` or
+   `LICENSE` file at the top containing the specific license and restrictions
+   which apply to that software, or
+2) It will contain specific license and restriction terms at the top of every
+   file.
+
+==============================================================================
+Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy):
 ==============================================================================
 ==============================================================================
 University of Illinois/NCSA
 University of Illinois/NCSA
 Open Source License
 Open Source License
 
 
-Copyright (c) 2003-2017 University of Illinois at Urbana-Champaign.
+Copyright (c) 2003-2019 University of Illinois at Urbana-Champaign.
 All rights reserved.
 All rights reserved.
 
 
 Developed by:
 Developed by:
@@ -42,27 +277,3 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
 SOFTWARE.
 SOFTWARE.
 
 
-==============================================================================
-Copyrights and Licenses for Third Party Software Distributed with LLVM:
-==============================================================================
-The LLVM software contains code written by third parties.  Such software will
-have its own individual LICENSE.TXT file in the directory in which it appears.
-This file will describe the copyrights, license, and restrictions which apply
-to that code.
-
-The disclaimer of warranty in the University of Illinois Open Source License
-applies to all code in the LLVM Distribution, and nothing in any of the
-other licenses gives permission to use the names of the LLVM Team or the
-University of Illinois to endorse or promote products derived from this
-Software.
-
-The following pieces of software have additional or alternate copyrights,
-licenses, and/or restrictions:
-
-Program             Directory
--------             ---------
-Google Test         llvm/utils/unittest/googletest
-OpenBSD regex       llvm/lib/Support/{reg*, COPYRIGHT.regex}
-pyyaml tests        llvm/test/YAMLParser/{*.data, LICENSE.TXT}
-ARM contributions   llvm/lib/Target/ARM/LICENSE.TXT
-md5 contributions   llvm/lib/Support/MD5.cpp llvm/include/llvm/Support/MD5.h

+ 3 - 4
LLVMBuild.txt

@@ -1,9 +1,8 @@
 ;===- ./LLVMBuild.txt ------------------------------------------*- Conf -*--===;
 ;===- ./LLVMBuild.txt ------------------------------------------*- Conf -*--===;
 ;
 ;
-;                     The LLVM Compiler Infrastructure
-;
-; This file is distributed under the University of Illinois Open Source
-; License. See LICENSE.TXT for details.
+; Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+; See https://llvm.org/LICENSE.txt for license information.
+; SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 ;
 ;
 ;===------------------------------------------------------------------------===;
 ;===------------------------------------------------------------------------===;
 ;
 ;

+ 2 - 2
README.txt

@@ -1,5 +1,5 @@
-Low Level Virtual Machine  for iOS (LLVM)
-=========================================
+The LLVM Compiler Infrastructure
+================================
 
 
 This directory and its subdirectories contain a forked source code 
 This directory and its subdirectories contain a forked source code 
 for LLVM, a toolkit for the construction of highly optimized compilers,
 for LLVM, a toolkit for the construction of highly optimized compilers,

+ 4 - 9
RELEASE_TESTERS.TXT

@@ -13,8 +13,8 @@ O: Ubuntu
 
 
 N: Sylvestre Ledru
 N: Sylvestre Ledru
 E: sylvestre@debian.org
 E: sylvestre@debian.org
-T: x86
-O: Debian
+T: All supported archs Debian/Ubuntu
+O: Debian/Ubuntu packages
 
 
 N: Nikola Smiljanic
 N: Nikola Smiljanic
 E: popizdeh@gmail.com
 E: popizdeh@gmail.com
@@ -41,12 +41,7 @@ E: hans@chromium.org
 T: x86
 T: x86
 O: Windows
 O: Windows
 
 
-N: Diana Picus
-E: diana.picus@linaro.org
+N: Diana Picus, Yvan Roux
+E: diana.picus@linaro.org, yvan.roux@linaro.org
 T: ARM, AArch64
 T: ARM, AArch64
 O: Linux
 O: Linux
-
-N: Simon Dardis
-E: simon.dardis@mips.com
-T: MIPS
-O: Linux

+ 4 - 0
benchmarks/CMakeLists.txt

@@ -0,0 +1,4 @@
+set(LLVM_LINK_COMPONENTS
+  Support)
+
+add_benchmark(DummyYAML DummyYAML.cpp)

+ 13 - 0
benchmarks/DummyYAML.cpp

@@ -0,0 +1,13 @@
+#include "benchmark/benchmark.h"
+#include "llvm/Support/YAMLTraits.h"
+
+static void BM_YAMLDummyIsNumeric(benchmark::State& state) {
+  std::string x = "hello";
+  for (auto _ : state) {
+    std::string copy(x);
+    llvm::yaml::isNumeric(copy);
+  }
+}
+BENCHMARK(BM_YAMLDummyIsNumeric);
+
+BENCHMARK_MAIN();

+ 3 - 4
bindings/LLVMBuild.txt

@@ -1,9 +1,8 @@
 ;===- ./bindings/LLVMBuild.txt ---------------------------------*- Conf -*--===;
 ;===- ./bindings/LLVMBuild.txt ---------------------------------*- Conf -*--===;
 ;
 ;
-;                     The LLVM Compiler Infrastructure
-;
-; This file is distributed under the University of Illinois Open Source
-; License. See LICENSE.TXT for details.
+; Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+; See https://llvm.org/LICENSE.txt for license information.
+; SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 ;
 ;
 ;===------------------------------------------------------------------------===;
 ;===------------------------------------------------------------------------===;
 ;
 ;

+ 1 - 1
bindings/go/README.txt

@@ -48,7 +48,7 @@ Alternatively, you can build LLVM yourself, but you must then set the
 CGO_CPPFLAGS, CGO_CXXFLAGS and CGO_LDFLAGS environment variables:
 CGO_CPPFLAGS, CGO_CXXFLAGS and CGO_LDFLAGS environment variables:
 
 
     $ export CGO_CPPFLAGS="`/path/to/llvm-build/bin/llvm-config --cppflags`"
     $ export CGO_CPPFLAGS="`/path/to/llvm-build/bin/llvm-config --cppflags`"
-    $ export CGO_CXXFLAGS=-std=c++11
+    $ export CGO_CXXFLAGS=-std=c++14
     $ export CGO_LDFLAGS="`/path/to/llvm-build/bin/llvm-config --ldflags --libs --system-libs all`"
     $ export CGO_LDFLAGS="`/path/to/llvm-build/bin/llvm-config --ldflags --libs --system-libs all`"
     $ go build -tags byollvm
     $ go build -tags byollvm
 
 

+ 0 - 30
bindings/go/llvm/DIBuilderBindings.cpp

@@ -1,30 +0,0 @@
-//===- DIBuilderBindings.cpp - Bindings for DIBuilder ---------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file defines C bindings for the DIBuilder class.
-//
-//===----------------------------------------------------------------------===//
-
-#include "DIBuilderBindings.h"
-#include "IRBindings.h"
-#include "llvm/IR/DIBuilder.h"
-#include "llvm/IR/IRBuilder.h"
-#include "llvm/IR/Module.h"
-
-using namespace llvm;
-
-LLVMMetadataRef LLVMDIBuilderCreateTypedef(LLVMDIBuilderRef Dref,
-                                           LLVMMetadataRef Ty, const char *Name,
-                                           LLVMMetadataRef File, unsigned Line,
-                                           LLVMMetadataRef Context) {
-  DIBuilder *D = unwrap(Dref);
-  return wrap(D->createTypedef(unwrap<DIType>(Ty), Name,
-                               File ? unwrap<DIFile>(File) : nullptr, Line,
-                               Context ? unwrap<DIScope>(Context) : nullptr));
-}

+ 0 - 40
bindings/go/llvm/DIBuilderBindings.h

@@ -1,40 +0,0 @@
-//===- DIBuilderBindings.h - Bindings for DIBuilder -------------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file defines C bindings for the DIBuilder class.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_BINDINGS_GO_LLVM_DIBUILDERBINDINGS_H
-#define LLVM_BINDINGS_GO_LLVM_DIBUILDERBINDINGS_H
-
-#include "IRBindings.h"
-#include "llvm-c/Core.h"
-#include "llvm-c/DebugInfo.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// FIXME: These bindings shouldn't be Go-specific and should eventually move to
-// a (somewhat) less stable collection of C APIs for use in creating bindings of
-// LLVM in other languages.
-
-typedef struct LLVMOpaqueDIBuilder *LLVMDIBuilderRef;
-
-LLVMMetadataRef LLVMDIBuilderCreateTypedef(LLVMDIBuilderRef D,
-                                           LLVMMetadataRef Ty, const char *Name,
-                                           LLVMMetadataRef File, unsigned Line,
-                                           LLVMMetadataRef Context);
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif

+ 5 - 19
bindings/go/llvm/IRBindings.cpp

@@ -1,9 +1,8 @@
 //===- IRBindings.cpp - Additional bindings for ir ------------------------===//
 //===- IRBindings.cpp - Additional bindings for ir ------------------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //
@@ -36,13 +35,6 @@ LLVMMetadataRef LLVMMDNode2(LLVMContextRef C, LLVMMetadataRef *MDs,
       MDNode::get(*unwrap(C), ArrayRef<Metadata *>(unwrap(MDs), Count)));
       MDNode::get(*unwrap(C), ArrayRef<Metadata *>(unwrap(MDs), Count)));
 }
 }
 
 
-LLVMMetadataRef LLVMTemporaryMDNode(LLVMContextRef C, LLVMMetadataRef *MDs,
-                                    unsigned Count) {
-  return wrap(MDTuple::getTemporary(*unwrap(C),
-                                    ArrayRef<Metadata *>(unwrap(MDs), Count))
-                  .release());
-}
-
 void LLVMAddNamedMetadataOperand2(LLVMModuleRef M, const char *name,
 void LLVMAddNamedMetadataOperand2(LLVMModuleRef M, const char *name,
                                   LLVMMetadataRef Val) {
                                   LLVMMetadataRef Val) {
   NamedMDNode *N = unwrap(M)->getOrInsertNamedMetadata(name);
   NamedMDNode *N = unwrap(M)->getOrInsertNamedMetadata(name);
@@ -58,13 +50,7 @@ void LLVMSetMetadata2(LLVMValueRef Inst, unsigned KindID, LLVMMetadataRef MD) {
   unwrap<Instruction>(Inst)->setMetadata(KindID, N);
   unwrap<Instruction>(Inst)->setMetadata(KindID, N);
 }
 }
 
 
-void LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef MD, LLVMMetadataRef New) {
-  auto *Node = unwrap<MDNode>(MD);
-  Node->replaceAllUsesWith(unwrap<Metadata>(New));
-  MDNode::deleteTemporary(Node);
-}
-
-void LLVMSetCurrentDebugLocation2(LLVMBuilderRef Bref, unsigned Line,
+void LLVMGoSetCurrentDebugLocation(LLVMBuilderRef Bref, unsigned Line,
                                   unsigned Col, LLVMMetadataRef Scope,
                                   unsigned Col, LLVMMetadataRef Scope,
                                   LLVMMetadataRef InlinedAt) {
                                   LLVMMetadataRef InlinedAt) {
   unwrap(Bref)->SetCurrentDebugLocation(
   unwrap(Bref)->SetCurrentDebugLocation(
@@ -72,7 +58,7 @@ void LLVMSetCurrentDebugLocation2(LLVMBuilderRef Bref, unsigned Line,
                     InlinedAt ? unwrap<MDNode>(InlinedAt) : nullptr));
                     InlinedAt ? unwrap<MDNode>(InlinedAt) : nullptr));
 }
 }
 
 
-LLVMDebugLocMetadata LLVMGetCurrentDebugLocation2(LLVMBuilderRef Bref) {
+LLVMDebugLocMetadata LLVMGoGetCurrentDebugLocation(LLVMBuilderRef Bref) {
   const auto& Loc = unwrap(Bref)->getCurrentDebugLocation();
   const auto& Loc = unwrap(Bref)->getCurrentDebugLocation();
   const auto* InlinedAt = Loc.getInlinedAt();
   const auto* InlinedAt = Loc.getInlinedAt();
   const LLVMDebugLocMetadata md{
   const LLVMDebugLocMetadata md{

+ 6 - 10
bindings/go/llvm/IRBindings.h

@@ -1,9 +1,8 @@
 //===- IRBindings.h - Additional bindings for IR ----------------*- C++ -*-===//
 //===- IRBindings.h - Additional bindings for IR ----------------*- C++ -*-===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //
@@ -15,6 +14,7 @@
 #define LLVM_BINDINGS_GO_LLVM_IRBINDINGS_H
 #define LLVM_BINDINGS_GO_LLVM_IRBINDINGS_H
 
 
 #include "llvm-c/Core.h"
 #include "llvm-c/Core.h"
+#include "llvm-c/DebugInfo.h"
 #ifdef __cplusplus
 #ifdef __cplusplus
 #include "llvm/IR/Metadata.h"
 #include "llvm/IR/Metadata.h"
 #include "llvm/Support/CBindingWrapping.h"
 #include "llvm/Support/CBindingWrapping.h"
@@ -38,20 +38,16 @@ LLVMMetadataRef LLVMConstantAsMetadata(LLVMValueRef Val);
 LLVMMetadataRef LLVMMDString2(LLVMContextRef C, const char *Str, unsigned SLen);
 LLVMMetadataRef LLVMMDString2(LLVMContextRef C, const char *Str, unsigned SLen);
 LLVMMetadataRef LLVMMDNode2(LLVMContextRef C, LLVMMetadataRef *MDs,
 LLVMMetadataRef LLVMMDNode2(LLVMContextRef C, LLVMMetadataRef *MDs,
                             unsigned Count);
                             unsigned Count);
-LLVMMetadataRef LLVMTemporaryMDNode(LLVMContextRef C, LLVMMetadataRef *MDs,
-                                    unsigned Count);
 
 
 void LLVMAddNamedMetadataOperand2(LLVMModuleRef M, const char *name,
 void LLVMAddNamedMetadataOperand2(LLVMModuleRef M, const char *name,
                                   LLVMMetadataRef Val);
                                   LLVMMetadataRef Val);
 void LLVMSetMetadata2(LLVMValueRef Inst, unsigned KindID, LLVMMetadataRef MD);
 void LLVMSetMetadata2(LLVMValueRef Inst, unsigned KindID, LLVMMetadataRef MD);
 
 
-void LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef MD, LLVMMetadataRef New);
-
-void LLVMSetCurrentDebugLocation2(LLVMBuilderRef Bref, unsigned Line,
+void LLVMGoSetCurrentDebugLocation(LLVMBuilderRef Bref, unsigned Line,
                                   unsigned Col, LLVMMetadataRef Scope,
                                   unsigned Col, LLVMMetadataRef Scope,
                                   LLVMMetadataRef InlinedAt);
                                   LLVMMetadataRef InlinedAt);
 
 
-struct LLVMDebugLocMetadata LLVMGetCurrentDebugLocation2(LLVMBuilderRef Bref);
+struct LLVMDebugLocMetadata LLVMGoGetCurrentDebugLocation(LLVMBuilderRef Bref);
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 }
 }

+ 10 - 8
bindings/go/llvm/InstrumentationBindings.cpp

@@ -1,9 +1,8 @@
 //===- InstrumentationBindings.cpp - instrumentation bindings -------------===//
 //===- InstrumentationBindings.cpp - instrumentation bindings -------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //
@@ -16,6 +15,9 @@
 #include "llvm/IR/LegacyPassManager.h"
 #include "llvm/IR/LegacyPassManager.h"
 #include "llvm/IR/Module.h"
 #include "llvm/IR/Module.h"
 #include "llvm/Transforms/Instrumentation.h"
 #include "llvm/Transforms/Instrumentation.h"
+#include "llvm/Transforms/Instrumentation/AddressSanitizer.h"
+#include "llvm/Transforms/Instrumentation/MemorySanitizer.h"
+#include "llvm/Transforms/Instrumentation/ThreadSanitizer.h"
 
 
 using namespace llvm;
 using namespace llvm;
 
 
@@ -24,15 +26,15 @@ void LLVMAddAddressSanitizerFunctionPass(LLVMPassManagerRef PM) {
 }
 }
 
 
 void LLVMAddAddressSanitizerModulePass(LLVMPassManagerRef PM) {
 void LLVMAddAddressSanitizerModulePass(LLVMPassManagerRef PM) {
-  unwrap(PM)->add(createAddressSanitizerModulePass());
+  unwrap(PM)->add(createModuleAddressSanitizerLegacyPassPass());
 }
 }
 
 
 void LLVMAddThreadSanitizerPass(LLVMPassManagerRef PM) {
 void LLVMAddThreadSanitizerPass(LLVMPassManagerRef PM) {
-  unwrap(PM)->add(createThreadSanitizerPass());
+  unwrap(PM)->add(createThreadSanitizerLegacyPassPass());
 }
 }
 
 
-void LLVMAddMemorySanitizerPass(LLVMPassManagerRef PM) {
-  unwrap(PM)->add(createMemorySanitizerPass());
+void LLVMAddMemorySanitizerLegacyPassPass(LLVMPassManagerRef PM) {
+  unwrap(PM)->add(createMemorySanitizerLegacyPassPass());
 }
 }
 
 
 void LLVMAddDataFlowSanitizerPass(LLVMPassManagerRef PM,
 void LLVMAddDataFlowSanitizerPass(LLVMPassManagerRef PM,

+ 4 - 5
bindings/go/llvm/InstrumentationBindings.h

@@ -1,9 +1,8 @@
 //===- InstrumentationBindings.h - instrumentation bindings -----*- C++ -*-===//
 //===- InstrumentationBindings.h - instrumentation bindings -----*- C++ -*-===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //
@@ -27,7 +26,7 @@ extern "C" {
 void LLVMAddAddressSanitizerFunctionPass(LLVMPassManagerRef PM);
 void LLVMAddAddressSanitizerFunctionPass(LLVMPassManagerRef PM);
 void LLVMAddAddressSanitizerModulePass(LLVMPassManagerRef PM);
 void LLVMAddAddressSanitizerModulePass(LLVMPassManagerRef PM);
 void LLVMAddThreadSanitizerPass(LLVMPassManagerRef PM);
 void LLVMAddThreadSanitizerPass(LLVMPassManagerRef PM);
-void LLVMAddMemorySanitizerPass(LLVMPassManagerRef PM);
+void LLVMAddMemorySanitizerLegacyPassPass(LLVMPassManagerRef PM);
 void LLVMAddDataFlowSanitizerPass(LLVMPassManagerRef PM, int ABIListFilesNum,
 void LLVMAddDataFlowSanitizerPass(LLVMPassManagerRef PM, int ABIListFilesNum,
                                   const char **ABIListFiles);
                                   const char **ABIListFiles);
 
 

+ 3 - 4
bindings/go/llvm/SupportBindings.cpp

@@ -1,9 +1,8 @@
 //===- SupportBindings.cpp - Additional bindings for support --------------===//
 //===- SupportBindings.cpp - Additional bindings for support --------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //

+ 3 - 4
bindings/go/llvm/SupportBindings.h

@@ -1,9 +1,8 @@
 //===- SupportBindings.h - Additional bindings for Support ------*- C++ -*-===//
 //===- SupportBindings.h - Additional bindings for Support ------*- C++ -*-===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //

+ 3 - 4
bindings/go/llvm/analysis.go

@@ -1,9 +1,8 @@
 //===- analysis.go - Bindings for analysis --------------------------------===//
 //===- analysis.go - Bindings for analysis --------------------------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //

+ 3 - 4
bindings/go/llvm/bitreader.go

@@ -1,9 +1,8 @@
 //===- bitreader.go - Bindings for bitreader ------------------------------===//
 //===- bitreader.go - Bindings for bitreader ------------------------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //

+ 3 - 4
bindings/go/llvm/bitwriter.go

@@ -1,9 +1,8 @@
 //===- bitwriter.go - Bindings for bitwriter ------------------------------===//
 //===- bitwriter.go - Bindings for bitwriter ------------------------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //

+ 146 - 36
bindings/go/llvm/dibuilder.go

@@ -1,9 +1,8 @@
 //===- dibuilder.go - Bindings for DIBuilder ------------------------------===//
 //===- dibuilder.go - Bindings for DIBuilder ------------------------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //
@@ -14,7 +13,7 @@
 package llvm
 package llvm
 
 
 /*
 /*
-#include "DIBuilderBindings.h"
+#include "IRBindings.h"
 #include <stdlib.h>
 #include <stdlib.h>
 */
 */
 import "C"
 import "C"
@@ -45,7 +44,7 @@ const (
 	FlagProtected
 	FlagProtected
 	FlagFwdDecl
 	FlagFwdDecl
 	FlagAppleBlock
 	FlagAppleBlock
-	FlagBlockByrefStruct
+	FlagReserved
 	FlagVirtual
 	FlagVirtual
 	FlagArtificial
 	FlagArtificial
 	FlagExplicit
 	FlagExplicit
@@ -55,6 +54,7 @@ const (
 	FlagVector
 	FlagVector
 	FlagStaticMember
 	FlagStaticMember
 	FlagIndirectVariable
 	FlagIndirectVariable
+	FlagArgumentNotModified
 )
 )
 
 
 type DwarfLang uint32
 type DwarfLang uint32
@@ -297,19 +297,20 @@ func (d *DIBuilder) CreateBasicType(t DIBasicType) Metadata {
 		d.ref,
 		d.ref,
 		name,
 		name,
 		C.size_t(len(t.Name)),
 		C.size_t(len(t.Name)),
-		C.unsigned(t.SizeInBits),
-		C.unsigned(t.Encoding),
+		C.uint64_t(t.SizeInBits),
+		C.LLVMDWARFTypeEncoding(t.Encoding),
+		C.LLVMDIFlags(0),
 	)
 	)
 	return Metadata{C: result}
 	return Metadata{C: result}
 }
 }
 
 
 // DIPointerType holds the values for creating pointer type debug metadata.
 // DIPointerType holds the values for creating pointer type debug metadata.
 type DIPointerType struct {
 type DIPointerType struct {
-	Pointee     Metadata
-	SizeInBits  uint64
-	AlignInBits uint32 // optional
+	Pointee      Metadata
+	SizeInBits   uint64
+	AlignInBits  uint32 // optional
 	AddressSpace uint32
 	AddressSpace uint32
-	Name        string // optional
+	Name         string // optional
 }
 }
 
 
 // CreatePointerType creates a type that represents a pointer to another type.
 // CreatePointerType creates a type that represents a pointer to another type.
@@ -319,8 +320,8 @@ func (d *DIBuilder) CreatePointerType(t DIPointerType) Metadata {
 	result := C.LLVMDIBuilderCreatePointerType(
 	result := C.LLVMDIBuilderCreatePointerType(
 		d.ref,
 		d.ref,
 		t.Pointee.C,
 		t.Pointee.C,
-		C.unsigned(t.SizeInBits),
-		C.unsigned(t.AlignInBits),
+		C.uint64_t(t.SizeInBits),
+		C.uint32_t(t.AlignInBits),
 		C.unsigned(t.AddressSpace),
 		C.unsigned(t.AddressSpace),
 		name,
 		name,
 		C.size_t(len(t.Name)),
 		C.size_t(len(t.Name)),
@@ -355,14 +356,14 @@ func (d *DIBuilder) CreateSubroutineType(t DISubroutineType) Metadata {
 
 
 // DIStructType holds the values for creating struct type debug metadata.
 // DIStructType holds the values for creating struct type debug metadata.
 type DIStructType struct {
 type DIStructType struct {
-	Name        string
-	File        Metadata
-	Line        int
-	SizeInBits  uint64
-	AlignInBits uint32
-	Flags       int
-	DerivedFrom Metadata
-	Elements    []Metadata
+	Name         string
+	File         Metadata
+	Line         int
+	SizeInBits   uint64
+	AlignInBits  uint32
+	Flags        int
+	DerivedFrom  Metadata
+	Elements     []Metadata
 	VTableHolder Metadata // optional
 	VTableHolder Metadata // optional
 	UniqueID     string
 	UniqueID     string
 }
 }
@@ -381,8 +382,8 @@ func (d *DIBuilder) CreateStructType(scope Metadata, t DIStructType) Metadata {
 		C.size_t(len(t.Name)),
 		C.size_t(len(t.Name)),
 		t.File.C,
 		t.File.C,
 		C.unsigned(t.Line),
 		C.unsigned(t.Line),
-		C.unsigned(t.SizeInBits),
-		C.unsigned(t.AlignInBits),
+		C.uint64_t(t.SizeInBits),
+		C.uint32_t(t.AlignInBits),
 		C.LLVMDIFlags(t.Flags),
 		C.LLVMDIFlags(t.Flags),
 		t.DerivedFrom.C,
 		t.DerivedFrom.C,
 		elements,
 		elements,
@@ -424,8 +425,8 @@ func (d *DIBuilder) CreateReplaceableCompositeType(scope Metadata, t DIReplaceab
 		t.File.C,
 		t.File.C,
 		C.unsigned(t.Line),
 		C.unsigned(t.Line),
 		C.unsigned(t.RuntimeLang),
 		C.unsigned(t.RuntimeLang),
-		C.unsigned(t.SizeInBits),
-		C.unsigned(t.AlignInBits),
+		C.uint64_t(t.SizeInBits),
+		C.uint32_t(t.AlignInBits),
 		C.LLVMDIFlags(t.Flags),
 		C.LLVMDIFlags(t.Flags),
 		uniqueID,
 		uniqueID,
 		C.size_t(len(t.UniqueID)),
 		C.size_t(len(t.UniqueID)),
@@ -456,9 +457,9 @@ func (d *DIBuilder) CreateMemberType(scope Metadata, t DIMemberType) Metadata {
 		C.size_t(len(t.Name)),
 		C.size_t(len(t.Name)),
 		t.File.C,
 		t.File.C,
 		C.unsigned(t.Line),
 		C.unsigned(t.Line),
-		C.unsigned(t.SizeInBits),
-		C.unsigned(t.AlignInBits),
-		C.unsigned(t.OffsetInBits),
+		C.uint64_t(t.SizeInBits),
+		C.uint32_t(t.AlignInBits),
+		C.uint64_t(t.OffsetInBits),
 		C.LLVMDIFlags(t.Flags),
 		C.LLVMDIFlags(t.Flags),
 		t.Type.C,
 		t.Type.C,
 	)
 	)
@@ -488,8 +489,8 @@ func (d *DIBuilder) CreateArrayType(t DIArrayType) Metadata {
 	subscripts, length := llvmMetadataRefs(subscriptsSlice)
 	subscripts, length := llvmMetadataRefs(subscriptsSlice)
 	result := C.LLVMDIBuilderCreateArrayType(
 	result := C.LLVMDIBuilderCreateArrayType(
 		d.ref,
 		d.ref,
-		C.unsigned(t.SizeInBits),
-		C.unsigned(t.AlignInBits),
+		C.uint64_t(t.SizeInBits),
+		C.uint32_t(t.AlignInBits),
 		t.ElementType.C,
 		t.ElementType.C,
 		subscripts,
 		subscripts,
 		length,
 		length,
@@ -514,6 +515,7 @@ func (d *DIBuilder) CreateTypedef(t DITypedef) Metadata {
 		d.ref,
 		d.ref,
 		t.Type.C,
 		t.Type.C,
 		name,
 		name,
+		C.size_t(len(t.Name)),
 		t.File.C,
 		t.File.C,
 		C.unsigned(t.Line),
 		C.unsigned(t.Line),
 		t.Context.C,
 		t.Context.C,
@@ -563,20 +565,24 @@ func (d *DIBuilder) CreateExpression(addr []int64) Metadata {
 
 
 // InsertDeclareAtEnd inserts a call to llvm.dbg.declare at the end of the
 // InsertDeclareAtEnd inserts a call to llvm.dbg.declare at the end of the
 // specified basic block for the given value and associated debug metadata.
 // specified basic block for the given value and associated debug metadata.
-func (d *DIBuilder) InsertDeclareAtEnd(v Value, diVarInfo, expr Metadata, bb BasicBlock) Value {
-	result := C.LLVMDIBuilderInsertDeclareAtEnd(d.ref, v.C, diVarInfo.C, expr.C, nil, bb.C)
+func (d *DIBuilder) InsertDeclareAtEnd(v Value, diVarInfo, expr Metadata, l DebugLoc, bb BasicBlock) Value {
+	loc := C.LLVMDIBuilderCreateDebugLocation(
+		d.m.Context().C, C.uint(l.Line), C.uint(l.Col), l.Scope.C, l.InlinedAt.C)
+	result := C.LLVMDIBuilderInsertDeclareAtEnd(d.ref, v.C, diVarInfo.C, expr.C, loc, bb.C)
 	return Value{C: result}
 	return Value{C: result}
 }
 }
 
 
 // InsertValueAtEnd inserts a call to llvm.dbg.value at the end of the
 // InsertValueAtEnd inserts a call to llvm.dbg.value at the end of the
 // specified basic block for the given value and associated debug metadata.
 // specified basic block for the given value and associated debug metadata.
-func (d *DIBuilder) InsertValueAtEnd(v Value, diVarInfo, expr Metadata, bb BasicBlock) Value {
-	result := C.LLVMDIBuilderInsertDbgValueAtEnd(d.ref, v.C, diVarInfo.C, expr.C, nil, bb.C)
+func (d *DIBuilder) InsertValueAtEnd(v Value, diVarInfo, expr Metadata, l DebugLoc, bb BasicBlock) Value {
+	loc := C.LLVMDIBuilderCreateDebugLocation(
+		d.m.Context().C, C.uint(l.Line), C.uint(l.Col), l.Scope.C, l.InlinedAt.C)
+	result := C.LLVMDIBuilderInsertDbgValueAtEnd(d.ref, v.C, diVarInfo.C, expr.C, loc, bb.C)
 	return Value{C: result}
 	return Value{C: result}
 }
 }
 
 
 func (v Value) SetSubprogram(sp Metadata) {
 func (v Value) SetSubprogram(sp Metadata) {
-  C.LLVMSetSubprogram(v.C, sp.C)
+	C.LLVMSetSubprogram(v.C, sp.C)
 }
 }
 
 
 func boolToCInt(v bool) C.int {
 func boolToCInt(v bool) C.int {
@@ -585,3 +591,107 @@ func boolToCInt(v bool) C.int {
 	}
 	}
 	return 0
 	return 0
 }
 }
+
+//-------------------------------------------------------------------------
+// llvm.Metadata
+//-------------------------------------------------------------------------
+
+func (c Context) TemporaryMDNode(mds []Metadata) (md Metadata) {
+	ptr, nvals := llvmMetadataRefs(mds)
+	md.C = C.LLVMTemporaryMDNode(c.C, ptr, C.size_t(nvals))
+	return
+}
+
+func (md Metadata) ReplaceAllUsesWith(new Metadata) {
+	C.LLVMMetadataReplaceAllUsesWith(md.C, new.C)
+}
+
+type MetadataKind C.LLVMMetadataKind
+
+const (
+	MDStringMetadataKind                     = C.LLVMMDStringMetadataKind
+	ConstantAsMetadataMetadataKind           = C.LLVMConstantAsMetadataMetadataKind
+	LocalAsMetadataMetadataKind              = C.LLVMLocalAsMetadataMetadataKind
+	DistinctMDOperandPlaceholderMetadataKind = C.LLVMDistinctMDOperandPlaceholderMetadataKind
+	MDTupleMetadataKind                      = C.LLVMMDTupleMetadataKind
+	DILocationMetadataKind                   = C.LLVMDILocationMetadataKind
+	DIExpressionMetadataKind                 = C.LLVMDIExpressionMetadataKind
+	DIGlobalVariableExpressionMetadataKind   = C.LLVMDIGlobalVariableExpressionMetadataKind
+	GenericDINodeMetadataKind                = C.LLVMGenericDINodeMetadataKind
+	DISubrangeMetadataKind                   = C.LLVMDISubrangeMetadataKind
+	DIEnumeratorMetadataKind                 = C.LLVMDIEnumeratorMetadataKind
+	DIBasicTypeMetadataKind                  = C.LLVMDIBasicTypeMetadataKind
+	DIDerivedTypeMetadataKind                = C.LLVMDIDerivedTypeMetadataKind
+	DICompositeTypeMetadataKind              = C.LLVMDICompositeTypeMetadataKind
+	DISubroutineTypeMetadataKind             = C.LLVMDISubroutineTypeMetadataKind
+	DIFileMetadataKind                       = C.LLVMDIFileMetadataKind
+	DICompileUnitMetadataKind                = C.LLVMDICompileUnitMetadataKind
+	DISubprogramMetadataKind                 = C.LLVMDISubprogramMetadataKind
+	DILexicalBlockMetadataKind               = C.LLVMDILexicalBlockMetadataKind
+	DILexicalBlockFileMetadataKind           = C.LLVMDILexicalBlockFileMetadataKind
+	DINamespaceMetadataKind                  = C.LLVMDINamespaceMetadataKind
+	DIModuleMetadataKind                     = C.LLVMDIModuleMetadataKind
+	DITemplateTypeParameterMetadataKind      = C.LLVMDITemplateTypeParameterMetadataKind
+	DITemplateValueParameterMetadataKind     = C.LLVMDITemplateValueParameterMetadataKind
+	DIGlobalVariableMetadataKind             = C.LLVMDIGlobalVariableMetadataKind
+	DILocalVariableMetadataKind              = C.LLVMDILocalVariableMetadataKind
+	DILabelMetadataKind                      = C.LLVMDILabelMetadataKind
+	DIObjCPropertyMetadataKind               = C.LLVMDIObjCPropertyMetadataKind
+	DIImportedEntityMetadataKind             = C.LLVMDIImportedEntityMetadataKind
+	DIMacroMetadataKind                      = C.LLVMDIMacroMetadataKind
+	DIMacroFileMetadataKind                  = C.LLVMDIMacroFileMetadataKind
+	DICommonBlockMetadataKind                = C.LLVMDICommonBlockMetadataKind
+)
+
+// Kind returns the metadata kind.
+func (md Metadata) Kind() MetadataKind {
+	return MetadataKind(C.LLVMGetMetadataKind(md.C))
+}
+
+// FileDirectory returns the directory of a DIFile metadata node.
+func (md Metadata) FileDirectory() string {
+	var length C.unsigned
+	ptr := C.LLVMDIFileGetDirectory(md.C, &length)
+	return string(((*[1 << 20]byte)(unsafe.Pointer(ptr)))[:length:length])
+}
+
+// FileFilename returns the filename of a DIFile metadata node.
+func (md Metadata) FileFilename() string {
+	var length C.unsigned
+	ptr := C.LLVMDIFileGetFilename(md.C, &length)
+	return string(((*[1 << 20]byte)(unsafe.Pointer(ptr)))[:length:length])
+}
+
+// FileSource returns the source of a DIFile metadata node.
+func (md Metadata) FileSource() string {
+	var length C.unsigned
+	ptr := C.LLVMDIFileGetSource(md.C, &length)
+	return string(((*[1 << 20]byte)(unsafe.Pointer(ptr)))[:length:length])
+}
+
+// LocationLine returns the line number of a DILocation.
+func (md Metadata) LocationLine() uint {
+	return uint(C.LLVMDILocationGetLine(md.C))
+}
+
+// LocationColumn returns the column (offset from the start of the line) of a
+// DILocation.
+func (md Metadata) LocationColumn() uint {
+	return uint(C.LLVMDILocationGetColumn(md.C))
+}
+
+// LocationScope returns the local scope associated with this debug location.
+func (md Metadata) LocationScope() Metadata {
+	return Metadata{C.LLVMDILocationGetScope(md.C)}
+}
+
+// LocationInlinedAt return the "inline at" location associated with this debug
+// location.
+func (md Metadata) LocationInlinedAt() Metadata {
+	return Metadata{C.LLVMDILocationGetInlinedAt(md.C)}
+}
+
+// ScopeFile returns the file (DIFile) of a given scope.
+func (md Metadata) ScopeFile() Metadata {
+	return Metadata{C.LLVMDIScopeGetFile(md.C)}
+}

+ 3 - 4
bindings/go/llvm/executionengine.go

@@ -1,9 +1,8 @@
 //===- executionengine.go - Bindings for executionengine ------------------===//
 //===- executionengine.go - Bindings for executionengine ------------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //

+ 3 - 4
bindings/go/llvm/executionengine_test.go

@@ -1,9 +1,8 @@
 //===- executionengine_test.go - Tests for executionengine ----------------===//
 //===- executionengine_test.go - Tests for executionengine ----------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //

+ 157 - 67
bindings/go/llvm/ir.go

@@ -1,9 +1,8 @@
 //===- ir.go - Bindings for ir --------------------------------------------===//
 //===- ir.go - Bindings for ir --------------------------------------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //
@@ -66,6 +65,8 @@ type (
 		C C.LLVMAttributeRef
 		C C.LLVMAttributeRef
 	}
 	}
 	Opcode              C.LLVMOpcode
 	Opcode              C.LLVMOpcode
+	AtomicRMWBinOp      C.LLVMAtomicRMWBinOp
+	AtomicOrdering      C.LLVMAtomicOrdering
 	TypeKind            C.LLVMTypeKind
 	TypeKind            C.LLVMTypeKind
 	Linkage             C.LLVMLinkage
 	Linkage             C.LLVMLinkage
 	Visibility          C.LLVMVisibility
 	Visibility          C.LLVMVisibility
@@ -74,6 +75,7 @@ type (
 	IntPredicate        C.LLVMIntPredicate
 	IntPredicate        C.LLVMIntPredicate
 	FloatPredicate      C.LLVMRealPredicate
 	FloatPredicate      C.LLVMRealPredicate
 	LandingPadClause    C.LLVMLandingPadClauseTy
 	LandingPadClause    C.LLVMLandingPadClauseTy
+	InlineAsmDialect    C.LLVMInlineAsmDialect
 )
 )
 
 
 func (c Context) IsNil() bool        { return c.C == nil }
 func (c Context) IsNil() bool        { return c.C == nil }
@@ -87,6 +89,7 @@ func (c MemoryBuffer) IsNil() bool   { return c.C == nil }
 func (c PassManager) IsNil() bool    { return c.C == nil }
 func (c PassManager) IsNil() bool    { return c.C == nil }
 func (c Use) IsNil() bool            { return c.C == nil }
 func (c Use) IsNil() bool            { return c.C == nil }
 func (c Attribute) IsNil() bool      { return c.C == nil }
 func (c Attribute) IsNil() bool      { return c.C == nil }
+func (c Metadata) IsNil() bool       { return c.C == nil }
 
 
 // helpers
 // helpers
 func llvmTypeRefPtr(t *Type) *C.LLVMTypeRef    { return (*C.LLVMTypeRef)(unsafe.Pointer(t)) }
 func llvmTypeRefPtr(t *Type) *C.LLVMTypeRef    { return (*C.LLVMTypeRef)(unsafe.Pointer(t)) }
@@ -192,6 +195,30 @@ const (
 	InsertValue    Opcode = C.LLVMInsertValue
 	InsertValue    Opcode = C.LLVMInsertValue
 )
 )
 
 
+const (
+	AtomicRMWBinOpXchg AtomicRMWBinOp = C.LLVMAtomicRMWBinOpXchg
+	AtomicRMWBinOpAdd  AtomicRMWBinOp = C.LLVMAtomicRMWBinOpAdd
+	AtomicRMWBinOpSub  AtomicRMWBinOp = C.LLVMAtomicRMWBinOpSub
+	AtomicRMWBinOpAnd  AtomicRMWBinOp = C.LLVMAtomicRMWBinOpAnd
+	AtomicRMWBinOpNand AtomicRMWBinOp = C.LLVMAtomicRMWBinOpNand
+	AtomicRMWBinOpOr   AtomicRMWBinOp = C.LLVMAtomicRMWBinOpOr
+	AtomicRMWBinOpXor  AtomicRMWBinOp = C.LLVMAtomicRMWBinOpXor
+	AtomicRMWBinOpMax  AtomicRMWBinOp = C.LLVMAtomicRMWBinOpMax
+	AtomicRMWBinOpMin  AtomicRMWBinOp = C.LLVMAtomicRMWBinOpMin
+	AtomicRMWBinOpUMax AtomicRMWBinOp = C.LLVMAtomicRMWBinOpUMax
+	AtomicRMWBinOpUMin AtomicRMWBinOp = C.LLVMAtomicRMWBinOpUMin
+)
+
+const (
+	AtomicOrderingNotAtomic              AtomicOrdering = C.LLVMAtomicOrderingNotAtomic
+	AtomicOrderingUnordered              AtomicOrdering = C.LLVMAtomicOrderingUnordered
+	AtomicOrderingMonotonic              AtomicOrdering = C.LLVMAtomicOrderingMonotonic
+	AtomicOrderingAcquire                AtomicOrdering = C.LLVMAtomicOrderingAcquire
+	AtomicOrderingRelease                AtomicOrdering = C.LLVMAtomicOrderingRelease
+	AtomicOrderingAcquireRelease         AtomicOrdering = C.LLVMAtomicOrderingAcquireRelease
+	AtomicOrderingSequentiallyConsistent AtomicOrdering = C.LLVMAtomicOrderingSequentiallyConsistent
+)
+
 //-------------------------------------------------------------------------
 //-------------------------------------------------------------------------
 // llvm.TypeKind
 // llvm.TypeKind
 //-------------------------------------------------------------------------
 //-------------------------------------------------------------------------
@@ -211,6 +238,7 @@ const (
 	PointerTypeKind   TypeKind = C.LLVMPointerTypeKind
 	PointerTypeKind   TypeKind = C.LLVMPointerTypeKind
 	VectorTypeKind    TypeKind = C.LLVMVectorTypeKind
 	VectorTypeKind    TypeKind = C.LLVMVectorTypeKind
 	MetadataTypeKind  TypeKind = C.LLVMMetadataTypeKind
 	MetadataTypeKind  TypeKind = C.LLVMMetadataTypeKind
+	TokenTypeKind     TypeKind = C.LLVMTokenTypeKind
 )
 )
 
 
 //-------------------------------------------------------------------------
 //-------------------------------------------------------------------------
@@ -314,6 +342,15 @@ const (
 	LandingPadFilter LandingPadClause = C.LLVMLandingPadFilter
 	LandingPadFilter LandingPadClause = C.LLVMLandingPadFilter
 )
 )
 
 
+//-------------------------------------------------------------------------
+// llvm.InlineAsmDialect
+//-------------------------------------------------------------------------
+
+const (
+	InlineAsmDialectATT   InlineAsmDialect = C.LLVMInlineAsmDialectATT
+	InlineAsmDialectIntel InlineAsmDialect = C.LLVMInlineAsmDialectIntel
+)
+
 //-------------------------------------------------------------------------
 //-------------------------------------------------------------------------
 // llvm.Context
 // llvm.Context
 //-------------------------------------------------------------------------
 //-------------------------------------------------------------------------
@@ -348,49 +385,49 @@ func AttributeKindID(name string) (id uint) {
 }
 }
 
 
 func (c Context) CreateEnumAttribute(kind uint, val uint64) (a Attribute) {
 func (c Context) CreateEnumAttribute(kind uint, val uint64) (a Attribute) {
-  a.C = C.LLVMCreateEnumAttribute(c.C, C.unsigned(kind), C.uint64_t(val))
-  return
+	a.C = C.LLVMCreateEnumAttribute(c.C, C.unsigned(kind), C.uint64_t(val))
+	return
 }
 }
 
 
 func (a Attribute) GetEnumKind() (id int) {
 func (a Attribute) GetEnumKind() (id int) {
-  id = int(C.LLVMGetEnumAttributeKind(a.C))
-  return
+	id = int(C.LLVMGetEnumAttributeKind(a.C))
+	return
 }
 }
 
 
 func (a Attribute) GetEnumValue() (val uint64) {
 func (a Attribute) GetEnumValue() (val uint64) {
-  val = uint64(C.LLVMGetEnumAttributeValue(a.C))
-  return
+	val = uint64(C.LLVMGetEnumAttributeValue(a.C))
+	return
 }
 }
 
 
 func (c Context) CreateStringAttribute(kind string, val string) (a Attribute) {
 func (c Context) CreateStringAttribute(kind string, val string) (a Attribute) {
-  ckind := C.CString(kind)
-  defer C.free(unsafe.Pointer(ckind))
-  cval := C.CString(val)
-  defer C.free(unsafe.Pointer(cval))
-  a.C = C.LLVMCreateStringAttribute(c.C,
-                                    ckind, C.unsigned(len(kind)),
-                                    cval, C.unsigned(len(val)))
-  return
+	ckind := C.CString(kind)
+	defer C.free(unsafe.Pointer(ckind))
+	cval := C.CString(val)
+	defer C.free(unsafe.Pointer(cval))
+	a.C = C.LLVMCreateStringAttribute(c.C,
+		ckind, C.unsigned(len(kind)),
+		cval, C.unsigned(len(val)))
+	return
 }
 }
 
 
 func (a Attribute) GetStringKind() string {
 func (a Attribute) GetStringKind() string {
-  length := C.unsigned(0)
-  ckind := C.LLVMGetStringAttributeKind(a.C, &length)
-  return C.GoStringN(ckind, C.int(length))
+	length := C.unsigned(0)
+	ckind := C.LLVMGetStringAttributeKind(a.C, &length)
+	return C.GoStringN(ckind, C.int(length))
 }
 }
 
 
 func (a Attribute) GetStringValue() string {
 func (a Attribute) GetStringValue() string {
-  length := C.unsigned(0)
-  ckind := C.LLVMGetStringAttributeValue(a.C, &length)
-  return C.GoStringN(ckind, C.int(length))
+	length := C.unsigned(0)
+	ckind := C.LLVMGetStringAttributeValue(a.C, &length)
+	return C.GoStringN(ckind, C.int(length))
 }
 }
 
 
 func (a Attribute) IsEnum() bool {
 func (a Attribute) IsEnum() bool {
-  return C.LLVMIsEnumAttribute(a.C) != 0;
+	return C.LLVMIsEnumAttribute(a.C) != 0
 }
 }
 
 
 func (a Attribute) IsString() bool {
 func (a Attribute) IsString() bool {
-  return C.LLVMIsStringAttribute(a.C) != 0;
+	return C.LLVMIsStringAttribute(a.C) != 0
 }
 }
 
 
 //-------------------------------------------------------------------------
 //-------------------------------------------------------------------------
@@ -655,6 +692,7 @@ func (t Type) VectorSize() int          { return int(C.LLVMGetVectorSize(t.C)) }
 // Operations on other types
 // Operations on other types
 func (c Context) VoidType() (t Type)  { t.C = C.LLVMVoidTypeInContext(c.C); return }
 func (c Context) VoidType() (t Type)  { t.C = C.LLVMVoidTypeInContext(c.C); return }
 func (c Context) LabelType() (t Type) { t.C = C.LLVMLabelTypeInContext(c.C); return }
 func (c Context) LabelType() (t Type) { t.C = C.LLVMLabelTypeInContext(c.C); return }
+func (c Context) TokenType() (t Type) { t.C = C.LLVMTokenTypeInContext(c.C); return }
 
 
 func VoidType() (t Type)  { t.C = C.LLVMVoidType(); return }
 func VoidType() (t Type)  { t.C = C.LLVMVoidType(); return }
 func LabelType() (t Type) { t.C = C.LLVMLabelType(); return }
 func LabelType() (t Type) { t.C = C.LLVMLabelType(); return }
@@ -727,7 +765,6 @@ func (v Value) IsAPHINode() (rv Value)             { rv.C = C.LLVMIsAPHINode(v.C
 func (v Value) IsASelectInst() (rv Value)          { rv.C = C.LLVMIsASelectInst(v.C); return }
 func (v Value) IsASelectInst() (rv Value)          { rv.C = C.LLVMIsASelectInst(v.C); return }
 func (v Value) IsAShuffleVectorInst() (rv Value)   { rv.C = C.LLVMIsAShuffleVectorInst(v.C); return }
 func (v Value) IsAShuffleVectorInst() (rv Value)   { rv.C = C.LLVMIsAShuffleVectorInst(v.C); return }
 func (v Value) IsAStoreInst() (rv Value)           { rv.C = C.LLVMIsAStoreInst(v.C); return }
 func (v Value) IsAStoreInst() (rv Value)           { rv.C = C.LLVMIsAStoreInst(v.C); return }
-func (v Value) IsATerminatorInst() (rv Value)      { rv.C = C.LLVMIsATerminatorInst(v.C); return }
 func (v Value) IsABranchInst() (rv Value)          { rv.C = C.LLVMIsABranchInst(v.C); return }
 func (v Value) IsABranchInst() (rv Value)          { rv.C = C.LLVMIsABranchInst(v.C); return }
 func (v Value) IsAInvokeInst() (rv Value)          { rv.C = C.LLVMIsAInvokeInst(v.C); return }
 func (v Value) IsAInvokeInst() (rv Value)          { rv.C = C.LLVMIsAInvokeInst(v.C); return }
 func (v Value) IsAReturnInst() (rv Value)          { rv.C = C.LLVMIsAReturnInst(v.C); return }
 func (v Value) IsAReturnInst() (rv Value)          { rv.C = C.LLVMIsAReturnInst(v.C); return }
@@ -784,11 +821,6 @@ func (c Context) MDNode(mds []Metadata) (md Metadata) {
 	md.C = C.LLVMMDNode2(c.C, ptr, nvals)
 	md.C = C.LLVMMDNode2(c.C, ptr, nvals)
 	return
 	return
 }
 }
-func (c Context) TemporaryMDNode(mds []Metadata) (md Metadata) {
-	ptr, nvals := llvmMetadataRefs(mds)
-	md.C = C.LLVMTemporaryMDNode(c.C, ptr, nvals)
-	return
-}
 func (v Value) ConstantAsMetadata() (md Metadata) {
 func (v Value) ConstantAsMetadata() (md Metadata) {
 	md.C = C.LLVMConstantAsMetadata(v.C)
 	md.C = C.LLVMConstantAsMetadata(v.C)
 	return
 	return
@@ -1037,6 +1069,28 @@ func (v Value) IsThreadLocal() bool       { return C.LLVMIsThreadLocal(v.C) != 0
 func (v Value) SetThreadLocal(tl bool)    { C.LLVMSetThreadLocal(v.C, boolToLLVMBool(tl)) }
 func (v Value) SetThreadLocal(tl bool)    { C.LLVMSetThreadLocal(v.C, boolToLLVMBool(tl)) }
 func (v Value) IsGlobalConstant() bool    { return C.LLVMIsGlobalConstant(v.C) != 0 }
 func (v Value) IsGlobalConstant() bool    { return C.LLVMIsGlobalConstant(v.C) != 0 }
 func (v Value) SetGlobalConstant(gc bool) { C.LLVMSetGlobalConstant(v.C, boolToLLVMBool(gc)) }
 func (v Value) SetGlobalConstant(gc bool) { C.LLVMSetGlobalConstant(v.C, boolToLLVMBool(gc)) }
+func (v Value) IsVolatile() bool          { return C.LLVMGetVolatile(v.C) != 0 }
+func (v Value) SetVolatile(volatile bool) { C.LLVMSetVolatile(v.C, boolToLLVMBool(volatile)) }
+func (v Value) Ordering() AtomicOrdering  { return AtomicOrdering(C.LLVMGetOrdering(v.C)) }
+func (v Value) SetOrdering(ordering AtomicOrdering) {
+	C.LLVMSetOrdering(v.C, C.LLVMAtomicOrdering(ordering))
+}
+func (v Value) IsAtomicSingleThread() bool { return C.LLVMIsAtomicSingleThread(v.C) != 0 }
+func (v Value) SetAtomicSingleThread(singleThread bool) {
+	C.LLVMSetAtomicSingleThread(v.C, boolToLLVMBool(singleThread))
+}
+func (v Value) CmpXchgSuccessOrdering() AtomicOrdering {
+	return AtomicOrdering(C.LLVMGetCmpXchgSuccessOrdering(v.C))
+}
+func (v Value) SetCmpXchgSuccessOrdering(ordering AtomicOrdering) {
+	C.LLVMSetCmpXchgSuccessOrdering(v.C, C.LLVMAtomicOrdering(ordering))
+}
+func (v Value) CmpXchgFailureOrdering() AtomicOrdering {
+	return AtomicOrdering(C.LLVMGetCmpXchgFailureOrdering(v.C))
+}
+func (v Value) SetCmpXchgFailureOrdering(ordering AtomicOrdering) {
+	C.LLVMSetCmpXchgFailureOrdering(v.C, C.LLVMAtomicOrdering(ordering))
+}
 
 
 // Operations on aliases
 // Operations on aliases
 func AddAlias(m Module, t Type, aliasee Value, name string) (v Value) {
 func AddAlias(m Module, t Type, aliasee Value, name string) (v Value) {
@@ -1097,36 +1151,36 @@ func (v Value) SetGC(name string) {
 	C.LLVMSetGC(v.C, cname)
 	C.LLVMSetGC(v.C, cname)
 }
 }
 func (v Value) AddAttributeAtIndex(i int, a Attribute) {
 func (v Value) AddAttributeAtIndex(i int, a Attribute) {
-  C.LLVMAddAttributeAtIndex(v.C, C.LLVMAttributeIndex(i), a.C)
+	C.LLVMAddAttributeAtIndex(v.C, C.LLVMAttributeIndex(i), a.C)
 }
 }
 func (v Value) AddFunctionAttr(a Attribute) {
 func (v Value) AddFunctionAttr(a Attribute) {
-  v.AddAttributeAtIndex(C.LLVMAttributeFunctionIndex, a);
+	v.AddAttributeAtIndex(C.LLVMAttributeFunctionIndex, a)
 }
 }
 func (v Value) GetEnumAttributeAtIndex(i int, kind uint) (a Attribute) {
 func (v Value) GetEnumAttributeAtIndex(i int, kind uint) (a Attribute) {
-  a.C = C.LLVMGetEnumAttributeAtIndex(v.C, C.LLVMAttributeIndex(i), C.unsigned(kind))
-  return
+	a.C = C.LLVMGetEnumAttributeAtIndex(v.C, C.LLVMAttributeIndex(i), C.unsigned(kind))
+	return
 }
 }
 func (v Value) GetEnumFunctionAttribute(kind uint) Attribute {
 func (v Value) GetEnumFunctionAttribute(kind uint) Attribute {
-  return v.GetEnumAttributeAtIndex(C.LLVMAttributeFunctionIndex, kind)
+	return v.GetEnumAttributeAtIndex(C.LLVMAttributeFunctionIndex, kind)
 }
 }
 func (v Value) GetStringAttributeAtIndex(i int, kind string) (a Attribute) {
 func (v Value) GetStringAttributeAtIndex(i int, kind string) (a Attribute) {
-  ckind := C.CString(kind)
-  defer C.free(unsafe.Pointer(ckind))
-  a.C = C.LLVMGetStringAttributeAtIndex(v.C, C.LLVMAttributeIndex(i),
-                                        ckind, C.unsigned(len(kind)))
-  return
+	ckind := C.CString(kind)
+	defer C.free(unsafe.Pointer(ckind))
+	a.C = C.LLVMGetStringAttributeAtIndex(v.C, C.LLVMAttributeIndex(i),
+		ckind, C.unsigned(len(kind)))
+	return
 }
 }
 func (v Value) RemoveEnumAttributeAtIndex(i int, kind uint) {
 func (v Value) RemoveEnumAttributeAtIndex(i int, kind uint) {
-  C.LLVMRemoveEnumAttributeAtIndex(v.C, C.LLVMAttributeIndex(i), C.unsigned(kind))
+	C.LLVMRemoveEnumAttributeAtIndex(v.C, C.LLVMAttributeIndex(i), C.unsigned(kind))
 }
 }
 func (v Value) RemoveEnumFunctionAttribute(kind uint) {
 func (v Value) RemoveEnumFunctionAttribute(kind uint) {
-  v.RemoveEnumAttributeAtIndex(C.LLVMAttributeFunctionIndex, kind);
+	v.RemoveEnumAttributeAtIndex(C.LLVMAttributeFunctionIndex, kind)
 }
 }
 func (v Value) RemoveStringAttributeAtIndex(i int, kind string) {
 func (v Value) RemoveStringAttributeAtIndex(i int, kind string) {
-  ckind := C.CString(kind)
-  defer C.free(unsafe.Pointer(ckind))
-  C.LLVMRemoveStringAttributeAtIndex(v.C, C.LLVMAttributeIndex(i),
-                                     ckind, C.unsigned(len(kind)))
+	ckind := C.CString(kind)
+	defer C.free(unsafe.Pointer(ckind))
+	C.LLVMRemoveStringAttributeAtIndex(v.C, C.LLVMAttributeIndex(i),
+		ckind, C.unsigned(len(kind)))
 }
 }
 func (v Value) AddTargetDependentFunctionAttr(attr, value string) {
 func (v Value) AddTargetDependentFunctionAttr(attr, value string) {
 	cattr := C.CString(attr)
 	cattr := C.CString(attr)
@@ -1148,12 +1202,12 @@ func (v Value) Params() []Value {
 	}
 	}
 	return out
 	return out
 }
 }
-func (v Value) Param(i int) (rv Value)  { rv.C = C.LLVMGetParam(v.C, C.unsigned(i)); return }
-func (v Value) ParamParent() (rv Value) { rv.C = C.LLVMGetParamParent(v.C); return }
-func (v Value) FirstParam() (rv Value)  { rv.C = C.LLVMGetFirstParam(v.C); return }
-func (v Value) LastParam() (rv Value)   { rv.C = C.LLVMGetLastParam(v.C); return }
-func NextParam(v Value) (rv Value)      { rv.C = C.LLVMGetNextParam(v.C); return }
-func PrevParam(v Value) (rv Value)      { rv.C = C.LLVMGetPreviousParam(v.C); return }
+func (v Value) Param(i int) (rv Value)      { rv.C = C.LLVMGetParam(v.C, C.unsigned(i)); return }
+func (v Value) ParamParent() (rv Value)     { rv.C = C.LLVMGetParamParent(v.C); return }
+func (v Value) FirstParam() (rv Value)      { rv.C = C.LLVMGetFirstParam(v.C); return }
+func (v Value) LastParam() (rv Value)       { rv.C = C.LLVMGetLastParam(v.C); return }
+func NextParam(v Value) (rv Value)          { rv.C = C.LLVMGetNextParam(v.C); return }
+func PrevParam(v Value) (rv Value)          { rv.C = C.LLVMGetPreviousParam(v.C); return }
 func (v Value) SetParamAlignment(align int) { C.LLVMSetParamAlignment(v.C, C.unsigned(align)) }
 func (v Value) SetParamAlignment(align int) { C.LLVMSetParamAlignment(v.C, C.unsigned(align)) }
 
 
 // Operations on basic blocks
 // Operations on basic blocks
@@ -1201,7 +1255,10 @@ func (bb BasicBlock) MoveBefore(pos BasicBlock) { C.LLVMMoveBasicBlockBefore(bb.
 func (bb BasicBlock) MoveAfter(pos BasicBlock)  { C.LLVMMoveBasicBlockAfter(bb.C, pos.C) }
 func (bb BasicBlock) MoveAfter(pos BasicBlock)  { C.LLVMMoveBasicBlockAfter(bb.C, pos.C) }
 
 
 // Operations on instructions
 // Operations on instructions
+func (v Value) EraseFromParentAsInstruction()      { C.LLVMInstructionEraseFromParent(v.C) }
 func (v Value) InstructionParent() (bb BasicBlock) { bb.C = C.LLVMGetInstructionParent(v.C); return }
 func (v Value) InstructionParent() (bb BasicBlock) { bb.C = C.LLVMGetInstructionParent(v.C); return }
+func (v Value) InstructionDebugLoc() (md Metadata) { md.C = C.LLVMInstructionGetDebugLoc(v.C); return }
+func (v Value) InstructionSetDebugLoc(md Metadata) { C.LLVMInstructionSetDebugLoc(v.C, md.C) }
 func (bb BasicBlock) FirstInstruction() (v Value)  { v.C = C.LLVMGetFirstInstruction(bb.C); return }
 func (bb BasicBlock) FirstInstruction() (v Value)  { v.C = C.LLVMGetFirstInstruction(bb.C); return }
 func (bb BasicBlock) LastInstruction() (v Value)   { v.C = C.LLVMGetLastInstruction(bb.C); return }
 func (bb BasicBlock) LastInstruction() (v Value)   { v.C = C.LLVMGetLastInstruction(bb.C); return }
 func NextInstruction(v Value) (rv Value)           { rv.C = C.LLVMGetNextInstruction(v.C); return }
 func NextInstruction(v Value) (rv Value)           { rv.C = C.LLVMGetNextInstruction(v.C); return }
@@ -1220,6 +1277,10 @@ func (v Value) AddCallSiteAttribute(i int, a Attribute) {
 func (v Value) SetInstrParamAlignment(i int, align int) {
 func (v Value) SetInstrParamAlignment(i int, align int) {
 	C.LLVMSetInstrParamAlignment(v.C, C.unsigned(i), C.unsigned(align))
 	C.LLVMSetInstrParamAlignment(v.C, C.unsigned(i), C.unsigned(align))
 }
 }
+func (v Value) CalledValue() (rv Value) {
+	rv.C = C.LLVMGetCalledValue(v.C)
+	return
+}
 
 
 // Operations on call instructions (only)
 // Operations on call instructions (only)
 func (v Value) IsTailCall() bool    { return C.LLVMIsTailCall(v.C) != 0 }
 func (v Value) IsTailCall() bool    { return C.LLVMIsTailCall(v.C) != 0 }
@@ -1240,6 +1301,33 @@ func (v Value) IncomingBlock(i int) (bb BasicBlock) {
 	return
 	return
 }
 }
 
 
+// Operations on inline assembly
+func InlineAsm(t Type, asmString, constraints string, hasSideEffects, isAlignStack bool, dialect InlineAsmDialect) (rv Value) {
+	casm := C.CString(asmString)
+	defer C.free(unsafe.Pointer(casm))
+	cconstraints := C.CString(constraints)
+	defer C.free(unsafe.Pointer(cconstraints))
+	rv.C = C.LLVMGetInlineAsm(t.C, casm, C.size_t(len(asmString)), cconstraints, C.size_t(len(constraints)), boolToLLVMBool(hasSideEffects), boolToLLVMBool(isAlignStack), C.LLVMInlineAsmDialect(dialect))
+	return
+}
+
+// Operations on aggregates
+func (v Value) Indices() []uint32 {
+	num := C.LLVMGetNumIndices(v.C)
+	indicesPtr := C.LLVMGetIndices(v.C)
+	// https://github.com/golang/go/wiki/cgo#turning-c-arrays-into-go-slices
+	rawIndices := (*[1 << 20]C.uint)(unsafe.Pointer(indicesPtr))[:num:num]
+	indices := make([]uint32, num)
+	for i := range indices {
+		indices[i] = uint32(rawIndices[i])
+	}
+	return indices
+}
+
+// Operations on comparisons
+func (v Value) IntPredicate() IntPredicate     { return IntPredicate(C.LLVMGetICmpPredicate(v.C)) }
+func (v Value) FloatPredicate() FloatPredicate { return FloatPredicate(C.LLVMGetFCmpPredicate(v.C)) }
+
 //-------------------------------------------------------------------------
 //-------------------------------------------------------------------------
 // llvm.Builder
 // llvm.Builder
 //-------------------------------------------------------------------------
 //-------------------------------------------------------------------------
@@ -1266,16 +1354,18 @@ func (b Builder) Dispose() { C.LLVMDisposeBuilder(b.C) }
 
 
 // Metadata
 // Metadata
 type DebugLoc struct {
 type DebugLoc struct {
-	Line, Col      uint
-	Scope          Metadata
-	InlinedAt      Metadata
+	Line, Col uint
+	Scope     Metadata
+	InlinedAt Metadata
 }
 }
+
 func (b Builder) SetCurrentDebugLocation(line, col uint, scope, inlinedAt Metadata) {
 func (b Builder) SetCurrentDebugLocation(line, col uint, scope, inlinedAt Metadata) {
-	C.LLVMSetCurrentDebugLocation2(b.C, C.unsigned(line), C.unsigned(col), scope.C, inlinedAt.C)
+	C.LLVMGoSetCurrentDebugLocation(b.C, C.unsigned(line), C.unsigned(col), scope.C, inlinedAt.C)
 }
 }
+
 // Get current debug location. Please do not call this function until setting debug location with SetCurrentDebugLocation()
 // Get current debug location. Please do not call this function until setting debug location with SetCurrentDebugLocation()
 func (b Builder) GetCurrentDebugLocation() (loc DebugLoc) {
 func (b Builder) GetCurrentDebugLocation() (loc DebugLoc) {
-	md := C.LLVMGetCurrentDebugLocation2(b.C)
+	md := C.LLVMGoGetCurrentDebugLocation(b.C)
 	loc.Line = uint(md.Line)
 	loc.Line = uint(md.Line)
 	loc.Col = uint(md.Col)
 	loc.Col = uint(md.Col)
 	loc.Scope = Metadata{C: md.Scope}
 	loc.Scope = Metadata{C: md.Scope}
@@ -1592,6 +1682,14 @@ func (b Builder) CreateGlobalStringPtr(str, name string) (v Value) {
 	v.C = C.LLVMBuildGlobalStringPtr(b.C, cstr, cname)
 	v.C = C.LLVMBuildGlobalStringPtr(b.C, cstr, cname)
 	return
 	return
 }
 }
+func (b Builder) CreateAtomicRMW(op AtomicRMWBinOp, ptr, val Value, ordering AtomicOrdering, singleThread bool) (v Value) {
+	v.C = C.LLVMBuildAtomicRMW(b.C, C.LLVMAtomicRMWBinOp(op), ptr.C, val.C, C.LLVMAtomicOrdering(ordering), boolToLLVMBool(singleThread))
+	return
+}
+func (b Builder) CreateAtomicCmpXchg(ptr, cmp, newVal Value, successOrdering, failureOrdering AtomicOrdering, singleThread bool) (v Value) {
+	v.C = C.LLVMBuildAtomicCmpXchg(b.C, ptr.C, cmp.C, newVal.C, C.LLVMAtomicOrdering(successOrdering), C.LLVMAtomicOrdering(failureOrdering), boolToLLVMBool(singleThread))
+	return
+}
 
 
 // Casts
 // Casts
 func (b Builder) CreateTrunc(val Value, t Type, name string) (v Value) {
 func (b Builder) CreateTrunc(val Value, t Type, name string) (v Value) {
@@ -1914,11 +2012,3 @@ func (pm PassManager) FinalizeFunc() bool { return C.LLVMFinalizeFunctionPassMan
 // the module provider.
 // the module provider.
 // See llvm::PassManagerBase::~PassManagerBase.
 // See llvm::PassManagerBase::~PassManagerBase.
 func (pm PassManager) Dispose() { C.LLVMDisposePassManager(pm.C) }
 func (pm PassManager) Dispose() { C.LLVMDisposePassManager(pm.C) }
-
-//-------------------------------------------------------------------------
-// llvm.Metadata
-//-------------------------------------------------------------------------
-
-func (md Metadata) ReplaceAllUsesWith(new Metadata) {
-	C.LLVMMetadataReplaceAllUsesWith(md.C, new.C)
-}

+ 5 - 7
bindings/go/llvm/ir_test.go

@@ -1,9 +1,8 @@
 //===- ir_test.go - Tests for ir ------------------------------------------===//
 //===- ir_test.go - Tests for ir ------------------------------------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //
@@ -31,7 +30,7 @@ func testAttribute(t *testing.T, name string) {
 	fn.AddFunctionAttr(attr)
 	fn.AddFunctionAttr(attr)
 	newattr := fn.GetEnumFunctionAttribute(kind)
 	newattr := fn.GetEnumFunctionAttribute(kind)
 	if attr != newattr {
 	if attr != newattr {
-		t.Errorf("got attribute mask %d, want %d", newattr, attr)
+		t.Errorf("got attribute %p, want %p", newattr.C, attr.C)
 	}
 	}
 
 
 	text := mod.String()
 	text := mod.String()
@@ -42,7 +41,7 @@ func testAttribute(t *testing.T, name string) {
 	fn.RemoveEnumFunctionAttribute(kind)
 	fn.RemoveEnumFunctionAttribute(kind)
 	newattr = fn.GetEnumFunctionAttribute(kind)
 	newattr = fn.GetEnumFunctionAttribute(kind)
 	if !newattr.IsNil() {
 	if !newattr.IsNil() {
-		t.Errorf("got attribute mask %d, want 0", newattr)
+		t.Errorf("got attribute %p, want 0", newattr.C)
 	}
 	}
 }
 }
 
 
@@ -52,7 +51,6 @@ func TestAttributes(t *testing.T) {
 		"sanitize_address",
 		"sanitize_address",
 		"alwaysinline",
 		"alwaysinline",
 		"builtin",
 		"builtin",
-		"byval",
 		"convergent",
 		"convergent",
 		"inalloca",
 		"inalloca",
 		"inlinehint",
 		"inlinehint",

+ 3 - 4
bindings/go/llvm/linker.go

@@ -1,9 +1,8 @@
 //===- linker.go - Bindings for linker ------------------------------------===//
 //===- linker.go - Bindings for linker ------------------------------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //

+ 1 - 1
bindings/go/llvm/llvm_config.go.in

@@ -3,7 +3,7 @@
 package llvm
 package llvm
 
 
 /*
 /*
-#cgo CXXFLAGS: -std=c++11
+#cgo CXXFLAGS: -std=c++14
 #cgo CPPFLAGS: @LLVM_CFLAGS@
 #cgo CPPFLAGS: @LLVM_CFLAGS@
 #cgo LDFLAGS: @LLVM_LDFLAGS@
 #cgo LDFLAGS: @LLVM_LDFLAGS@
 */
 */

+ 3 - 4
bindings/go/llvm/llvm_dep.go

@@ -1,9 +1,8 @@
 //===- llvm_dep.go - creates LLVM dependency ------------------------------===//
 //===- llvm_dep.go - creates LLVM dependency ------------------------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //

+ 3 - 4
bindings/go/llvm/string.go

@@ -1,9 +1,8 @@
 //===- string.go - Stringer implementation for Type -----------------------===//
 //===- string.go - Stringer implementation for Type -----------------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //

+ 3 - 4
bindings/go/llvm/string_test.go

@@ -1,9 +1,8 @@
 //===- string_test.go - test Stringer implementation for Type -------------===//
 //===- string_test.go - test Stringer implementation for Type -------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //

+ 3 - 4
bindings/go/llvm/support.go

@@ -1,9 +1,8 @@
 //===- support.go - Bindings for support ----------------------------------===//
 //===- support.go - Bindings for support ----------------------------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //

+ 4 - 4
bindings/go/llvm/target.go

@@ -1,9 +1,8 @@
 //===- target.go - Bindings for target ------------------------------------===//
 //===- target.go - Bindings for target ------------------------------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //
@@ -62,6 +61,7 @@ const (
 const (
 const (
 	CodeModelDefault    CodeModel = C.LLVMCodeModelDefault
 	CodeModelDefault    CodeModel = C.LLVMCodeModelDefault
 	CodeModelJITDefault CodeModel = C.LLVMCodeModelJITDefault
 	CodeModelJITDefault CodeModel = C.LLVMCodeModelJITDefault
+	CodeModelTiny       CodeModel = C.LLVMCodeModelTiny
 	CodeModelSmall      CodeModel = C.LLVMCodeModelSmall
 	CodeModelSmall      CodeModel = C.LLVMCodeModelSmall
 	CodeModelKernel     CodeModel = C.LLVMCodeModelKernel
 	CodeModelKernel     CodeModel = C.LLVMCodeModelKernel
 	CodeModelMedium     CodeModel = C.LLVMCodeModelMedium
 	CodeModelMedium     CodeModel = C.LLVMCodeModelMedium

+ 23 - 0
bindings/go/llvm/transforms_coroutines.go

@@ -0,0 +1,23 @@
+//===- transforms_coroutines.go - Bindings for coroutines -----------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines bindings for the coroutines component.
+//
+//===----------------------------------------------------------------------===//
+
+package llvm
+
+/*
+#include "llvm-c/Transforms/Coroutines.h"
+*/
+import "C"
+
+func (pm PassManager) AddCoroEarlyPass()   { C.LLVMAddCoroEarlyPass(pm.C) }
+func (pm PassManager) AddCoroSplitPass()   { C.LLVMAddCoroSplitPass(pm.C) }
+func (pm PassManager) AddCoroElidePass()   { C.LLVMAddCoroElidePass(pm.C) }
+func (pm PassManager) AddCoroCleanupPass() { C.LLVMAddCoroCleanupPass(pm.C) }

+ 5 - 6
bindings/go/llvm/transforms_instrumentation.go

@@ -1,9 +1,8 @@
 //===- transforms_instrumentation.go - Bindings for instrumentation -------===//
 //===- transforms_instrumentation.go - Bindings for instrumentation -------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //
@@ -32,8 +31,8 @@ func (pm PassManager) AddThreadSanitizerPass() {
 	C.LLVMAddThreadSanitizerPass(pm.C)
 	C.LLVMAddThreadSanitizerPass(pm.C)
 }
 }
 
 
-func (pm PassManager) AddMemorySanitizerPass() {
-	C.LLVMAddMemorySanitizerPass(pm.C)
+func (pm PassManager) AddMemorySanitizerLegacyPassPass() {
+	C.LLVMAddMemorySanitizerLegacyPassPass(pm.C)
 }
 }
 
 
 func (pm PassManager) AddDataFlowSanitizerPass(abilist []string) {
 func (pm PassManager) AddDataFlowSanitizerPass(abilist []string) {

+ 3 - 4
bindings/go/llvm/transforms_ipo.go

@@ -1,9 +1,8 @@
 //===- transforms_ipo.go - Bindings for ipo -------------------------------===//
 //===- transforms_ipo.go - Bindings for ipo -------------------------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //

+ 3 - 4
bindings/go/llvm/transforms_pmbuilder.go

@@ -1,9 +1,8 @@
 //===- transforms_pmbuilder.go - Bindings for PassManagerBuilder ----------===//
 //===- transforms_pmbuilder.go - Bindings for PassManagerBuilder ----------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //

+ 3 - 4
bindings/go/llvm/transforms_scalar.go

@@ -1,9 +1,8 @@
 //===- transforms_scalar.go - Bindings for scalaropts ---------------------===//
 //===- transforms_scalar.go - Bindings for scalaropts ---------------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //

+ 3 - 4
bindings/go/llvm/version.go

@@ -1,9 +1,8 @@
 //===- version.go - LLVM version info -------------------------------------===//
 //===- version.go - LLVM version info -------------------------------------===//
 //
 //
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //
 //===----------------------------------------------------------------------===//
 //===----------------------------------------------------------------------===//
 //
 //

+ 4 - 4
bindings/ocaml/all_backends/all_backends_ocaml.c

@@ -1,9 +1,9 @@
 /*===-- all_backends_ocaml.c - LLVM OCaml Glue ------------------*- C++ -*-===*\
 /*===-- all_backends_ocaml.c - LLVM OCaml Glue ------------------*- C++ -*-===*\
 |*                                                                            *|
 |*                                                                            *|
-|*                     The LLVM Compiler Infrastructure                       *|
-|*                                                                            *|
-|* This file is distributed under the University of Illinois Open Source      *|
-|* License. See LICENSE.TXT for details.                                      *|
+|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
+|* Exceptions.                                                                *|
+|* See https://llvm.org/LICENSE.txt for license information.                  *|
+|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
 |*                                                                            *|
 |*                                                                            *|
 |*===----------------------------------------------------------------------===*|
 |*===----------------------------------------------------------------------===*|
 |*                                                                            *|
 |*                                                                            *|

+ 3 - 4
bindings/ocaml/all_backends/llvm_all_backends.ml

@@ -1,9 +1,8 @@
 (*===-- llvm_all_backends.ml - LLVM OCaml Interface -----------*- OCaml -*-===*
 (*===-- llvm_all_backends.ml - LLVM OCaml Interface -----------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 3 - 4
bindings/ocaml/all_backends/llvm_all_backends.mli

@@ -1,9 +1,8 @@
 (*===-- llvm_all_backends.mli - LLVM OCaml Interface ----------*- OCaml -*-===*
 (*===-- llvm_all_backends.mli - LLVM OCaml Interface ----------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 4 - 4
bindings/ocaml/analysis/analysis_ocaml.c

@@ -1,9 +1,9 @@
 /*===-- analysis_ocaml.c - LLVM OCaml Glue ----------------------*- C++ -*-===*\
 /*===-- analysis_ocaml.c - LLVM OCaml Glue ----------------------*- C++ -*-===*\
 |*                                                                            *|
 |*                                                                            *|
-|*                     The LLVM Compiler Infrastructure                       *|
-|*                                                                            *|
-|* This file is distributed under the University of Illinois Open Source      *|
-|* License. See LICENSE.TXT for details.                                      *|
+|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
+|* Exceptions.                                                                *|
+|* See https://llvm.org/LICENSE.txt for license information.                  *|
+|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
 |*                                                                            *|
 |*                                                                            *|
 |*===----------------------------------------------------------------------===*|
 |*===----------------------------------------------------------------------===*|
 |*                                                                            *|
 |*                                                                            *|

+ 3 - 4
bindings/ocaml/analysis/llvm_analysis.ml

@@ -1,9 +1,8 @@
 (*===-- llvm_analysis.ml - LLVM OCaml Interface ---------------*- OCaml -*-===*
 (*===-- llvm_analysis.ml - LLVM OCaml Interface ---------------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 3 - 4
bindings/ocaml/analysis/llvm_analysis.mli

@@ -1,9 +1,8 @@
 (*===-- llvm_analysis.mli - LLVM OCaml Interface --------------*- OCaml -*-===*
 (*===-- llvm_analysis.mli - LLVM OCaml Interface --------------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 4 - 4
bindings/ocaml/backends/backend_ocaml.c

@@ -1,9 +1,9 @@
 /*===-- backend_ocaml.c - LLVM OCaml Glue -----------------------*- C++ -*-===*\
 /*===-- backend_ocaml.c - LLVM OCaml Glue -----------------------*- C++ -*-===*\
 |*                                                                            *|
 |*                                                                            *|
-|*                     The LLVM Compiler Infrastructure                       *|
-|*                                                                            *|
-|* This file is distributed under the University of Illinois Open Source      *|
-|* License. See LICENSE.TXT for details.                                      *|
+|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
+|* Exceptions.                                                                *|
+|* See https://llvm.org/LICENSE.txt for license information.                  *|
+|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
 |*                                                                            *|
 |*                                                                            *|
 |*===----------------------------------------------------------------------===*|
 |*===----------------------------------------------------------------------===*|
 |*                                                                            *|
 |*                                                                            *|

+ 3 - 4
bindings/ocaml/backends/llvm_backend.ml.in

@@ -1,9 +1,8 @@
 (*===-- llvm_backend.ml.in - LLVM OCaml Interface -------------*- OCaml -*-===*
 (*===-- llvm_backend.ml.in - LLVM OCaml Interface -------------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 3 - 4
bindings/ocaml/backends/llvm_backend.mli.in

@@ -1,9 +1,8 @@
 (*===-- llvm_backend.mli.in - LLVM OCaml Interface ------------*- OCaml -*-===*
 (*===-- llvm_backend.mli.in - LLVM OCaml Interface ------------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 4 - 4
bindings/ocaml/bitreader/bitreader_ocaml.c

@@ -1,9 +1,9 @@
 /*===-- bitwriter_ocaml.c - LLVM OCaml Glue ---------------------*- C++ -*-===*\
 /*===-- bitwriter_ocaml.c - LLVM OCaml Glue ---------------------*- C++ -*-===*\
 |*                                                                            *|
 |*                                                                            *|
-|*                     The LLVM Compiler Infrastructure                       *|
-|*                                                                            *|
-|* This file is distributed under the University of Illinois Open Source      *|
-|* License. See LICENSE.TXT for details.                                      *|
+|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
+|* Exceptions.                                                                *|
+|* See https://llvm.org/LICENSE.txt for license information.                  *|
+|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
 |*                                                                            *|
 |*                                                                            *|
 |*===----------------------------------------------------------------------===*|
 |*===----------------------------------------------------------------------===*|
 |*                                                                            *|
 |*                                                                            *|

+ 3 - 4
bindings/ocaml/bitreader/llvm_bitreader.ml

@@ -1,9 +1,8 @@
 (*===-- llvm_bitreader.ml - LLVM OCaml Interface --------------*- OCaml -*-===*
 (*===-- llvm_bitreader.ml - LLVM OCaml Interface --------------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 3 - 4
bindings/ocaml/bitreader/llvm_bitreader.mli

@@ -1,9 +1,8 @@
 (*===-- llvm_bitreader.mli - LLVM OCaml Interface -------------*- OCaml -*-===*
 (*===-- llvm_bitreader.mli - LLVM OCaml Interface -------------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 4 - 4
bindings/ocaml/bitwriter/bitwriter_ocaml.c

@@ -1,9 +1,9 @@
 /*===-- bitwriter_ocaml.c - LLVM OCaml Glue ---------------------*- C++ -*-===*\
 /*===-- bitwriter_ocaml.c - LLVM OCaml Glue ---------------------*- C++ -*-===*\
 |*                                                                            *|
 |*                                                                            *|
-|*                     The LLVM Compiler Infrastructure                       *|
-|*                                                                            *|
-|* This file is distributed under the University of Illinois Open Source      *|
-|* License. See LICENSE.TXT for details.                                      *|
+|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
+|* Exceptions.                                                                *|
+|* See https://llvm.org/LICENSE.txt for license information.                  *|
+|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
 |*                                                                            *|
 |*                                                                            *|
 |*===----------------------------------------------------------------------===*|
 |*===----------------------------------------------------------------------===*|
 |*                                                                            *|
 |*                                                                            *|

+ 3 - 4
bindings/ocaml/bitwriter/llvm_bitwriter.ml

@@ -1,9 +1,8 @@
 (*===-- llvm_bitwriter.ml - LLVM OCaml Interface --------------*- OCaml -*-===*
 (*===-- llvm_bitwriter.ml - LLVM OCaml Interface --------------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===
  *===----------------------------------------------------------------------===
  *
  *

+ 3 - 4
bindings/ocaml/bitwriter/llvm_bitwriter.mli

@@ -1,9 +1,8 @@
 (*===-- llvm_bitwriter.mli - LLVM OCaml Interface -------------*- OCaml -*-===*
 (*===-- llvm_bitwriter.mli - LLVM OCaml Interface -------------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 4 - 4
bindings/ocaml/executionengine/executionengine_ocaml.c

@@ -1,9 +1,9 @@
 /*===-- executionengine_ocaml.c - LLVM OCaml Glue ---------------*- C++ -*-===*\
 /*===-- executionengine_ocaml.c - LLVM OCaml Glue ---------------*- C++ -*-===*\
 |*                                                                            *|
 |*                                                                            *|
-|*                     The LLVM Compiler Infrastructure                       *|
-|*                                                                            *|
-|* This file is distributed under the University of Illinois Open Source      *|
-|* License. See LICENSE.TXT for details.                                      *|
+|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
+|* Exceptions.                                                                *|
+|* See https://llvm.org/LICENSE.txt for license information.                  *|
+|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
 |*                                                                            *|
 |*                                                                            *|
 |*===----------------------------------------------------------------------===*|
 |*===----------------------------------------------------------------------===*|
 |*                                                                            *|
 |*                                                                            *|

+ 3 - 4
bindings/ocaml/executionengine/llvm_executionengine.ml

@@ -1,9 +1,8 @@
 (*===-- llvm_executionengine.ml - LLVM OCaml Interface --------*- OCaml -*-===*
 (*===-- llvm_executionengine.ml - LLVM OCaml Interface --------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 3 - 4
bindings/ocaml/executionengine/llvm_executionengine.mli

@@ -1,9 +1,8 @@
 (*===-- llvm_executionengine.mli - LLVM OCaml Interface -------*- OCaml -*-===*
 (*===-- llvm_executionengine.mli - LLVM OCaml Interface -------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 4 - 4
bindings/ocaml/irreader/irreader_ocaml.c

@@ -1,9 +1,9 @@
 /*===-- irreader_ocaml.c - LLVM OCaml Glue ----------------------*- C++ -*-===*\
 /*===-- irreader_ocaml.c - LLVM OCaml Glue ----------------------*- C++ -*-===*\
 |*                                                                            *|
 |*                                                                            *|
-|*                     The LLVM Compiler Infrastructure                       *|
-|*                                                                            *|
-|* This file is distributed under the University of Illinois Open Source      *|
-|* License. See LICENSE.TXT for details.                                      *|
+|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
+|* Exceptions.                                                                *|
+|* See https://llvm.org/LICENSE.txt for license information.                  *|
+|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
 |*                                                                            *|
 |*                                                                            *|
 |*===----------------------------------------------------------------------===*|
 |*===----------------------------------------------------------------------===*|
 |*                                                                            *|
 |*                                                                            *|

+ 3 - 4
bindings/ocaml/irreader/llvm_irreader.ml

@@ -1,9 +1,8 @@
 (*===-- llvm_irreader.ml - LLVM OCaml Interface ---------------*- OCaml -*-===*
 (*===-- llvm_irreader.ml - LLVM OCaml Interface ---------------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 3 - 4
bindings/ocaml/irreader/llvm_irreader.mli

@@ -1,9 +1,8 @@
 (*===-- llvm_irreader.mli - LLVM OCaml Interface --------------*- OCaml -*-===*
 (*===-- llvm_irreader.mli - LLVM OCaml Interface --------------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 4 - 4
bindings/ocaml/linker/linker_ocaml.c

@@ -1,9 +1,9 @@
 /*===-- linker_ocaml.c - LLVM OCaml Glue ------------------------*- C++ -*-===*\
 /*===-- linker_ocaml.c - LLVM OCaml Glue ------------------------*- C++ -*-===*\
 |*                                                                            *|
 |*                                                                            *|
-|*                     The LLVM Compiler Infrastructure                       *|
-|*                                                                            *|
-|* This file is distributed under the University of Illinois Open Source      *|
-|* License. See LICENSE.TXT for details.                                      *|
+|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
+|* Exceptions.                                                                *|
+|* See https://llvm.org/LICENSE.txt for license information.                  *|
+|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
 |*                                                                            *|
 |*                                                                            *|
 |*===----------------------------------------------------------------------===*|
 |*===----------------------------------------------------------------------===*|
 |*                                                                            *|
 |*                                                                            *|

+ 3 - 4
bindings/ocaml/linker/llvm_linker.ml

@@ -1,9 +1,8 @@
 (*===-- llvm_linker.ml - LLVM OCaml Interface ------------------*- OCaml -*-===*
 (*===-- llvm_linker.ml - LLVM OCaml Interface ------------------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 3 - 4
bindings/ocaml/linker/llvm_linker.mli

@@ -1,9 +1,8 @@
 (*===-- llvm_linker.mli - LLVM OCaml Interface -----------------*- OCaml -*-===*
 (*===-- llvm_linker.mli - LLVM OCaml Interface -----------------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 20 - 5
bindings/ocaml/llvm/llvm.ml

@@ -1,9 +1,8 @@
 (*===-- llvm/llvm.ml - LLVM OCaml Interface -------------------------------===*
 (*===-- llvm/llvm.ml - LLVM OCaml Interface -------------------------------===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 
@@ -42,6 +41,7 @@ module TypeKind = struct
   | Vector
   | Vector
   | Metadata
   | Metadata
   | X86_mmx
   | X86_mmx
+  | Token
 end
 end
 
 
 module Linkage = struct
 module Linkage = struct
@@ -238,6 +238,14 @@ module Opcode  = struct
   | AtomicRMW
   | AtomicRMW
   | Resume
   | Resume
   | LandingPad
   | LandingPad
+  | AddrSpaceCast
+  | CleanupRet
+  | CatchRet
+  | CatchPad
+  | CleanupPad
+  | CatchSwitch
+  | FNeg
+  | CallBr
 end
 end
 
 
 module LandingPadClauseTy = struct
 module LandingPadClauseTy = struct
@@ -303,6 +311,7 @@ module ValueKind = struct
   | ConstantVector
   | ConstantVector
   | Function
   | Function
   | GlobalAlias
   | GlobalAlias
+  | GlobalIFunc
   | GlobalVariable
   | GlobalVariable
   | UndefValue
   | UndefValue
   | Instruction of Opcode.t
   | Instruction of Opcode.t
@@ -461,6 +470,7 @@ external struct_element_types : lltype -> lltype array
                               = "llvm_struct_element_types"
                               = "llvm_struct_element_types"
 external is_packed : lltype -> bool = "llvm_is_packed"
 external is_packed : lltype -> bool = "llvm_is_packed"
 external is_opaque : lltype -> bool = "llvm_is_opaque"
 external is_opaque : lltype -> bool = "llvm_is_opaque"
+external is_literal : lltype -> bool = "llvm_is_literal"
 
 
 (*--... Operations on pointer, vector, and array types .....................--*)
 (*--... Operations on pointer, vector, and array types .....................--*)
 
 
@@ -529,6 +539,7 @@ external operand : llvalue -> int -> llvalue = "llvm_operand"
 external operand_use : llvalue -> int -> lluse = "llvm_operand_use"
 external operand_use : llvalue -> int -> lluse = "llvm_operand_use"
 external set_operand : llvalue -> int -> llvalue -> unit = "llvm_set_operand"
 external set_operand : llvalue -> int -> llvalue -> unit = "llvm_set_operand"
 external num_operands : llvalue -> int = "llvm_num_operands"
 external num_operands : llvalue -> int = "llvm_num_operands"
+external indices : llvalue -> int array = "llvm_indices"
 
 
 (*--... Operations on constants of (mostly) any type .......................--*)
 (*--... Operations on constants of (mostly) any type .......................--*)
 external is_constant : llvalue -> bool = "llvm_is_constant"
 external is_constant : llvalue -> bool = "llvm_is_constant"
@@ -1044,9 +1055,12 @@ let remove_enum_call_site_attr f k i =
 let remove_string_call_site_attr f k i =
 let remove_string_call_site_attr f k i =
   llvm_remove_string_call_site_attr f k (AttrIndex.to_int i)
   llvm_remove_string_call_site_attr f k (AttrIndex.to_int i)
 
 
-(*--... Operations on call instructions (only) .............................--*)
+(*--... Operations on call and invoke instructions (only) ..................--*)
+external num_arg_operands : llvalue -> int = "llvm_num_arg_operands"
 external is_tail_call : llvalue -> bool = "llvm_is_tail_call"
 external is_tail_call : llvalue -> bool = "llvm_is_tail_call"
 external set_tail_call : bool -> llvalue -> unit = "llvm_set_tail_call"
 external set_tail_call : bool -> llvalue -> unit = "llvm_set_tail_call"
+external get_normal_dest : llvalue -> llbasicblock = "LLVMGetNormalDest"
+external get_unwind_dest : llvalue -> llbasicblock = "LLVMGetUnwindDest"
 
 
 (*--... Operations on load/store instructions (only) .......................--*)
 (*--... Operations on load/store instructions (only) .......................--*)
 external is_volatile : llvalue -> bool = "llvm_is_volatile"
 external is_volatile : llvalue -> bool = "llvm_is_volatile"
@@ -1175,6 +1189,7 @@ external build_invoke : llvalue -> llvalue array -> llbasicblock ->
                       = "llvm_build_invoke_bc" "llvm_build_invoke_nat"
                       = "llvm_build_invoke_bc" "llvm_build_invoke_nat"
 external build_landingpad : lltype -> llvalue -> int -> string -> llbuilder ->
 external build_landingpad : lltype -> llvalue -> int -> string -> llbuilder ->
                             llvalue = "llvm_build_landingpad"
                             llvalue = "llvm_build_landingpad"
+external is_cleanup : llvalue -> bool = "llvm_is_cleanup"
 external set_cleanup : llvalue -> bool -> unit = "llvm_set_cleanup"
 external set_cleanup : llvalue -> bool -> unit = "llvm_set_cleanup"
 external add_clause : llvalue -> llvalue -> unit = "llvm_add_clause"
 external add_clause : llvalue -> llvalue -> unit = "llvm_add_clause"
 external build_resume : llvalue -> llbuilder -> llvalue = "llvm_build_resume"
 external build_resume : llvalue -> llbuilder -> llvalue = "llvm_build_resume"

+ 43 - 8
bindings/ocaml/llvm/llvm.mli

@@ -1,9 +1,8 @@
 (*===-- llvm/llvm.mli - LLVM OCaml Interface ------------------------------===*
 (*===-- llvm/llvm.mli - LLVM OCaml Interface ------------------------------===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 
@@ -77,6 +76,7 @@ module TypeKind : sig
   | Vector
   | Vector
   | Metadata
   | Metadata
   | X86_mmx
   | X86_mmx
+  | Token
 end
 end
 
 
 (** The linkage of a global value, accessed with {!linkage} and
 (** The linkage of a global value, accessed with {!linkage} and
@@ -260,6 +260,14 @@ module Opcode : sig
   | AtomicRMW
   | AtomicRMW
   | Resume
   | Resume
   | LandingPad
   | LandingPad
+  | AddrSpaceCast
+  | CleanupRet
+  | CatchRet
+  | CatchPad
+  | CleanupPad
+  | CatchSwitch
+  | FNeg
+  | CallBr
 end
 end
 
 
 (** The type of a clause of a [landingpad] instruction.
 (** The type of a clause of a [landingpad] instruction.
@@ -336,6 +344,7 @@ module ValueKind : sig
   | ConstantVector
   | ConstantVector
   | Function
   | Function
   | GlobalAlias
   | GlobalAlias
+  | GlobalIFunc
   | GlobalVariable
   | GlobalVariable
   | UndefValue
   | UndefValue
   | Instruction of Opcode.t
   | Instruction of Opcode.t
@@ -657,6 +666,10 @@ val is_packed : lltype -> bool
     [false] otherwise. See the method [llvm::StructType::isOpaque]. *)
     [false] otherwise. See the method [llvm::StructType::isOpaque]. *)
 val is_opaque : lltype -> bool
 val is_opaque : lltype -> bool
 
 
+(** [is_literal sty] returns [true] if the structure type [sty] is literal.
+    [false] otherwise. See the method [llvm::StructType::isLiteral]. *)
+val is_literal : lltype -> bool
+
 
 
 (** {7 Operations on pointer, vector, and array types} *)
 (** {7 Operations on pointer, vector, and array types} *)
 
 
@@ -802,6 +815,11 @@ val set_operand : llvalue -> int -> llvalue -> unit
 val num_operands : llvalue -> int
 val num_operands : llvalue -> int
 
 
 
 
+(** [indices i] returns the indices for the ExtractValue or InsertValue
+    instruction [i].
+    See the [llvm::getIndices] methods. *)
+val indices : llvalue -> int array
+
 (** {7 Operations on constants of (mostly) any type} *)
 (** {7 Operations on constants of (mostly) any type} *)
 
 
 (** [is_constant v] returns [true] if the value [v] is a constant, [false]
 (** [is_constant v] returns [true] if the value [v] is a constant, [false]
@@ -1824,7 +1842,12 @@ val remove_enum_call_site_attr : llvalue -> llattrkind -> AttrIndex.t -> unit
 val remove_string_call_site_attr : llvalue -> string -> AttrIndex.t -> unit
 val remove_string_call_site_attr : llvalue -> string -> AttrIndex.t -> unit
 
 
 
 
-(** {7 Operations on call instructions (only)} *)
+(** {7 Operations on call and invoke instructions (only)} *)
+
+(** [num_arg_operands ci] returns the number of arguments for the call or
+    invoke instruction [ci].  See the method
+    [llvm::CallInst::getNumArgOperands]. *)
+val num_arg_operands : llvalue -> int
 
 
 (** [is_tail_call ci] is [true] if the call instruction [ci] is flagged as
 (** [is_tail_call ci] is [true] if the call instruction [ci] is flagged as
     eligible for tail call optimization, [false] otherwise.
     eligible for tail call optimization, [false] otherwise.
@@ -1836,6 +1859,14 @@ val is_tail_call : llvalue -> bool
     See the method [llvm::CallInst::setTailCall]. *)
     See the method [llvm::CallInst::setTailCall]. *)
 val set_tail_call : bool -> llvalue -> unit
 val set_tail_call : bool -> llvalue -> unit
 
 
+(** [get_normal_dest ii] is the normal destination basic block of an invoke
+    instruction. See the method [llvm::InvokeInst::getNormalDest()]. *)
+val get_normal_dest : llvalue -> llbasicblock
+
+(** [get_unwind_dest ii] is the unwind destination basic block of an invoke
+    instruction. See the method [llvm::InvokeInst::getUnwindDest()]. *)
+val get_unwind_dest : llvalue -> llbasicblock
+
 
 
 (** {7 Operations on load/store instructions (only)} *)
 (** {7 Operations on load/store instructions (only)} *)
 
 
@@ -1857,16 +1888,16 @@ val set_volatile : bool -> llvalue -> unit
 val is_terminator : llvalue -> bool
 val is_terminator : llvalue -> bool
 
 
 (** [successor v i] returns the successor at index [i] for the value [v].
 (** [successor v i] returns the successor at index [i] for the value [v].
-    See the method [llvm::TerminatorInst::getSuccessor]. *)
+    See the method [llvm::Instruction::getSuccessor]. *)
 val successor : llvalue -> int -> llbasicblock
 val successor : llvalue -> int -> llbasicblock
 
 
 (** [set_successor v i o] sets the successor of the value [v] at the index [i] to
 (** [set_successor v i o] sets the successor of the value [v] at the index [i] to
     the value [o].
     the value [o].
-    See the method [llvm::TerminatorInst::setSuccessor]. *)
+    See the method [llvm::Instruction::setSuccessor]. *)
 val set_successor : llvalue -> int -> llbasicblock -> unit
 val set_successor : llvalue -> int -> llbasicblock -> unit
 
 
 (** [num_successors v] returns the number of successors for the value [v].
 (** [num_successors v] returns the number of successors for the value [v].
-    See the method [llvm::TerminatorInst::getNumSuccessors]. *)
+    See the method [llvm::Instruction::getNumSuccessors]. *)
 val num_successors : llvalue -> int
 val num_successors : llvalue -> int
 
 
 (** [successors v] returns the successors of [v]. *)
 (** [successors v] returns the successors of [v]. *)
@@ -2068,6 +2099,10 @@ val build_invoke : llvalue -> llvalue array -> llbasicblock ->
 val build_landingpad : lltype -> llvalue -> int -> string -> llbuilder ->
 val build_landingpad : lltype -> llvalue -> int -> string -> llbuilder ->
                          llvalue
                          llvalue
 
 
+(** [is_cleanup lp] returns [true] if [landingpad] instruction lp is a cleanup.
+    See the method [llvm::LandingPadInst::isCleanup]. *)
+val is_cleanup : llvalue -> bool
+
 (** [set_cleanup lp] sets the cleanup flag in the [landingpad]instruction.
 (** [set_cleanup lp] sets the cleanup flag in the [landingpad]instruction.
     See the method [llvm::LandingPadInst::setCleanup]. *)
     See the method [llvm::LandingPadInst::setCleanup]. *)
 val set_cleanup : llvalue -> bool -> unit
 val set_cleanup : llvalue -> bool -> unit

+ 39 - 9
bindings/ocaml/llvm/llvm_ocaml.c

@@ -1,9 +1,9 @@
 /*===-- llvm_ocaml.c - LLVM OCaml Glue --------------------------*- C++ -*-===*\
 /*===-- llvm_ocaml.c - LLVM OCaml Glue --------------------------*- C++ -*-===*\
 |*                                                                            *|
 |*                                                                            *|
-|*                     The LLVM Compiler Infrastructure                       *|
-|*                                                                            *|
-|* This file is distributed under the University of Illinois Open Source      *|
-|* License. See LICENSE.TXT for details.                                      *|
+|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
+|* Exceptions.                                                                *|
+|* See https://llvm.org/LICENSE.txt for license information.                  *|
+|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
 |*                                                                            *|
 |*                                                                            *|
 |*===----------------------------------------------------------------------===*|
 |*===----------------------------------------------------------------------===*|
 |*                                                                            *|
 |*                                                                            *|
@@ -20,6 +20,7 @@
 #include <string.h>
 #include <string.h>
 #include "llvm-c/Core.h"
 #include "llvm-c/Core.h"
 #include "llvm-c/Support.h"
 #include "llvm-c/Support.h"
+#include "llvm/Config/llvm-config.h"
 #include "caml/alloc.h"
 #include "caml/alloc.h"
 #include "caml/custom.h"
 #include "caml/custom.h"
 #include "caml/memory.h"
 #include "caml/memory.h"
@@ -482,9 +483,9 @@ CAMLprim value llvm_struct_set_body(LLVMTypeRef Ty,
 CAMLprim value llvm_struct_name(LLVMTypeRef Ty)
 CAMLprim value llvm_struct_name(LLVMTypeRef Ty)
 {
 {
   CAMLparam0();
   CAMLparam0();
+  CAMLlocal1(result);
   const char *C = LLVMGetStructName(Ty);
   const char *C = LLVMGetStructName(Ty);
   if (C) {
   if (C) {
-    CAMLlocal1(result);
     result = caml_alloc_small(1, 0);
     result = caml_alloc_small(1, 0);
     Store_field(result, 0, caml_copy_string(C));
     Store_field(result, 0, caml_copy_string(C));
     CAMLreturn(result);
     CAMLreturn(result);
@@ -509,6 +510,11 @@ CAMLprim value llvm_is_opaque(LLVMTypeRef StructTy) {
   return Val_bool(LLVMIsOpaqueStruct(StructTy));
   return Val_bool(LLVMIsOpaqueStruct(StructTy));
 }
 }
 
 
+/* lltype -> bool */
+CAMLprim value llvm_is_literal(LLVMTypeRef StructTy) {
+  return Val_bool(LLVMIsLiteralStruct(StructTy));
+}
+
 /*--... Operations on array, pointer, and vector types .....................--*/
 /*--... Operations on array, pointer, and vector types .....................--*/
 
 
 /* lltype -> lltype array */
 /* lltype -> lltype array */
@@ -618,6 +624,7 @@ enum ValueKind {
   ConstantVector,
   ConstantVector,
   Function,
   Function,
   GlobalAlias,
   GlobalAlias,
+  GlobalIFunc,
   GlobalVariable,
   GlobalVariable,
   UndefValue,
   UndefValue,
   Instruction
   Instruction
@@ -629,6 +636,7 @@ enum ValueKind {
 
 
 CAMLprim value llvm_classify_value(LLVMValueRef Val) {
 CAMLprim value llvm_classify_value(LLVMValueRef Val) {
   CAMLparam0();
   CAMLparam0();
+  CAMLlocal1(result);
   if (!Val)
   if (!Val)
     CAMLreturn(Val_int(NullValue));
     CAMLreturn(Val_int(NullValue));
   if (LLVMIsAConstant(Val)) {
   if (LLVMIsAConstant(Val)) {
@@ -645,7 +653,6 @@ CAMLprim value llvm_classify_value(LLVMValueRef Val) {
     DEFINE_CASE(Val, ConstantVector);
     DEFINE_CASE(Val, ConstantVector);
   }
   }
   if (LLVMIsAInstruction(Val)) {
   if (LLVMIsAInstruction(Val)) {
-    CAMLlocal1(result);
     result = caml_alloc_small(1, 0);
     result = caml_alloc_small(1, 0);
     Store_field(result, 0, Val_int(LLVMGetInstructionOpcode(Val)));
     Store_field(result, 0, Val_int(LLVMGetInstructionOpcode(Val)));
     CAMLreturn(result);
     CAMLreturn(result);
@@ -653,6 +660,7 @@ CAMLprim value llvm_classify_value(LLVMValueRef Val) {
   if (LLVMIsAGlobalValue(Val)) {
   if (LLVMIsAGlobalValue(Val)) {
     DEFINE_CASE(Val, Function);
     DEFINE_CASE(Val, Function);
     DEFINE_CASE(Val, GlobalAlias);
     DEFINE_CASE(Val, GlobalAlias);
+    DEFINE_CASE(Val, GlobalIFunc);
     DEFINE_CASE(Val, GlobalVariable);
     DEFINE_CASE(Val, GlobalVariable);
   }
   }
   DEFINE_CASE(Val, Argument);
   DEFINE_CASE(Val, Argument);
@@ -724,6 +732,19 @@ CAMLprim value llvm_num_operands(LLVMValueRef V) {
   return Val_int(LLVMGetNumOperands(V));
   return Val_int(LLVMGetNumOperands(V));
 }
 }
 
 
+/* llvalue -> int array */
+CAMLprim value llvm_indices(LLVMValueRef Instr) {
+  CAMLparam0();
+  CAMLlocal1(indices);
+  unsigned n = LLVMGetNumIndices(Instr);
+  const unsigned *Indices = LLVMGetIndices(Instr);
+  indices = caml_alloc(n, 0);
+  for (unsigned i = 0; i < n; i++) {
+    Op_val(indices)[i] = Val_int(Indices[i]);
+  }
+  CAMLreturn(indices);
+}
+
 /*--... Operations on constants of (mostly) any type .......................--*/
 /*--... Operations on constants of (mostly) any type .......................--*/
 
 
 /* llvalue -> bool */
 /* llvalue -> bool */
@@ -801,12 +822,11 @@ CAMLprim LLVMValueRef llvm_mdnull(LLVMContextRef C) {
 /* llvalue -> string option */
 /* llvalue -> string option */
 CAMLprim value llvm_get_mdstring(LLVMValueRef V) {
 CAMLprim value llvm_get_mdstring(LLVMValueRef V) {
   CAMLparam0();
   CAMLparam0();
+  CAMLlocal2(Option, Str);
   const char *S;
   const char *S;
   unsigned Len;
   unsigned Len;
 
 
   if ((S = LLVMGetMDString(V, &Len))) {
   if ((S = LLVMGetMDString(V, &Len))) {
-    CAMLlocal2(Option, Str);
-
     Str = caml_alloc_string(Len);
     Str = caml_alloc_string(Len);
     memcpy(String_val(Str), S, Len);
     memcpy(String_val(Str), S, Len);
     Option = alloc(1,0);
     Option = alloc(1,0);
@@ -1514,7 +1534,7 @@ CAMLprim value llvm_instr_get_opcode(LLVMValueRef Inst) {
   if (!LLVMIsAInstruction(Inst))
   if (!LLVMIsAInstruction(Inst))
       failwith("Not an instruction");
       failwith("Not an instruction");
   o = LLVMGetInstructionOpcode(Inst);
   o = LLVMGetInstructionOpcode(Inst);
-  assert (o <= LLVMLandingPad);
+  assert (o <= LLVMCallBr);
   return Val_int(o);
   return Val_int(o);
 }
 }
 
 
@@ -1596,6 +1616,11 @@ CAMLprim value llvm_remove_string_call_site_attr(LLVMValueRef F, value Kind,
 
 
 /*--... Operations on call instructions (only) .............................--*/
 /*--... Operations on call instructions (only) .............................--*/
 
 
+/* llvalue -> int */
+CAMLprim value llvm_num_arg_operands(LLVMValueRef V) {
+  return Val_int(LLVMGetNumArgOperands(V));
+}
+
 /* llvalue -> bool */
 /* llvalue -> bool */
 CAMLprim value llvm_is_tail_call(LLVMValueRef CallInst) {
 CAMLprim value llvm_is_tail_call(LLVMValueRef CallInst) {
   return Val_bool(LLVMIsTailCall(CallInst));
   return Val_bool(LLVMIsTailCall(CallInst));
@@ -1901,6 +1926,11 @@ CAMLprim value llvm_add_clause(LLVMValueRef LandingPadInst, LLVMValueRef ClauseV
     return Val_unit;
     return Val_unit;
 }
 }
 
 
+/* llvalue -> bool */
+CAMLprim value llvm_is_cleanup(LLVMValueRef LandingPadInst)
+{
+    return Val_bool(LLVMIsCleanup(LandingPadInst));
+}
 
 
 /* llvalue -> bool -> unit */
 /* llvalue -> bool -> unit */
 CAMLprim value llvm_set_cleanup(LLVMValueRef LandingPadInst, value flag)
 CAMLprim value llvm_set_cleanup(LLVMValueRef LandingPadInst, value flag)

+ 3 - 4
bindings/ocaml/target/llvm_target.ml

@@ -1,9 +1,8 @@
 (*===-- llvm_target.ml - LLVM OCaml Interface ------------------*- OCaml -*-===*
 (*===-- llvm_target.ml - LLVM OCaml Interface ------------------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 3 - 4
bindings/ocaml/target/llvm_target.mli

@@ -1,9 +1,8 @@
 (*===-- llvm_target.mli - LLVM OCaml Interface -----------------*- OCaml -*-===*
 (*===-- llvm_target.mli - LLVM OCaml Interface -----------------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 4 - 4
bindings/ocaml/target/target_ocaml.c

@@ -1,9 +1,9 @@
 /*===-- target_ocaml.c - LLVM OCaml Glue ------------------------*- C++ -*-===*\
 /*===-- target_ocaml.c - LLVM OCaml Glue ------------------------*- C++ -*-===*\
 |*                                                                            *|
 |*                                                                            *|
-|*                     The LLVM Compiler Infrastructure                       *|
-|*                                                                            *|
-|* This file is distributed under the University of Illinois Open Source      *|
-|* License. See LICENSE.TXT for details.                                      *|
+|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
+|* Exceptions.                                                                *|
+|* See https://llvm.org/LICENSE.txt for license information.                  *|
+|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
 |*                                                                            *|
 |*                                                                            *|
 |*===----------------------------------------------------------------------===*|
 |*===----------------------------------------------------------------------===*|
 |*                                                                            *|
 |*                                                                            *|

+ 10 - 4
bindings/ocaml/transforms/ipo/ipo_ocaml.c

@@ -1,9 +1,9 @@
 /*===-- ipo_ocaml.c - LLVM OCaml Glue ---------------------------*- C++ -*-===*\
 /*===-- ipo_ocaml.c - LLVM OCaml Glue ---------------------------*- C++ -*-===*\
 |*                                                                            *|
 |*                                                                            *|
-|*                     The LLVM Compiler Infrastructure                       *|
-|*                                                                            *|
-|* This file is distributed under the University of Illinois Open Source      *|
-|* License. See LICENSE.TXT for details.                                      *|
+|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
+|* Exceptions.                                                                *|
+|* See https://llvm.org/LICENSE.txt for license information.                  *|
+|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
 |*                                                                            *|
 |*                                                                            *|
 |*===----------------------------------------------------------------------===*|
 |*===----------------------------------------------------------------------===*|
 |*                                                                            *|
 |*                                                                            *|
@@ -31,6 +31,12 @@ CAMLprim value llvm_add_constant_merge(LLVMPassManagerRef PM) {
   return Val_unit;
   return Val_unit;
 }
 }
 
 
+/* [`Module] Llvm.PassManager.t -> unit */
+CAMLprim value llvm_add_merge_functions(LLVMPassManagerRef PM) {
+  LLVMAddMergeFunctionsPass(PM);
+  return Val_unit;
+}
+
 /* [`Module] Llvm.PassManager.t -> unit */
 /* [`Module] Llvm.PassManager.t -> unit */
 CAMLprim value llvm_add_dead_arg_elimination(LLVMPassManagerRef PM) {
 CAMLprim value llvm_add_dead_arg_elimination(LLVMPassManagerRef PM) {
   LLVMAddDeadArgEliminationPass(PM);
   LLVMAddDeadArgEliminationPass(PM);

+ 6 - 4
bindings/ocaml/transforms/ipo/llvm_ipo.ml

@@ -1,9 +1,8 @@
 (*===-- llvm_ipo.ml - LLVM OCaml Interface --------------------*- OCaml -*-===*
 (*===-- llvm_ipo.ml - LLVM OCaml Interface --------------------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 
@@ -13,6 +12,9 @@ external add_argument_promotion
 external add_constant_merge
 external add_constant_merge
   : [ `Module ] Llvm.PassManager.t -> unit
   : [ `Module ] Llvm.PassManager.t -> unit
   = "llvm_add_constant_merge"
   = "llvm_add_constant_merge"
+external add_merge_functions
+  : [ `Module ] Llvm.PassManager.t -> unit
+  = "llvm_add_merge_functions"
 external add_dead_arg_elimination
 external add_dead_arg_elimination
   : [ `Module ] Llvm.PassManager.t -> unit
   : [ `Module ] Llvm.PassManager.t -> unit
   = "llvm_add_dead_arg_elimination"
   = "llvm_add_dead_arg_elimination"

+ 8 - 4
bindings/ocaml/transforms/ipo/llvm_ipo.mli

@@ -1,9 +1,8 @@
 (*===-- llvm_ipo.mli - LLVM OCaml Interface -------------------*- OCaml -*-===*
 (*===-- llvm_ipo.mli - LLVM OCaml Interface -------------------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 
@@ -22,6 +21,11 @@ external add_constant_merge
   : [ `Module ] Llvm.PassManager.t -> unit
   : [ `Module ] Llvm.PassManager.t -> unit
   = "llvm_add_constant_merge"
   = "llvm_add_constant_merge"
 
 
+(** See the [llvm::createMergeFunctionsPass] function. *)
+external add_merge_functions
+  : [ `Module ] Llvm.PassManager.t -> unit
+  = "llvm_add_merge_functions"
+
 (** See the [llvm::createDeadArgEliminationPass] function. *)
 (** See the [llvm::createDeadArgEliminationPass] function. *)
 external add_dead_arg_elimination
 external add_dead_arg_elimination
   : [ `Module ] Llvm.PassManager.t -> unit
   : [ `Module ] Llvm.PassManager.t -> unit

+ 3 - 4
bindings/ocaml/transforms/passmgr_builder/llvm_passmgr_builder.ml

@@ -1,9 +1,8 @@
 (*===-- llvm_passmgr_builder.ml - LLVM OCaml Interface --------*- OCaml -*-===*
 (*===-- llvm_passmgr_builder.ml - LLVM OCaml Interface --------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 3 - 4
bindings/ocaml/transforms/passmgr_builder/llvm_passmgr_builder.mli

@@ -1,9 +1,8 @@
 (*===-- llvm_passmgr_builder.mli - LLVM OCaml Interface -------*- OCaml -*-===*
 (*===-- llvm_passmgr_builder.mli - LLVM OCaml Interface -------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 4 - 4
bindings/ocaml/transforms/passmgr_builder/passmgr_builder_ocaml.c

@@ -1,9 +1,9 @@
 /*===-- passmgr_builder_ocaml.c - LLVM OCaml Glue ---------------*- C++ -*-===*\
 /*===-- passmgr_builder_ocaml.c - LLVM OCaml Glue ---------------*- C++ -*-===*\
 |*                                                                            *|
 |*                                                                            *|
-|*                     The LLVM Compiler Infrastructure                       *|
-|*                                                                            *|
-|* This file is distributed under the University of Illinois Open Source      *|
-|* License. See LICENSE.TXT for details.                                      *|
+|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
+|* Exceptions.                                                                *|
+|* See https://llvm.org/LICENSE.txt for license information.                  *|
+|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
 |*                                                                            *|
 |*                                                                            *|
 |*===----------------------------------------------------------------------===*|
 |*===----------------------------------------------------------------------===*|
 |*                                                                            *|
 |*                                                                            *|

+ 15 - 4
bindings/ocaml/transforms/scalar_opts/llvm_scalar_opts.ml

@@ -1,15 +1,17 @@
 (*===-- llvm_scalar_opts.ml - LLVM OCaml Interface ------------*- OCaml -*-===*
 (*===-- llvm_scalar_opts.ml - LLVM OCaml Interface ------------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 
 external add_aggressive_dce
 external add_aggressive_dce
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   = "llvm_add_aggressive_dce"
   = "llvm_add_aggressive_dce"
+external add_dce
+  : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
+  = "llvm_add_dce"
 external add_alignment_from_assumptions
 external add_alignment_from_assumptions
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   = "llvm_add_alignment_from_assumptions"
   = "llvm_add_alignment_from_assumptions"
@@ -64,6 +66,9 @@ external add_memcpy_opt
 external add_partially_inline_lib_calls
 external add_partially_inline_lib_calls
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   = "llvm_add_partially_inline_lib_calls"
   = "llvm_add_partially_inline_lib_calls"
+external add_lower_atomic
+  : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
+  = "llvm_add_lower_atomic"
 external add_lower_switch
 external add_lower_switch
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   = "llvm_add_lower_switch"
   = "llvm_add_lower_switch"
@@ -109,6 +114,9 @@ external add_early_cse
 external add_lower_expect_intrinsic
 external add_lower_expect_intrinsic
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   = "llvm_add_lower_expect_intrinsic"
   = "llvm_add_lower_expect_intrinsic"
+external add_lower_constant_intrinsics
+  : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
+  = "llvm_add_lower_constant_intrinsics"
 external add_type_based_alias_analysis
 external add_type_based_alias_analysis
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   = "llvm_add_type_based_alias_analysis"
   = "llvm_add_type_based_alias_analysis"
@@ -118,3 +126,6 @@ external add_scoped_no_alias_alias_analysis
 external add_basic_alias_analysis
 external add_basic_alias_analysis
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   = "llvm_add_basic_alias_analysis"
   = "llvm_add_basic_alias_analysis"
+external add_unify_function_exit_nodes
+  : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
+  = "llvm_add_unify_function_exit_nodes"

+ 23 - 4
bindings/ocaml/transforms/scalar_opts/llvm_scalar_opts.mli

@@ -1,9 +1,8 @@
 (*===-- llvm_scalar_opts.mli - LLVM OCaml Interface -----------*- OCaml -*-===*
 (*===-- llvm_scalar_opts.mli - LLVM OCaml Interface -----------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 
@@ -17,6 +16,11 @@ external add_aggressive_dce
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   = "llvm_add_aggressive_dce"
   = "llvm_add_aggressive_dce"
 
 
+(** See the [llvm::createDCEPass] function. *)
+external add_dce
+  : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
+  = "llvm_add_dce"
+
 (** See the [llvm::createAlignmentFromAssumptionsPass] function. *)
 (** See the [llvm::createAlignmentFromAssumptionsPass] function. *)
 external add_alignment_from_assumptions
 external add_alignment_from_assumptions
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
@@ -107,6 +111,11 @@ external add_partially_inline_lib_calls
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   = "llvm_add_partially_inline_lib_calls"
   = "llvm_add_partially_inline_lib_calls"
 
 
+(** See the [llvm::createLowerAtomicPass] function. *)
+external add_lower_atomic
+  : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
+  = "llvm_add_lower_atomic"
+
 (** See the [llvm::createLowerSwitchPass] function. *)
 (** See the [llvm::createLowerSwitchPass] function. *)
 external add_lower_switch
 external add_lower_switch
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
@@ -182,6 +191,11 @@ external add_lower_expect_intrinsic
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   = "llvm_add_lower_expect_intrinsic"
   = "llvm_add_lower_expect_intrinsic"
 
 
+(** See the [llvm::createLowerConstantIntrinsicsPass] function. *)
+external add_lower_constant_intrinsics
+  : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
+  = "llvm_add_lower_constant_intrinsics"
+
 (** See the [llvm::createTypeBasedAliasAnalysisPass] function. *)
 (** See the [llvm::createTypeBasedAliasAnalysisPass] function. *)
 external add_type_based_alias_analysis
 external add_type_based_alias_analysis
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
@@ -196,3 +210,8 @@ external add_scoped_no_alias_alias_analysis
 external add_basic_alias_analysis
 external add_basic_alias_analysis
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
   = "llvm_add_basic_alias_analysis"
   = "llvm_add_basic_alias_analysis"
+
+(** See the [llvm::createUnifyFunctionExitNodesPass] function. *)
+external add_unify_function_exit_nodes
+  : [< Llvm.PassManager.any ] Llvm.PassManager.t -> unit
+  = "llvm_add_unify_function_exit_nodes"

+ 28 - 4
bindings/ocaml/transforms/scalar_opts/scalar_opts_ocaml.c

@@ -1,9 +1,9 @@
 /*===-- scalar_opts_ocaml.c - LLVM OCaml Glue -------------------*- C++ -*-===*\
 /*===-- scalar_opts_ocaml.c - LLVM OCaml Glue -------------------*- C++ -*-===*\
 |*                                                                            *|
 |*                                                                            *|
-|*                     The LLVM Compiler Infrastructure                       *|
-|*                                                                            *|
-|* This file is distributed under the University of Illinois Open Source      *|
-|* License. See LICENSE.TXT for details.                                      *|
+|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
+|* Exceptions.                                                                *|
+|* See https://llvm.org/LICENSE.txt for license information.                  *|
+|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
 |*                                                                            *|
 |*                                                                            *|
 |*===----------------------------------------------------------------------===*|
 |*===----------------------------------------------------------------------===*|
 |*                                                                            *|
 |*                                                                            *|
@@ -16,6 +16,7 @@
 \*===----------------------------------------------------------------------===*/
 \*===----------------------------------------------------------------------===*/
 
 
 #include "llvm-c/Transforms/Scalar.h"
 #include "llvm-c/Transforms/Scalar.h"
+#include "llvm-c/Transforms/Utils.h"
 #include "caml/mlvalues.h"
 #include "caml/mlvalues.h"
 #include "caml/misc.h"
 #include "caml/misc.h"
 
 
@@ -25,6 +26,11 @@ CAMLprim value llvm_add_aggressive_dce(LLVMPassManagerRef PM) {
   return Val_unit;
   return Val_unit;
 }
 }
 
 
+CAMLprim value llvm_add_dce(LLVMPassManagerRef PM) {
+  LLVMAddDCEPass(PM);
+  return Val_unit;
+}
+
 /* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
 /* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
 CAMLprim value llvm_add_alignment_from_assumptions(LLVMPassManagerRef PM) {
 CAMLprim value llvm_add_alignment_from_assumptions(LLVMPassManagerRef PM) {
   LLVMAddAlignmentFromAssumptionsPass(PM);
   LLVMAddAlignmentFromAssumptionsPass(PM);
@@ -133,6 +139,12 @@ CAMLprim value llvm_add_partially_inline_lib_calls(LLVMPassManagerRef PM) {
   return Val_unit;
   return Val_unit;
 }
 }
 
 
+/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
+CAMLprim value llvm_add_lower_atomic(LLVMPassManagerRef PM) {
+  LLVMAddLowerAtomicPass(PM);
+  return Val_unit;
+}
+
 /* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
 /* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
 CAMLprim value llvm_add_lower_switch(LLVMPassManagerRef PM) {
 CAMLprim value llvm_add_lower_switch(LLVMPassManagerRef PM) {
   LLVMAddLowerSwitchPass(PM);
   LLVMAddLowerSwitchPass(PM);
@@ -224,6 +236,12 @@ CAMLprim value llvm_add_lower_expect_intrinsic(LLVMPassManagerRef PM) {
   return Val_unit;
   return Val_unit;
 }
 }
 
 
+/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
+CAMLprim value llvm_add_lower_constant_intrinsics(LLVMPassManagerRef PM) {
+  LLVMAddLowerConstantIntrinsicsPass(PM);
+  return Val_unit;
+}
+
 /* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
 /* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
 CAMLprim value llvm_add_type_based_alias_analysis(LLVMPassManagerRef PM) {
 CAMLprim value llvm_add_type_based_alias_analysis(LLVMPassManagerRef PM) {
   LLVMAddTypeBasedAliasAnalysisPass(PM);
   LLVMAddTypeBasedAliasAnalysisPass(PM);
@@ -241,3 +259,9 @@ CAMLprim value llvm_add_basic_alias_analysis(LLVMPassManagerRef PM) {
   LLVMAddBasicAliasAnalysisPass(PM);
   LLVMAddBasicAliasAnalysisPass(PM);
   return Val_unit;
   return Val_unit;
 }
 }
+
+/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
+CAMLprim value llvm_add_unify_function_exit_nodes(LLVMPassManagerRef PM) {
+  LLVMAddUnifyFunctionExitNodesPass(PM);
+  return Val_unit;
+}

+ 3 - 4
bindings/ocaml/transforms/utils/llvm_transform_utils.ml

@@ -1,9 +1,8 @@
 (*===-- llvm_transform_utils.ml - LLVM OCaml Interface --------*- OCaml -*-===*
 (*===-- llvm_transform_utils.ml - LLVM OCaml Interface --------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 3 - 4
bindings/ocaml/transforms/utils/llvm_transform_utils.mli

@@ -1,9 +1,8 @@
 (*===-- llvm_transform_utils.mli - LLVM OCaml Interface -------*- OCaml -*-===*
 (*===-- llvm_transform_utils.mli - LLVM OCaml Interface -------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 

+ 5 - 5
bindings/ocaml/transforms/utils/transform_utils_ocaml.c

@@ -1,9 +1,9 @@
-/*===-- vectorize_ocaml.c - LLVM OCaml Glue ---------------------*- C++ -*-===*\
+/*===-- transform_utils_ocaml.c - LLVM OCaml Glue ---------------*- C++ -*-===*\
 |*                                                                            *|
 |*                                                                            *|
-|*                     The LLVM Compiler Infrastructure                       *|
-|*                                                                            *|
-|* This file is distributed under the University of Illinois Open Source      *|
-|* License. See LICENSE.TXT for details.                                      *|
+|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
+|* Exceptions.                                                                *|
+|* See https://llvm.org/LICENSE.txt for license information.                  *|
+|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
 |*                                                                            *|
 |*                                                                            *|
 |*===----------------------------------------------------------------------===*|
 |*===----------------------------------------------------------------------===*|
 |*                                                                            *|
 |*                                                                            *|

+ 3 - 7
bindings/ocaml/transforms/vectorize/llvm_vectorize.ml

@@ -1,15 +1,11 @@
 (*===-- llvm_vectorize.ml - LLVM OCaml Interface --------------*- OCaml -*-===*
 (*===-- llvm_vectorize.ml - LLVM OCaml Interface --------------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 
-external add_bb_vectorize
-  : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
-  = "llvm_add_bb_vectorize"
 external add_loop_vectorize
 external add_loop_vectorize
   : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
   : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
   = "llvm_add_loop_vectorize"
   = "llvm_add_loop_vectorize"

+ 3 - 9
bindings/ocaml/transforms/vectorize/llvm_vectorize.mli

@@ -1,9 +1,8 @@
 (*===-- llvm_vectorize.mli - LLVM OCaml Interface -------------*- OCaml -*-===*
 (*===-- llvm_vectorize.mli - LLVM OCaml Interface -------------*- OCaml -*-===*
  *
  *
- *                     The LLVM Compiler Infrastructure
- *
- * This file is distributed under the University of Illinois Open Source
- * License. See LICENSE.TXT for details.
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  *
  *
  *===----------------------------------------------------------------------===*)
  *===----------------------------------------------------------------------===*)
 
 
@@ -12,11 +11,6 @@
     This interface provides an OCaml API for LLVM vectorize transforms, the
     This interface provides an OCaml API for LLVM vectorize transforms, the
     classes in the [LLVMVectorize] library. *)
     classes in the [LLVMVectorize] library. *)
 
 
-(** See the [llvm::createBBVectorizePass] function. *)
-external add_bb_vectorize
-  : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
-  = "llvm_add_bb_vectorize"
-
 (** See the [llvm::createLoopVectorizePass] function. *)
 (** See the [llvm::createLoopVectorizePass] function. *)
 external add_loop_vectorize
 external add_loop_vectorize
   : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
   : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit

+ 4 - 10
bindings/ocaml/transforms/vectorize/vectorize_ocaml.c

@@ -1,9 +1,9 @@
 /*===-- vectorize_ocaml.c - LLVM OCaml Glue ---------------------*- C++ -*-===*\
 /*===-- vectorize_ocaml.c - LLVM OCaml Glue ---------------------*- C++ -*-===*\
 |*                                                                            *|
 |*                                                                            *|
-|*                     The LLVM Compiler Infrastructure                       *|
-|*                                                                            *|
-|* This file is distributed under the University of Illinois Open Source      *|
-|* License. See LICENSE.TXT for details.                                      *|
+|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
+|* Exceptions.                                                                *|
+|* See https://llvm.org/LICENSE.txt for license information.                  *|
+|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
 |*                                                                            *|
 |*                                                                            *|
 |*===----------------------------------------------------------------------===*|
 |*===----------------------------------------------------------------------===*|
 |*                                                                            *|
 |*                                                                            *|
@@ -19,12 +19,6 @@
 #include "caml/mlvalues.h"
 #include "caml/mlvalues.h"
 #include "caml/misc.h"
 #include "caml/misc.h"
 
 
-/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
-CAMLprim value llvm_add_bb_vectorize(LLVMPassManagerRef PM) {
-  LLVMAddBBVectorizePass(PM);
-  return Val_unit;
-}
-
 /* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
 /* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
 CAMLprim value llvm_add_loop_vectorize(LLVMPassManagerRef PM) {
 CAMLprim value llvm_add_loop_vectorize(LLVMPassManagerRef PM) {
   LLVMAddLoopVectorizePass(PM);
   LLVMAddLoopVectorizePass(PM);

+ 3 - 4
bindings/python/llvm/common.py

@@ -1,9 +1,8 @@
 #===- common.py - Python LLVM Bindings -----------------------*- python -*--===#
 #===- common.py - Python LLVM Bindings -----------------------*- python -*--===#
 #
 #
-#                     The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 #
 #
 #===------------------------------------------------------------------------===#
 #===------------------------------------------------------------------------===#
 
 

+ 21 - 10
bindings/python/llvm/core.py

@@ -1,11 +1,11 @@
 #===- core.py - Python LLVM Bindings -------------------------*- python -*--===#
 #===- core.py - Python LLVM Bindings -------------------------*- python -*--===#
 #
 #
-#                     The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 #
 #
 #===------------------------------------------------------------------------===#
 #===------------------------------------------------------------------------===#
+from __future__ import print_function
 
 
 from .common import LLVMObject
 from .common import LLVMObject
 from .common import c_object_p
 from .common import c_object_p
@@ -18,6 +18,8 @@ from ctypes import byref
 from ctypes import c_char_p
 from ctypes import c_char_p
 from ctypes import c_uint
 from ctypes import c_uint
 
 
+import sys
+
 __all__ = [
 __all__ = [
     "lib",
     "lib",
     "Enums",
     "Enums",
@@ -235,7 +237,7 @@ class Module(LLVMObject):
         def __iter__(self):
         def __iter__(self):
             return self
             return self
         
         
-        def next(self):
+        def __next__(self):
             if not isinstance(self.function, Function):
             if not isinstance(self.function, Function):
                 raise StopIteration("")
                 raise StopIteration("")
             result = self.function
             result = self.function
@@ -244,7 +246,10 @@ class Module(LLVMObject):
             else:
             else:
                 self.function = self.function.next
                 self.function = self.function.next
             return result
             return result
-    
+
+        if sys.version_info.major == 2:
+            next = __next__
+
     def __iter__(self):
     def __iter__(self):
         return Module.__function_iterator(self)
         return Module.__function_iterator(self)
 
 
@@ -303,7 +308,7 @@ class Function(Value):
         def __iter__(self):
         def __iter__(self):
             return self
             return self
         
         
-        def next(self):
+        def __next__(self):
             if not isinstance(self.bb, BasicBlock):
             if not isinstance(self.bb, BasicBlock):
                 raise StopIteration("")
                 raise StopIteration("")
             result = self.bb
             result = self.bb
@@ -312,6 +317,9 @@ class Function(Value):
             else:
             else:
                 self.bb = self.bb.next
                 self.bb = self.bb.next
             return result
             return result
+
+        if sys.version_info.major == 2:
+            next = __next__
     
     
     def __iter__(self):
     def __iter__(self):
         return Function.__bb_iterator(self)
         return Function.__bb_iterator(self)
@@ -380,7 +388,7 @@ class BasicBlock(LLVMObject):
         def __iter__(self):
         def __iter__(self):
             return self
             return self
         
         
-        def next(self):
+        def __next__(self):
             if not isinstance(self.inst, Instruction):
             if not isinstance(self.inst, Instruction):
                 raise StopIteration("")
                 raise StopIteration("")
             result = self.inst
             result = self.inst
@@ -389,7 +397,10 @@ class BasicBlock(LLVMObject):
             else:
             else:
                 self.inst = self.inst.next
                 self.inst = self.inst.next
             return result
             return result
-    
+
+        if sys.version_info.major == 2:
+            next = __next__
+
     def __iter__(self):
     def __iter__(self):
         return BasicBlock.__inst_iterator(self)
         return BasicBlock.__inst_iterator(self)
 
 
@@ -605,7 +616,7 @@ def register_enumerations():
     ]
     ]
     for enum_class, enum_spec in enums:
     for enum_class, enum_spec in enums:
         for name, value in enum_spec:
         for name, value in enum_spec:
-            print name, value
+            print(name, value)
             enum_class.register(name, value)
             enum_class.register(name, value)
     return enums
     return enums
 
 

+ 3 - 4
bindings/python/llvm/disassembler.py

@@ -1,9 +1,8 @@
 #===- disassembler.py - Python LLVM Bindings -----------------*- python -*--===#
 #===- disassembler.py - Python LLVM Bindings -----------------*- python -*--===#
 #
 #
-#                     The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 #
 #
 #===------------------------------------------------------------------------===#
 #===------------------------------------------------------------------------===#
 
 

+ 3 - 4
bindings/python/llvm/enumerations.py

@@ -1,9 +1,8 @@
 #===- enumerations.py - Python LLVM Enumerations -------------*- python -*--===#
 #===- enumerations.py - Python LLVM Enumerations -------------*- python -*--===#
 #
 #
-#                     The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 #
 #
 #===------------------------------------------------------------------------===#
 #===------------------------------------------------------------------------===#
 
 

+ 3 - 4
bindings/python/llvm/object.py

@@ -1,9 +1,8 @@
 #===- object.py - Python Object Bindings --------------------*- python -*--===#
 #===- object.py - Python Object Bindings --------------------*- python -*--===#
 #
 #
-#                     The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 #
 #
 #===------------------------------------------------------------------------===#
 #===------------------------------------------------------------------------===#
 
 

+ 5 - 0
bindings/python/llvm/tests/base.py

@@ -1,6 +1,8 @@
 import os.path
 import os.path
+import sys
 import unittest
 import unittest
 
 
+
 POSSIBLE_TEST_BINARIES = [
 POSSIBLE_TEST_BINARIES = [
     'libreadline.so.5',
     'libreadline.so.5',
     'libreadline.so.6',
     'libreadline.so.6',
@@ -15,6 +17,9 @@ POSSIBLE_TEST_BINARY_PATHS = [
 ]
 ]
 
 
 class TestBase(unittest.TestCase):
 class TestBase(unittest.TestCase):
+    if sys.version_info.major == 2:
+        assertRaisesRegex = unittest.TestCase.assertRaisesRegexp
+
     def get_test_binary(self):
     def get_test_binary(self):
         """Helper to obtain a test binary for object file testing.
         """Helper to obtain a test binary for object file testing.
 
 

+ 4 - 2
bindings/python/llvm/tests/test_bitreader.py

@@ -1,3 +1,5 @@
+from __future__ import print_function
+
 from .base import TestBase
 from .base import TestBase
 from ..core import OpCode
 from ..core import OpCode
 from ..core import MemoryBuffer
 from ..core import MemoryBuffer
@@ -11,5 +13,5 @@ class TestBitReader(TestBase):
     def test_parse_bitcode(self):
     def test_parse_bitcode(self):
         source = self.get_test_bc()
         source = self.get_test_bc()
         m = parse_bitcode(MemoryBuffer(filename=source))
         m = parse_bitcode(MemoryBuffer(filename=source))
-        print m.target
-        print m.datalayout
+        print(m.target)
+        print(m.datalayout)

+ 3 - 1
bindings/python/llvm/tests/test_core.py

@@ -1,3 +1,5 @@
+from __future__ import print_function
+
 from .base import TestBase
 from .base import TestBase
 from ..core import MemoryBuffer
 from ..core import MemoryBuffer
 from ..core import PassRegistry
 from ..core import PassRegistry
@@ -127,7 +129,7 @@ class TestCore(TestBase):
             self.assertEqual(inst.opcode, inst_list[i][1])
             self.assertEqual(inst.opcode, inst_list[i][1])
             for op in range(len(inst)):
             for op in range(len(inst)):
                 o = inst.get_operand(op)
                 o = inst.get_operand(op)
-                print o.name
+                print(o.name)
                 o.dump()
                 o.dump()
             inst.dump()
             inst.dump()
             i += 1
             i += 1

+ 4 - 2
bindings/python/llvm/tests/test_disassembler.py

@@ -1,3 +1,5 @@
+from __future__ import print_function
+
 from .base import TestBase
 from .base import TestBase
 
 
 from ..disassembler import Disassembler, Option_UseMarkup
 from ..disassembler import Disassembler, Option_UseMarkup
@@ -17,7 +19,7 @@ class TestDisassembler(TestBase):
         self.assertEqual(s, '\tjcxz\t-127')
         self.assertEqual(s, '\tjcxz\t-127')
 
 
     def test_nonexistent_triple(self):
     def test_nonexistent_triple(self):
-        with self.assertRaisesRegexp(Exception, "Could not obtain disassembler for triple"):
+        with self.assertRaisesRegex(Exception, "Could not obtain disassembler for triple"):
             Disassembler("nonexistent-triple-raises")
             Disassembler("nonexistent-triple-raises")
 
 
     def test_get_instructions(self):
     def test_get_instructions(self):
@@ -38,6 +40,6 @@ class TestDisassembler(TestBase):
         disassembler = Disassembler(triple)
         disassembler = Disassembler(triple)
         disassembler.set_options(Option_UseMarkup)
         disassembler.set_options(Option_UseMarkup)
         count, s = disassembler.get_instruction(sequence)
         count, s = disassembler.get_instruction(sequence)
-        print s
+        print(s)
         self.assertEqual(count, 4)
         self.assertEqual(count, 4)
         self.assertEqual(s, '\tpush\t{<reg:r4>, <reg:lr>}')
         self.assertEqual(s, '\tpush\t{<reg:r4>, <reg:lr>}')

+ 9 - 7
bindings/python/llvm/tests/test_object.py

@@ -1,3 +1,5 @@
+from numbers import Integral
+
 from .base import TestBase
 from .base import TestBase
 from ..object import ObjectFile
 from ..object import ObjectFile
 from ..object import Relocation
 from ..object import Relocation
@@ -20,9 +22,9 @@ class TestObjectFile(TestBase):
             count += 1
             count += 1
             assert isinstance(section, Section)
             assert isinstance(section, Section)
             assert isinstance(section.name, str)
             assert isinstance(section.name, str)
-            assert isinstance(section.size, long)
+            assert isinstance(section.size, Integral)
             assert isinstance(section.contents, str)
             assert isinstance(section.contents, str)
-            assert isinstance(section.address, long)
+            assert isinstance(section.address, Integral)
             assert len(section.contents) == section.size
             assert len(section.contents) == section.size
 
 
         self.assertGreater(count, 0)
         self.assertGreater(count, 0)
@@ -38,8 +40,8 @@ class TestObjectFile(TestBase):
             count += 1
             count += 1
             assert isinstance(symbol, Symbol)
             assert isinstance(symbol, Symbol)
             assert isinstance(symbol.name, str)
             assert isinstance(symbol.name, str)
-            assert isinstance(symbol.address, long)
-            assert isinstance(symbol.size, long)
+            assert isinstance(symbol.address, Integral)
+            assert isinstance(symbol.size, Integral)
 
 
         self.assertGreater(count, 0)
         self.assertGreater(count, 0)
 
 
@@ -60,8 +62,8 @@ class TestObjectFile(TestBase):
         for section in o.get_sections():
         for section in o.get_sections():
             for relocation in section.get_relocations():
             for relocation in section.get_relocations():
                 assert isinstance(relocation, Relocation)
                 assert isinstance(relocation, Relocation)
-                assert isinstance(relocation.address, long)
-                assert isinstance(relocation.offset, long)
-                assert isinstance(relocation.type_number, long)
+                assert isinstance(relocation.address, Integral)
+                assert isinstance(relocation.offset, Integral)
+                assert isinstance(relocation.type_number, Integral)
                 assert isinstance(relocation.type_name, str)
                 assert isinstance(relocation.type_name, str)
                 assert isinstance(relocation.value_string, str)
                 assert isinstance(relocation.value_string, str)

+ 62 - 10
cmake/config-ix.cmake

@@ -7,6 +7,7 @@ include(CheckIncludeFile)
 include(CheckLibraryExists)
 include(CheckLibraryExists)
 include(CheckSymbolExists)
 include(CheckSymbolExists)
 include(CheckFunctionExists)
 include(CheckFunctionExists)
+include(CheckStructHasMember)
 include(CheckCCompilerFlag)
 include(CheckCCompilerFlag)
 
 
 include(CheckCompilerVersion)
 include(CheckCompilerVersion)
@@ -22,12 +23,24 @@ if( CMAKE_SYSTEM MATCHES "FreeBSD-9.2-RELEASE" AND
   list(APPEND CMAKE_REQUIRED_LIBRARIES "cxxrt")
   list(APPEND CMAKE_REQUIRED_LIBRARIES "cxxrt")
 endif()
 endif()
 
 
+# Do checks with _XOPEN_SOURCE and large-file API on AIX, because we will build
+# with those too.
+if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
+          list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D_XOPEN_SOURCE=700")
+          list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D_LARGE_FILE_API")
+endif()
+
+# Do checks with _FILE_OFFSET_BITS=64 on Solaris, because we will build
+# with those too.
+if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
+          list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D_FILE_OFFSET_BITS=64")
+endif()
+
 # include checks
 # include checks
 check_include_file(dlfcn.h HAVE_DLFCN_H)
 check_include_file(dlfcn.h HAVE_DLFCN_H)
 check_include_file(errno.h HAVE_ERRNO_H)
 check_include_file(errno.h HAVE_ERRNO_H)
 check_include_file(fcntl.h HAVE_FCNTL_H)
 check_include_file(fcntl.h HAVE_FCNTL_H)
 check_include_file(link.h HAVE_LINK_H)
 check_include_file(link.h HAVE_LINK_H)
-check_include_file(malloc.h HAVE_MALLOC_H)
 check_include_file(malloc/malloc.h HAVE_MALLOC_MALLOC_H)
 check_include_file(malloc/malloc.h HAVE_MALLOC_MALLOC_H)
 if( NOT PURE_WINDOWS )
 if( NOT PURE_WINDOWS )
   check_include_file(pthread.h HAVE_PTHREAD_H)
   check_include_file(pthread.h HAVE_PTHREAD_H)
@@ -128,7 +141,7 @@ if(NOT LLVM_USE_SANITIZER MATCHES "Memory.*")
     endif()
     endif()
     if(LLVM_ENABLE_TERMINFO)
     if(LLVM_ENABLE_TERMINFO)
       set(HAVE_TERMINFO 0)
       set(HAVE_TERMINFO 0)
-      foreach(library tinfo terminfo curses ncurses ncursesw)
+      foreach(library terminfo tinfo curses ncurses ncursesw)
         string(TOUPPER ${library} library_suffix)
         string(TOUPPER ${library} library_suffix)
         check_library_exists(${library} setupterm "" HAVE_TERMINFO_${library_suffix})
         check_library_exists(${library} setupterm "" HAVE_TERMINFO_${library_suffix})
         if(HAVE_TERMINFO_${library_suffix})
         if(HAVE_TERMINFO_${library_suffix})
@@ -148,7 +161,11 @@ if(NOT LLVM_USE_SANITIZER MATCHES "Memory.*")
       find_package(LibXml2)
       find_package(LibXml2)
       if (LIBXML2_FOUND)
       if (LIBXML2_FOUND)
         set(LLVM_LIBXML2_ENABLED 1)
         set(LLVM_LIBXML2_ENABLED 1)
-        include_directories(${LIBXML2_INCLUDE_DIR})
+        if ((CMAKE_OSX_SYSROOT) AND (EXISTS ${CMAKE_OSX_SYSROOT}/${LIBXML2_INCLUDE_DIR}))
+          include_directories(${CMAKE_OSX_SYSROOT}/${LIBXML2_INCLUDE_DIR})
+        else()
+          include_directories(${LIBXML2_INCLUDE_DIR})
+        endif()
         set(LIBXML2_LIBS "xml2")
         set(LIBXML2_LIBS "xml2")
       endif()
       endif()
     endif()
     endif()
@@ -203,7 +220,6 @@ check_symbol_exists(malloc_zone_statistics malloc/malloc.h
 check_symbol_exists(getrlimit "sys/types.h;sys/time.h;sys/resource.h" HAVE_GETRLIMIT)
 check_symbol_exists(getrlimit "sys/types.h;sys/time.h;sys/resource.h" HAVE_GETRLIMIT)
 check_symbol_exists(posix_spawn spawn.h HAVE_POSIX_SPAWN)
 check_symbol_exists(posix_spawn spawn.h HAVE_POSIX_SPAWN)
 check_symbol_exists(pread unistd.h HAVE_PREAD)
 check_symbol_exists(pread unistd.h HAVE_PREAD)
-check_symbol_exists(realpath stdlib.h HAVE_REALPATH)
 check_symbol_exists(sbrk unistd.h HAVE_SBRK)
 check_symbol_exists(sbrk unistd.h HAVE_SBRK)
 check_symbol_exists(strerror string.h HAVE_STRERROR)
 check_symbol_exists(strerror string.h HAVE_STRERROR)
 check_symbol_exists(strerror_r string.h HAVE_STRERROR_R)
 check_symbol_exists(strerror_r string.h HAVE_STRERROR_R)
@@ -244,6 +260,11 @@ if( HAVE_DLFCN_H )
   endif()
   endif()
 endif()
 endif()
 
 
+CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtimespec.tv_nsec
+    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC)
+CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtim.tv_nsec
+    "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC)
+
 check_symbol_exists(__GLIBC__ stdio.h LLVM_USING_GLIBC)
 check_symbol_exists(__GLIBC__ stdio.h LLVM_USING_GLIBC)
 if( LLVM_USING_GLIBC )
 if( LLVM_USING_GLIBC )
   add_definitions( -D_GNU_SOURCE )
   add_definitions( -D_GNU_SOURCE )
@@ -315,6 +336,15 @@ else()
   unset(HAVE_FFI_CALL CACHE)
   unset(HAVE_FFI_CALL CACHE)
 endif( LLVM_ENABLE_FFI )
 endif( LLVM_ENABLE_FFI )
 
 
+# Whether we can use std::is_trivially_copyable to verify llvm::is_trivially_copyable.
+CHECK_CXX_SOURCE_COMPILES("
+#include <type_traits>
+struct T { int val; };
+static_assert(std::is_trivially_copyable<T>::value, \"ok\");
+int main() { return 0;}
+" HAVE_STD_IS_TRIVIALLY_COPYABLE)
+
+
 # Define LLVM_HAS_ATOMICS if gcc or MSVC atomic builtins are supported.
 # Define LLVM_HAS_ATOMICS if gcc or MSVC atomic builtins are supported.
 include(CheckAtomic)
 include(CheckAtomic)
 
 
@@ -376,12 +406,16 @@ elseif (LLVM_NATIVE_ARCH MATCHES "sparc")
   set(LLVM_NATIVE_ARCH Sparc)
   set(LLVM_NATIVE_ARCH Sparc)
 elseif (LLVM_NATIVE_ARCH MATCHES "powerpc")
 elseif (LLVM_NATIVE_ARCH MATCHES "powerpc")
   set(LLVM_NATIVE_ARCH PowerPC)
   set(LLVM_NATIVE_ARCH PowerPC)
+elseif (LLVM_NATIVE_ARCH MATCHES "ppc64le")
+  set(LLVM_NATIVE_ARCH PowerPC)
 elseif (LLVM_NATIVE_ARCH MATCHES "aarch64")
 elseif (LLVM_NATIVE_ARCH MATCHES "aarch64")
   set(LLVM_NATIVE_ARCH AArch64)
   set(LLVM_NATIVE_ARCH AArch64)
 elseif (LLVM_NATIVE_ARCH MATCHES "arm64")
 elseif (LLVM_NATIVE_ARCH MATCHES "arm64")
   set(LLVM_NATIVE_ARCH AArch64)
   set(LLVM_NATIVE_ARCH AArch64)
 elseif (LLVM_NATIVE_ARCH MATCHES "arm")
 elseif (LLVM_NATIVE_ARCH MATCHES "arm")
   set(LLVM_NATIVE_ARCH ARM)
   set(LLVM_NATIVE_ARCH ARM)
+elseif (LLVM_NATIVE_ARCH MATCHES "avr")
+  set(LLVM_NATIVE_ARCH AVR)
 elseif (LLVM_NATIVE_ARCH MATCHES "mips")
 elseif (LLVM_NATIVE_ARCH MATCHES "mips")
   set(LLVM_NATIVE_ARCH Mips)
   set(LLVM_NATIVE_ARCH Mips)
 elseif (LLVM_NATIVE_ARCH MATCHES "xcore")
 elseif (LLVM_NATIVE_ARCH MATCHES "xcore")
@@ -440,7 +474,8 @@ if( MSVC )
   set(strdup "_strdup")
   set(strdup "_strdup")
 
 
   # See if the DIA SDK is available and usable.
   # See if the DIA SDK is available and usable.
-  set(MSVC_DIA_SDK_DIR "$ENV{VSINSTALLDIR}DIA SDK")
+  set(MSVC_DIA_SDK_DIR "$ENV{VSINSTALLDIR}DIA SDK" CACHE PATH
+      "Path to the DIA SDK")
 
 
   # Due to a bug in MSVC 2013's installation software, it is possible
   # Due to a bug in MSVC 2013's installation software, it is possible
   # for MSVC 2013 to write the DIA SDK into the Visual Studio 2012
   # for MSVC 2013 to write the DIA SDK into the Visual Studio 2012
@@ -511,10 +546,10 @@ else()
 endif()
 endif()
 
 
 set(LLVM_BINDINGS "")
 set(LLVM_BINDINGS "")
-if(WIN32)
+find_program(GO_EXECUTABLE NAMES go DOC "go executable")
+if(WIN32 OR NOT LLVM_ENABLE_BINDINGS)
   message(STATUS "Go bindings disabled.")
   message(STATUS "Go bindings disabled.")
 else()
 else()
-  find_program(GO_EXECUTABLE NAMES go DOC "go executable")
   if(GO_EXECUTABLE STREQUAL "GO_EXECUTABLE-NOTFOUND")
   if(GO_EXECUTABLE STREQUAL "GO_EXECUTABLE-NOTFOUND")
     message(STATUS "Go bindings disabled.")
     message(STATUS "Go bindings disabled.")
   else()
   else()
@@ -533,6 +568,20 @@ find_program(GOLD_EXECUTABLE NAMES ${LLVM_DEFAULT_TARGET_TRIPLE}-ld.gold ld.gold
 set(LLVM_BINUTILS_INCDIR "" CACHE PATH
 set(LLVM_BINUTILS_INCDIR "" CACHE PATH
 	"PATH to binutils/include containing plugin-api.h for gold plugin.")
 	"PATH to binutils/include containing plugin-api.h for gold plugin.")
 
 
+if(CMAKE_GENERATOR STREQUAL "Ninja")
+  execute_process(COMMAND ${CMAKE_MAKE_PROGRAM} --version
+    OUTPUT_VARIABLE NINJA_VERSION
+    OUTPUT_STRIP_TRAILING_WHITESPACE)
+  set(NINJA_VERSION ${NINJA_VERSION} CACHE STRING "Ninja version number" FORCE)
+  message(STATUS "Ninja version: ${NINJA_VERSION}")
+endif()
+
+if(CMAKE_GENERATOR STREQUAL "Ninja" AND
+    NOT "${NINJA_VERSION}" VERSION_LESS "1.9.0" AND
+    CMAKE_HOST_APPLE AND CMAKE_HOST_SYSTEM_VERSION VERSION_GREATER "15.6.0")
+  set(LLVM_TOUCH_STATIC_LIBRARIES ON)
+endif()
+
 if(CMAKE_HOST_APPLE AND APPLE)
 if(CMAKE_HOST_APPLE AND APPLE)
   if(NOT CMAKE_XCRUN)
   if(NOT CMAKE_XCRUN)
     find_program(CMAKE_XCRUN NAMES xcrun)
     find_program(CMAKE_XCRUN NAMES xcrun)
@@ -554,7 +603,7 @@ endif()
 # Keep the version requirements in sync with bindings/ocaml/README.txt.
 # Keep the version requirements in sync with bindings/ocaml/README.txt.
 include(FindOCaml)
 include(FindOCaml)
 include(AddOCaml)
 include(AddOCaml)
-if(WIN32)
+if(WIN32 OR NOT LLVM_ENABLE_BINDINGS)
   message(STATUS "OCaml bindings disabled.")
   message(STATUS "OCaml bindings disabled.")
 else()
 else()
   find_package(OCaml)
   find_package(OCaml)
@@ -585,16 +634,19 @@ function(find_python_module module)
   string(REPLACE "." "_" module_name ${module})
   string(REPLACE "." "_" module_name ${module})
   string(TOUPPER ${module_name} module_upper)
   string(TOUPPER ${module_name} module_upper)
   set(FOUND_VAR PY_${module_upper}_FOUND)
   set(FOUND_VAR PY_${module_upper}_FOUND)
+  if (DEFINED ${FOUND_VAR})
+    return()
+  endif()
 
 
   execute_process(COMMAND "${PYTHON_EXECUTABLE}" "-c" "import ${module}"
   execute_process(COMMAND "${PYTHON_EXECUTABLE}" "-c" "import ${module}"
     RESULT_VARIABLE status
     RESULT_VARIABLE status
     ERROR_QUIET)
     ERROR_QUIET)
 
 
   if(status)
   if(status)
-    set(${FOUND_VAR} 0 PARENT_SCOPE)
+    set(${FOUND_VAR} OFF CACHE BOOL "Failed to find python module '${module}'")
     message(STATUS "Could NOT find Python module ${module}")
     message(STATUS "Could NOT find Python module ${module}")
   else()
   else()
-    set(${FOUND_VAR} 1 PARENT_SCOPE)
+  set(${FOUND_VAR} ON CACHE BOOL "Found python module '${module}'")
     message(STATUS "Found Python module ${module}")
     message(STATUS "Found Python module ${module}")
   endif()
   endif()
 endfunction()
 endfunction()

+ 309 - 148
cmake/modules/AddLLVM.cmake

@@ -8,6 +8,8 @@ function(llvm_update_compile_flags name)
     set(update_src_props ON)
     set(update_src_props ON)
   endif()
   endif()
 
 
+  list(APPEND LLVM_COMPILE_CFLAGS " ${LLVM_COMPILE_FLAGS}")
+
   # LLVM_REQUIRES_EH is an internal flag that individual targets can use to
   # LLVM_REQUIRES_EH is an internal flag that individual targets can use to
   # force EH
   # force EH
   if(LLVM_REQUIRES_EH OR LLVM_ENABLE_EH)
   if(LLVM_REQUIRES_EH OR LLVM_ENABLE_EH)
@@ -21,9 +23,15 @@ function(llvm_update_compile_flags name)
   else()
   else()
     if(LLVM_COMPILER_IS_GCC_COMPATIBLE)
     if(LLVM_COMPILER_IS_GCC_COMPATIBLE)
       list(APPEND LLVM_COMPILE_FLAGS "-fno-exceptions")
       list(APPEND LLVM_COMPILE_FLAGS "-fno-exceptions")
+      if(NOT LLVM_ENABLE_UNWIND_TABLES)
+        list(APPEND LLVM_COMPILE_FLAGS "-fno-unwind-tables")
+        list(APPEND LLVM_COMPILE_FLAGS "-fno-asynchronous-unwind-tables")
+      endif()
     elseif(MSVC)
     elseif(MSVC)
       list(APPEND LLVM_COMPILE_DEFINITIONS _HAS_EXCEPTIONS=0)
       list(APPEND LLVM_COMPILE_DEFINITIONS _HAS_EXCEPTIONS=0)
       list(APPEND LLVM_COMPILE_FLAGS "/EHs-c-")
       list(APPEND LLVM_COMPILE_FLAGS "/EHs-c-")
+    elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL")
+      list(APPEND LLVM_COMPILE_FLAGS "-qnoeh")
     endif()
     endif()
   endif()
   endif()
 
 
@@ -37,6 +45,8 @@ function(llvm_update_compile_flags name)
       list(APPEND LLVM_COMPILE_FLAGS "-fno-rtti")
       list(APPEND LLVM_COMPILE_FLAGS "-fno-rtti")
     elseif (MSVC)
     elseif (MSVC)
       list(APPEND LLVM_COMPILE_FLAGS "/GR-")
       list(APPEND LLVM_COMPILE_FLAGS "/GR-")
+    elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL")
+      list(APPEND LLVM_COMPILE_FLAGS "-qnortti")
     endif ()
     endif ()
   elseif(MSVC)
   elseif(MSVC)
     list(APPEND LLVM_COMPILE_FLAGS "/GR")
     list(APPEND LLVM_COMPILE_FLAGS "/GR")
@@ -46,6 +56,7 @@ function(llvm_update_compile_flags name)
   #   - LLVM_COMPILE_FLAGS is list.
   #   - LLVM_COMPILE_FLAGS is list.
   #   - PROPERTY COMPILE_FLAGS is string.
   #   - PROPERTY COMPILE_FLAGS is string.
   string(REPLACE ";" " " target_compile_flags " ${LLVM_COMPILE_FLAGS}")
   string(REPLACE ";" " " target_compile_flags " ${LLVM_COMPILE_FLAGS}")
+  string(REPLACE ";" " " target_compile_cflags " ${LLVM_COMPILE_CFLAGS}")
 
 
   if(update_src_props)
   if(update_src_props)
     foreach(fn ${sources})
     foreach(fn ${sources})
@@ -54,6 +65,10 @@ function(llvm_update_compile_flags name)
         set_property(SOURCE ${fn} APPEND_STRING PROPERTY
         set_property(SOURCE ${fn} APPEND_STRING PROPERTY
           COMPILE_FLAGS "${target_compile_flags}")
           COMPILE_FLAGS "${target_compile_flags}")
       endif()
       endif()
+      if("${suf}" STREQUAL ".c")
+        set_property(SOURCE ${fn} APPEND_STRING PROPERTY
+          COMPILE_FLAGS "${target_compile_cflags}")
+      endif()
     endforeach()
     endforeach()
   else()
   else()
     # Update target props, since all sources are C++.
     # Update target props, since all sources are C++.
@@ -73,7 +88,7 @@ function(add_llvm_symbol_exports target_name export_file)
       VERBATIM
       VERBATIM
       COMMENT "Creating export file for ${target_name}")
       COMMENT "Creating export file for ${target_name}")
     set_property(TARGET ${target_name} APPEND_STRING PROPERTY
     set_property(TARGET ${target_name} APPEND_STRING PROPERTY
-                 LINK_FLAGS " -Wl,-exported_symbols_list,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}")
+                 LINK_FLAGS " -Wl,-exported_symbols_list,\"${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}\"")
   elseif(${CMAKE_SYSTEM_NAME} MATCHES "AIX")
   elseif(${CMAKE_SYSTEM_NAME} MATCHES "AIX")
     set_property(TARGET ${target_name} APPEND_STRING PROPERTY
     set_property(TARGET ${target_name} APPEND_STRING PROPERTY
                  LINK_FLAGS " -Wl,-bE:${export_file}")
                  LINK_FLAGS " -Wl,-bE:${export_file}")
@@ -93,10 +108,10 @@ function(add_llvm_symbol_exports target_name export_file)
       COMMENT "Creating export file for ${target_name}")
       COMMENT "Creating export file for ${target_name}")
     if (${LLVM_LINKER_IS_SOLARISLD})
     if (${LLVM_LINKER_IS_SOLARISLD})
       set_property(TARGET ${target_name} APPEND_STRING PROPERTY
       set_property(TARGET ${target_name} APPEND_STRING PROPERTY
-                   LINK_FLAGS "  -Wl,-M,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}")
+                   LINK_FLAGS "  -Wl,-M,\"${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}\"")
     else()
     else()
       set_property(TARGET ${target_name} APPEND_STRING PROPERTY
       set_property(TARGET ${target_name} APPEND_STRING PROPERTY
-                   LINK_FLAGS "  -Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}")
+                   LINK_FLAGS "  -Wl,--version-script,\"${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}\"")
     endif()
     endif()
   else()
   else()
     set(native_export_file "${target_name}.def")
     set(native_export_file "${target_name}.def")
@@ -147,7 +162,20 @@ function(add_llvm_symbol_exports target_name export_file)
   set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} PARENT_SCOPE)
   set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} PARENT_SCOPE)
 endfunction(add_llvm_symbol_exports)
 endfunction(add_llvm_symbol_exports)
 
 
-if(NOT WIN32 AND NOT APPLE)
+if(APPLE)
+  execute_process(
+    COMMAND "${CMAKE_LINKER}" -v
+    ERROR_VARIABLE stderr
+    )
+  set(LLVM_LINKER_DETECTED YES)
+  if("${stderr}" MATCHES "PROJECT:ld64")
+    set(LLVM_LINKER_IS_LD64 YES)
+    message(STATUS "Linker detection: ld64")
+  else()
+    set(LLVM_LINKER_DETECTED NO)
+    message(STATUS "Linker detection: unknown")
+  endif()
+elseif(NOT WIN32)
   # Detect what linker we have here
   # Detect what linker we have here
   if( LLVM_USE_LINKER )
   if( LLVM_USE_LINKER )
     set(command ${CMAKE_C_COMPILER} -fuse-ld=${LLVM_USE_LINKER} -Wl,--version)
     set(command ${CMAKE_C_COMPILER} -fuse-ld=${LLVM_USE_LINKER} -Wl,--version)
@@ -160,22 +188,22 @@ if(NOT WIN32 AND NOT APPLE)
     OUTPUT_VARIABLE stdout
     OUTPUT_VARIABLE stdout
     ERROR_VARIABLE stderr
     ERROR_VARIABLE stderr
     )
     )
-  set(LLVM_LINKER_DETECTED ON)
+  set(LLVM_LINKER_DETECTED YES)
   if("${stdout}" MATCHES "GNU gold")
   if("${stdout}" MATCHES "GNU gold")
-    set(LLVM_LINKER_IS_GOLD ON)
+    set(LLVM_LINKER_IS_GOLD YES)
     message(STATUS "Linker detection: GNU Gold")
     message(STATUS "Linker detection: GNU Gold")
   elseif("${stdout}" MATCHES "^LLD")
   elseif("${stdout}" MATCHES "^LLD")
-    set(LLVM_LINKER_IS_LLD ON)
+    set(LLVM_LINKER_IS_LLD YES)
     message(STATUS "Linker detection: LLD")
     message(STATUS "Linker detection: LLD")
   elseif("${stdout}" MATCHES "GNU ld")
   elseif("${stdout}" MATCHES "GNU ld")
-    set(LLVM_LINKER_IS_GNULD ON)
+    set(LLVM_LINKER_IS_GNULD YES)
     message(STATUS "Linker detection: GNU ld")
     message(STATUS "Linker detection: GNU ld")
   elseif("${stderr}" MATCHES "Solaris Link Editors" OR
   elseif("${stderr}" MATCHES "Solaris Link Editors" OR
          "${stdout}" MATCHES "Solaris Link Editors")
          "${stdout}" MATCHES "Solaris Link Editors")
-    set(LLVM_LINKER_IS_SOLARISLD ON)
+    set(LLVM_LINKER_IS_SOLARISLD YES)
     message(STATUS "Linker detection: Solaris ld")
     message(STATUS "Linker detection: Solaris ld")
   else()
   else()
-    set(LLVM_LINKER_DETECTED OFF)
+    set(LLVM_LINKER_DETECTED NO)
     message(STATUS "Linker detection: unknown")
     message(STATUS "Linker detection: unknown")
   endif()
   endif()
 endif()
 endif()
@@ -208,7 +236,8 @@ function(add_link_opts target_name)
       elseif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
       elseif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
         set_property(TARGET ${target_name} APPEND_STRING PROPERTY
         set_property(TARGET ${target_name} APPEND_STRING PROPERTY
                      LINK_FLAGS " -Wl,-z -Wl,discard-unused=sections")
                      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|AIX")
         # Object files are compiled with -ffunction-data-sections.
         # Object files are compiled with -ffunction-data-sections.
         # Versions of bfd ld < 2.23.1 have a bug in --gc-sections that breaks
         # 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
         # tools that use plugins. Always pass --gc-sections once we require
@@ -216,6 +245,11 @@ function(add_link_opts target_name)
         set_property(TARGET ${target_name} APPEND_STRING PROPERTY
         set_property(TARGET ${target_name} APPEND_STRING PROPERTY
                      LINK_FLAGS " -Wl,--gc-sections")
                      LINK_FLAGS " -Wl,--gc-sections")
       endif()
       endif()
+    else() #LLVM_NO_DEAD_STRIP
+      if(${CMAKE_SYSTEM_NAME} MATCHES "AIX")
+        set_property(TARGET ${target_name} APPEND_STRING PROPERTY
+                     LINK_FLAGS " -Wl,-bnogc")
+      endif()
     endif()
     endif()
   endif()
   endif()
 endfunction(add_link_opts)
 endfunction(add_link_opts)
@@ -359,13 +393,15 @@ endfunction(set_windows_version_resource_properties)
 #     May specify header files for IDE generators.
 #     May specify header files for IDE generators.
 #   SONAME
 #   SONAME
 #     Should set SONAME link flags and create symlinks
 #     Should set SONAME link flags and create symlinks
+#   NO_INSTALL_RPATH
+#     Suppress default RPATH settings in shared libraries.
 #   PLUGIN_TOOL
 #   PLUGIN_TOOL
 #     The tool (i.e. cmake target) that this plugin will link against
 #     The tool (i.e. cmake target) that this plugin will link against
 #   )
 #   )
 function(llvm_add_library name)
 function(llvm_add_library name)
   cmake_parse_arguments(ARG
   cmake_parse_arguments(ARG
-    "MODULE;SHARED;STATIC;OBJECT;DISABLE_LLVM_LINK_LLVM_DYLIB;SONAME"
-    "OUTPUT_NAME;PLUGIN_TOOL"
+    "MODULE;SHARED;STATIC;OBJECT;DISABLE_LLVM_LINK_LLVM_DYLIB;SONAME;NO_INSTALL_RPATH"
+    "OUTPUT_NAME;PLUGIN_TOOL;ENTITLEMENTS;BUNDLE_PATH"
     "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS"
     "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS"
     ${ARGN})
     ${ARGN})
   list(APPEND LLVM_COMMON_DEPENDS ${ARG_DEPENDS})
   list(APPEND LLVM_COMMON_DEPENDS ${ARG_DEPENDS})
@@ -408,12 +444,20 @@ function(llvm_add_library name)
       ${ALL_FILES}
       ${ALL_FILES}
       )
       )
     llvm_update_compile_flags(${obj_name})
     llvm_update_compile_flags(${obj_name})
-    set(ALL_FILES "$<TARGET_OBJECTS:${obj_name}>")
+    if(CMAKE_GENERATOR STREQUAL "Xcode")
+      set(DUMMY_FILE ${CMAKE_CURRENT_BINARY_DIR}/Dummy.c)
+      file(WRITE ${DUMMY_FILE} "// This file intentionally empty\n")
+      set_property(SOURCE ${DUMMY_FILE} APPEND_STRING PROPERTY COMPILE_FLAGS "-Wno-empty-translation-unit")
+    endif()
+    set(ALL_FILES "$<TARGET_OBJECTS:${obj_name}>" ${DUMMY_FILE})
 
 
     # Do add_dependencies(obj) later due to CMake issue 14747.
     # Do add_dependencies(obj) later due to CMake issue 14747.
     list(APPEND objlibs ${obj_name})
     list(APPEND objlibs ${obj_name})
 
 
     set_target_properties(${obj_name} PROPERTIES FOLDER "Object Libraries")
     set_target_properties(${obj_name} PROPERTIES FOLDER "Object Libraries")
+    if(ARG_DEPENDS)
+      add_dependencies(${obj_name} ${ARG_DEPENDS})
+    endif()
   endif()
   endif()
 
 
   if(ARG_SHARED AND ARG_STATIC)
   if(ARG_SHARED AND ARG_STATIC)
@@ -435,17 +479,19 @@ function(llvm_add_library name)
 
 
   if(ARG_MODULE)
   if(ARG_MODULE)
     add_library(${name} MODULE ${ALL_FILES})
     add_library(${name} MODULE ${ALL_FILES})
-    llvm_setup_rpath(${name})
   elseif(ARG_SHARED)
   elseif(ARG_SHARED)
     add_windows_version_resource_file(ALL_FILES ${ALL_FILES})
     add_windows_version_resource_file(ALL_FILES ${ALL_FILES})
     add_library(${name} SHARED ${ALL_FILES})
     add_library(${name} SHARED ${ALL_FILES})
-
-    llvm_setup_rpath(${name})
-
   else()
   else()
     add_library(${name} STATIC ${ALL_FILES})
     add_library(${name} STATIC ${ALL_FILES})
   endif()
   endif()
 
 
+  if(NOT ARG_NO_INSTALL_RPATH)
+    if(ARG_MODULE OR ARG_SHARED)
+      llvm_setup_rpath(${name})
+    endif()
+  endif()
+
   setup_dependency_debugging(${name} ${LLVM_COMMON_DEPENDS})
   setup_dependency_debugging(${name} ${LLVM_COMMON_DEPENDS})
 
 
   if(DEFINED windows_resource_file)
   if(DEFINED windows_resource_file)
@@ -486,7 +532,7 @@ function(llvm_add_library name)
       set_target_properties(${name}
       set_target_properties(${name}
         PROPERTIES
         PROPERTIES
         # Since 4.0.0, the ABI version is indicated by the major version
         # Since 4.0.0, the ABI version is indicated by the major version
-        SOVERSION ${LLVM_VERSION_MAJOR}
+        SOVERSION ${LLVM_VERSION_MAJOR}${LLVM_VERSION_SUFFIX}
         VERSION ${LLVM_VERSION_MAJOR}${LLVM_VERSION_SUFFIX})
         VERSION ${LLVM_VERSION_MAJOR}${LLVM_VERSION_SUFFIX})
     endif()
     endif()
   endif()
   endif()
@@ -567,6 +613,19 @@ function(llvm_add_library name)
 
 
   if(ARG_SHARED OR ARG_MODULE)
   if(ARG_SHARED OR ARG_MODULE)
     llvm_externalize_debuginfo(${name})
     llvm_externalize_debuginfo(${name})
+    llvm_codesign(${name} ENTITLEMENTS ${ARG_ENTITLEMENTS} BUNDLE_PATH ${ARG_BUNDLE_PATH})
+  endif()
+  # clang and newer versions of ninja use high-resolutions timestamps,
+  # but older versions of libtool on Darwin don't, so the archive will
+  # often get an older timestamp than the last object that was added
+  # or updated.  To fix this, we add a custom command to touch archive
+  # after it's been built so that ninja won't rebuild it unnecessarily
+  # the next time it's run.
+  if(ARG_STATIC AND LLVM_TOUCH_STATIC_LIBRARIES)
+    add_custom_command(TARGET ${name}
+      POST_BUILD
+      COMMAND touch ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}
+      )
   endif()
   endif()
 endfunction()
 endfunction()
 
 
@@ -579,30 +638,46 @@ function(add_llvm_install_targets target)
     set(prefix_option -DCMAKE_INSTALL_PREFIX="${ARG_PREFIX}")
     set(prefix_option -DCMAKE_INSTALL_PREFIX="${ARG_PREFIX}")
   endif()
   endif()
 
 
+  set(file_dependencies)
+  set(target_dependencies)
+  foreach(dependency ${ARG_DEPENDS})
+    if(TARGET ${dependency})
+      list(APPEND target_dependencies ${dependency})
+    else()
+      list(APPEND file_dependencies ${dependency})
+    endif()
+  endforeach()
+
   add_custom_target(${target}
   add_custom_target(${target}
-                    DEPENDS ${ARG_DEPENDS}
+                    DEPENDS ${file_dependencies}
                     COMMAND "${CMAKE_COMMAND}"
                     COMMAND "${CMAKE_COMMAND}"
                             ${component_option}
                             ${component_option}
                             ${prefix_option}
                             ${prefix_option}
                             -P "${CMAKE_BINARY_DIR}/cmake_install.cmake"
                             -P "${CMAKE_BINARY_DIR}/cmake_install.cmake"
                     USES_TERMINAL)
                     USES_TERMINAL)
   add_custom_target(${target}-stripped
   add_custom_target(${target}-stripped
-                    DEPENDS ${ARG_DEPENDS}
+                    DEPENDS ${file_dependencies}
                     COMMAND "${CMAKE_COMMAND}"
                     COMMAND "${CMAKE_COMMAND}"
                             ${component_option}
                             ${component_option}
                             ${prefix_option}
                             ${prefix_option}
                             -DCMAKE_INSTALL_DO_STRIP=1
                             -DCMAKE_INSTALL_DO_STRIP=1
                             -P "${CMAKE_BINARY_DIR}/cmake_install.cmake"
                             -P "${CMAKE_BINARY_DIR}/cmake_install.cmake"
                     USES_TERMINAL)
                     USES_TERMINAL)
+  if(target_dependencies)
+    add_dependencies(${target} ${target_dependencies})
+    add_dependencies(${target}-stripped ${target_dependencies})
+  endif()
 endfunction()
 endfunction()
 
 
 macro(add_llvm_library name)
 macro(add_llvm_library name)
   cmake_parse_arguments(ARG
   cmake_parse_arguments(ARG
-    "SHARED;BUILDTREE_ONLY"
+    "SHARED;BUILDTREE_ONLY;MODULE;INSTALL_WITH_TOOLCHAIN"
     ""
     ""
     ""
     ""
     ${ARGN})
     ${ARGN})
-  if( BUILD_SHARED_LIBS OR ARG_SHARED )
+  if(ARG_MODULE)
+    llvm_add_library(${name} MODULE ${ARG_UNPARSED_ARGUMENTS})
+  elseif( BUILD_SHARED_LIBS OR ARG_SHARED )
     llvm_add_library(${name} SHARED ${ARG_UNPARSED_ARGUMENTS})
     llvm_add_library(${name} SHARED ${ARG_UNPARSED_ARGUMENTS})
   else()
   else()
     llvm_add_library(${name} ${ARG_UNPARSED_ARGUMENTS})
     llvm_add_library(${name} ${ARG_UNPARSED_ARGUMENTS})
@@ -611,30 +686,24 @@ macro(add_llvm_library name)
   # Libraries that are meant to only be exposed via the build tree only are
   # Libraries that are meant to only be exposed via the build tree only are
   # never installed and are only exported as a target in the special build tree
   # never installed and are only exported as a target in the special build tree
   # config file.
   # config file.
-  if (NOT ARG_BUILDTREE_ONLY)
+  if (NOT ARG_BUILDTREE_ONLY AND NOT ARG_MODULE)
     set_property( GLOBAL APPEND PROPERTY LLVM_LIBS ${name} )
     set_property( GLOBAL APPEND PROPERTY LLVM_LIBS ${name} )
+    set(in_llvm_libs YES)
   endif()
   endif()
 
 
-  if( EXCLUDE_FROM_ALL )
+  if (ARG_MODULE AND NOT TARGET ${name})
+    # Add empty "phony" target
+    add_custom_target(${name})
+  elseif( EXCLUDE_FROM_ALL )
     set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON)
     set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON)
   elseif(ARG_BUILDTREE_ONLY)
   elseif(ARG_BUILDTREE_ONLY)
     set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS_BUILDTREE_ONLY ${name})
     set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS_BUILDTREE_ONLY ${name})
   else()
   else()
-    if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "LTO" OR
-        (LLVM_LINK_LLVM_DYLIB AND ${name} STREQUAL "LLVM"))
-      set(install_dir lib${LLVM_LIBDIR_SUFFIX})
-      if(ARG_SHARED OR BUILD_SHARED_LIBS)
-        if(WIN32 OR CYGWIN OR MINGW)
-          set(install_type RUNTIME)
-          set(install_dir bin)
-        else()
-          set(install_type LIBRARY)
-        endif()
-      else()
-        set(install_type ARCHIVE)
-      endif()
+    if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ARG_INSTALL_WITH_TOOLCHAIN)
 
 
+      set(export_to_llvmexports)
       if(${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR
       if(${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR
+          (in_llvm_libs AND "llvm-libraries" IN_LIST LLVM_DISTRIBUTION_COMPONENTS) OR
           NOT LLVM_DISTRIBUTION_COMPONENTS)
           NOT LLVM_DISTRIBUTION_COMPONENTS)
         set(export_to_llvmexports EXPORT LLVMExports)
         set(export_to_llvmexports EXPORT LLVMExports)
         set_property(GLOBAL PROPERTY LLVM_HAS_EXPORTS True)
         set_property(GLOBAL PROPERTY LLVM_HAS_EXPORTS True)
@@ -642,10 +711,11 @@ macro(add_llvm_library name)
 
 
       install(TARGETS ${name}
       install(TARGETS ${name}
               ${export_to_llvmexports}
               ${export_to_llvmexports}
-              ${install_type} DESTINATION ${install_dir}
-              COMPONENT ${name})
+              LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name}
+              ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name}
+              RUNTIME DESTINATION bin COMPONENT ${name})
 
 
-      if (NOT CMAKE_CONFIGURATION_TYPES)
+      if (NOT LLVM_ENABLE_IDE)
         add_llvm_install_targets(install-${name}
         add_llvm_install_targets(install-${name}
                                  DEPENDS ${name}
                                  DEPENDS ${name}
                                  COMPONENT ${name})
                                  COMPONENT ${name})
@@ -653,47 +723,20 @@ macro(add_llvm_library name)
     endif()
     endif()
     set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
     set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
   endif()
   endif()
-  set_target_properties(${name} PROPERTIES FOLDER "Libraries")
-endmacro(add_llvm_library name)
-
-macro(add_llvm_loadable_module name)
-  llvm_add_library(${name} MODULE ${ARGN})
-  if(NOT TARGET ${name})
-    # Add empty "phony" target
-    add_custom_target(${name})
+  if (ARG_MODULE)
+    set_target_properties(${name} PROPERTIES FOLDER "Loadable modules")
   else()
   else()
-    if( EXCLUDE_FROM_ALL )
-      set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON)
-    else()
-      if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
-        if(WIN32 OR CYGWIN)
-          # DLL platform
-          set(dlldir "bin")
-        else()
-          set(dlldir "lib${LLVM_LIBDIR_SUFFIX}")
-        endif()
-
-        if(${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR
-            NOT LLVM_DISTRIBUTION_COMPONENTS)
-          set(export_to_llvmexports EXPORT LLVMExports)
-          set_property(GLOBAL PROPERTY LLVM_HAS_EXPORTS True)
-        endif()
-
-        install(TARGETS ${name}
-                ${export_to_llvmexports}
-                LIBRARY DESTINATION ${dlldir}
-                ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX})
-      endif()
-      set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
-    endif()
+    set_target_properties(${name} PROPERTIES FOLDER "Libraries")
   endif()
   endif()
-
-  set_target_properties(${name} PROPERTIES FOLDER "Loadable modules")
-endmacro(add_llvm_loadable_module name)
-
+endmacro(add_llvm_library name)
 
 
 macro(add_llvm_executable name)
 macro(add_llvm_executable name)
-  cmake_parse_arguments(ARG "DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH" "" "DEPENDS" ${ARGN})
+  cmake_parse_arguments(ARG
+    "DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH"
+    "ENTITLEMENTS;BUNDLE_PATH"
+    "DEPENDS"
+    ${ARGN})
+
   llvm_process_sources( ALL_FILES ${ARG_UNPARSED_ARGUMENTS} )
   llvm_process_sources( ALL_FILES ${ARG_UNPARSED_ARGUMENTS} )
 
 
   list(APPEND LLVM_COMMON_DEPENDS ${ARG_DEPENDS})
   list(APPEND LLVM_COMMON_DEPENDS ${ARG_DEPENDS})
@@ -771,6 +814,8 @@ macro(add_llvm_executable name)
     # API for all shared libaries loaded by this executable.
     # API for all shared libaries loaded by this executable.
     target_link_libraries(${name} PRIVATE ${LLVM_PTHREAD_LIB})
     target_link_libraries(${name} PRIVATE ${LLVM_PTHREAD_LIB})
   endif()
   endif()
+
+  llvm_codesign(${name} ENTITLEMENTS ${ARG_ENTITLEMENTS} BUNDLE_PATH ${ARG_BUNDLE_PATH})
 endmacro(add_llvm_executable name)
 endmacro(add_llvm_executable name)
 
 
 function(export_executable_symbols target)
 function(export_executable_symbols target)
@@ -850,7 +895,12 @@ if(NOT LLVM_TOOLCHAIN_TOOLS)
     llvm-ar
     llvm-ar
     llvm-ranlib
     llvm-ranlib
     llvm-lib
     llvm-lib
+    llvm-nm
+    llvm-objcopy
     llvm-objdump
     llvm-objdump
+    llvm-rc
+    llvm-profdata
+    llvm-symbolizer
     )
     )
 endif()
 endif()
 
 
@@ -862,6 +912,7 @@ macro(add_llvm_tool name)
 
 
   if ( ${name} IN_LIST LLVM_TOOLCHAIN_TOOLS OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
   if ( ${name} IN_LIST LLVM_TOOLCHAIN_TOOLS OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
     if( LLVM_BUILD_TOOLS )
     if( LLVM_BUILD_TOOLS )
+      set(export_to_llvmexports)
       if(${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR
       if(${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR
           NOT LLVM_DISTRIBUTION_COMPONENTS)
           NOT LLVM_DISTRIBUTION_COMPONENTS)
         set(export_to_llvmexports EXPORT LLVMExports)
         set(export_to_llvmexports EXPORT LLVMExports)
@@ -873,7 +924,7 @@ macro(add_llvm_tool name)
               RUNTIME DESTINATION ${LLVM_TOOLS_INSTALL_DIR}
               RUNTIME DESTINATION ${LLVM_TOOLS_INSTALL_DIR}
               COMPONENT ${name})
               COMPONENT ${name})
 
 
-      if (NOT CMAKE_CONFIGURATION_TYPES)
+      if (NOT LLVM_ENABLE_IDE)
         add_llvm_install_targets(install-${name}
         add_llvm_install_targets(install-${name}
                                  DEPENDS ${name}
                                  DEPENDS ${name}
                                  COMPONENT ${name})
                                  COMPONENT ${name})
@@ -907,14 +958,28 @@ macro(add_llvm_utility name)
 
 
   add_llvm_executable(${name} DISABLE_LLVM_LINK_LLVM_DYLIB ${ARGN})
   add_llvm_executable(${name} DISABLE_LLVM_LINK_LLVM_DYLIB ${ARGN})
   set_target_properties(${name} PROPERTIES FOLDER "Utils")
   set_target_properties(${name} PROPERTIES FOLDER "Utils")
-  if( LLVM_INSTALL_UTILS AND LLVM_BUILD_UTILS )
-    install (TARGETS ${name}
-      RUNTIME DESTINATION ${LLVM_UTILS_INSTALL_DIR}
-      COMPONENT ${name})
-    if (NOT CMAKE_CONFIGURATION_TYPES)
-      add_llvm_install_targets(install-${name}
-                               DEPENDS ${name}
-                               COMPONENT ${name})
+  if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
+    if (LLVM_INSTALL_UTILS AND LLVM_BUILD_UTILS)
+      set(export_to_llvmexports)
+      if (${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR
+          NOT LLVM_DISTRIBUTION_COMPONENTS)
+        set(export_to_llvmexports EXPORT LLVMExports)
+        set_property(GLOBAL PROPERTY LLVM_HAS_EXPORTS True)
+      endif()
+
+      install(TARGETS ${name}
+              ${export_to_llvmexports}
+              RUNTIME DESTINATION ${LLVM_UTILS_INSTALL_DIR}
+              COMPONENT ${name})
+
+      if (NOT LLVM_ENABLE_IDE)
+        add_llvm_install_targets(install-${name}
+                                 DEPENDS ${name}
+                                 COMPONENT ${name})
+      endif()
+      set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
+    elseif(LLVM_BUILD_UTILS)
+      set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS_BUILDTREE_ONLY ${name})
     endif()
     endif()
   endif()
   endif()
 endmacro(add_llvm_utility name)
 endmacro(add_llvm_utility name)
@@ -955,47 +1020,50 @@ endfunction(canonicalize_tool_name)
 # Custom add_subdirectory wrapper
 # Custom add_subdirectory wrapper
 # Takes in a project name (i.e. LLVM), the subdirectory name, and an optional
 # Takes in a project name (i.e. LLVM), the subdirectory name, and an optional
 # path if it differs from the name.
 # path if it differs from the name.
-macro(add_llvm_subdirectory project type name)
+function(add_llvm_subdirectory project type name)
   set(add_llvm_external_dir "${ARGN}")
   set(add_llvm_external_dir "${ARGN}")
   if("${add_llvm_external_dir}" STREQUAL "")
   if("${add_llvm_external_dir}" STREQUAL "")
     set(add_llvm_external_dir ${name})
     set(add_llvm_external_dir ${name})
   endif()
   endif()
   canonicalize_tool_name(${name} nameUPPER)
   canonicalize_tool_name(${name} nameUPPER)
+  set(canonical_full_name ${project}_${type}_${nameUPPER})
+  get_property(already_processed GLOBAL PROPERTY ${canonical_full_name}_PROCESSED)
+  if(already_processed)
+    return()
+  endif()
+  set_property(GLOBAL PROPERTY ${canonical_full_name}_PROCESSED YES)
+
   if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}/CMakeLists.txt)
   if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}/CMakeLists.txt)
     # Treat it as in-tree subproject.
     # Treat it as in-tree subproject.
-    option(${project}_${type}_${nameUPPER}_BUILD
+    option(${canonical_full_name}_BUILD
            "Whether to build ${name} as part of ${project}" On)
            "Whether to build ${name} as part of ${project}" On)
     mark_as_advanced(${project}_${type}_${name}_BUILD)
     mark_as_advanced(${project}_${type}_${name}_BUILD)
-    if(${project}_${type}_${nameUPPER}_BUILD)
+    if(${canonical_full_name}_BUILD)
       add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir} ${add_llvm_external_dir})
       add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir} ${add_llvm_external_dir})
-      # Don't process it in add_llvm_implicit_projects().
-      set(${project}_${type}_${nameUPPER}_BUILD OFF)
     endif()
     endif()
   else()
   else()
     set(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR
     set(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR
       "${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}"
       "${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}"
       CACHE PATH "Path to ${name} source directory")
       CACHE PATH "Path to ${name} source directory")
-    set(${project}_${type}_${nameUPPER}_BUILD_DEFAULT ON)
+    set(${canonical_full_name}_BUILD_DEFAULT ON)
     if(NOT LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR OR NOT EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR})
     if(NOT LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR OR NOT EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR})
-      set(${project}_${type}_${nameUPPER}_BUILD_DEFAULT OFF)
+      set(${canonical_full_name}_BUILD_DEFAULT OFF)
     endif()
     endif()
     if("${LLVM_EXTERNAL_${nameUPPER}_BUILD}" STREQUAL "OFF")
     if("${LLVM_EXTERNAL_${nameUPPER}_BUILD}" STREQUAL "OFF")
-      set(${project}_${type}_${nameUPPER}_BUILD_DEFAULT OFF)
+      set(${canonical_full_name}_BUILD_DEFAULT OFF)
     endif()
     endif()
-    option(${project}_${type}_${nameUPPER}_BUILD
+    option(${canonical_full_name}_BUILD
       "Whether to build ${name} as part of LLVM"
       "Whether to build ${name} as part of LLVM"
-      ${${project}_${type}_${nameUPPER}_BUILD_DEFAULT})
-    if (${project}_${type}_${nameUPPER}_BUILD)
+      ${${canonical_full_name}_BUILD_DEFAULT})
+    if (${canonical_full_name}_BUILD)
       if(EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR})
       if(EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR})
         add_subdirectory(${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR} ${add_llvm_external_dir})
         add_subdirectory(${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR} ${add_llvm_external_dir})
       elseif(NOT "${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}" STREQUAL "")
       elseif(NOT "${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}" STREQUAL "")
         message(WARNING "Nonexistent directory for ${name}: ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}")
         message(WARNING "Nonexistent directory for ${name}: ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}")
       endif()
       endif()
-      # FIXME: It'd be redundant.
-      set(${project}_${type}_${nameUPPER}_BUILD Off)
     endif()
     endif()
   endif()
   endif()
-endmacro()
+endfunction()
 
 
 # Add external project that may want to be built as part of llvm such as Clang,
 # Add external project that may want to be built as part of llvm such as Clang,
 # lld, and Polly. This adds two options. One for the source directory of the
 # lld, and Polly. This adds two options. One for the source directory of the
@@ -1067,7 +1135,7 @@ function(add_unittest test_suite test_name)
   # Our current version of gtest does not properly recognize C++11 support
   # Our current version of gtest does not properly recognize C++11 support
   # with MSVC, so it falls back to tr1 / experimental classes.  Since LLVM
   # with MSVC, so it falls back to tr1 / experimental classes.  Since LLVM
   # itself requires C++11, we can safely force it on unconditionally so that
   # itself requires C++11, we can safely force it on unconditionally so that
-  # we don't have to fight with the buggy gtest check.  
+  # we don't have to fight with the buggy gtest check.
   add_definitions(-DGTEST_LANG_CXX11=1)
   add_definitions(-DGTEST_LANG_CXX11=1)
   add_definitions(-DGTEST_HAS_TR1_TUPLE=0)
   add_definitions(-DGTEST_HAS_TR1_TUPLE=0)
 
 
@@ -1103,6 +1171,30 @@ function(add_unittest test_suite test_name)
   endif ()
   endif ()
 endfunction()
 endfunction()
 
 
+# Use for test binaries that call llvm::getInputFileDirectory(). Use of this
+# is discouraged.
+function(add_unittest_with_input_files test_suite test_name)
+  set(LLVM_UNITTEST_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+  configure_file(
+    ${LLVM_MAIN_SRC_DIR}/unittests/unittest.cfg.in
+    ${CMAKE_CURRENT_BINARY_DIR}/llvm.srcdir.txt)
+
+  add_unittest(${test_suite} ${test_name} ${ARGN})
+endfunction()
+
+# Generic support for adding a benchmark.
+function(add_benchmark benchmark_name)
+  if( NOT LLVM_BUILD_BENCHMARKS )
+    set(EXCLUDE_FROM_ALL ON)
+  endif()
+
+  add_llvm_executable(${benchmark_name} IGNORE_EXTERNALIZE_DEBUGINFO NO_INSTALL_RPATH ${ARGN})
+  set(outdir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR})
+  set_output_directory(${benchmark_name} BINARY_DIR ${outdir} LIBRARY_DIR ${outdir})
+  set_property(TARGET ${benchmark_name} PROPERTY FOLDER "Utils")
+  target_link_libraries(${benchmark_name} PRIVATE benchmark)
+endfunction()
+
 function(llvm_add_go_executable binary pkgpath)
 function(llvm_add_go_executable binary pkgpath)
   cmake_parse_arguments(ARG "ALL" "" "DEPENDS;GOFLAGS" ${ARGN})
   cmake_parse_arguments(ARG "ALL" "" "DEPENDS;GOFLAGS" ${ARGN})
 
 
@@ -1226,10 +1318,6 @@ function(configure_lit_site_cfg site_in site_out)
     set(TARGET_TRIPLE "\"+config.target_triple+\"")
     set(TARGET_TRIPLE "\"+config.target_triple+\"")
   endif()
   endif()
 
 
-  string(CONCAT LIT_SITE_CFG_IN_FOOTER
-     "import lit.llvm\n"
-     "lit.llvm.initialize(lit_config, config)\n")
-
   configure_file(${site_in} ${site_out} @ONLY)
   configure_file(${site_in} ${site_out} @ONLY)
   if (EXISTS "${ARG_MAIN_CONFIG}")
   if (EXISTS "${ARG_MAIN_CONFIG}")
     set(PYTHON_STATEMENT "map_config('${ARG_MAIN_CONFIG}', '${site_out}')")
     set(PYTHON_STATEMENT "map_config('${ARG_MAIN_CONFIG}', '${site_out}')")
@@ -1250,7 +1338,6 @@ function(get_llvm_lit_path base_dir file_name)
   cmake_parse_arguments(ARG "ALLOW_EXTERNAL" "" "" ${ARGN})
   cmake_parse_arguments(ARG "ALLOW_EXTERNAL" "" "" ${ARGN})
 
 
   if (ARG_ALLOW_EXTERNAL)
   if (ARG_ALLOW_EXTERNAL)
-    set(LLVM_DEFAULT_EXTERNAL_LIT "${LLVM_EXTERNAL_LIT}")
     set (LLVM_EXTERNAL_LIT "" CACHE STRING "Command used to spawn lit")
     set (LLVM_EXTERNAL_LIT "" CACHE STRING "Command used to spawn lit")
     if ("${LLVM_EXTERNAL_LIT}" STREQUAL "")
     if ("${LLVM_EXTERNAL_LIT}" STREQUAL "")
       set(LLVM_EXTERNAL_LIT "${LLVM_DEFAULT_EXTERNAL_LIT}")
       set(LLVM_EXTERNAL_LIT "${LLVM_DEFAULT_EXTERNAL_LIT}")
@@ -1264,13 +1351,13 @@ function(get_llvm_lit_path base_dir file_name)
         set(${base_dir} ${LIT_BASE_DIR} PARENT_SCOPE)
         set(${base_dir} ${LIT_BASE_DIR} PARENT_SCOPE)
         return()
         return()
       else()
       else()
-        message(WARN "LLVM_EXTERNAL_LIT set to ${LLVM_EXTERNAL_LIT}, but the path does not exist.")
+        message(WARNING "LLVM_EXTERNAL_LIT set to ${LLVM_EXTERNAL_LIT}, but the path does not exist.")
       endif()
       endif()
     endif()
     endif()
   endif()
   endif()
 
 
   set(lit_file_name "llvm-lit")
   set(lit_file_name "llvm-lit")
-  if (WIN32 AND NOT CYGWIN)
+  if (CMAKE_HOST_WIN32 AND NOT CYGWIN)
     # llvm-lit needs suffix.py for multiprocess to find a main module.
     # llvm-lit needs suffix.py for multiprocess to find a main module.
     set(lit_file_name "${lit_file_name}.py")
     set(lit_file_name "${lit_file_name}.py")
   endif ()
   endif ()
@@ -1330,6 +1417,7 @@ function(add_lit_target target comment)
       COMMAND ${CMAKE_COMMAND} -E echo "${target} does nothing, no tools built.")
       COMMAND ${CMAKE_COMMAND} -E echo "${target} does nothing, no tools built.")
     message(STATUS "${target} does nothing.")
     message(STATUS "${target} does nothing.")
   endif()
   endif()
+
   if (ARG_DEPENDS)
   if (ARG_DEPENDS)
     add_dependencies(${target} ${ARG_DEPENDS})
     add_dependencies(${target} ${ARG_DEPENDS})
   endif()
   endif()
@@ -1361,7 +1449,7 @@ function(add_lit_testsuite target comment)
 endfunction()
 endfunction()
 
 
 function(add_lit_testsuites project directory)
 function(add_lit_testsuites project directory)
-  if (NOT CMAKE_CONFIGURATION_TYPES)
+  if (NOT LLVM_ENABLE_IDE)
     cmake_parse_arguments(ARG "" "" "PARAMS;DEPENDS;ARGS" ${ARGN})
     cmake_parse_arguments(ARG "" "" "PARAMS;DEPENDS;ARGS" ${ARGN})
 
 
     # Search recursively for test directories by assuming anything not
     # Search recursively for test directories by assuming anything not
@@ -1420,7 +1508,7 @@ function(llvm_install_library_symlink name dest type)
           CODE "install_symlink(${full_name} ${full_dest} ${output_dir})"
           CODE "install_symlink(${full_name} ${full_dest} ${output_dir})"
           COMPONENT ${component})
           COMPONENT ${component})
 
 
-  if (NOT CMAKE_CONFIGURATION_TYPES AND NOT ARG_ALWAYS_GENERATE)
+  if (NOT LLVM_ENABLE_IDE AND NOT ARG_ALWAYS_GENERATE)
     add_llvm_install_targets(install-${name}
     add_llvm_install_targets(install-${name}
                              DEPENDS ${name} ${dest} install-${dest}
                              DEPENDS ${name} ${dest} install-${dest}
                              COMPONENT ${name})
                              COMPONENT ${name})
@@ -1453,7 +1541,7 @@ function(llvm_install_symlink name dest)
           CODE "install_symlink(${full_name} ${full_dest} ${LLVM_TOOLS_INSTALL_DIR})"
           CODE "install_symlink(${full_name} ${full_dest} ${LLVM_TOOLS_INSTALL_DIR})"
           COMPONENT ${component})
           COMPONENT ${component})
 
 
-  if (NOT CMAKE_CONFIGURATION_TYPES AND NOT ARG_ALWAYS_GENERATE)
+  if (NOT LLVM_ENABLE_IDE AND NOT ARG_ALWAYS_GENERATE)
     add_llvm_install_targets(install-${name}
     add_llvm_install_targets(install-${name}
                              DEPENDS ${name} ${dest} install-${dest}
                              DEPENDS ${name} ${dest} install-${dest}
                              COMPONENT ${name})
                              COMPONENT ${name})
@@ -1544,13 +1632,30 @@ function(llvm_externalize_debuginfo name)
 
 
   if(NOT LLVM_EXTERNALIZE_DEBUGINFO_SKIP_STRIP)
   if(NOT LLVM_EXTERNALIZE_DEBUGINFO_SKIP_STRIP)
     if(APPLE)
     if(APPLE)
-      set(strip_command COMMAND xcrun strip -Sxl $<TARGET_FILE:${name}>)
+      if(NOT CMAKE_STRIP)
+        set(CMAKE_STRIP xcrun strip)
+      endif()
+      set(strip_command COMMAND ${CMAKE_STRIP} -Sxl $<TARGET_FILE:${name}>)
     else()
     else()
-      set(strip_command COMMAND strip -gx $<TARGET_FILE:${name}>)
+      set(strip_command COMMAND ${CMAKE_STRIP} -g -x $<TARGET_FILE:${name}>)
     endif()
     endif()
   endif()
   endif()
 
 
   if(APPLE)
   if(APPLE)
+    if(LLVM_EXTERNALIZE_DEBUGINFO_EXTENSION)
+      set(file_ext ${LLVM_EXTERNALIZE_DEBUGINFO_EXTENSION})
+    else()
+      set(file_ext dSYM)
+    endif()
+
+    set(output_name "$<TARGET_FILE_NAME:${name}>.${file_ext}")
+
+    if(LLVM_EXTERNALIZE_DEBUGINFO_OUTPUT_DIR)
+      set(output_path "-o=${LLVM_EXTERNALIZE_DEBUGINFO_OUTPUT_DIR}/${output_name}")
+    else()
+      set(output_path "-o=${output_name}")
+    endif()
+
     if(CMAKE_CXX_FLAGS MATCHES "-flto"
     if(CMAKE_CXX_FLAGS MATCHES "-flto"
       OR CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE} MATCHES "-flto")
       OR CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE} MATCHES "-flto")
 
 
@@ -1558,19 +1663,72 @@ function(llvm_externalize_debuginfo name)
       set_property(TARGET ${name} APPEND_STRING PROPERTY
       set_property(TARGET ${name} APPEND_STRING PROPERTY
         LINK_FLAGS " -Wl,-object_path_lto,${lto_object}")
         LINK_FLAGS " -Wl,-object_path_lto,${lto_object}")
     endif()
     endif()
+    if(NOT CMAKE_DSYMUTIL)
+      set(CMAKE_DSYMUTIL xcrun dsymutil)
+    endif()
     add_custom_command(TARGET ${name} POST_BUILD
     add_custom_command(TARGET ${name} POST_BUILD
-      COMMAND xcrun dsymutil $<TARGET_FILE:${name}>
+      COMMAND ${CMAKE_DSYMUTIL} ${output_path} $<TARGET_FILE:${name}>
       ${strip_command}
       ${strip_command}
       )
       )
   else()
   else()
     add_custom_command(TARGET ${name} POST_BUILD
     add_custom_command(TARGET ${name} POST_BUILD
-      COMMAND objcopy --only-keep-debug $<TARGET_FILE:${name}> $<TARGET_FILE:${name}>.debug
+      COMMAND ${CMAKE_OBJCOPY} --only-keep-debug $<TARGET_FILE:${name}> $<TARGET_FILE:${name}>.debug
       ${strip_command} -R .gnu_debuglink
       ${strip_command} -R .gnu_debuglink
-      COMMAND objcopy --add-gnu-debuglink=$<TARGET_FILE:${name}>.debug $<TARGET_FILE:${name}>
+      COMMAND ${CMAKE_OBJCOPY} --add-gnu-debuglink=$<TARGET_FILE:${name}>.debug $<TARGET_FILE:${name}>
       )
       )
   endif()
   endif()
 endfunction()
 endfunction()
 
 
+# Usage: llvm_codesign(name [FORCE] [ENTITLEMENTS file] [BUNDLE_PATH path])
+function(llvm_codesign name)
+  cmake_parse_arguments(ARG "FORCE" "ENTITLEMENTS;BUNDLE_PATH" "" ${ARGN})
+
+  if(NOT LLVM_CODESIGNING_IDENTITY)
+    return()
+  endif()
+
+  if(CMAKE_GENERATOR STREQUAL "Xcode")
+    set_target_properties(${name} PROPERTIES
+      XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY ${LLVM_CODESIGNING_IDENTITY}
+    )
+    if(DEFINED ARG_ENTITLEMENTS)
+      set_target_properties(${name} PROPERTIES
+        XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${ARG_ENTITLEMENTS}
+      )
+    endif()
+  elseif(APPLE AND CMAKE_HOST_SYSTEM_NAME MATCHES Darwin)
+    if(NOT CMAKE_CODESIGN)
+      set(CMAKE_CODESIGN xcrun codesign)
+    endif()
+    if(NOT CMAKE_CODESIGN_ALLOCATE)
+      execute_process(
+        COMMAND xcrun -f codesign_allocate
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+        OUTPUT_VARIABLE CMAKE_CODESIGN_ALLOCATE
+      )
+    endif()
+    if(DEFINED ARG_ENTITLEMENTS)
+      set(pass_entitlements --entitlements ${ARG_ENTITLEMENTS})
+    endif()
+
+    if (NOT ARG_BUNDLE_PATH)
+      set(ARG_BUNDLE_PATH $<TARGET_FILE:${name}>)
+    endif()
+
+    if(ARG_FORCE)
+      set(force_flag "-f")
+    endif()
+
+    add_custom_command(
+      TARGET ${name} POST_BUILD
+      COMMAND ${CMAKE_COMMAND} -E
+              env CODESIGN_ALLOCATE=${CMAKE_CODESIGN_ALLOCATE}
+              ${CMAKE_CODESIGN} -s ${LLVM_CODESIGNING_IDENTITY}
+              ${pass_entitlements} ${force_flag} ${ARG_BUNDLE_PATH}
+    )
+  endif()
+endfunction()
+
 function(llvm_setup_rpath name)
 function(llvm_setup_rpath name)
   if(CMAKE_INSTALL_RPATH)
   if(CMAKE_INSTALL_RPATH)
     return()
     return()
@@ -1584,7 +1742,7 @@ function(llvm_setup_rpath name)
 
 
   if (APPLE)
   if (APPLE)
     set(_install_name_dir INSTALL_NAME_DIR "@rpath")
     set(_install_name_dir INSTALL_NAME_DIR "@rpath")
-    set(_install_rpath "@loader_path/../lib" ${extra_libdir})
+    set(_install_rpath "@loader_path/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
   elseif(UNIX)
   elseif(UNIX)
     set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
     set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
     if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
     if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
@@ -1622,35 +1780,38 @@ function(setup_dependency_debugging name)
   set_target_properties(${name} PROPERTIES RULE_LAUNCH_COMPILE ${sandbox_command})
   set_target_properties(${name} PROPERTIES RULE_LAUNCH_COMPILE ${sandbox_command})
 endfunction()
 endfunction()
 
 
-# Figure out if we can track VC revisions.
-function(find_first_existing_file out_var)
-  foreach(file ${ARGN})
-    if(EXISTS "${file}")
-      set(${out_var} "${file}" PARENT_SCOPE)
-      return()
-    endif()
-  endforeach()
-endfunction()
-
-macro(find_first_existing_vc_file out_var path)
-    find_program(git_executable NAMES git git.exe git.cmd)
-    # Run from a subdirectory to force git to print an absolute path.
-    execute_process(COMMAND ${git_executable} rev-parse --git-dir
-      WORKING_DIRECTORY ${path}/cmake
-      RESULT_VARIABLE git_result
-      OUTPUT_VARIABLE git_dir
-      ERROR_QUIET)
-    if(git_result EQUAL 0)
-      string(STRIP "${git_dir}" git_dir)
-      set(${out_var} "${git_dir}/logs/HEAD")
-      # some branchless cases (e.g. 'repo') may not yet have .git/logs/HEAD
-      if (NOT EXISTS "${git_dir}/logs/HEAD")
-        file(WRITE "${git_dir}/logs/HEAD" "")
+function(find_first_existing_vc_file path out_var)
+  if(NOT EXISTS "${path}")
+    return()
+  endif()
+  if(EXISTS "${path}/.svn")
+    set(svn_files
+      "${path}/.svn/wc.db"   # SVN 1.7
+      "${path}/.svn/entries" # SVN 1.6
+    )
+    foreach(file IN LISTS svn_files)
+      if(EXISTS "${file}")
+        set(${out_var} "${file}" PARENT_SCOPE)
+        return()
+      endif()
+    endforeach()
+  else()
+    find_package(Git)
+    if(GIT_FOUND)
+      execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --git-dir
+        WORKING_DIRECTORY ${path}
+        RESULT_VARIABLE git_result
+        OUTPUT_VARIABLE git_output
+        ERROR_QUIET)
+      if(git_result EQUAL 0)
+        string(STRIP "${git_output}" git_output)
+        get_filename_component(git_dir ${git_output} ABSOLUTE BASE_DIR ${path})
+        # Some branchless cases (e.g. 'repo') may not yet have .git/logs/HEAD
+        if (NOT EXISTS "${git_dir}/logs/HEAD")
+          file(WRITE "${git_dir}/logs/HEAD" "")
+        endif()
+        set(${out_var} "${git_dir}/logs/HEAD" PARENT_SCOPE)
       endif()
       endif()
-    else()
-      find_first_existing_file(${out_var}
-        "${path}/.svn/wc.db"   # SVN 1.7
-        "${path}/.svn/entries" # SVN 1.6
-      )
     endif()
     endif()
-endmacro()
+  endif()
+endfunction()

Some files were not shown because too many files changed in this diff