Removing the in-tree copy of llvm+clang
This commit is contained in:
parent
eb24fc8b34
commit
f7bfc49d29
45
cpp/llvm/.gitignore
vendored
45
cpp/llvm/.gitignore
vendored
@ -1,45 +0,0 @@
|
|||||||
#==============================================================================#
|
|
||||||
# This file specifies intentionally untracked files that git should ignore.
|
|
||||||
# See: http://www.kernel.org/pub/software/scm/git/docs/gitignore.html
|
|
||||||
#
|
|
||||||
# This file is intentionally different from the output of `git svn show-ignore`,
|
|
||||||
# as most of those are useless.
|
|
||||||
#==============================================================================#
|
|
||||||
|
|
||||||
#==============================================================================#
|
|
||||||
# File extensions to be ignored anywhere in the tree.
|
|
||||||
#==============================================================================#
|
|
||||||
# Temp files created by most text editors.
|
|
||||||
*~
|
|
||||||
# Merge files created by git.
|
|
||||||
*.orig
|
|
||||||
# Byte compiled python modules.
|
|
||||||
*.pyc
|
|
||||||
# vim swap files
|
|
||||||
.*.swp
|
|
||||||
|
|
||||||
#==============================================================================#
|
|
||||||
# Explicit files to ignore (only matches one).
|
|
||||||
#==============================================================================#
|
|
||||||
.gitusers
|
|
||||||
autom4te.cache
|
|
||||||
cscope.files
|
|
||||||
cscope.out
|
|
||||||
autoconf/aclocal.m4
|
|
||||||
autoconf/autom4te.cache
|
|
||||||
|
|
||||||
#==============================================================================#
|
|
||||||
# Directories to ignore (do not add trailing '/'s, they skip symlinks).
|
|
||||||
#==============================================================================#
|
|
||||||
# External projects that are tracked independently.
|
|
||||||
projects/*
|
|
||||||
!projects/sample
|
|
||||||
!projects/CMakeLists.txt
|
|
||||||
!projects/Makefile
|
|
||||||
|
|
||||||
# The build breakes without this file
|
|
||||||
!projects/LLVMBuild.txt
|
|
||||||
# Clang, which is tracked independently.
|
|
||||||
# tools/clang
|
|
||||||
# LLDB, which is tracked independently.
|
|
||||||
tools/lldb
|
|
@ -1,467 +0,0 @@
|
|||||||
# See docs/CMake.html for instructions about how to build LLVM with CMake.
|
|
||||||
|
|
||||||
project(LLVM)
|
|
||||||
cmake_minimum_required(VERSION 2.8)
|
|
||||||
|
|
||||||
# Add path for custom modules
|
|
||||||
set(CMAKE_MODULE_PATH
|
|
||||||
${CMAKE_MODULE_PATH}
|
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/cmake"
|
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
|
|
||||||
)
|
|
||||||
|
|
||||||
set(LLVM_VERSION_MAJOR 3)
|
|
||||||
set(LLVM_VERSION_MINOR 1)
|
|
||||||
|
|
||||||
set(PACKAGE_VERSION "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}svn")
|
|
||||||
|
|
||||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
|
||||||
|
|
||||||
include(VersionFromVCS)
|
|
||||||
|
|
||||||
option(LLVM_APPEND_VC_REV
|
|
||||||
"Append the version control system revision id to LLVM version" OFF)
|
|
||||||
|
|
||||||
if( LLVM_APPEND_VC_REV )
|
|
||||||
add_version_info_from_vcs(PACKAGE_VERSION)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(PACKAGE_NAME LLVM)
|
|
||||||
set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
|
|
||||||
set(PACKAGE_BUGREPORT "http://llvm.org/bugs/")
|
|
||||||
|
|
||||||
# Sanity check our source directory to make sure that we are not trying to
|
|
||||||
# generate an in-tree build (unless on MSVC_IDE, where it is ok), and to make
|
|
||||||
# sure that we don't have any stray generated files lying around in the tree
|
|
||||||
# (which would end up getting picked up by header search, instead of the correct
|
|
||||||
# versions).
|
|
||||||
if( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE )
|
|
||||||
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
|
|
||||||
to this source directory as the last argument.
|
|
||||||
This process created the file `CMakeCache.txt' and the directory `CMakeFiles'.
|
|
||||||
Please delete them.")
|
|
||||||
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)
|
|
||||||
|
|
||||||
set(LLVM_MAIN_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
|
|
||||||
set(LLVM_MAIN_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/include)
|
|
||||||
set(LLVM_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
|
|
||||||
set(LLVM_TOOLS_BINARY_DIR ${LLVM_BINARY_DIR}/bin)
|
|
||||||
set(LLVM_EXAMPLES_BINARY_DIR ${LLVM_BINARY_DIR}/examples)
|
|
||||||
set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" )
|
|
||||||
|
|
||||||
set(LLVM_ALL_TARGETS
|
|
||||||
ARM
|
|
||||||
CellSPU
|
|
||||||
CppBackend
|
|
||||||
Hexagon
|
|
||||||
Mips
|
|
||||||
MBlaze
|
|
||||||
MSP430
|
|
||||||
PowerPC
|
|
||||||
PTX
|
|
||||||
Sparc
|
|
||||||
X86
|
|
||||||
XCore
|
|
||||||
)
|
|
||||||
|
|
||||||
# List of targets with JIT support:
|
|
||||||
set(LLVM_TARGETS_WITH_JIT X86 PowerPC ARM Mips)
|
|
||||||
|
|
||||||
if( MSVC )
|
|
||||||
set(LLVM_TARGETS_TO_BUILD X86
|
|
||||||
CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
|
|
||||||
else( MSVC )
|
|
||||||
set(LLVM_TARGETS_TO_BUILD "all"
|
|
||||||
CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
|
|
||||||
endif( MSVC )
|
|
||||||
|
|
||||||
option(BUILD_SHARED_LIBS
|
|
||||||
"Build all libraries as shared libraries instead of static" OFF)
|
|
||||||
|
|
||||||
option(LLVM_ENABLE_CBE_PRINTF_A "Set to ON if CBE is enabled for printf %a output" ON)
|
|
||||||
if(LLVM_ENABLE_CBE_PRINTF_A)
|
|
||||||
set(ENABLE_CBE_PRINTF_A 1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
option(LLVM_ENABLE_TIMESTAMPS "Enable embedding timestamp information in build" ON)
|
|
||||||
if(LLVM_ENABLE_TIMESTAMPS)
|
|
||||||
set(ENABLE_TIMESTAMPS 1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
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_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should search for ffi.h or ffi/ffi.h")
|
|
||||||
|
|
||||||
set(LLVM_TARGET_ARCH "host"
|
|
||||||
CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
|
|
||||||
|
|
||||||
option(LLVM_ENABLE_THREADS "Use threads if available." ON)
|
|
||||||
|
|
||||||
if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
|
|
||||||
set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(LLVM_ENUM_TARGETS "")
|
|
||||||
foreach(c ${LLVM_TARGETS_TO_BUILD})
|
|
||||||
list(FIND LLVM_ALL_TARGETS ${c} idx)
|
|
||||||
if( idx LESS 0 )
|
|
||||||
message(FATAL_ERROR "The target `${c}' does not exist.
|
|
||||||
It should be one of\n${LLVM_ALL_TARGETS}")
|
|
||||||
else()
|
|
||||||
set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${c})\n")
|
|
||||||
endif()
|
|
||||||
endforeach(c)
|
|
||||||
|
|
||||||
set(llvm_builded_incs_dir ${LLVM_BINARY_DIR}/include/llvm)
|
|
||||||
|
|
||||||
include(AddLLVMDefinitions)
|
|
||||||
|
|
||||||
option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
|
|
||||||
|
|
||||||
# MSVC has a gazillion warnings with this.
|
|
||||||
if( MSVC )
|
|
||||||
option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." OFF)
|
|
||||||
else( MSVC )
|
|
||||||
option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
|
|
||||||
option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
|
|
||||||
|
|
||||||
if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
|
|
||||||
option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
|
|
||||||
else()
|
|
||||||
option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
option(LLVM_USE_INTEL_JITEVENTS
|
|
||||||
"Use Intel JIT API to inform Intel(R) VTune(TM) Amplifier XE 2011 about JIT code"
|
|
||||||
OFF)
|
|
||||||
|
|
||||||
if( LLVM_USE_INTEL_JITEVENTS )
|
|
||||||
# Verify we are on a supported platform
|
|
||||||
if( CMAKE_SYSTEM_NAME MATCHES "Windows" OR CMAKE_SYSTEM_NAME MATCHES "Linux" )
|
|
||||||
# Directory where Intel Parallel Amplifier XE 2011 is installed.
|
|
||||||
if ( WIN32 )
|
|
||||||
set(LLVM_INTEL_JITEVENTS_DIR $ENV{VTUNE_AMPLIFIER_XE_2011_DIR})
|
|
||||||
else ( WIN32 )
|
|
||||||
set(LLVM_INTEL_JITEVENTS_DIR "/opt/intel/vtune_amplifier_xe_2011")
|
|
||||||
endif ( WIN32 )
|
|
||||||
|
|
||||||
# Set include and library search paths for Intel JIT Events API
|
|
||||||
set(LLVM_INTEL_JITEVENTS_INCDIR "${LLVM_INTEL_JITEVENTS_DIR}/include")
|
|
||||||
|
|
||||||
if ( CMAKE_SIZEOF_VOID_P EQUAL 8 )
|
|
||||||
set(LLVM_INTEL_JITEVENTS_LIBDIR "${LLVM_INTEL_JITEVENTS_DIR}/lib64")
|
|
||||||
else ( CMAKE_SIZEOF_VOID_P EQUAL 8 )
|
|
||||||
set(LLVM_INTEL_JITEVENTS_LIBDIR "${LLVM_INTEL_JITEVENTS_DIR}/lib32")
|
|
||||||
endif ( CMAKE_SIZEOF_VOID_P EQUAL 8 )
|
|
||||||
else()
|
|
||||||
message(FATAL_ERROR
|
|
||||||
"Intel JIT API support is available on Linux and Windows only.")
|
|
||||||
endif()
|
|
||||||
endif( LLVM_USE_INTEL_JITEVENTS )
|
|
||||||
|
|
||||||
option(LLVM_USE_OPROFILE
|
|
||||||
"Use opagent JIT interface to inform OProfile about JIT code" OFF)
|
|
||||||
|
|
||||||
# If enabled, ierify we are on a platform that supports oprofile.
|
|
||||||
if( LLVM_USE_OPROFILE )
|
|
||||||
if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
|
|
||||||
message(FATAL_ERROR "OProfile support is available on Linux only.")
|
|
||||||
endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
|
|
||||||
endif( LLVM_USE_OPROFILE )
|
|
||||||
|
|
||||||
# Define an option controlling whether we should build for 32-bit on 64-bit
|
|
||||||
# platforms, where supported.
|
|
||||||
if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
|
|
||||||
# TODO: support other platforms and toolchains.
|
|
||||||
option(LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Define the default arguments to use with 'lit', and an option for the user to
|
|
||||||
# override.
|
|
||||||
set(LIT_ARGS_DEFAULT "-sv")
|
|
||||||
if (MSVC OR XCODE)
|
|
||||||
set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
|
|
||||||
endif()
|
|
||||||
set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
|
|
||||||
|
|
||||||
# On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.
|
|
||||||
if( WIN32 AND NOT CYGWIN )
|
|
||||||
set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Define options to control the inclusion and default build behavior for
|
|
||||||
# components which may not strictly be necessary (tools, runtime, examples, and
|
|
||||||
# tests).
|
|
||||||
#
|
|
||||||
# This is primarily to support building smaller or faster project files.
|
|
||||||
option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
|
|
||||||
option(LLVM_BUILD_TOOLS
|
|
||||||
"Build the LLVM tools. If OFF, just generate build targets." ON)
|
|
||||||
|
|
||||||
option(LLVM_INCLUDE_RUNTIME "Generate build targets for the LLVM runtimes" ON)
|
|
||||||
option(LLVM_BUILD_RUNTIME
|
|
||||||
"Build the LLVM runtime libraries. If OFF, just generate build targets." ON)
|
|
||||||
|
|
||||||
option(LLVM_BUILD_EXAMPLES
|
|
||||||
"Build the LLVM example programs. If OFF, just generate build targets." OFF)
|
|
||||||
option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
|
|
||||||
|
|
||||||
option(LLVM_BUILD_TESTS
|
|
||||||
"Build LLVM unit tests. If OFF, just generate build targets." OFF)
|
|
||||||
option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON)
|
|
||||||
|
|
||||||
# All options referred to from HandleLLVMOptions have to be specified
|
|
||||||
# BEFORE this include, otherwise options will not be correctly set on
|
|
||||||
# first cmake run
|
|
||||||
include(config-ix)
|
|
||||||
include(HandleLLVMOptions)
|
|
||||||
|
|
||||||
# Verify that we can find a Python interpreter,
|
|
||||||
include(FindPythonInterp)
|
|
||||||
if( NOT PYTHONINTERP_FOUND )
|
|
||||||
message(FATAL_ERROR
|
|
||||||
"Unable to find Python interpreter, required for builds and testing.
|
|
||||||
|
|
||||||
Please install Python or specify the PYTHON_EXECUTABLE CMake variable.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
######
|
|
||||||
# LLVMBuild Integration
|
|
||||||
#
|
|
||||||
# We use llvm-build to generate all the data required by the CMake based
|
|
||||||
# build system in one swoop:
|
|
||||||
#
|
|
||||||
# - We generate a file (a CMake fragment) in the object root which contains
|
|
||||||
# all the definitions that are required by CMake.
|
|
||||||
#
|
|
||||||
# - We generate the library table used by llvm-config.
|
|
||||||
#
|
|
||||||
# - We generate the dependencies for the CMake fragment, so that we will
|
|
||||||
# automatically reconfigure outselves.
|
|
||||||
|
|
||||||
set(LLVMBUILDTOOL "${LLVM_MAIN_SRC_DIR}/utils/llvm-build/llvm-build")
|
|
||||||
set(LLVMCONFIGLIBRARYDEPENDENCIESINC
|
|
||||||
"${LLVM_BINARY_DIR}/tools/llvm-config/LibraryDependencies.inc")
|
|
||||||
set(LLVMBUILDCMAKEFRAG
|
|
||||||
"${LLVM_BINARY_DIR}/LLVMBuild.cmake")
|
|
||||||
|
|
||||||
# Create the list of optional components that are enabled
|
|
||||||
if (LLVM_USE_INTEL_JITEVENTS)
|
|
||||||
set(LLVMOPTIONALCOMPONENTS IntelJITEvents)
|
|
||||||
endif (LLVM_USE_INTEL_JITEVENTS)
|
|
||||||
if (LLVM_USE_OPROFILE)
|
|
||||||
set(LLVMOPTIONALCOMPONENTS ${LLVMOPTIONALCOMPONENTS} OProfileJIT)
|
|
||||||
endif (LLVM_USE_OPROFILE)
|
|
||||||
|
|
||||||
message(STATUS "Constructing LLVMBuild project information")
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${PYTHON_EXECUTABLE} ${LLVMBUILDTOOL}
|
|
||||||
--native-target "${LLVM_NATIVE_ARCH}"
|
|
||||||
--enable-targets "${LLVM_TARGETS_TO_BUILD}"
|
|
||||||
--enable-optional-components "${LLVMOPTIONALCOMPONENTS}"
|
|
||||||
--write-library-table ${LLVMCONFIGLIBRARYDEPENDENCIESINC}
|
|
||||||
--write-cmake-fragment ${LLVMBUILDCMAKEFRAG}
|
|
||||||
ERROR_VARIABLE LLVMBUILDOUTPUT
|
|
||||||
ERROR_VARIABLE LLVMBUILDERRORS
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
ERROR_STRIP_TRAILING_WHITESPACE
|
|
||||||
RESULT_VARIABLE LLVMBUILDRESULT)
|
|
||||||
|
|
||||||
# On Win32, CMake doesn't properly handle piping the default output/error
|
|
||||||
# streams into the GUI console. So, we explicitly catch and report them.
|
|
||||||
if( NOT "${LLVMBUILDOUTPUT}" STREQUAL "")
|
|
||||||
message(STATUS "llvm-build output: ${LLVMBUILDOUTPUT}")
|
|
||||||
endif()
|
|
||||||
if( NOT "${LLVMBUILDRESULT}" STREQUAL "0" )
|
|
||||||
message(FATAL_ERROR
|
|
||||||
"Unexpected failure executing llvm-build: ${LLVMBUILDERRORS}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Include the generated CMake fragment. This will define properties from the
|
|
||||||
# LLVMBuild files in a format which is easy to consume from CMake, and will add
|
|
||||||
# the dependencies so that CMake will reconfigure properly when the LLVMBuild
|
|
||||||
# files change.
|
|
||||||
include(${LLVMBUILDCMAKEFRAG})
|
|
||||||
|
|
||||||
######
|
|
||||||
|
|
||||||
# Configure all of the various header file fragments LLVM uses which depend on
|
|
||||||
# configuration variables.
|
|
||||||
set(LLVM_ENUM_ASM_PRINTERS "")
|
|
||||||
set(LLVM_ENUM_ASM_PARSERS "")
|
|
||||||
set(LLVM_ENUM_DISASSEMBLERS "")
|
|
||||||
foreach(t ${LLVM_TARGETS_TO_BUILD})
|
|
||||||
set( td ${LLVM_MAIN_SRC_DIR}/lib/Target/${t} )
|
|
||||||
file(GLOB asmp_file "${td}/*AsmPrinter.cpp")
|
|
||||||
if( asmp_file )
|
|
||||||
set(LLVM_ENUM_ASM_PRINTERS
|
|
||||||
"${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
|
|
||||||
endif()
|
|
||||||
if( EXISTS ${td}/AsmParser/CMakeLists.txt )
|
|
||||||
set(LLVM_ENUM_ASM_PARSERS
|
|
||||||
"${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n")
|
|
||||||
endif()
|
|
||||||
if( EXISTS ${td}/Disassembler/CMakeLists.txt )
|
|
||||||
set(LLVM_ENUM_DISASSEMBLERS
|
|
||||||
"${LLVM_ENUM_DISASSEMBLERS}LLVM_DISASSEMBLER(${t})\n")
|
|
||||||
endif()
|
|
||||||
endforeach(t)
|
|
||||||
|
|
||||||
# Produce the target definition files, which provide a way for clients to easily
|
|
||||||
# include various classes of targets.
|
|
||||||
configure_file(
|
|
||||||
${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
|
|
||||||
${LLVM_BINARY_DIR}/include/llvm/Config/AsmPrinters.def
|
|
||||||
)
|
|
||||||
configure_file(
|
|
||||||
${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
|
|
||||||
${LLVM_BINARY_DIR}/include/llvm/Config/AsmParsers.def
|
|
||||||
)
|
|
||||||
configure_file(
|
|
||||||
${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Disassemblers.def.in
|
|
||||||
${LLVM_BINARY_DIR}/include/llvm/Config/Disassemblers.def
|
|
||||||
)
|
|
||||||
configure_file(
|
|
||||||
${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in
|
|
||||||
${LLVM_BINARY_DIR}/include/llvm/Config/Targets.def
|
|
||||||
)
|
|
||||||
|
|
||||||
# Configure the three LLVM configuration header files.
|
|
||||||
configure_file(
|
|
||||||
${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/config.h.cmake
|
|
||||||
${LLVM_BINARY_DIR}/include/llvm/Config/config.h)
|
|
||||||
configure_file(
|
|
||||||
${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/llvm-config.h.cmake
|
|
||||||
${LLVM_BINARY_DIR}/include/llvm/Config/llvm-config.h)
|
|
||||||
configure_file(
|
|
||||||
${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/DataTypes.h.cmake
|
|
||||||
${LLVM_BINARY_DIR}/include/llvm/Support/DataTypes.h)
|
|
||||||
|
|
||||||
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR} )
|
|
||||||
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
|
|
||||||
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib )
|
|
||||||
|
|
||||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
|
||||||
|
|
||||||
include_directories( ${LLVM_BINARY_DIR}/include ${LLVM_MAIN_INCLUDE_DIR})
|
|
||||||
|
|
||||||
if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
|
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include llvm/Support/Solaris.h")
|
|
||||||
endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
|
|
||||||
|
|
||||||
include(AddLLVM)
|
|
||||||
include(TableGen)
|
|
||||||
|
|
||||||
if( MINGW )
|
|
||||||
# People report that -O3 is unreliable on MinGW. The traditional
|
|
||||||
# build also uses -O2 for that reason:
|
|
||||||
llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Put this before tblgen. Else we have a circular dependence.
|
|
||||||
add_subdirectory(lib/Support)
|
|
||||||
add_subdirectory(lib/TableGen)
|
|
||||||
|
|
||||||
add_subdirectory(utils/TableGen)
|
|
||||||
|
|
||||||
add_subdirectory(include/llvm)
|
|
||||||
|
|
||||||
add_subdirectory(lib)
|
|
||||||
|
|
||||||
add_subdirectory(utils/FileCheck)
|
|
||||||
add_subdirectory(utils/FileUpdate)
|
|
||||||
add_subdirectory(utils/count)
|
|
||||||
add_subdirectory(utils/not)
|
|
||||||
add_subdirectory(utils/llvm-lit)
|
|
||||||
add_subdirectory(utils/yaml-bench)
|
|
||||||
|
|
||||||
add_subdirectory(projects)
|
|
||||||
|
|
||||||
if( LLVM_INCLUDE_TOOLS )
|
|
||||||
add_subdirectory(tools)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if( LLVM_INCLUDE_RUNTIME )
|
|
||||||
add_subdirectory(runtime)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if( LLVM_INCLUDE_EXAMPLES )
|
|
||||||
add_subdirectory(examples)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if( LLVM_INCLUDE_TESTS )
|
|
||||||
add_subdirectory(test)
|
|
||||||
add_subdirectory(utils/unittest)
|
|
||||||
add_subdirectory(unittests)
|
|
||||||
if (MSVC)
|
|
||||||
# This utility is used to prevent chrashing tests from calling Dr. Watson on
|
|
||||||
# Windows.
|
|
||||||
add_subdirectory(utils/KillTheDoctor)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_subdirectory(cmake/modules)
|
|
||||||
|
|
||||||
install(DIRECTORY include/
|
|
||||||
DESTINATION include
|
|
||||||
FILES_MATCHING
|
|
||||||
PATTERN "*.def"
|
|
||||||
PATTERN "*.h"
|
|
||||||
PATTERN "*.td"
|
|
||||||
PATTERN "*.inc"
|
|
||||||
PATTERN "LICENSE.TXT"
|
|
||||||
PATTERN ".svn" EXCLUDE
|
|
||||||
)
|
|
||||||
|
|
||||||
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/
|
|
||||||
DESTINATION include
|
|
||||||
FILES_MATCHING
|
|
||||||
PATTERN "*.def"
|
|
||||||
PATTERN "*.h"
|
|
||||||
PATTERN "*.gen"
|
|
||||||
PATTERN "*.inc"
|
|
||||||
# Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
|
|
||||||
PATTERN "CMakeFiles" EXCLUDE
|
|
||||||
PATTERN ".svn" EXCLUDE
|
|
||||||
)
|
|
||||||
|
|
||||||
# TODO: make and install documentation.
|
|
||||||
|
|
||||||
set(CPACK_PACKAGE_VENDOR "LLVM")
|
|
||||||
set(CPACK_PACKAGE_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
|
|
||||||
set(CPACK_PACKAGE_VERSION_MINOR ${LLVM_VERSION_MINOR})
|
|
||||||
add_version_info_from_vcs(CPACK_PACKAGE_VERSION_PATCH)
|
|
||||||
include(CPack)
|
|
||||||
|
|
||||||
# Workaround for MSVS10 to avoid the Dialog Hell
|
|
||||||
# FIXME: This could be removed with future version of CMake.
|
|
||||||
if(MSVC_VERSION EQUAL 1600)
|
|
||||||
set(LLVM_SLN_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/LLVM.sln")
|
|
||||||
if( EXISTS "${LLVM_SLN_FILENAME}" )
|
|
||||||
file(APPEND "${LLVM_SLN_FILENAME}" "\n# This should be regenerated!\n")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
@ -1,415 +0,0 @@
|
|||||||
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
|
|
||||||
LLVM, please submit a patch to this file to add yourself, and it will be
|
|
||||||
done!
|
|
||||||
|
|
||||||
The list is sorted by surname and formatted to allow easy grepping and
|
|
||||||
beautification by scripts. The fields are: name (N), email (E), web-address
|
|
||||||
(W), PGP key ID and fingerprint (P), description (D), and snail-mail address
|
|
||||||
(S).
|
|
||||||
|
|
||||||
|
|
||||||
N: Vikram Adve
|
|
||||||
E: vadve@cs.uiuc.edu
|
|
||||||
W: http://www.cs.uiuc.edu/~vadve/
|
|
||||||
D: The Sparc64 backend, provider of much wisdom, and motivator for LLVM
|
|
||||||
|
|
||||||
N: Owen Anderson
|
|
||||||
E: resistor@mac.com
|
|
||||||
D: LCSSA pass and related LoopUnswitch work
|
|
||||||
D: GVNPRE pass, TargetData refactoring, random improvements
|
|
||||||
|
|
||||||
N: Henrik Bach
|
|
||||||
D: MingW Win32 API portability layer
|
|
||||||
|
|
||||||
N: Nate Begeman
|
|
||||||
E: natebegeman@mac.com
|
|
||||||
D: PowerPC backend developer
|
|
||||||
D: Target-independent code generator and analysis improvements
|
|
||||||
|
|
||||||
N: Daniel Berlin
|
|
||||||
E: dberlin@dberlin.org
|
|
||||||
D: ET-Forest implementation.
|
|
||||||
D: Sparse bitmap
|
|
||||||
|
|
||||||
N: David Blaikie
|
|
||||||
E: dblaikie@gmail.com
|
|
||||||
D: General bug fixing/fit & finish, mostly in Clang
|
|
||||||
|
|
||||||
N: Neil Booth
|
|
||||||
E: neil@daikokuya.co.uk
|
|
||||||
D: APFloat implementation.
|
|
||||||
|
|
||||||
N: Misha Brukman
|
|
||||||
E: brukman+llvm@uiuc.edu
|
|
||||||
W: http://misha.brukman.net
|
|
||||||
D: Portions of X86 and Sparc JIT compilers, PowerPC backend
|
|
||||||
D: Incremental bitcode loader
|
|
||||||
|
|
||||||
N: Cameron Buschardt
|
|
||||||
E: buschard@uiuc.edu
|
|
||||||
D: The `mem2reg' pass - promotes values stored in memory to registers
|
|
||||||
|
|
||||||
N: Brendon Cahoon
|
|
||||||
E: bcahoon@codeaurora.org
|
|
||||||
D: Loop unrolling with run-time trip counts.
|
|
||||||
|
|
||||||
N: Chandler Carruth
|
|
||||||
E: chandlerc@gmail.com
|
|
||||||
D: Hashing algorithms and interfaces
|
|
||||||
D: Inline cost analysis
|
|
||||||
D: Machine block placement pass
|
|
||||||
|
|
||||||
N: Casey Carter
|
|
||||||
E: ccarter@uiuc.edu
|
|
||||||
D: Fixes to the Reassociation pass, various improvement patches
|
|
||||||
|
|
||||||
N: Evan Cheng
|
|
||||||
E: evan.cheng@apple.com
|
|
||||||
D: ARM and X86 backends
|
|
||||||
D: Instruction scheduler improvements
|
|
||||||
D: Register allocator improvements
|
|
||||||
D: Loop optimizer improvements
|
|
||||||
D: Target-independent code generator improvements
|
|
||||||
|
|
||||||
N: Dan Villiom Podlaski Christiansen
|
|
||||||
E: danchr@gmail.com
|
|
||||||
E: danchr@cs.au.dk
|
|
||||||
W: http://villiom.dk
|
|
||||||
D: LLVM Makefile improvements
|
|
||||||
D: Clang diagnostic & driver tweaks
|
|
||||||
S: Aarhus, Denmark
|
|
||||||
|
|
||||||
N: Jeff Cohen
|
|
||||||
E: jeffc@jolt-lang.org
|
|
||||||
W: http://jolt-lang.org
|
|
||||||
D: Native Win32 API portability layer
|
|
||||||
|
|
||||||
N: John T. Criswell
|
|
||||||
E: criswell@uiuc.edu
|
|
||||||
D: Original Autoconf support, documentation improvements, bug fixes
|
|
||||||
|
|
||||||
N: Anshuman Dasgupta
|
|
||||||
E: adasgupt@codeaurora.org
|
|
||||||
D: Deterministic finite automaton based infrastructure for VLIW packetization
|
|
||||||
|
|
||||||
N: Stefanus Du Toit
|
|
||||||
E: stefanus.dutoit@rapidmind.com
|
|
||||||
D: Bug fixes and minor improvements
|
|
||||||
|
|
||||||
N: Rafael Avila de Espindola
|
|
||||||
E: rafael.espindola@gmail.com
|
|
||||||
D: The ARM backend
|
|
||||||
|
|
||||||
N: Alkis Evlogimenos
|
|
||||||
E: alkis@evlogimenos.com
|
|
||||||
D: Linear scan register allocator, many codegen improvements, Java frontend
|
|
||||||
|
|
||||||
N: Hal Finkel
|
|
||||||
E: hfinkel@anl.gov
|
|
||||||
D: Basic-block autovectorization, PowerPC backend improvements
|
|
||||||
|
|
||||||
N: Ryan Flynn
|
|
||||||
E: pizza@parseerror.com
|
|
||||||
D: Miscellaneous bug fixes
|
|
||||||
|
|
||||||
N: Brian Gaeke
|
|
||||||
E: gaeke@uiuc.edu
|
|
||||||
W: http://www.students.uiuc.edu/~gaeke/
|
|
||||||
D: Portions of X86 static and JIT compilers; initial SparcV8 backend
|
|
||||||
D: Dynamic trace optimizer
|
|
||||||
D: FreeBSD/X86 compatibility fixes, the llvm-nm tool
|
|
||||||
|
|
||||||
N: Nicolas Geoffray
|
|
||||||
E: nicolas.geoffray@lip6.fr
|
|
||||||
W: http://www-src.lip6.fr/homepages/Nicolas.Geoffray/
|
|
||||||
D: PPC backend fixes for Linux
|
|
||||||
|
|
||||||
N: Louis Gerbarg
|
|
||||||
D: Portions of the PowerPC backend
|
|
||||||
|
|
||||||
N: Saem Ghani
|
|
||||||
E: saemghani@gmail.com
|
|
||||||
D: Callgraph class cleanups
|
|
||||||
|
|
||||||
N: Mikhail Glushenkov
|
|
||||||
E: foldr@codedgers.com
|
|
||||||
D: Author of llvmc2
|
|
||||||
|
|
||||||
N: Dan Gohman
|
|
||||||
E: gohman@apple.com
|
|
||||||
D: Miscellaneous bug fixes
|
|
||||||
|
|
||||||
N: David Goodwin
|
|
||||||
E: david@goodwinz.net
|
|
||||||
D: Thumb-2 code generator
|
|
||||||
|
|
||||||
N: David Greene
|
|
||||||
E: greened@obbligato.org
|
|
||||||
D: Miscellaneous bug fixes
|
|
||||||
D: Register allocation refactoring
|
|
||||||
|
|
||||||
N: Gabor Greif
|
|
||||||
E: ggreif@gmail.com
|
|
||||||
D: Improvements for space efficiency
|
|
||||||
|
|
||||||
N: James Grosbach
|
|
||||||
E: grosbach@apple.com
|
|
||||||
D: SjLj exception handling support
|
|
||||||
D: General fixes and improvements for the ARM back-end
|
|
||||||
D: MCJIT
|
|
||||||
D: ARM integrated assembler and assembly parser
|
|
||||||
|
|
||||||
N: Lang Hames
|
|
||||||
E: lhames@gmail.com
|
|
||||||
D: PBQP-based register allocator
|
|
||||||
|
|
||||||
N: Gordon Henriksen
|
|
||||||
E: gordonhenriksen@mac.com
|
|
||||||
D: Pluggable GC support
|
|
||||||
D: C interface
|
|
||||||
D: Ocaml bindings
|
|
||||||
|
|
||||||
N: Raul Fernandes Herbster
|
|
||||||
E: raul@dsc.ufcg.edu.br
|
|
||||||
D: JIT support for ARM
|
|
||||||
|
|
||||||
N: Paolo Invernizzi
|
|
||||||
E: arathorn@fastwebnet.it
|
|
||||||
D: Visual C++ compatibility fixes
|
|
||||||
|
|
||||||
N: Patrick Jenkins
|
|
||||||
E: patjenk@wam.umd.edu
|
|
||||||
D: Nightly Tester
|
|
||||||
|
|
||||||
N: Dale Johannesen
|
|
||||||
E: dalej@apple.com
|
|
||||||
D: ARM constant islands improvements
|
|
||||||
D: Tail merging improvements
|
|
||||||
D: Rewrite X87 back end
|
|
||||||
D: Use APFloat for floating point constants widely throughout compiler
|
|
||||||
D: Implement X87 long double
|
|
||||||
|
|
||||||
N: Brad Jones
|
|
||||||
E: kungfoomaster@nondot.org
|
|
||||||
D: Support for packed types
|
|
||||||
|
|
||||||
N: Rod Kay
|
|
||||||
E: rkay@auroraux.org
|
|
||||||
D: Author of LLVM Ada bindings
|
|
||||||
|
|
||||||
N: Eric Kidd
|
|
||||||
W: http://randomhacks.net/
|
|
||||||
D: llvm-config script
|
|
||||||
|
|
||||||
N: Anton Korobeynikov
|
|
||||||
E: asl@math.spbu.ru
|
|
||||||
D: Mingw32 fixes, cross-compiling support, stdcall/fastcall calling conv.
|
|
||||||
D: x86/linux PIC codegen, aliases, regparm/visibility attributes
|
|
||||||
D: Switch lowering refactoring
|
|
||||||
|
|
||||||
N: Sumant Kowshik
|
|
||||||
E: kowshik@uiuc.edu
|
|
||||||
D: Author of the original C backend
|
|
||||||
|
|
||||||
N: Benjamin Kramer
|
|
||||||
E: benny.kra@gmail.com
|
|
||||||
D: Miscellaneous bug fixes
|
|
||||||
|
|
||||||
N: Sundeep Kushwaha
|
|
||||||
E: sundeepk@codeaurora.org
|
|
||||||
D: Implemented DFA-based target independent VLIW packetizer
|
|
||||||
|
|
||||||
N: Christopher Lamb
|
|
||||||
E: christopher.lamb@gmail.com
|
|
||||||
D: aligned load/store support, parts of noalias and restrict support
|
|
||||||
D: vreg subreg infrastructure, X86 codegen improvements based on subregs
|
|
||||||
D: address spaces
|
|
||||||
|
|
||||||
N: Jim Laskey
|
|
||||||
E: jlaskey@apple.com
|
|
||||||
D: Improvements to the PPC backend, instruction scheduling
|
|
||||||
D: Debug and Dwarf implementation
|
|
||||||
D: Auto upgrade mangler
|
|
||||||
D: llvm-gcc4 svn wrangler
|
|
||||||
|
|
||||||
N: Chris Lattner
|
|
||||||
E: sabre@nondot.org
|
|
||||||
W: http://nondot.org/~sabre/
|
|
||||||
D: Primary architect of LLVM
|
|
||||||
|
|
||||||
N: Tanya Lattner (Tanya Brethour)
|
|
||||||
E: tonic@nondot.org
|
|
||||||
W: http://nondot.org/~tonic/
|
|
||||||
D: The initial llvm-ar tool, converted regression testsuite to dejagnu
|
|
||||||
D: Modulo scheduling in the SparcV9 backend
|
|
||||||
D: Release manager (1.7+)
|
|
||||||
|
|
||||||
N: Andrew Lenharth
|
|
||||||
E: alenhar2@cs.uiuc.edu
|
|
||||||
W: http://www.lenharth.org/~andrewl/
|
|
||||||
D: Alpha backend
|
|
||||||
D: Sampling based profiling
|
|
||||||
|
|
||||||
N: Nick Lewycky
|
|
||||||
E: nicholas@mxc.ca
|
|
||||||
D: PredicateSimplifier pass
|
|
||||||
|
|
||||||
N: Tony Linthicum, et. al.
|
|
||||||
E: tlinth@codeaurora.org
|
|
||||||
D: Backend for Qualcomm's Hexagon VLIW processor.
|
|
||||||
|
|
||||||
N: Bruno Cardoso Lopes
|
|
||||||
E: bruno.cardoso@gmail.com
|
|
||||||
W: http://www.brunocardoso.org
|
|
||||||
D: The Mips backend
|
|
||||||
|
|
||||||
N: Duraid Madina
|
|
||||||
E: duraid@octopus.com.au
|
|
||||||
W: http://kinoko.c.u-tokyo.ac.jp/~duraid/
|
|
||||||
D: IA64 backend, BigBlock register allocator
|
|
||||||
|
|
||||||
N: John McCall
|
|
||||||
E: rjmccall@apple.com
|
|
||||||
D: Clang semantic analysis and IR generation
|
|
||||||
|
|
||||||
N: Michael McCracken
|
|
||||||
E: michael.mccracken@gmail.com
|
|
||||||
D: Line number support for llvmgcc
|
|
||||||
|
|
||||||
N: Vladimir Merzliakov
|
|
||||||
E: wanderer@rsu.ru
|
|
||||||
D: Test suite fixes for FreeBSD
|
|
||||||
|
|
||||||
N: Scott Michel
|
|
||||||
E: scottm@aero.org
|
|
||||||
D: Added STI Cell SPU backend.
|
|
||||||
|
|
||||||
N: Kai Nacke
|
|
||||||
E: kai@redstar.de
|
|
||||||
D: Support for implicit TLS model used with MS VC runtime
|
|
||||||
|
|
||||||
N: Takumi Nakamura
|
|
||||||
E: geek4civic@gmail.com
|
|
||||||
E: chapuni@hf.rim.or.jp
|
|
||||||
D: Cygwin and MinGW support.
|
|
||||||
D: Win32 tweaks.
|
|
||||||
S: Yokohama, Japan
|
|
||||||
|
|
||||||
N: Edward O'Callaghan
|
|
||||||
E: eocallaghan@auroraux.org
|
|
||||||
W: http://www.auroraux.org
|
|
||||||
D: Add Clang support with various other improvements to utils/NewNightlyTest.pl
|
|
||||||
D: Fix and maintain Solaris & AuroraUX support for llvm, various build warnings
|
|
||||||
D: and error clean ups.
|
|
||||||
|
|
||||||
N: Morten Ofstad
|
|
||||||
E: morten@hue.no
|
|
||||||
D: Visual C++ compatibility fixes
|
|
||||||
|
|
||||||
N: Jakob Stoklund Olesen
|
|
||||||
E: stoklund@2pi.dk
|
|
||||||
D: Machine code verifier
|
|
||||||
D: Blackfin backend
|
|
||||||
D: Fast register allocator
|
|
||||||
D: Greedy register allocator
|
|
||||||
|
|
||||||
N: Richard Osborne
|
|
||||||
E: richard@xmos.com
|
|
||||||
D: XCore backend
|
|
||||||
|
|
||||||
N: Devang Patel
|
|
||||||
E: dpatel@apple.com
|
|
||||||
D: LTO tool, PassManager rewrite, Loop Pass Manager, Loop Rotate
|
|
||||||
D: GCC PCH Integration (llvm-gcc), llvm-gcc improvements
|
|
||||||
D: Optimizer improvements, Loop Index Split
|
|
||||||
|
|
||||||
N: Sandeep Patel
|
|
||||||
E: deeppatel1987@gmail.com
|
|
||||||
D: ARM calling conventions rewrite, hard float support
|
|
||||||
|
|
||||||
N: Wesley Peck
|
|
||||||
E: peckw@wesleypeck.com
|
|
||||||
W: http://wesleypeck.com/
|
|
||||||
D: MicroBlaze backend
|
|
||||||
|
|
||||||
N: Francois Pichet
|
|
||||||
E: pichet2000@gmail.com
|
|
||||||
D: MSVC support
|
|
||||||
|
|
||||||
N: Vladimir Prus
|
|
||||||
W: http://vladimir_prus.blogspot.com
|
|
||||||
E: ghost@cs.msu.su
|
|
||||||
D: Made inst_iterator behave like a proper iterator, LowerConstantExprs pass
|
|
||||||
|
|
||||||
N: Xerxes Ranby
|
|
||||||
E: xerxes@zafena.se
|
|
||||||
D: Cmake dependency chain and various bug fixes
|
|
||||||
|
|
||||||
N: Chad Rosier
|
|
||||||
E: mcrosier@apple.com
|
|
||||||
D: ARM fast-isel improvements
|
|
||||||
D: Performance monitoring
|
|
||||||
|
|
||||||
N: Nadav Rotem
|
|
||||||
E: nadav.rotem@intel.com
|
|
||||||
D: Vector code generation improvements.
|
|
||||||
|
|
||||||
N: Roman Samoilov
|
|
||||||
E: roman@codedgers.com
|
|
||||||
D: MSIL backend
|
|
||||||
|
|
||||||
N: Duncan Sands
|
|
||||||
E: baldrick@free.fr
|
|
||||||
D: Ada support in llvm-gcc
|
|
||||||
D: Dragonegg plugin
|
|
||||||
D: Exception handling improvements
|
|
||||||
D: Type legalizer rewrite
|
|
||||||
|
|
||||||
N: Ruchira Sasanka
|
|
||||||
E: sasanka@uiuc.edu
|
|
||||||
D: Graph coloring register allocator for the Sparc64 backend
|
|
||||||
|
|
||||||
N: Arnold Schwaighofer
|
|
||||||
E: arnold.schwaighofer@gmail.com
|
|
||||||
D: Tail call optimization for the x86 backend
|
|
||||||
|
|
||||||
N: Shantonu Sen
|
|
||||||
E: ssen@apple.com
|
|
||||||
D: Miscellaneous bug fixes
|
|
||||||
|
|
||||||
N: Anand Shukla
|
|
||||||
E: ashukla@cs.uiuc.edu
|
|
||||||
D: The `paths' pass
|
|
||||||
|
|
||||||
N: Michael J. Spencer
|
|
||||||
E: bigcheesegs@gmail.com
|
|
||||||
D: Shepherding Windows COFF support into MC.
|
|
||||||
D: Lots of Windows stuff.
|
|
||||||
|
|
||||||
N: Reid Spencer
|
|
||||||
E: rspencer@reidspencer.com
|
|
||||||
W: http://reidspencer.com/
|
|
||||||
D: Lots of stuff, see: http://wiki.llvm.org/index.php/User:Reid
|
|
||||||
|
|
||||||
N: Edwin Torok
|
|
||||||
E: edwintorok@gmail.com
|
|
||||||
D: Miscellaneous bug fixes
|
|
||||||
|
|
||||||
N: Adam Treat
|
|
||||||
E: manyoso@yahoo.com
|
|
||||||
D: C++ bugs filed, and C++ front-end bug fixes.
|
|
||||||
|
|
||||||
N: Lauro Ramos Venancio
|
|
||||||
E: lauro.venancio@indt.org.br
|
|
||||||
D: ARM backend improvements
|
|
||||||
D: Thread Local Storage implementation
|
|
||||||
|
|
||||||
N: Bill Wendling
|
|
||||||
E: wendling@apple.com
|
|
||||||
D: Exception handling
|
|
||||||
D: Bunches of stuff
|
|
||||||
|
|
||||||
N: Bob Wilson
|
|
||||||
E: bob.wilson@acm.org
|
|
||||||
D: Advanced SIMD (NEON) support in the ARM backend
|
|
@ -1,70 +0,0 @@
|
|||||||
==============================================================================
|
|
||||||
LLVM Release License
|
|
||||||
==============================================================================
|
|
||||||
University of Illinois/NCSA
|
|
||||||
Open Source License
|
|
||||||
|
|
||||||
Copyright (c) 2003-2012 University of Illinois at Urbana-Champaign.
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Developed by:
|
|
||||||
|
|
||||||
LLVM Team
|
|
||||||
|
|
||||||
University of Illinois at Urbana-Champaign
|
|
||||||
|
|
||||||
http://llvm.org
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal with
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimers.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimers in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
* Neither the names of the LLVM Team, University of Illinois at
|
|
||||||
Urbana-Champaign, nor the names of its contributors may be used to
|
|
||||||
endorse or promote products derived from this Software without specific
|
|
||||||
prior written permission.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
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
|
|
||||||
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
|
|
||||||
------- ---------
|
|
||||||
Autoconf llvm/autoconf
|
|
||||||
llvm/projects/ModuleMaker/autoconf
|
|
||||||
llvm/projects/sample/autoconf
|
|
||||||
CellSPU backend llvm/lib/Target/CellSPU/README.txt
|
|
||||||
Google Test llvm/utils/unittest/googletest
|
|
||||||
OpenBSD regex llvm/lib/Support/{reg*, COPYRIGHT.regex}
|
|
||||||
pyyaml tests llvm/test/YAMLParser/{*.data, LICENSE.TXT}
|
|
@ -1,24 +0,0 @@
|
|||||||
;===- ./LLVMBuild.txt ------------------------------------------*- Conf -*--===;
|
|
||||||
;
|
|
||||||
; The LLVM Compiler Infrastructure
|
|
||||||
;
|
|
||||||
; This file is distributed under the University of Illinois Open Source
|
|
||||||
; License. See LICENSE.TXT for details.
|
|
||||||
;
|
|
||||||
;===------------------------------------------------------------------------===;
|
|
||||||
;
|
|
||||||
; This is an LLVMBuild description file for the components in this subdirectory.
|
|
||||||
;
|
|
||||||
; For more information on the LLVMBuild system, please see:
|
|
||||||
;
|
|
||||||
; http://llvm.org/docs/LLVMBuild.html
|
|
||||||
;
|
|
||||||
;===------------------------------------------------------------------------===;
|
|
||||||
|
|
||||||
[common]
|
|
||||||
subdirectories = bindings docs examples lib projects runtime tools utils
|
|
||||||
|
|
||||||
[component_0]
|
|
||||||
type = Group
|
|
||||||
name = Miscellaneous
|
|
||||||
parent = $ROOT
|
|
@ -1,70 +0,0 @@
|
|||||||
#===-- Makefile.common - Common make rules for LLVM --------*- Makefile -*--===#
|
|
||||||
#
|
|
||||||
# The LLVM Compiler Infrastructure
|
|
||||||
#
|
|
||||||
# This file is distributed under the University of Illinois Open Source
|
|
||||||
# License. See LICENSE.TXT for details.
|
|
||||||
#
|
|
||||||
#===------------------------------------------------------------------------===#
|
|
||||||
#
|
|
||||||
# This file is included by all of the LLVM makefiles. This file defines common
|
|
||||||
# rules to do things like compile a .cpp file or generate dependency info.
|
|
||||||
# These are platform dependent, so this is the file used to specify these
|
|
||||||
# system dependent operations.
|
|
||||||
#
|
|
||||||
# The following functionality can be set by setting incoming variables.
|
|
||||||
# The variable $(LEVEL) *must* be set:
|
|
||||||
#
|
|
||||||
# 1. LEVEL - The level of the current subdirectory from the top of the
|
|
||||||
# source directory. This level should be expressed as a path, for
|
|
||||||
# example, ../.. for two levels deep.
|
|
||||||
#
|
|
||||||
# 2. DIRS - A list of subdirectories to be built. Fake targets are set up
|
|
||||||
# so that each of the targets "all", "install", and "clean" each build
|
|
||||||
# the subdirectories before the local target. DIRS are guaranteed to be
|
|
||||||
# built in order.
|
|
||||||
#
|
|
||||||
# 3. PARALLEL_DIRS - A list of subdirectories to be built, but that may be
|
|
||||||
# built in any order. All DIRS are built in order before PARALLEL_DIRS are
|
|
||||||
# built, which are then built in any order.
|
|
||||||
#
|
|
||||||
# 4. Source - If specified, this sets the source code filenames. If this
|
|
||||||
# is not set, it defaults to be all of the .cpp, .c, .y, and .l files
|
|
||||||
# in the current directory. Also, if you want to build files in addition
|
|
||||||
# to the local files, you can use the ExtraSource variable
|
|
||||||
#
|
|
||||||
# 5. SourceDir - If specified, this specifies a directory that the source files
|
|
||||||
# are in, if they are not in the current directory. This should include a
|
|
||||||
# trailing / character.
|
|
||||||
#
|
|
||||||
# 6. LLVM_SRC_ROOT - If specified, points to the top of the LLVM source tree.
|
|
||||||
#
|
|
||||||
# 8. PROJ_SRC_DIR - The directory which contains the current set of Makefiles
|
|
||||||
# and usually the source code too (unless SourceDir is set).
|
|
||||||
#
|
|
||||||
# 9. PROJ_SRC_ROOT - The root directory of the source code being compiled.
|
|
||||||
#
|
|
||||||
# 10. PROJ_OBJ_DIR - The directory where object code should be placed.
|
|
||||||
#
|
|
||||||
# 11. PROJ_OBJ_ROOT - The root directory for where object code should be
|
|
||||||
# placed.
|
|
||||||
#
|
|
||||||
# For building,
|
|
||||||
# LLVM, LLVM_SRC_ROOT = PROJ_SRC_ROOT
|
|
||||||
#
|
|
||||||
#===-----------------------------------------------------------------------====
|
|
||||||
|
|
||||||
#
|
|
||||||
# Configuration file to set paths specific to local installation of LLVM
|
|
||||||
#
|
|
||||||
ifndef LLVM_OBJ_ROOT
|
|
||||||
include $(LEVEL)/Makefile.config
|
|
||||||
else
|
|
||||||
include $(LLVM_OBJ_ROOT)/Makefile.config
|
|
||||||
endif
|
|
||||||
|
|
||||||
#
|
|
||||||
# Include all of the build rules used for making LLVM
|
|
||||||
#
|
|
||||||
include $(LLVM_SRC_ROOT)/Makefile.rules
|
|
||||||
|
|
@ -1,360 +0,0 @@
|
|||||||
#===-- Makefile.config - Local configuration for LLVM ------*- Makefile -*--===#
|
|
||||||
#
|
|
||||||
# The LLVM Compiler Infrastructure
|
|
||||||
#
|
|
||||||
# This file is distributed under the University of Illinois Open Source
|
|
||||||
# License. See LICENSE.TXT for details.
|
|
||||||
#
|
|
||||||
#===------------------------------------------------------------------------===#
|
|
||||||
#
|
|
||||||
# This file is included by Makefile.common. It defines paths and other
|
|
||||||
# values specific to a particular installation of LLVM.
|
|
||||||
#
|
|
||||||
#===------------------------------------------------------------------------===#
|
|
||||||
|
|
||||||
# Define LLVM specific info and directories based on the autoconf variables
|
|
||||||
LLVMPackageName := @PACKAGE_TARNAME@
|
|
||||||
LLVMVersion := @PACKAGE_VERSION@
|
|
||||||
LLVM_CONFIGTIME := @LLVM_CONFIGTIME@
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# Directory Configuration
|
|
||||||
# This section of the Makefile determines what is where. To be
|
|
||||||
# specific, there are several locations that need to be defined:
|
|
||||||
#
|
|
||||||
# o LLVM_SRC_ROOT : The root directory of the LLVM source code.
|
|
||||||
# o LLVM_OBJ_ROOT : The root directory containing the built LLVM code.
|
|
||||||
#
|
|
||||||
# o PROJ_SRC_DIR : The directory containing the code to build.
|
|
||||||
# o PROJ_SRC_ROOT : The root directory of the code to build.
|
|
||||||
#
|
|
||||||
# o PROJ_OBJ_DIR : The directory in which compiled code will be placed.
|
|
||||||
# o PROJ_OBJ_ROOT : The root directory in which compiled code is placed.
|
|
||||||
#
|
|
||||||
###########################################################################
|
|
||||||
|
|
||||||
PWD := @BINPWD@
|
|
||||||
# Set the project name to LLVM if its not defined
|
|
||||||
ifndef PROJECT_NAME
|
|
||||||
PROJECT_NAME := $(LLVMPackageName)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# The macro below is expanded when 'realpath' is not built-in.
|
|
||||||
# Built-in 'realpath' is available on GNU Make 3.81.
|
|
||||||
realpath = $(shell cd $(1); $(PWD))
|
|
||||||
|
|
||||||
PROJ_OBJ_DIR := $(call realpath, .)
|
|
||||||
PROJ_OBJ_ROOT := $(call realpath, $(PROJ_OBJ_DIR)/$(LEVEL))
|
|
||||||
|
|
||||||
CLANG_SRC_ROOT := @CLANG_SRC_ROOT@
|
|
||||||
|
|
||||||
ifeq ($(PROJECT_NAME),$(LLVMPackageName))
|
|
||||||
LLVM_SRC_ROOT := $(call realpath, @abs_top_srcdir@)
|
|
||||||
LLVM_OBJ_ROOT := $(call realpath, @abs_top_builddir@)
|
|
||||||
PROJ_SRC_ROOT := $(LLVM_SRC_ROOT)
|
|
||||||
PROJ_SRC_DIR := $(LLVM_SRC_ROOT)$(patsubst $(PROJ_OBJ_ROOT)%,%,$(PROJ_OBJ_DIR))
|
|
||||||
|
|
||||||
ifneq ($(CLANG_SRC_ROOT),)
|
|
||||||
CLANG_SRC_ROOT:= $(call realpath, $(CLANG_SRC_ROOT))
|
|
||||||
PROJ_SRC_DIR := $(patsubst $(LLVM_SRC_ROOT)/tools/clang%,$(CLANG_SRC_ROOT)%,$(PROJ_SRC_DIR))
|
|
||||||
endif
|
|
||||||
|
|
||||||
prefix := @prefix@
|
|
||||||
PROJ_prefix := $(prefix)
|
|
||||||
PROJ_VERSION := $(LLVMVersion)
|
|
||||||
else
|
|
||||||
ifndef PROJ_SRC_ROOT
|
|
||||||
$(error Projects must define PROJ_SRC_ROOT)
|
|
||||||
endif
|
|
||||||
ifndef PROJ_OBJ_ROOT
|
|
||||||
$(error Projects must define PROJ_OBJ_ROOT)
|
|
||||||
endif
|
|
||||||
ifndef PROJ_INSTALL_ROOT
|
|
||||||
$(error Projects must define PROJ_INSTALL_ROOT)
|
|
||||||
endif
|
|
||||||
ifndef LLVM_SRC_ROOT
|
|
||||||
$(error Projects must define LLVM_SRC_ROOT)
|
|
||||||
endif
|
|
||||||
ifndef LLVM_OBJ_ROOT
|
|
||||||
$(error Projects must define LLVM_OBJ_ROOT)
|
|
||||||
endif
|
|
||||||
PROJ_SRC_DIR := $(call realpath, $(PROJ_SRC_ROOT)/$(patsubst $(PROJ_OBJ_ROOT)%,%,$(PROJ_OBJ_DIR)))
|
|
||||||
prefix := $(PROJ_INSTALL_ROOT)
|
|
||||||
PROJ_prefix := $(prefix)
|
|
||||||
ifndef PROJ_VERSION
|
|
||||||
PROJ_VERSION := 1.0
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
INTERNAL_PREFIX := @INTERNAL_PREFIX@
|
|
||||||
ifneq ($(INTERNAL_PREFIX),)
|
|
||||||
PROJ_internal_prefix := $(INTERNAL_PREFIX)
|
|
||||||
else
|
|
||||||
PROJ_internal_prefix := $(prefix)
|
|
||||||
endif
|
|
||||||
|
|
||||||
PROJ_bindir := $(PROJ_prefix)/bin
|
|
||||||
PROJ_libdir := $(PROJ_prefix)/lib
|
|
||||||
PROJ_datadir := $(PROJ_prefix)/share
|
|
||||||
PROJ_docsdir := $(PROJ_prefix)/docs/llvm
|
|
||||||
PROJ_etcdir := $(PROJ_prefix)/etc/llvm
|
|
||||||
PROJ_includedir := $(PROJ_prefix)/include
|
|
||||||
PROJ_infodir := $(PROJ_prefix)/info
|
|
||||||
PROJ_mandir := $(PROJ_prefix)/share/man
|
|
||||||
|
|
||||||
# Determine if we're on a unix type operating system
|
|
||||||
LLVM_ON_UNIX:=@LLVM_ON_UNIX@
|
|
||||||
LLVM_ON_WIN32:=@LLVM_ON_WIN32@
|
|
||||||
|
|
||||||
# Host operating system for which LLVM will be run.
|
|
||||||
OS=@OS@
|
|
||||||
HOST_OS=@HOST_OS@
|
|
||||||
# Target operating system for which LLVM will compile for.
|
|
||||||
TARGET_OS=@TARGET_OS@
|
|
||||||
|
|
||||||
# Target hardware architecture
|
|
||||||
ARCH=@ARCH@
|
|
||||||
TARGET_NATIVE_ARCH := $(ARCH)
|
|
||||||
|
|
||||||
# Indicates, whether we're cross-compiling LLVM or not
|
|
||||||
LLVM_CROSS_COMPILING=@LLVM_CROSS_COMPILING@
|
|
||||||
|
|
||||||
# Executable file extension for build platform (mainly for
|
|
||||||
# tablegen call if we're cross-compiling).
|
|
||||||
BUILD_EXEEXT=@BUILD_EXEEXT@
|
|
||||||
|
|
||||||
# Compilers for the build platflorm (mainly for tablegen
|
|
||||||
# call if we're cross-compiling).
|
|
||||||
BUILD_CC=@BUILD_CC@
|
|
||||||
BUILD_CXX=@BUILD_CXX@
|
|
||||||
|
|
||||||
# Triple for configuring build tools when cross-compiling
|
|
||||||
BUILD_TRIPLE=@build@
|
|
||||||
|
|
||||||
# Target triple (cpu-vendor-os) for which we should generate code
|
|
||||||
TARGET_TRIPLE=@target@
|
|
||||||
|
|
||||||
# Extra options to compile LLVM with
|
|
||||||
EXTRA_OPTIONS=@EXTRA_OPTIONS@
|
|
||||||
|
|
||||||
# Extra options to link LLVM with
|
|
||||||
EXTRA_LD_OPTIONS=@EXTRA_LD_OPTIONS@
|
|
||||||
|
|
||||||
# Endian-ness of the target
|
|
||||||
ENDIAN=@ENDIAN@
|
|
||||||
|
|
||||||
# Path to the C++ compiler to use. This is an optional setting, which defaults
|
|
||||||
# to whatever your gmake defaults to.
|
|
||||||
CXX = @CXX@
|
|
||||||
|
|
||||||
# Path to the CC binary, which use used by testcases for native builds.
|
|
||||||
CC := @CC@
|
|
||||||
|
|
||||||
# Linker flags.
|
|
||||||
LDFLAGS+=@LDFLAGS@
|
|
||||||
|
|
||||||
# Path to the library archiver program.
|
|
||||||
AR_PATH = @AR@
|
|
||||||
AR = @AR@
|
|
||||||
|
|
||||||
# Path to the nm program
|
|
||||||
NM_PATH = @NM@
|
|
||||||
|
|
||||||
# The pathnames of the programs we require to build
|
|
||||||
CMP := @CMP@
|
|
||||||
CP := @CP@
|
|
||||||
DATE := @DATE@
|
|
||||||
FIND := @FIND@
|
|
||||||
GREP := @GREP@
|
|
||||||
INSTALL := @INSTALL@
|
|
||||||
MKDIR := $(LLVM_SRC_ROOT)/autoconf/mkinstalldirs
|
|
||||||
MV := @MV@
|
|
||||||
RANLIB := @RANLIB@
|
|
||||||
RM := @RM@
|
|
||||||
SED := @SED@
|
|
||||||
TAR := @TAR@
|
|
||||||
|
|
||||||
# Paths to miscellaneous programs we hope are present but might not be
|
|
||||||
BZIP2 := @BZIP2@
|
|
||||||
CAT := @CAT@
|
|
||||||
DOT := @DOT@
|
|
||||||
DOXYGEN := @DOXYGEN@
|
|
||||||
GROFF := @GROFF@
|
|
||||||
GZIPBIN := @GZIPBIN@
|
|
||||||
OCAMLC := @OCAMLC@
|
|
||||||
OCAMLOPT := @OCAMLOPT@
|
|
||||||
OCAMLDEP := @OCAMLDEP@
|
|
||||||
OCAMLDOC := @OCAMLDOC@
|
|
||||||
GAS := @GAS@
|
|
||||||
POD2HTML := @POD2HTML@
|
|
||||||
POD2MAN := @POD2MAN@
|
|
||||||
PDFROFF := @PDFROFF@
|
|
||||||
RUNTEST := @RUNTEST@
|
|
||||||
TCLSH := @TCLSH@
|
|
||||||
ZIP := @ZIP@
|
|
||||||
|
|
||||||
HAVE_PTHREAD := @HAVE_PTHREAD@
|
|
||||||
|
|
||||||
LIBS := @LIBS@
|
|
||||||
|
|
||||||
# Targets that we should build
|
|
||||||
TARGETS_TO_BUILD=@TARGETS_TO_BUILD@
|
|
||||||
|
|
||||||
# Path to directory where object files should be stored during a build.
|
|
||||||
# Set OBJ_ROOT to "." if you do not want to use a separate place for
|
|
||||||
# object files.
|
|
||||||
OBJ_ROOT := .
|
|
||||||
|
|
||||||
# What to pass as rpath flag to g++
|
|
||||||
RPATH := @RPATH@
|
|
||||||
|
|
||||||
# What to pass as -rdynamic flag to g++
|
|
||||||
RDYNAMIC := @RDYNAMIC@
|
|
||||||
|
|
||||||
# These are options that can either be enabled here, or can be enabled on the
|
|
||||||
# make command line (ie, make ENABLE_PROFILING=1):
|
|
||||||
|
|
||||||
# When ENABLE_LIBCPP is enabled, LLVM uses libc++ by default to build.
|
|
||||||
#ENABLE_LIBCPP = 0
|
|
||||||
ENABLE_LIBCPP = @ENABLE_LIBCPP@
|
|
||||||
|
|
||||||
# When ENABLE_OPTIMIZED is enabled, LLVM code is optimized and output is put
|
|
||||||
# into the "Release" directories. Otherwise, LLVM code is not optimized and
|
|
||||||
# output is put in the "Debug" directories.
|
|
||||||
#ENABLE_OPTIMIZED = 1
|
|
||||||
@ENABLE_OPTIMIZED@
|
|
||||||
|
|
||||||
# When ENABLE_PROFILING is enabled, profile instrumentation is done
|
|
||||||
# and output is put into the "<Flavor>+Profile" directories, where
|
|
||||||
# <Flavor> is either Debug or Release depending on how other build
|
|
||||||
# flags are set. Otherwise, output is put in the <Flavor>
|
|
||||||
# directories.
|
|
||||||
#ENABLE_PROFILING = 1
|
|
||||||
@ENABLE_PROFILING@
|
|
||||||
|
|
||||||
# When DISABLE_ASSERTIONS is enabled, builds of all of the LLVM code will
|
|
||||||
# exclude assertion checks, otherwise they are included.
|
|
||||||
#DISABLE_ASSERTIONS = 1
|
|
||||||
@DISABLE_ASSERTIONS@
|
|
||||||
|
|
||||||
# When ENABLE_EXPENSIVE_CHECKS is enabled, builds of all of the LLVM
|
|
||||||
# code will include expensive checks, otherwise they are excluded.
|
|
||||||
#ENABLE_EXPENSIVE_CHECKS = 0
|
|
||||||
@ENABLE_EXPENSIVE_CHECKS@
|
|
||||||
|
|
||||||
# When DEBUG_RUNTIME is enabled, the runtime libraries will retain debug
|
|
||||||
# symbols.
|
|
||||||
#DEBUG_RUNTIME = 1
|
|
||||||
@DEBUG_RUNTIME@
|
|
||||||
|
|
||||||
# When DEBUG_SYMBOLS is enabled, the compiler libraries will retain debug
|
|
||||||
# symbols.
|
|
||||||
#DEBUG_SYMBOLS = 1
|
|
||||||
@DEBUG_SYMBOLS@
|
|
||||||
|
|
||||||
# The compiler flags to use for optimized builds.
|
|
||||||
OPTIMIZE_OPTION := @OPTIMIZE_OPTION@
|
|
||||||
|
|
||||||
# When ENABLE_PROFILING is enabled, the llvm source base is built with profile
|
|
||||||
# information to allow gprof to be used to get execution frequencies.
|
|
||||||
#ENABLE_PROFILING = 1
|
|
||||||
|
|
||||||
# When ENABLE_DOCS is disabled, docs/ will not be built.
|
|
||||||
ENABLE_DOCS = @ENABLE_DOCS@
|
|
||||||
|
|
||||||
# When ENABLE_DOXYGEN is enabled, the doxygen documentation will be built
|
|
||||||
ENABLE_DOXYGEN = @ENABLE_DOXYGEN@
|
|
||||||
|
|
||||||
# Do we want to enable threads?
|
|
||||||
ENABLE_THREADS := @ENABLE_THREADS@
|
|
||||||
|
|
||||||
# Do we want to build with position independent code?
|
|
||||||
ENABLE_PIC := @ENABLE_PIC@
|
|
||||||
|
|
||||||
# Do we want to build a shared library and link the tools with it?
|
|
||||||
ENABLE_SHARED := @ENABLE_SHARED@
|
|
||||||
|
|
||||||
# Do we want to link the stdc++ into a shared library? (Cygming)
|
|
||||||
ENABLE_EMBED_STDCXX := @ENABLE_EMBED_STDCXX@
|
|
||||||
|
|
||||||
# Use -fvisibility-inlines-hidden?
|
|
||||||
ENABLE_VISIBILITY_INLINES_HIDDEN := @ENABLE_VISIBILITY_INLINES_HIDDEN@
|
|
||||||
|
|
||||||
# Do we want to allow timestamping information into builds?
|
|
||||||
ENABLE_TIMESTAMPS := @ENABLE_TIMESTAMPS@
|
|
||||||
|
|
||||||
# This option tells the Makefiles to produce verbose output.
|
|
||||||
# It essentially prints the commands that make is executing
|
|
||||||
#VERBOSE = 1
|
|
||||||
|
|
||||||
# Enable JIT for this platform
|
|
||||||
TARGET_HAS_JIT = @TARGET_HAS_JIT@
|
|
||||||
|
|
||||||
# Environment variable to set to change the runtime shared library search path.
|
|
||||||
SHLIBPATH_VAR = @SHLIBPATH_VAR@
|
|
||||||
|
|
||||||
# Shared library extension for host platform.
|
|
||||||
SHLIBEXT = @SHLIBEXT@
|
|
||||||
|
|
||||||
# Executable file extension for host platform.
|
|
||||||
EXEEXT = @EXEEXT@
|
|
||||||
|
|
||||||
# Things we just assume are "there"
|
|
||||||
ECHO := echo
|
|
||||||
|
|
||||||
# Get the options for causing archives to link all their content instead of
|
|
||||||
# just missing symbols, and the inverse of that. This is used for certain LLVM
|
|
||||||
# tools that permit loadable modules. It ensures that the LLVM symbols will be
|
|
||||||
# available to those loadable modules.
|
|
||||||
LINKALL := @LINKALL@
|
|
||||||
NOLINKALL := @NOLINKALL@
|
|
||||||
|
|
||||||
# Get the value of HUGE_VAL_SANITY which will be either "yes" or "no" depending
|
|
||||||
# on the check.
|
|
||||||
HUGE_VAL_SANITY = @HUGE_VAL_SANITY@
|
|
||||||
|
|
||||||
# Bindings that we should build
|
|
||||||
BINDINGS_TO_BUILD := @BINDINGS_TO_BUILD@
|
|
||||||
ALL_BINDINGS := @ALL_BINDINGS@
|
|
||||||
OCAML_LIBDIR := @OCAML_LIBDIR@
|
|
||||||
|
|
||||||
# When compiling under Mingw/Cygwin, executables such as tblgen
|
|
||||||
# expect Windows paths, whereas the build system uses Unix paths.
|
|
||||||
# The function SYSPATH transforms Unix paths into Windows paths.
|
|
||||||
ifneq (,$(findstring -mno-cygwin, $(CXX)))
|
|
||||||
SYSPATH = $(shell echo $(1) | cygpath -m -f -)
|
|
||||||
else
|
|
||||||
SYSPATH = $(1)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Location of the plugin header file for gold.
|
|
||||||
BINUTILS_INCDIR := @BINUTILS_INCDIR@
|
|
||||||
|
|
||||||
# Optional flags supported by the compiler
|
|
||||||
# -Wno-missing-field-initializers
|
|
||||||
NO_MISSING_FIELD_INITIALIZERS = @NO_MISSING_FIELD_INITIALIZERS@
|
|
||||||
# -Wno-variadic-macros
|
|
||||||
NO_VARIADIC_MACROS = @NO_VARIADIC_MACROS@
|
|
||||||
# -Wcovered-switch-default
|
|
||||||
COVERED_SWITCH_DEFAULT = @COVERED_SWITCH_DEFAULT@
|
|
||||||
|
|
||||||
# Was polly found in tools/polly?
|
|
||||||
LLVM_HAS_POLLY = @LLVM_HAS_POLLY@
|
|
||||||
# Flags supported by the linker.
|
|
||||||
# bfd ld / gold --version-script=file
|
|
||||||
HAVE_LINK_VERSION_SCRIPT = @HAVE_LINK_VERSION_SCRIPT@
|
|
||||||
|
|
||||||
# Flags to control building support for Intel JIT Events API
|
|
||||||
USE_INTEL_JITEVENTS := @USE_INTEL_JITEVENTS@
|
|
||||||
INTEL_JITEVENTS_INCDIR := @INTEL_JITEVENTS_INCDIR@
|
|
||||||
INTEL_JITEVENTS_LIBDIR := @INTEL_JITEVENTS_LIBDIR@
|
|
||||||
|
|
||||||
# Flags to control building support for OProfile JIT API
|
|
||||||
USE_OPROFILE := @USE_OPROFILE@
|
|
||||||
|
|
||||||
ifeq ($(USE_INTEL_JITEVENTS), 1)
|
|
||||||
OPTIONAL_COMPONENTS += IntelJITEvents
|
|
||||||
endif
|
|
||||||
ifeq ($(USE_OPROFILE), 1)
|
|
||||||
OPTIONAL_COMPONENTS += OProfileJIT
|
|
||||||
endif
|
|
File diff suppressed because it is too large
Load Diff
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
Low Level Virtual Machine (LLVM)
|
|
||||||
================================
|
|
||||||
|
|
||||||
This directory and its subdirectories contain source code for the Low Level
|
|
||||||
Virtual Machine, a toolkit for the construction of highly optimized compilers,
|
|
||||||
optimizers, and runtime environments.
|
|
||||||
|
|
||||||
LLVM is open source software. You may freely distribute it under the terms of
|
|
||||||
the license agreement found in LICENSE.txt.
|
|
||||||
|
|
||||||
Please see the HTML documentation provided in docs/index.html for further
|
|
||||||
assistance with LLVM.
|
|
||||||
|
|
||||||
If you're writing a package for LLVM, see docs/Packaging.html for our
|
|
||||||
suggestions.
|
|
||||||
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
die() {
|
|
||||||
echo "$@" 1>&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
clean() {
|
|
||||||
echo $1 | sed -e 's/\\//g'
|
|
||||||
}
|
|
||||||
|
|
||||||
### NOTE: ############################################################
|
|
||||||
### These variables specify the tool versions we want to use.
|
|
||||||
### Periods should be escaped with backslash for use by grep.
|
|
||||||
###
|
|
||||||
### If you update these, please also update docs/GettingStarted.html
|
|
||||||
want_autoconf_version='2\.60'
|
|
||||||
want_autoheader_version=$want_autoconf_version
|
|
||||||
want_aclocal_version='1\.9\.6'
|
|
||||||
want_libtool_version='1\.5\.22'
|
|
||||||
### END NOTE #########################################################
|
|
||||||
|
|
||||||
outfile=configure
|
|
||||||
configfile=configure.ac
|
|
||||||
|
|
||||||
want_autoconf_version_clean=$(clean $want_autoconf_version)
|
|
||||||
want_autoheader_version_clean=$(clean $want_autoheader_version)
|
|
||||||
want_aclocal_version_clean=$(clean $want_aclocal_version)
|
|
||||||
want_libtool_version_clean=$(clean $want_libtool_version)
|
|
||||||
|
|
||||||
test -d autoconf && test -f autoconf/$configfile && cd autoconf
|
|
||||||
test -f $configfile || die "Can't find 'autoconf' dir; please cd into it first"
|
|
||||||
autoconf --version | grep $want_autoconf_version > /dev/null
|
|
||||||
test $? -eq 0 || die "Your autoconf was not detected as being $want_autoconf_version_clean"
|
|
||||||
aclocal --version | grep '^aclocal.*'$want_aclocal_version > /dev/null
|
|
||||||
test $? -eq 0 || die "Your aclocal was not detected as being $want_aclocal_version_clean"
|
|
||||||
autoheader --version | grep '^autoheader.*'$want_autoheader_version > /dev/null
|
|
||||||
test $? -eq 0 || die "Your autoheader was not detected as being $want_autoheader_version_clean"
|
|
||||||
libtool --version | grep $want_libtool_version > /dev/null
|
|
||||||
test $? -eq 0 || die "Your libtool was not detected as being $want_libtool_version_clean"
|
|
||||||
echo ""
|
|
||||||
echo "### NOTE: ############################################################"
|
|
||||||
echo "### If you get *any* warnings from autoconf below you MUST fix the"
|
|
||||||
echo "### scripts in the m4 directory because there are future forward"
|
|
||||||
echo "### compatibility or platform support issues at risk. Please do NOT"
|
|
||||||
echo "### commit any configure script that was generated with warnings"
|
|
||||||
echo "### present. You should get just three 'Regenerating..' lines."
|
|
||||||
echo "######################################################################"
|
|
||||||
echo ""
|
|
||||||
echo "Regenerating aclocal.m4 with aclocal $want_aclocal_version_clean"
|
|
||||||
cwd=`pwd`
|
|
||||||
aclocal --force -I $cwd/m4 || die "aclocal failed"
|
|
||||||
echo "Regenerating configure with autoconf $want_autoconf_version_clean"
|
|
||||||
autoconf --force --warnings=all -o ../$outfile $configfile || die "autoconf failed"
|
|
||||||
cd ..
|
|
||||||
echo "Regenerating config.h.in with autoheader $want_autoheader_version_clean"
|
|
||||||
autoheader --warnings=all -I autoconf -I autoconf/m4 autoconf/$configfile || die "autoheader failed"
|
|
||||||
exit 0
|
|
@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
global: main;
|
|
||||||
__progname;
|
|
||||||
environ;
|
|
||||||
|
|
||||||
local: *;
|
|
||||||
};
|
|
@ -1,24 +0,0 @@
|
|||||||
------------------------------------------------------------------------------
|
|
||||||
Autoconf Files
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
All autoconf files are licensed under the LLVM license with the following
|
|
||||||
additions:
|
|
||||||
|
|
||||||
llvm/autoconf/install-sh:
|
|
||||||
This script is licensed under the LLVM license, with the following
|
|
||||||
additional copyrights and restrictions:
|
|
||||||
|
|
||||||
Copyright 1991 by the Massachusetts Institute of Technology
|
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this software and its
|
|
||||||
documentation for any purpose is hereby granted without fee, provided that
|
|
||||||
the above copyright notice appear in all copies and that both that
|
|
||||||
copyright notice and this permission notice appear in supporting
|
|
||||||
documentation, and that the name of M.I.T. not be used in advertising or
|
|
||||||
publicity pertaining to distribution of the software without specific,
|
|
||||||
written prior permission. M.I.T. makes no representations about the
|
|
||||||
suitability of this software for any purpose. It is provided "as is"
|
|
||||||
without express or implied warranty.
|
|
||||||
|
|
||||||
Please see the source files for additional copyrights.
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
|||||||
Upgrading Libtool
|
|
||||||
===============================================================================
|
|
||||||
|
|
||||||
If you are in the mood to upgrade libtool, you must do the following:
|
|
||||||
|
|
||||||
1. Get the new version of libtool and put it in <SRC>
|
|
||||||
2. configure/build/install libtool with --prefix=<PFX>
|
|
||||||
3. Copy <SRC>/ltdl.m4 to llvm/autoconf/m4
|
|
||||||
4. Copy <PFX>/share/aclocal/libtool.m4 to llvm/autoconf/m4/libtool.m4
|
|
||||||
5. Copy <PFX>/share/libtool/ltmain.sh to llvm/autoconf/ltmain.sh
|
|
||||||
6. Copy <PFX>/share/libtool/libltdl/ltdl.c to llvm/lib/System
|
|
||||||
7. Copy <PFX>/share/libtool/libltdl/ltdl.h to llvm/lib/System
|
|
||||||
8. Edit the ltdl.h file to #include "llvm/Config/config.h" at the very top. You
|
|
||||||
might also need to resolve some compiler warnings (typically about
|
|
||||||
comparison of signed vs. unsigned values). But, you won't find out about
|
|
||||||
those until you build LLVM (step 13).
|
|
||||||
9. Edit the llvm/autoconf/m4/libtool.m4 file so that:
|
|
||||||
a) in AC_PROB_LIBTOOL macro, the value of LIBTOOL is set to
|
|
||||||
$(top_builddir)/mklib, not $(top_builddir)/libtool
|
|
||||||
b) in AC_LIBTOOL_SETUP macro, the variable default_ofile is set to
|
|
||||||
"mklib" instead of "libtool"
|
|
||||||
c) s/AC_ENABLE_SHARED_DEFAULT/enable_shared_default/g
|
|
||||||
d) s/AC_ENABLE_STATIC_DEFAULT/enable_static_default/g
|
|
||||||
e) s/AC_ENABLE_FAST_INSTALL_DEFAULT/enable_fast_install_default/g
|
|
||||||
10. Run "autoupdate libtool.m4 ltdl.m4" in the llvm/autoconf/m4 directory.
|
|
||||||
This should correctly update the macro definitions in the libtool m4
|
|
||||||
files to match the version of autoconf that LLVM uses. This converts
|
|
||||||
AC_HELP_STRING to AS_HELP_STRING and AC_TRY_LINK to AC_LINK_IFELSE, amongst
|
|
||||||
other things. You may need to manually adjust the files.
|
|
||||||
11. Run AutoRegen.sh to get the new macros into configure script
|
|
||||||
12. If there are any warnings from AutoRegen.sh, go to step 9.
|
|
||||||
13. Rebuild LLVM, making sure it reconfigures
|
|
||||||
14. Test the JIT which uses libltdl
|
|
||||||
15. If it all works, only THEN commit the changes.
|
|
||||||
|
|
||||||
Upgrading autoconf
|
|
||||||
===============================================================================
|
|
||||||
|
|
||||||
If you are in the mood to upgrade autoconf, you should:
|
|
||||||
|
|
||||||
1. Consider not upgrading.
|
|
||||||
2. No really, this is a hassle, you don't want to do it.
|
|
||||||
3. Get the new version of autoconf and put it in <SRC>
|
|
||||||
4. configure/build/install autoconf with --prefix=<PFX>
|
|
||||||
5. Run autoupdate on all the m4 macros in llvm/autoconf/m4
|
|
||||||
6. Run autoupdate on llvm/autoconf/configure.ac
|
|
||||||
7. Regenerate configure script with AutoRegen.sh
|
|
||||||
8. If there are any warnings from AutoRegen.sh, fix them and go to step 7.
|
|
||||||
9. Test, test, test.
|
|
1516
cpp/llvm/autoconf/config.guess
vendored
1516
cpp/llvm/autoconf/config.guess
vendored
File diff suppressed because it is too large
Load Diff
1766
cpp/llvm/autoconf/config.sub
vendored
1766
cpp/llvm/autoconf/config.sub
vendored
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,522 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# depcomp - compile a program generating dependencies as side-effects
|
|
||||||
|
|
||||||
scriptversion=2004-05-31.23
|
|
||||||
|
|
||||||
# Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
# 02111-1307, USA.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
'')
|
|
||||||
echo "$0: No command. Try \`$0 --help' for more information." 1>&2
|
|
||||||
exit 1;
|
|
||||||
;;
|
|
||||||
-h | --h*)
|
|
||||||
cat <<\EOF
|
|
||||||
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
|
||||||
|
|
||||||
Run PROGRAMS ARGS to compile a file, generating dependencies
|
|
||||||
as side-effects.
|
|
||||||
|
|
||||||
Environment variables:
|
|
||||||
depmode Dependency tracking mode.
|
|
||||||
source Source file read by `PROGRAMS ARGS'.
|
|
||||||
object Object file output by `PROGRAMS ARGS'.
|
|
||||||
DEPDIR directory where to store dependencies.
|
|
||||||
depfile Dependency file to output.
|
|
||||||
tmpdepfile Temporary file to use when outputing dependencies.
|
|
||||||
libtool Whether libtool is used (yes/no).
|
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>.
|
|
||||||
EOF
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
-v | --v*)
|
|
||||||
echo "depcomp $scriptversion"
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
|
||||||
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
|
||||||
depfile=${depfile-`echo "$object" |
|
|
||||||
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
|
||||||
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
|
||||||
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
|
|
||||||
# Some modes work just like other modes, but use different flags. We
|
|
||||||
# parameterize here, but still list the modes in the big case below,
|
|
||||||
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
|
||||||
# here, because this file can only contain one case statement.
|
|
||||||
if test "$depmode" = hp; then
|
|
||||||
# HP compiler uses -M and no extra arg.
|
|
||||||
gccflag=-M
|
|
||||||
depmode=gcc
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$depmode" = dashXmstdout; then
|
|
||||||
# This is just like dashmstdout with a different argument.
|
|
||||||
dashmflag=-xM
|
|
||||||
depmode=dashmstdout
|
|
||||||
fi
|
|
||||||
|
|
||||||
case "$depmode" in
|
|
||||||
gcc3)
|
|
||||||
## gcc 3 implements dependency tracking that does exactly what
|
|
||||||
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
|
||||||
## it if -MD -MP comes after the -MF stuff. Hmm.
|
|
||||||
"$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
mv "$tmpdepfile" "$depfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
gcc)
|
|
||||||
## There are various ways to get dependency output from gcc. Here's
|
|
||||||
## why we pick this rather obscure method:
|
|
||||||
## - Don't want to use -MD because we'd like the dependencies to end
|
|
||||||
## up in a subdir. Having to rename by hand is ugly.
|
|
||||||
## (We might end up doing this anyway to support other compilers.)
|
|
||||||
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
|
||||||
## -MM, not -M (despite what the docs say).
|
|
||||||
## - Using -M directly means running the compiler twice (even worse
|
|
||||||
## than renaming).
|
|
||||||
if test -z "$gccflag"; then
|
|
||||||
gccflag=-MD,
|
|
||||||
fi
|
|
||||||
"$@" -Wp,"$gccflag$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
|
|
||||||
## The second -e expression handles DOS-style file names with drive letters.
|
|
||||||
sed -e 's/^[^:]*: / /' \
|
|
||||||
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
|
||||||
## This next piece of magic avoids the `deleted header file' problem.
|
|
||||||
## The problem is that when a header file which appears in a .P file
|
|
||||||
## is deleted, the dependency causes make to die (because there is
|
|
||||||
## typically no way to rebuild the header). We avoid this by adding
|
|
||||||
## dummy dependencies for each header file. Too bad gcc doesn't do
|
|
||||||
## this for us directly.
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" |
|
|
||||||
## Some versions of gcc put a space before the `:'. On the theory
|
|
||||||
## that the space means something, we add a space to the output as
|
|
||||||
## well.
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
hp)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
sgi)
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
|
||||||
else
|
|
||||||
"$@" -MDupdate "$tmpdepfile"
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
|
|
||||||
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
|
|
||||||
# Clip off the initial element (the dependent). Don't try to be
|
|
||||||
# clever and replace this with sed code, as IRIX sed won't handle
|
|
||||||
# lines with more than a fixed number of characters (4096 in
|
|
||||||
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
|
||||||
# the IRIX cc adds comments like `#:fec' to the end of the
|
|
||||||
# dependency line.
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
|
|
||||||
tr '
|
|
||||||
' ' ' >> $depfile
|
|
||||||
echo >> $depfile
|
|
||||||
|
|
||||||
# The second pass generates a dummy entry for each header file.
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
|
||||||
>> $depfile
|
|
||||||
else
|
|
||||||
# The sourcefile does not contain any dependencies, so just
|
|
||||||
# store a dummy comment line, to avoid errors with the Makefile
|
|
||||||
# "include basename.Plo" scheme.
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
aix)
|
|
||||||
# The C for AIX Compiler uses -M and outputs the dependencies
|
|
||||||
# in a .u file. In older versions, this file always lives in the
|
|
||||||
# current directory. Also, the AIX compiler puts `$object:' at the
|
|
||||||
# start of each line; $object doesn't have directory information.
|
|
||||||
# Version 6 uses the directory in both cases.
|
|
||||||
stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
|
|
||||||
tmpdepfile="$stripped.u"
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
"$@" -Wc,-M
|
|
||||||
else
|
|
||||||
"$@" -M
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
|
|
||||||
if test -f "$tmpdepfile"; then :
|
|
||||||
else
|
|
||||||
stripped=`echo "$stripped" | sed 's,^.*/,,'`
|
|
||||||
tmpdepfile="$stripped.u"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
outname="$stripped.o"
|
|
||||||
# Each line is of the form `foo.o: dependent.h'.
|
|
||||||
# Do two passes, one to just change these to
|
|
||||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
|
||||||
sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
|
|
||||||
sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
|
|
||||||
else
|
|
||||||
# The sourcefile does not contain any dependencies, so just
|
|
||||||
# store a dummy comment line, to avoid errors with the Makefile
|
|
||||||
# "include basename.Plo" scheme.
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
icc)
|
|
||||||
# Intel's C compiler understands `-MD -MF file'. However on
|
|
||||||
# icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
|
|
||||||
# ICC 7.0 will fill foo.d with something like
|
|
||||||
# foo.o: sub/foo.c
|
|
||||||
# foo.o: sub/foo.h
|
|
||||||
# which is wrong. We want:
|
|
||||||
# sub/foo.o: sub/foo.c
|
|
||||||
# sub/foo.o: sub/foo.h
|
|
||||||
# sub/foo.c:
|
|
||||||
# sub/foo.h:
|
|
||||||
# ICC 7.1 will output
|
|
||||||
# foo.o: sub/foo.c sub/foo.h
|
|
||||||
# and will wrap long lines using \ :
|
|
||||||
# foo.o: sub/foo.c ... \
|
|
||||||
# sub/foo.h ... \
|
|
||||||
# ...
|
|
||||||
|
|
||||||
"$@" -MD -MF "$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
# Each line is of the form `foo.o: dependent.h',
|
|
||||||
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
|
|
||||||
# Do two passes, one to just change these to
|
|
||||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
|
||||||
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
|
||||||
# Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
# correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
|
|
||||||
sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
tru64)
|
|
||||||
# The Tru64 compiler uses -MD to generate dependencies as a side
|
|
||||||
# effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
|
|
||||||
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
|
||||||
# dependencies in `foo.d' instead, so we check for that too.
|
|
||||||
# Subdirectories are respected.
|
|
||||||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
|
||||||
test "x$dir" = "x$object" && dir=
|
|
||||||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
|
||||||
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
# Dependencies are output in .lo.d with libtool 1.4.
|
|
||||||
# With libtool 1.5 they are output both in $dir.libs/$base.o.d
|
|
||||||
# and in $dir.libs/$base.o.d and $dir$base.o.d. We process the
|
|
||||||
# latter, because the former will be cleaned when $dir.libs is
|
|
||||||
# erased.
|
|
||||||
tmpdepfile1="$dir.libs/$base.lo.d"
|
|
||||||
tmpdepfile2="$dir$base.o.d"
|
|
||||||
tmpdepfile3="$dir.libs/$base.d"
|
|
||||||
"$@" -Wc,-MD
|
|
||||||
else
|
|
||||||
tmpdepfile1="$dir$base.o.d"
|
|
||||||
tmpdepfile2="$dir$base.d"
|
|
||||||
tmpdepfile3="$dir$base.d"
|
|
||||||
"$@" -MD
|
|
||||||
fi
|
|
||||||
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -f "$tmpdepfile1"; then
|
|
||||||
tmpdepfile="$tmpdepfile1"
|
|
||||||
elif test -f "$tmpdepfile2"; then
|
|
||||||
tmpdepfile="$tmpdepfile2"
|
|
||||||
else
|
|
||||||
tmpdepfile="$tmpdepfile3"
|
|
||||||
fi
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
|
||||||
# That's a tab and a space in the [].
|
|
||||||
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
|
||||||
else
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
#nosideeffect)
|
|
||||||
# This comment above is used by automake to tell side-effect
|
|
||||||
# dependency tracking mechanisms from slower ones.
|
|
||||||
|
|
||||||
dashmstdout)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout, regardless of -o.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test $1 != '--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove `-o $object'.
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
test -z "$dashmflag" && dashmflag=-M
|
|
||||||
# Require at least two characters before searching for `:'
|
|
||||||
# in the target name. This is to cope with DOS-style filenames:
|
|
||||||
# a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
|
|
||||||
"$@" $dashmflag |
|
|
||||||
sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
cat < "$tmpdepfile" > "$depfile"
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" | \
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
dashXmstdout)
|
|
||||||
# This case only exists to satisfy depend.m4. It is never actually
|
|
||||||
# run, as this mode is specially recognized in the preamble.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
makedepend)
|
|
||||||
"$@" || exit $?
|
|
||||||
# Remove any Libtool call
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test $1 != '--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
# X makedepend
|
|
||||||
shift
|
|
||||||
cleared=no
|
|
||||||
for arg in "$@"; do
|
|
||||||
case $cleared in
|
|
||||||
no)
|
|
||||||
set ""; shift
|
|
||||||
cleared=yes ;;
|
|
||||||
esac
|
|
||||||
case "$arg" in
|
|
||||||
-D*|-I*)
|
|
||||||
set fnord "$@" "$arg"; shift ;;
|
|
||||||
# Strip any option that makedepend may not understand. Remove
|
|
||||||
# the object too, otherwise makedepend will parse it as a source file.
|
|
||||||
-*|$object)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"; shift ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
obj_suffix="`echo $object | sed 's/^.*\././'`"
|
|
||||||
touch "$tmpdepfile"
|
|
||||||
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
|
||||||
rm -f "$depfile"
|
|
||||||
cat < "$tmpdepfile" > "$depfile"
|
|
||||||
sed '1,2d' "$tmpdepfile" | tr ' ' '
|
|
||||||
' | \
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
|
||||||
;;
|
|
||||||
|
|
||||||
cpp)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test $1 != '--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove `-o $object'.
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
"$@" -E |
|
|
||||||
sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
|
|
||||||
sed '$ s: \\$::' > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
cat < "$tmpdepfile" >> "$depfile"
|
|
||||||
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvisualcpp)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout, regardless of -o,
|
|
||||||
# because we must use -o when running libtool.
|
|
||||||
"$@" || exit $?
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case "$arg" in
|
|
||||||
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
|
||||||
set fnord "$@"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
"$@" -E |
|
|
||||||
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
. "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
|
|
||||||
echo " " >> "$depfile"
|
|
||||||
. "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
none)
|
|
||||||
exec "$@"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "Unknown depmode $depmode" 1>&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: shell-script
|
|
||||||
# sh-indentation: 2
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-end: "$"
|
|
||||||
# End:
|
|
@ -1,322 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# install - install a program, script, or datafile
|
|
||||||
|
|
||||||
scriptversion=2004-09-10.20
|
|
||||||
|
|
||||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
|
||||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
|
||||||
# following copyright and license.
|
|
||||||
#
|
|
||||||
# Copyright (C) 1994 X Consortium
|
|
||||||
#
|
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
# of this software and associated documentation files (the "Software"), to
|
|
||||||
# deal in the Software without restriction, including without limitation the
|
|
||||||
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
# sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
# furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
# The above copyright notice and this permission notice shall be included in
|
|
||||||
# all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
|
||||||
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
#
|
|
||||||
# Except as contained in this notice, the name of the X Consortium shall not
|
|
||||||
# be used in advertising or otherwise to promote the sale, use or other deal-
|
|
||||||
# ings in this Software without prior written authorization from the X Consor-
|
|
||||||
# tium.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# FSF changes to this file are in the public domain.
|
|
||||||
#
|
|
||||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
|
||||||
# `make' implicit rules from creating a file called install from it
|
|
||||||
# when there is no Makefile.
|
|
||||||
#
|
|
||||||
# This script is compatible with the BSD install script, but was written
|
|
||||||
# from scratch. It can only install one file at a time, a restriction
|
|
||||||
# shared with many OS's install programs.
|
|
||||||
|
|
||||||
# set DOITPROG to echo to test this script
|
|
||||||
|
|
||||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
|
||||||
doit="${DOITPROG-}"
|
|
||||||
|
|
||||||
# put in absolute paths if you don't have them in your path; or use env. vars.
|
|
||||||
|
|
||||||
mvprog="${MVPROG-mv}"
|
|
||||||
cpprog="${CPPROG-cp}"
|
|
||||||
chmodprog="${CHMODPROG-chmod}"
|
|
||||||
chownprog="${CHOWNPROG-chown}"
|
|
||||||
chgrpprog="${CHGRPPROG-chgrp}"
|
|
||||||
stripprog="${STRIPPROG-strip}"
|
|
||||||
rmprog="${RMPROG-rm}"
|
|
||||||
mkdirprog="${MKDIRPROG-mkdir}"
|
|
||||||
|
|
||||||
chmodcmd="$chmodprog 0755"
|
|
||||||
chowncmd=
|
|
||||||
chgrpcmd=
|
|
||||||
stripcmd=
|
|
||||||
rmcmd="$rmprog -f"
|
|
||||||
mvcmd="$mvprog"
|
|
||||||
src=
|
|
||||||
dst=
|
|
||||||
dir_arg=
|
|
||||||
dstarg=
|
|
||||||
no_target_directory=
|
|
||||||
|
|
||||||
usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
|
||||||
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
|
||||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
|
||||||
or: $0 [OPTION]... -d DIRECTORIES...
|
|
||||||
|
|
||||||
In the 1st form, copy SRCFILE to DSTFILE.
|
|
||||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
|
||||||
In the 4th, create DIRECTORIES.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-c (ignored)
|
|
||||||
-d create directories instead of installing files.
|
|
||||||
-g GROUP $chgrpprog installed files to GROUP.
|
|
||||||
-m MODE $chmodprog installed files to MODE.
|
|
||||||
-o USER $chownprog installed files to USER.
|
|
||||||
-s $stripprog installed files.
|
|
||||||
-t DIRECTORY install into DIRECTORY.
|
|
||||||
-T report an error if DSTFILE is a directory.
|
|
||||||
--help display this help and exit.
|
|
||||||
--version display version info and exit.
|
|
||||||
|
|
||||||
Environment variables override the default commands:
|
|
||||||
CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
|
|
||||||
"
|
|
||||||
|
|
||||||
while test -n "$1"; do
|
|
||||||
case $1 in
|
|
||||||
-c) shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-d) dir_arg=true
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-g) chgrpcmd="$chgrpprog $2"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
--help) echo "$usage"; exit 0;;
|
|
||||||
|
|
||||||
-m) chmodcmd="$chmodprog $2"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-o) chowncmd="$chownprog $2"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-s) stripcmd=$stripprog
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-t) dstarg=$2
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-T) no_target_directory=true
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
--version) echo "$0 $scriptversion"; exit 0;;
|
|
||||||
|
|
||||||
*) # When -d is used, all remaining arguments are directories to create.
|
|
||||||
# When -t is used, the destination is already specified.
|
|
||||||
test -n "$dir_arg$dstarg" && break
|
|
||||||
# Otherwise, the last argument is the destination. Remove it from $@.
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$dstarg"; then
|
|
||||||
# $@ is not empty: it contains at least $arg.
|
|
||||||
set fnord "$@" "$dstarg"
|
|
||||||
shift # fnord
|
|
||||||
fi
|
|
||||||
shift # arg
|
|
||||||
dstarg=$arg
|
|
||||||
done
|
|
||||||
break;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -z "$1"; then
|
|
||||||
if test -z "$dir_arg"; then
|
|
||||||
echo "$0: no input file specified." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# It's OK to call `install-sh -d' without argument.
|
|
||||||
# This can happen when creating conditional directories.
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
for src
|
|
||||||
do
|
|
||||||
# Protect names starting with `-'.
|
|
||||||
case $src in
|
|
||||||
-*) src=./$src ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
dst=$src
|
|
||||||
src=
|
|
||||||
|
|
||||||
if test -d "$dst"; then
|
|
||||||
mkdircmd=:
|
|
||||||
chmodcmd=
|
|
||||||
else
|
|
||||||
mkdircmd=$mkdirprog
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
|
||||||
# might cause directories to be created, which would be especially bad
|
|
||||||
# if $src (and thus $dsttmp) contains '*'.
|
|
||||||
if test ! -f "$src" && test ! -d "$src"; then
|
|
||||||
echo "$0: $src does not exist." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$dstarg"; then
|
|
||||||
echo "$0: no destination specified." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
dst=$dstarg
|
|
||||||
# Protect names starting with `-'.
|
|
||||||
case $dst in
|
|
||||||
-*) dst=./$dst ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# If destination is a directory, append the input filename; won't work
|
|
||||||
# if double slashes aren't ignored.
|
|
||||||
if test -d "$dst"; then
|
|
||||||
if test -n "$no_target_directory"; then
|
|
||||||
echo "$0: $dstarg: Is a directory" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
dst=$dst/`basename "$src"`
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# This sed command emulates the dirname command.
|
|
||||||
dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
|
|
||||||
|
|
||||||
# Make sure that the destination directory exists.
|
|
||||||
|
|
||||||
# Skip lots of stat calls in the usual case.
|
|
||||||
if test ! -d "$dstdir"; then
|
|
||||||
defaultIFS='
|
|
||||||
'
|
|
||||||
IFS="${IFS-$defaultIFS}"
|
|
||||||
|
|
||||||
oIFS=$IFS
|
|
||||||
# Some sh's can't handle IFS=/ for some reason.
|
|
||||||
IFS='%'
|
|
||||||
set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
|
|
||||||
IFS=$oIFS
|
|
||||||
|
|
||||||
pathcomp=
|
|
||||||
|
|
||||||
while test $# -ne 0 ; do
|
|
||||||
pathcomp=$pathcomp$1
|
|
||||||
shift
|
|
||||||
if test ! -d "$pathcomp"; then
|
|
||||||
$mkdirprog "$pathcomp"
|
|
||||||
# mkdir can fail with a `File exist' error in case several
|
|
||||||
# install-sh are creating the directory concurrently. This
|
|
||||||
# is OK.
|
|
||||||
test -d "$pathcomp" || exit
|
|
||||||
fi
|
|
||||||
pathcomp=$pathcomp/
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
$doit $mkdircmd "$dst" \
|
|
||||||
&& { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
|
|
||||||
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
|
|
||||||
&& { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
|
|
||||||
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
|
|
||||||
|
|
||||||
else
|
|
||||||
dstfile=`basename "$dst"`
|
|
||||||
|
|
||||||
# Make a couple of temp file names in the proper directory.
|
|
||||||
dsttmp=$dstdir/_inst.$$_
|
|
||||||
rmtmp=$dstdir/_rm.$$_
|
|
||||||
|
|
||||||
# Trap to clean up those temp files at exit.
|
|
||||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
|
||||||
trap '(exit $?); exit' 1 2 13 15
|
|
||||||
|
|
||||||
# Copy the file name to the temp name.
|
|
||||||
$doit $cpprog "$src" "$dsttmp" &&
|
|
||||||
|
|
||||||
# and set any options; do chmod last to preserve setuid bits.
|
|
||||||
#
|
|
||||||
# If any of these fail, we abort the whole thing. If we want to
|
|
||||||
# ignore errors from any of these, just make sure not to ignore
|
|
||||||
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
|
||||||
#
|
|
||||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
|
|
||||||
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
|
|
||||||
&& { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
|
|
||||||
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
|
|
||||||
|
|
||||||
# Now rename the file to the real destination.
|
|
||||||
{ $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
|
|
||||||
|| {
|
|
||||||
# The rename failed, perhaps because mv can't rename something else
|
|
||||||
# to itself, or perhaps because mv is so ancient that it does not
|
|
||||||
# support -f.
|
|
||||||
|
|
||||||
# Now remove or move aside any old file at destination location.
|
|
||||||
# We try this two ways since rm can't unlink itself on some
|
|
||||||
# systems and the destination file might be busy for other
|
|
||||||
# reasons. In this case, the final cleanup might fail but the new
|
|
||||||
# file should still install successfully.
|
|
||||||
{
|
|
||||||
if test -f "$dstdir/$dstfile"; then
|
|
||||||
$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
|
|
||||||
|| $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
|
|
||||||
|| {
|
|
||||||
echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
|
|
||||||
(exit 1); exit
|
|
||||||
}
|
|
||||||
else
|
|
||||||
:
|
|
||||||
fi
|
|
||||||
} &&
|
|
||||||
|
|
||||||
# Now rename the file to the real destination.
|
|
||||||
$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fi || { (exit 1); exit; }
|
|
||||||
done
|
|
||||||
|
|
||||||
# The final little trick to "correctly" pass the exit status to the exit trap.
|
|
||||||
{
|
|
||||||
(exit 0); exit
|
|
||||||
}
|
|
||||||
|
|
||||||
# Local variables:
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-end: "$"
|
|
||||||
# End:
|
|
File diff suppressed because it is too large
Load Diff
@ -1,42 +0,0 @@
|
|||||||
# Check for the extension used for executables on build platform.
|
|
||||||
# This is necessary for cross-compiling where the build platform
|
|
||||||
# may differ from the host platform.
|
|
||||||
AC_DEFUN([AC_BUILD_EXEEXT],
|
|
||||||
[
|
|
||||||
AC_MSG_CHECKING([for executable suffix on build platform])
|
|
||||||
AC_CACHE_VAL(ac_cv_build_exeext,
|
|
||||||
[if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
|
|
||||||
ac_cv_build_exeext=.exe
|
|
||||||
else
|
|
||||||
ac_build_prefix=${build_alias}-
|
|
||||||
|
|
||||||
AC_CHECK_PROG(BUILD_CC, ${ac_build_prefix}gcc, ${ac_build_prefix}gcc)
|
|
||||||
if test -z "$BUILD_CC"; then
|
|
||||||
AC_CHECK_PROG(BUILD_CC, gcc, gcc)
|
|
||||||
if test -z "$BUILD_CC"; then
|
|
||||||
AC_CHECK_PROG(BUILD_CC, cc, cc, , , /usr/ucb/cc)
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
test -z "$BUILD_CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
|
|
||||||
ac_build_link='${BUILD_CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&AS_MESSAGE_LOG_FD'
|
|
||||||
rm -f conftest*
|
|
||||||
echo 'int main () { return 0; }' > conftest.$ac_ext
|
|
||||||
ac_cv_build_exeext=
|
|
||||||
if AC_TRY_EVAL(ac_build_link); then
|
|
||||||
for file in conftest.*; do
|
|
||||||
case $file in
|
|
||||||
*.c | *.o | *.obj | *.dSYM) ;;
|
|
||||||
*) ac_cv_build_exeext=`echo $file | sed -e s/conftest//` ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
else
|
|
||||||
AC_MSG_ERROR([installation or configuration problem: compiler cannot create executables.])
|
|
||||||
fi
|
|
||||||
rm -f conftest*
|
|
||||||
test x"${ac_cv_build_exeext}" = x && ac_cv_build_exeext=blank
|
|
||||||
fi])
|
|
||||||
BUILD_EXEEXT=""
|
|
||||||
test x"${ac_cv_build_exeext}" != xblank && BUILD_EXEEXT=${ac_cv_build_exeext}
|
|
||||||
AC_MSG_RESULT(${ac_cv_build_exeext})
|
|
||||||
ac_build_exeext=$BUILD_EXEEXT
|
|
||||||
AC_SUBST(BUILD_EXEEXT)])
|
|
@ -1,31 +0,0 @@
|
|||||||
#
|
|
||||||
# Determine if the printf() functions have the %a format character.
|
|
||||||
# This is modified from:
|
|
||||||
# http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_have_ext_slist.html
|
|
||||||
AC_DEFUN([AC_C_PRINTF_A],
|
|
||||||
[AC_CACHE_CHECK([if printf has the %a format character],[llvm_cv_c_printf_a],
|
|
||||||
[AC_LANG_PUSH([C])
|
|
||||||
AC_RUN_IFELSE([
|
|
||||||
AC_LANG_PROGRAM([[
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
]],[[
|
|
||||||
volatile double A, B;
|
|
||||||
char Buffer[100];
|
|
||||||
A = 1;
|
|
||||||
A /= 10.0;
|
|
||||||
sprintf(Buffer, "%a", A);
|
|
||||||
B = atof(Buffer);
|
|
||||||
if (A != B)
|
|
||||||
return (1);
|
|
||||||
if (A != 0x1.999999999999ap-4)
|
|
||||||
return (1);
|
|
||||||
return (0);]])],
|
|
||||||
llvm_cv_c_printf_a=yes,
|
|
||||||
llvmac_cv_c_printf_a=no,
|
|
||||||
llvmac_cv_c_printf_a=no)
|
|
||||||
AC_LANG_POP([C])])
|
|
||||||
if test "$llvm_cv_c_printf_a" = "yes"; then
|
|
||||||
AC_DEFINE([HAVE_PRINTF_A],[1],[Define to have the %a format string])
|
|
||||||
fi
|
|
||||||
])
|
|
@ -1,26 +0,0 @@
|
|||||||
#
|
|
||||||
# Check for GNU Make. This is originally from
|
|
||||||
# http://www.gnu.org/software/ac-archive/htmldoc/check_gnu_make.html
|
|
||||||
#
|
|
||||||
AC_DEFUN([AC_CHECK_GNU_MAKE],
|
|
||||||
[AC_CACHE_CHECK([for GNU make],[llvm_cv_gnu_make_command],
|
|
||||||
dnl Search all the common names for GNU make
|
|
||||||
[llvm_cv_gnu_make_command=''
|
|
||||||
for a in "$MAKE" make gmake gnumake ; do
|
|
||||||
if test -z "$a" ; then continue ; fi ;
|
|
||||||
if ( sh -c "$a --version" 2> /dev/null | grep GNU 2>&1 > /dev/null )
|
|
||||||
then
|
|
||||||
llvm_cv_gnu_make_command=$a ;
|
|
||||||
break;
|
|
||||||
fi
|
|
||||||
done])
|
|
||||||
dnl If there was a GNU version, then set @ifGNUmake@ to the empty string,
|
|
||||||
dnl '#' otherwise
|
|
||||||
if test "x$llvm_cv_gnu_make_command" != "x" ; then
|
|
||||||
ifGNUmake='' ;
|
|
||||||
else
|
|
||||||
ifGNUmake='#' ;
|
|
||||||
AC_MSG_RESULT("Not found");
|
|
||||||
fi
|
|
||||||
AC_SUBST(ifGNUmake)
|
|
||||||
])
|
|
@ -1,9 +0,0 @@
|
|||||||
#
|
|
||||||
# Configure a Makefile without clobbering it if it exists and is not out of
|
|
||||||
# date. This macro is unique to LLVM.
|
|
||||||
#
|
|
||||||
AC_DEFUN([AC_CONFIG_MAKEFILE],
|
|
||||||
[AC_CONFIG_COMMANDS($1,
|
|
||||||
[${llvm_src}/autoconf/mkinstalldirs `dirname $1`
|
|
||||||
${SHELL} ${llvm_src}/autoconf/install-sh -m 0644 -c ${srcdir}/$1 $1])
|
|
||||||
])
|
|
@ -1,14 +0,0 @@
|
|||||||
#
|
|
||||||
# Provide the arguments and other processing needed for an LLVM project
|
|
||||||
#
|
|
||||||
AC_DEFUN([LLVM_CONFIG_PROJECT],
|
|
||||||
[AC_ARG_WITH([llvmsrc],
|
|
||||||
AS_HELP_STRING([--with-llvmsrc],[Location of LLVM Source Code]),
|
|
||||||
[llvm_src="$withval"],[llvm_src="]$1["])
|
|
||||||
AC_SUBST(LLVM_SRC,$llvm_src)
|
|
||||||
AC_ARG_WITH([llvmobj],
|
|
||||||
AS_HELP_STRING([--with-llvmobj],[Location of LLVM Object Code]),
|
|
||||||
[llvm_obj="$withval"],[llvm_obj="]$2["])
|
|
||||||
AC_SUBST(LLVM_OBJ,$llvm_obj)
|
|
||||||
AC_CONFIG_COMMANDS([setup],,[llvm_src="${LLVM_SRC}"])
|
|
||||||
])
|
|
@ -1,2 +0,0 @@
|
|||||||
AC_DEFUN([CXX_FLAG_CHECK],
|
|
||||||
[AC_SUBST($1, `$CXX -Werror $2 -fsyntax-only -xc /dev/null 2>/dev/null && echo $2`)])
|
|
@ -1,118 +0,0 @@
|
|||||||
dnl Check for a standard program that has a bin, include and lib directory
|
|
||||||
dnl
|
|
||||||
dnl Parameters:
|
|
||||||
dnl $1 - prefix directory to check
|
|
||||||
dnl $2 - program name to check
|
|
||||||
dnl $3 - header file to check
|
|
||||||
dnl $4 - library file to check
|
|
||||||
AC_DEFUN([CHECK_STD_PROGRAM],
|
|
||||||
[m4_define([allcapsname],translit($2,a-z,A-Z))
|
|
||||||
if test -n "$1" -a -d "$1" -a -n "$2" -a -d "$1/bin" -a -x "$1/bin/$2" ; then
|
|
||||||
AC_SUBST([USE_]allcapsname(),["USE_]allcapsname()[ = 1"])
|
|
||||||
AC_SUBST(allcapsname(),[$1/bin/$2])
|
|
||||||
AC_SUBST(allcapsname()[_BIN],[$1/bin])
|
|
||||||
AC_SUBST(allcapsname()[_DIR],[$1])
|
|
||||||
if test -n "$3" -a -d "$1/include" -a -f "$1/include/$3" ; then
|
|
||||||
AC_SUBST(allcapsname()[_INC],[$1/include])
|
|
||||||
fi
|
|
||||||
if test -n "$4" -a -d "$1/lib" -a -f "$1/lib/$4" ; then
|
|
||||||
AC_SUBST(allcapsname()[_LIB],[$1/lib])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl Find a program via --with options, in the path, or well known places
|
|
||||||
dnl
|
|
||||||
dnl Parameters:
|
|
||||||
dnl $1 - program's executable name
|
|
||||||
dnl $2 - header file name to check (optional)
|
|
||||||
dnl $3 - library file name to check (optional)
|
|
||||||
dnl $4 - alternate (long) name for the program
|
|
||||||
AC_DEFUN([FIND_STD_PROGRAM],
|
|
||||||
[m4_define([allcapsname],translit($1,a-z,A-Z))
|
|
||||||
m4_define([stdprog_long_name],ifelse($4,,translit($1,[ !@#$%^&*()-+={}[]:;"',./?],[-]),translit($4,[ !@#$%^&*()-+={}[]:;"',./?],[-])))
|
|
||||||
AC_MSG_CHECKING([for ]stdprog_long_name()[ bin/lib/include locations])
|
|
||||||
AC_ARG_WITH($1,
|
|
||||||
AS_HELP_STRING([--with-]stdprog_long_name()[=DIR],
|
|
||||||
[Specify that the ]stdprog_long_name()[ install prefix is DIR]),
|
|
||||||
$1[pfxdir=$withval],$1[pfxdir=nada])
|
|
||||||
AC_ARG_WITH($1[-bin],
|
|
||||||
AS_HELP_STRING([--with-]stdprog_long_name()[-bin=DIR],
|
|
||||||
[Specify that the ]stdprog_long_name()[ binary is in DIR]),
|
|
||||||
$1[bindir=$withval],$1[bindir=nada])
|
|
||||||
AC_ARG_WITH($1[-lib],
|
|
||||||
AS_HELP_STRING([--with-]stdprog_long_name()[-lib=DIR],
|
|
||||||
[Specify that ]stdprog_long_name()[ libraries are in DIR]),
|
|
||||||
$1[libdir=$withval],$1[libdir=nada])
|
|
||||||
AC_ARG_WITH($1[-inc],
|
|
||||||
AS_HELP_STRING([--with-]stdprog_long_name()[-inc=DIR],
|
|
||||||
[Specify that the ]stdprog_long_name()[ includes are in DIR]),
|
|
||||||
$1[incdir=$withval],$1[incdir=nada])
|
|
||||||
eval pfxval=\$\{$1pfxdir\}
|
|
||||||
eval binval=\$\{$1bindir\}
|
|
||||||
eval incval=\$\{$1incdir\}
|
|
||||||
eval libval=\$\{$1libdir\}
|
|
||||||
if test "${pfxval}" != "nada" ; then
|
|
||||||
CHECK_STD_PROGRAM(${pfxval},$1,$2,$3)
|
|
||||||
elif test "${binval}" != "nada" ; then
|
|
||||||
if test "${libval}" != "nada" ; then
|
|
||||||
if test "${incval}" != "nada" ; then
|
|
||||||
if test -d "${binval}" ; then
|
|
||||||
if test -d "${incval}" ; then
|
|
||||||
if test -d "${libval}" ; then
|
|
||||||
AC_SUBST(allcapsname(),${binval}/$1)
|
|
||||||
AC_SUBST(allcapsname()[_BIN],${binval})
|
|
||||||
AC_SUBST(allcapsname()[_INC],${incval})
|
|
||||||
AC_SUBST(allcapsname()[_LIB],${libval})
|
|
||||||
AC_SUBST([USE_]allcapsname(),["USE_]allcapsname()[ = 1"])
|
|
||||||
AC_MSG_RESULT([found via --with options])
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([failed])
|
|
||||||
AC_MSG_ERROR([The --with-]$1[-libdir value must be a directory])
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([failed])
|
|
||||||
AC_MSG_ERROR([The --with-]$1[-incdir value must be a directory])
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([failed])
|
|
||||||
AC_MSG_ERROR([The --with-]$1[-bindir value must be a directory])
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([failed])
|
|
||||||
AC_MSG_ERROR([The --with-]$1[-incdir option must be specified])
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([failed])
|
|
||||||
AC_MSG_ERROR([The --with-]$1[-libdir option must be specified])
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
tmppfxdir=`which $1 2>&1`
|
|
||||||
if test -n "$tmppfxdir" -a -d "${tmppfxdir%*$1}" -a \
|
|
||||||
-d "${tmppfxdir%*$1}/.." ; then
|
|
||||||
tmppfxdir=`cd "${tmppfxdir%*$1}/.." ; pwd`
|
|
||||||
CHECK_STD_PROGRAM($tmppfxdir,$1,$2,$3)
|
|
||||||
AC_MSG_RESULT([found in PATH at ]$tmppfxdir)
|
|
||||||
else
|
|
||||||
checkresult="yes"
|
|
||||||
eval checkval=\$\{"USE_"allcapsname()\}
|
|
||||||
CHECK_STD_PROGRAM([/usr],$1,$2,$3)
|
|
||||||
if test -z "${checkval}" ; then
|
|
||||||
CHECK_STD_PROGRAM([/usr/local],$1,$2,$3)
|
|
||||||
if test -z "${checkval}" ; then
|
|
||||||
CHECK_STD_PROGRAM([/sw],$1,$2,$3)
|
|
||||||
if test -z "${checkval}" ; then
|
|
||||||
CHECK_STD_PROGRAM([/opt],$1,$2,$3)
|
|
||||||
if test -z "${checkval}" ; then
|
|
||||||
CHECK_STD_PROGRAM([/],$1,$2,$3)
|
|
||||||
if test -z "${checkval}" ; then
|
|
||||||
checkresult="no"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT($checkresult)
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
])
|
|
@ -1,36 +0,0 @@
|
|||||||
#
|
|
||||||
# This function determins if the the isinf function isavailable on this
|
|
||||||
# platform.
|
|
||||||
#
|
|
||||||
AC_DEFUN([AC_FUNC_ISINF],[
|
|
||||||
AC_SINGLE_CXX_CHECK([ac_cv_func_isinf_in_math_h],
|
|
||||||
[isinf], [<math.h>],
|
|
||||||
[float f; isinf(f);])
|
|
||||||
if test "$ac_cv_func_isinf_in_math_h" = "yes" ; then
|
|
||||||
AC_DEFINE([HAVE_ISINF_IN_MATH_H],1,[Set to 1 if the isinf function is found in <math.h>])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SINGLE_CXX_CHECK([ac_cv_func_isinf_in_cmath],
|
|
||||||
[isinf], [<cmath>],
|
|
||||||
[float f; isinf(f);])
|
|
||||||
if test "$ac_cv_func_isinf_in_cmath" = "yes" ; then
|
|
||||||
AC_DEFINE([HAVE_ISINF_IN_CMATH],1,[Set to 1 if the isinf function is found in <cmath>])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SINGLE_CXX_CHECK([ac_cv_func_std_isinf_in_cmath],
|
|
||||||
[std::isinf], [<cmath>],
|
|
||||||
[float f; std::isinf(f);])
|
|
||||||
if test "$ac_cv_func_std_isinf_in_cmath" = "yes" ; then
|
|
||||||
AC_DEFINE([HAVE_STD_ISINF_IN_CMATH],1,[Set to 1 if the std::isinf function is found in <cmath>])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SINGLE_CXX_CHECK([ac_cv_func_finite_in_ieeefp_h],
|
|
||||||
[finite], [<ieeefp.h>],
|
|
||||||
[float f; finite(f);])
|
|
||||||
if test "$ac_cv_func_finite_in_ieeefp_h" = "yes" ; then
|
|
||||||
AC_DEFINE([HAVE_FINITE_IN_IEEEFP_H],1,[Set to 1 if the finite function is found in <ieeefp.h>])
|
|
||||||
fi
|
|
||||||
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
|||||||
#
|
|
||||||
# This function determines if the isnan function is available on this
|
|
||||||
# platform.
|
|
||||||
#
|
|
||||||
AC_DEFUN([AC_FUNC_ISNAN],[
|
|
||||||
AC_SINGLE_CXX_CHECK([ac_cv_func_isnan_in_math_h],
|
|
||||||
[isnan], [<math.h>],
|
|
||||||
[float f; isnan(f);])
|
|
||||||
|
|
||||||
if test "$ac_cv_func_isnan_in_math_h" = "yes" ; then
|
|
||||||
AC_DEFINE([HAVE_ISNAN_IN_MATH_H],1,[Set to 1 if the isnan function is found in <math.h>])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SINGLE_CXX_CHECK([ac_cv_func_isnan_in_cmath],
|
|
||||||
[isnan], [<cmath>],
|
|
||||||
[float f; isnan(f);])
|
|
||||||
if test "$ac_cv_func_isnan_in_cmath" = "yes" ; then
|
|
||||||
AC_DEFINE([HAVE_ISNAN_IN_CMATH],1,[Set to 1 if the isnan function is found in <cmath>])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SINGLE_CXX_CHECK([ac_cv_func_std_isnan_in_cmath],
|
|
||||||
[std::isnan], [<cmath>],
|
|
||||||
[float f; std::isnan(f);])
|
|
||||||
if test "$ac_cv_func_std_isnan_in_cmath" = "yes" ; then
|
|
||||||
AC_DEFINE([HAVE_STD_ISNAN_IN_CMATH],1,[Set to 1 if the std::isnan function is found in <cmath>])
|
|
||||||
fi
|
|
||||||
])
|
|
@ -1,26 +0,0 @@
|
|||||||
#
|
|
||||||
# Check for the ability to mmap a file.
|
|
||||||
#
|
|
||||||
AC_DEFUN([AC_FUNC_MMAP_FILE],
|
|
||||||
[AC_CACHE_CHECK(for mmap of files,
|
|
||||||
ac_cv_func_mmap_file,
|
|
||||||
[ AC_LANG_PUSH([C])
|
|
||||||
AC_RUN_IFELSE([
|
|
||||||
AC_LANG_PROGRAM([[
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
]],[[
|
|
||||||
int fd;
|
|
||||||
fd = creat ("foo",0777);
|
|
||||||
fd = (int) mmap (0, 1, PROT_READ, MAP_SHARED, fd, 0);
|
|
||||||
unlink ("foo");
|
|
||||||
return (fd != (int) MAP_FAILED);]])],
|
|
||||||
[ac_cv_func_mmap_file=yes],[ac_cv_func_mmap_file=no],[ac_cv_func_mmap_file=no])
|
|
||||||
AC_LANG_POP([C])
|
|
||||||
])
|
|
||||||
if test "$ac_cv_func_mmap_file" = yes; then
|
|
||||||
AC_DEFINE([HAVE_MMAP_FILE],[],[Define if mmap() can map files into memory])
|
|
||||||
AC_SUBST(MMAP_FILE,[yes])
|
|
||||||
fi
|
|
||||||
])
|
|
@ -1,21 +0,0 @@
|
|||||||
#
|
|
||||||
# Check for anonymous mmap macros. This is modified from
|
|
||||||
# http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_have_ext_slist.html
|
|
||||||
#
|
|
||||||
AC_DEFUN([AC_HEADER_MMAP_ANONYMOUS],
|
|
||||||
[AC_CACHE_CHECK(for MAP_ANONYMOUS vs. MAP_ANON,
|
|
||||||
ac_cv_header_mmap_anon,
|
|
||||||
[ AC_LANG_PUSH([C])
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
|
|
||||||
[[#include <sys/mman.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>]],
|
|
||||||
[[mmap (0, 1, PROT_READ, MAP_ANONYMOUS, -1, 0); return (0);]])],
|
|
||||||
ac_cv_header_mmap_anon=yes,
|
|
||||||
ac_cv_header_mmap_anon=no)
|
|
||||||
AC_LANG_POP([C])
|
|
||||||
])
|
|
||||||
if test "$ac_cv_header_mmap_anon" = yes; then
|
|
||||||
AC_DEFINE([HAVE_MMAP_ANONYMOUS],[1],[Define if mmap() uses MAP_ANONYMOUS to map anonymous pages, or undefine if it uses MAP_ANON])
|
|
||||||
fi
|
|
||||||
])
|
|
@ -1,20 +0,0 @@
|
|||||||
#
|
|
||||||
# This function determins if the the HUGE_VAL macro is compilable with the
|
|
||||||
# -pedantic switch or not. XCode < 2.4.1 doesn't get it right.
|
|
||||||
#
|
|
||||||
AC_DEFUN([AC_HUGE_VAL_CHECK],[
|
|
||||||
AC_CACHE_CHECK([for HUGE_VAL sanity], [ac_cv_huge_val_sanity],[
|
|
||||||
AC_LANG_PUSH([C++])
|
|
||||||
ac_save_CXXFLAGS=$CXXFLAGS
|
|
||||||
CXXFLAGS="$CXXFLAGS -pedantic"
|
|
||||||
AC_RUN_IFELSE(
|
|
||||||
AC_LANG_PROGRAM(
|
|
||||||
[#include <math.h>],
|
|
||||||
[double x = HUGE_VAL; return x != x; ]),
|
|
||||||
[ac_cv_huge_val_sanity=yes],[ac_cv_huge_val_sanity=no],
|
|
||||||
[ac_cv_huge_val_sanity=yes])
|
|
||||||
CXXFLAGS=$ac_save_CXXFLAGS
|
|
||||||
AC_LANG_POP([C++])
|
|
||||||
])
|
|
||||||
AC_SUBST(HUGE_VAL_SANITY,$ac_cv_huge_val_sanity)
|
|
||||||
])
|
|
6389
cpp/llvm/autoconf/m4/libtool.m4
vendored
6389
cpp/llvm/autoconf/m4/libtool.m4
vendored
File diff suppressed because it is too large
Load Diff
@ -1,108 +0,0 @@
|
|||||||
#
|
|
||||||
# Get the linker version string.
|
|
||||||
#
|
|
||||||
# This macro is specific to LLVM.
|
|
||||||
#
|
|
||||||
AC_DEFUN([AC_LINK_GET_VERSION],
|
|
||||||
[AC_CACHE_CHECK([for linker version],[llvm_cv_link_version],
|
|
||||||
[
|
|
||||||
version_string="$(ld -v 2>&1 | head -1)"
|
|
||||||
|
|
||||||
# Check for ld64.
|
|
||||||
if (echo "$version_string" | grep -q "ld64"); then
|
|
||||||
llvm_cv_link_version=$(echo "$version_string" | sed -e "s#.*ld64-\([^ ]*\)\( (.*)\)\{0,1\}#\1#")
|
|
||||||
else
|
|
||||||
llvm_cv_link_version=$(echo "$version_string" | sed -e "s#[^0-9]*\([0-9.]*\).*#\1#")
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
AC_DEFINE_UNQUOTED([HOST_LINK_VERSION],"$llvm_cv_link_version",
|
|
||||||
[Linker version detected at compile time.])
|
|
||||||
])
|
|
||||||
|
|
||||||
#
|
|
||||||
# Determine if the system can handle the -R option being passed to the linker.
|
|
||||||
#
|
|
||||||
# This macro is specific to LLVM.
|
|
||||||
#
|
|
||||||
AC_DEFUN([AC_LINK_USE_R],
|
|
||||||
[AC_CACHE_CHECK([for compiler -Wl,-R<path> option],[llvm_cv_link_use_r],
|
|
||||||
[ AC_LANG_PUSH([C])
|
|
||||||
oldcflags="$CFLAGS"
|
|
||||||
CFLAGS="$CFLAGS -Wl,-R."
|
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],
|
|
||||||
[llvm_cv_link_use_r=yes],[llvm_cv_link_use_r=no])
|
|
||||||
CFLAGS="$oldcflags"
|
|
||||||
AC_LANG_POP([C])
|
|
||||||
])
|
|
||||||
if test "$llvm_cv_link_use_r" = yes ; then
|
|
||||||
AC_DEFINE([HAVE_LINK_R],[1],[Define if you can use -Wl,-R. to pass -R. to the linker, in order to add the current directory to the dynamic linker search path.])
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
#
|
|
||||||
# Determine if the system can handle the -R option being passed to the linker.
|
|
||||||
#
|
|
||||||
# This macro is specific to LLVM.
|
|
||||||
#
|
|
||||||
AC_DEFUN([AC_LINK_EXPORT_DYNAMIC],
|
|
||||||
[AC_CACHE_CHECK([for compiler -Wl,-export-dynamic option],
|
|
||||||
[llvm_cv_link_use_export_dynamic],
|
|
||||||
[ AC_LANG_PUSH([C])
|
|
||||||
oldcflags="$CFLAGS"
|
|
||||||
CFLAGS="$CFLAGS -Wl,-export-dynamic"
|
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],
|
|
||||||
[llvm_cv_link_use_export_dynamic=yes],[llvm_cv_link_use_export_dynamic=no])
|
|
||||||
CFLAGS="$oldcflags"
|
|
||||||
AC_LANG_POP([C])
|
|
||||||
])
|
|
||||||
if test "$llvm_cv_link_use_export_dynamic" = yes ; then
|
|
||||||
AC_DEFINE([HAVE_LINK_EXPORT_DYNAMIC],[1],[Define if you can use -Wl,-export-dynamic.])
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
#
|
|
||||||
# Determine if the system can handle the --version-script option being
|
|
||||||
# passed to the linker.
|
|
||||||
#
|
|
||||||
# This macro is specific to LLVM.
|
|
||||||
#
|
|
||||||
AC_DEFUN([AC_LINK_VERSION_SCRIPT],
|
|
||||||
[AC_CACHE_CHECK([for compiler -Wl,--version-script option],
|
|
||||||
[llvm_cv_link_use_version_script],
|
|
||||||
[ AC_LANG_PUSH([C])
|
|
||||||
oldcflags="$CFLAGS"
|
|
||||||
|
|
||||||
# The following code is from the autoconf manual,
|
|
||||||
# "11.13: Limitations of Usual Tools".
|
|
||||||
# Create a temporary directory $tmp in $TMPDIR (default /tmp).
|
|
||||||
# Use mktemp if possible; otherwise fall back on mkdir,
|
|
||||||
# with $RANDOM to make collisions less likely.
|
|
||||||
: ${TMPDIR=/tmp}
|
|
||||||
{
|
|
||||||
tmp=`
|
|
||||||
(umask 077 && mktemp -d "$TMPDIR/fooXXXXXX") 2>/dev/null
|
|
||||||
` &&
|
|
||||||
test -n "$tmp" && test -d "$tmp"
|
|
||||||
} || {
|
|
||||||
tmp=$TMPDIR/foo$$-$RANDOM
|
|
||||||
(umask 077 && mkdir "$tmp")
|
|
||||||
} || exit $?
|
|
||||||
|
|
||||||
echo "{" > "$tmp/export.map"
|
|
||||||
echo " global: main;" >> "$tmp/export.map"
|
|
||||||
echo " local: *;" >> "$tmp/export.map"
|
|
||||||
echo "};" >> "$tmp/export.map"
|
|
||||||
|
|
||||||
CFLAGS="$CFLAGS -Wl,--version-script=$tmp/export.map"
|
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],
|
|
||||||
[llvm_cv_link_use_version_script=yes],[llvm_cv_link_use_version_script=no])
|
|
||||||
rm "$tmp/export.map"
|
|
||||||
rmdir "$tmp"
|
|
||||||
CFLAGS="$oldcflags"
|
|
||||||
AC_LANG_POP([C])
|
|
||||||
])
|
|
||||||
if test "$llvm_cv_link_use_version_script" = yes ; then
|
|
||||||
AC_SUBST(HAVE_LINK_VERSION_SCRIPT,1)
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
|||||||
#
|
|
||||||
# Some Linux machines run a 64-bit kernel with a 32-bit userspace. 'uname -m'
|
|
||||||
# shows these as x86_64. Ask the system 'gcc' what it thinks.
|
|
||||||
#
|
|
||||||
AC_DEFUN([AC_IS_LINUX_MIXED],
|
|
||||||
[AC_CACHE_CHECK(for 32-bit userspace on 64-bit system,llvm_cv_linux_mixed,
|
|
||||||
[ AC_LANG_PUSH([C])
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
|
|
||||||
[[#ifndef __x86_64__
|
|
||||||
error: Not x86-64 even if uname says so!
|
|
||||||
#endif
|
|
||||||
]])],
|
|
||||||
[llvm_cv_linux_mixed=no],
|
|
||||||
[llvm_cv_linux_mixed=yes])
|
|
||||||
AC_LANG_POP([C])
|
|
||||||
])
|
|
||||||
])
|
|
@ -1,418 +0,0 @@
|
|||||||
## ltdl.m4 - Configure ltdl for the target system. -*-Autoconf-*-
|
|
||||||
## Copyright (C) 1999-2000 Free Software Foundation, Inc.
|
|
||||||
##
|
|
||||||
## This file is free software; the Free Software Foundation gives
|
|
||||||
## unlimited permission to copy and/or distribute it, with or without
|
|
||||||
## modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# serial 7 AC_LIB_LTDL
|
|
||||||
|
|
||||||
# AC_WITH_LTDL
|
|
||||||
# ------------
|
|
||||||
# Clients of libltdl can use this macro to allow the installer to
|
|
||||||
# choose between a shipped copy of the ltdl sources or a preinstalled
|
|
||||||
# version of the library.
|
|
||||||
AC_DEFUN([AC_WITH_LTDL],
|
|
||||||
[AC_REQUIRE([AC_LIB_LTDL])
|
|
||||||
AC_SUBST([LIBLTDL])
|
|
||||||
AC_SUBST([INCLTDL])
|
|
||||||
|
|
||||||
# Unless the user asks us to check, assume no installed ltdl exists.
|
|
||||||
use_installed_libltdl=no
|
|
||||||
|
|
||||||
AC_ARG_WITH([included_ltdl],
|
|
||||||
[ --with-included-ltdl use the GNU ltdl sources included here])
|
|
||||||
|
|
||||||
if test "x$with_included_ltdl" != xyes; then
|
|
||||||
# We are not being forced to use the included libltdl sources, so
|
|
||||||
# decide whether there is a useful installed version we can use.
|
|
||||||
AC_CHECK_HEADER([ltdl.h],
|
|
||||||
[AC_CHECK_LIB([ltdl], [lt_dlcaller_register],
|
|
||||||
[with_included_ltdl=no],
|
|
||||||
[with_included_ltdl=yes])
|
|
||||||
])
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$enable_ltdl_install" != xyes; then
|
|
||||||
# If the user did not specify an installable libltdl, then default
|
|
||||||
# to a convenience lib.
|
|
||||||
AC_LIBLTDL_CONVENIENCE
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$with_included_ltdl" = xno; then
|
|
||||||
# If the included ltdl is not to be used. then Use the
|
|
||||||
# preinstalled libltdl we found.
|
|
||||||
AC_DEFINE([HAVE_LTDL], [1],
|
|
||||||
[Define this if a modern libltdl is already installed])
|
|
||||||
LIBLTDL=-lltdl
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Report our decision...
|
|
||||||
AC_MSG_CHECKING([whether to use included libltdl])
|
|
||||||
AC_MSG_RESULT([$with_included_ltdl])
|
|
||||||
|
|
||||||
AC_CONFIG_SUBDIRS([libltdl])
|
|
||||||
])# AC_WITH_LTDL
|
|
||||||
|
|
||||||
|
|
||||||
# AC_LIB_LTDL
|
|
||||||
# -----------
|
|
||||||
# Perform all the checks necessary for compilation of the ltdl objects
|
|
||||||
# -- including compiler checks and header checks.
|
|
||||||
AC_DEFUN([AC_LIB_LTDL],
|
|
||||||
[AC_PREREQ(2.60)
|
|
||||||
AC_REQUIRE([AC_PROG_CC])
|
|
||||||
AC_REQUIRE([AC_C_CONST])
|
|
||||||
AC_REQUIRE([AC_HEADER_STDC])
|
|
||||||
AC_REQUIRE([AC_HEADER_DIRENT])
|
|
||||||
AC_REQUIRE([_LT_AC_CHECK_DLFCN])
|
|
||||||
AC_REQUIRE([AC_LTDL_ENABLE_INSTALL])
|
|
||||||
AC_REQUIRE([AC_LTDL_SHLIBEXT])
|
|
||||||
AC_REQUIRE([AC_LTDL_SHLIBPATH])
|
|
||||||
AC_REQUIRE([AC_LTDL_SYSSEARCHPATH])
|
|
||||||
AC_REQUIRE([AC_LTDL_OBJDIR])
|
|
||||||
AC_REQUIRE([AC_LTDL_DLPREOPEN])
|
|
||||||
AC_REQUIRE([AC_LTDL_DLLIB])
|
|
||||||
AC_REQUIRE([AC_LTDL_SYMBOL_USCORE])
|
|
||||||
AC_REQUIRE([AC_LTDL_DLSYM_USCORE])
|
|
||||||
AC_REQUIRE([AC_LTDL_SYS_DLOPEN_DEPLIBS])
|
|
||||||
AC_REQUIRE([AC_LTDL_FUNC_ARGZ])
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS([assert.h ctype.h errno.h malloc.h memory.h stdlib.h \
|
|
||||||
stdio.h unistd.h])
|
|
||||||
AC_CHECK_HEADERS([dl.h sys/dl.h dld.h mach-o/dyld.h])
|
|
||||||
AC_CHECK_HEADERS([string.h strings.h], [break])
|
|
||||||
|
|
||||||
AC_CHECK_FUNCS([strchr index], [break])
|
|
||||||
AC_CHECK_FUNCS([strrchr rindex], [break])
|
|
||||||
AC_CHECK_FUNCS([memcpy bcopy], [break])
|
|
||||||
AC_CHECK_FUNCS([memmove strcmp])
|
|
||||||
AC_CHECK_FUNCS([closedir opendir readdir])
|
|
||||||
])# AC_LIB_LTDL
|
|
||||||
|
|
||||||
|
|
||||||
# AC_LTDL_ENABLE_INSTALL
|
|
||||||
# ----------------------
|
|
||||||
AC_DEFUN([AC_LTDL_ENABLE_INSTALL],
|
|
||||||
[AC_ARG_ENABLE([ltdl-install],
|
|
||||||
[AS_HELP_STRING([--enable-ltdl-install],[install libltdl])])
|
|
||||||
|
|
||||||
AM_CONDITIONAL(INSTALL_LTDL, test x"${enable_ltdl_install-no}" != xno)
|
|
||||||
AM_CONDITIONAL(CONVENIENCE_LTDL, test x"${enable_ltdl_convenience-no}" != xno)
|
|
||||||
])# AC_LTDL_ENABLE_INSTALL
|
|
||||||
|
|
||||||
|
|
||||||
# AC_LTDL_SYS_DLOPEN_DEPLIBS
|
|
||||||
# --------------------------
|
|
||||||
AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS],
|
|
||||||
[AC_REQUIRE([AC_CANONICAL_HOST])
|
|
||||||
AC_CACHE_CHECK([whether deplibs are loaded by dlopen],
|
|
||||||
[libltdl_cv_sys_dlopen_deplibs],
|
|
||||||
[# PORTME does your system automatically load deplibs for dlopen?
|
|
||||||
# or its logical equivalent (e.g. shl_load for HP-UX < 11)
|
|
||||||
# For now, we just catch OSes we know something about -- in the
|
|
||||||
# future, we'll try test this programmatically.
|
|
||||||
libltdl_cv_sys_dlopen_deplibs=unknown
|
|
||||||
case "$host_os" in
|
|
||||||
aix3*|aix4.1.*|aix4.2.*)
|
|
||||||
# Unknown whether this is true for these versions of AIX, but
|
|
||||||
# we want this `case' here to explicitly catch those versions.
|
|
||||||
libltdl_cv_sys_dlopen_deplibs=unknown
|
|
||||||
;;
|
|
||||||
aix[[45]]*)
|
|
||||||
libltdl_cv_sys_dlopen_deplibs=yes
|
|
||||||
;;
|
|
||||||
darwin*)
|
|
||||||
# Assuming the user has installed a libdl from somewhere, this is true
|
|
||||||
# If you are looking for one http://www.opendarwin.org/projects/dlcompat
|
|
||||||
libltdl_cv_sys_dlopen_deplibs=yes
|
|
||||||
;;
|
|
||||||
gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
|
|
||||||
# GNU and its variants, using gnu ld.so (Glibc)
|
|
||||||
libltdl_cv_sys_dlopen_deplibs=yes
|
|
||||||
;;
|
|
||||||
hpux10*|hpux11*)
|
|
||||||
libltdl_cv_sys_dlopen_deplibs=yes
|
|
||||||
;;
|
|
||||||
interix*)
|
|
||||||
libltdl_cv_sys_dlopen_deplibs=yes
|
|
||||||
;;
|
|
||||||
irix[[12345]]*|irix6.[[01]]*)
|
|
||||||
# Catch all versions of IRIX before 6.2, and indicate that we don't
|
|
||||||
# know how it worked for any of those versions.
|
|
||||||
libltdl_cv_sys_dlopen_deplibs=unknown
|
|
||||||
;;
|
|
||||||
irix*)
|
|
||||||
# The case above catches anything before 6.2, and it's known that
|
|
||||||
# at 6.2 and later dlopen does load deplibs.
|
|
||||||
libltdl_cv_sys_dlopen_deplibs=yes
|
|
||||||
;;
|
|
||||||
netbsd*)
|
|
||||||
libltdl_cv_sys_dlopen_deplibs=yes
|
|
||||||
;;
|
|
||||||
openbsd*)
|
|
||||||
libltdl_cv_sys_dlopen_deplibs=yes
|
|
||||||
;;
|
|
||||||
osf[[1234]]*)
|
|
||||||
# dlopen did load deplibs (at least at 4.x), but until the 5.x series,
|
|
||||||
# it did *not* use an RPATH in a shared library to find objects the
|
|
||||||
# library depends on, so we explicitly say `no'.
|
|
||||||
libltdl_cv_sys_dlopen_deplibs=no
|
|
||||||
;;
|
|
||||||
osf5.0|osf5.0a|osf5.1)
|
|
||||||
# dlopen *does* load deplibs and with the right loader patch applied
|
|
||||||
# it even uses RPATH in a shared library to search for shared objects
|
|
||||||
# that the library depends on, but there's no easy way to know if that
|
|
||||||
# patch is installed. Since this is the case, all we can really
|
|
||||||
# say is unknown -- it depends on the patch being installed. If
|
|
||||||
# it is, this changes to `yes'. Without it, it would be `no'.
|
|
||||||
libltdl_cv_sys_dlopen_deplibs=unknown
|
|
||||||
;;
|
|
||||||
osf*)
|
|
||||||
# the two cases above should catch all versions of osf <= 5.1. Read
|
|
||||||
# the comments above for what we know about them.
|
|
||||||
# At > 5.1, deplibs are loaded *and* any RPATH in a shared library
|
|
||||||
# is used to find them so we can finally say `yes'.
|
|
||||||
libltdl_cv_sys_dlopen_deplibs=yes
|
|
||||||
;;
|
|
||||||
solaris*)
|
|
||||||
libltdl_cv_sys_dlopen_deplibs=yes
|
|
||||||
;;
|
|
||||||
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
|
|
||||||
libltdl_cv_sys_dlopen_deplibs=yes
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
])
|
|
||||||
if test "$libltdl_cv_sys_dlopen_deplibs" != yes; then
|
|
||||||
AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1],
|
|
||||||
[Define if the OS needs help to load dependent libraries for dlopen().])
|
|
||||||
fi
|
|
||||||
])# AC_LTDL_SYS_DLOPEN_DEPLIBS
|
|
||||||
|
|
||||||
|
|
||||||
# AC_LTDL_SHLIBEXT
|
|
||||||
# ----------------
|
|
||||||
AC_DEFUN([AC_LTDL_SHLIBEXT],
|
|
||||||
[AC_REQUIRE([AC_LIBTOOL_SYS_DYNAMIC_LINKER])
|
|
||||||
AC_CACHE_CHECK([which extension is used for loadable modules],
|
|
||||||
[libltdl_cv_shlibext],
|
|
||||||
[
|
|
||||||
module=yes
|
|
||||||
eval libltdl_cv_shlibext=$shrext_cmds
|
|
||||||
])
|
|
||||||
if test -n "$libltdl_cv_shlibext"; then
|
|
||||||
AC_DEFINE_UNQUOTED([LTDL_SHLIB_EXT], ["$libltdl_cv_shlibext"],
|
|
||||||
[Define to the extension used for shared libraries, say, ".so".])
|
|
||||||
fi
|
|
||||||
])# AC_LTDL_SHLIBEXT
|
|
||||||
|
|
||||||
|
|
||||||
# AC_LTDL_SHLIBPATH
|
|
||||||
# -----------------
|
|
||||||
AC_DEFUN([AC_LTDL_SHLIBPATH],
|
|
||||||
[AC_REQUIRE([AC_LIBTOOL_SYS_DYNAMIC_LINKER])
|
|
||||||
AC_CACHE_CHECK([which variable specifies run-time library path],
|
|
||||||
[libltdl_cv_shlibpath_var], [libltdl_cv_shlibpath_var="$shlibpath_var"])
|
|
||||||
if test -n "$libltdl_cv_shlibpath_var"; then
|
|
||||||
AC_DEFINE_UNQUOTED([LTDL_SHLIBPATH_VAR], ["$libltdl_cv_shlibpath_var"],
|
|
||||||
[Define to the name of the environment variable that determines the dynamic library search path.])
|
|
||||||
fi
|
|
||||||
])# AC_LTDL_SHLIBPATH
|
|
||||||
|
|
||||||
|
|
||||||
# AC_LTDL_SYSSEARCHPATH
|
|
||||||
# ---------------------
|
|
||||||
AC_DEFUN([AC_LTDL_SYSSEARCHPATH],
|
|
||||||
[AC_REQUIRE([AC_LIBTOOL_SYS_DYNAMIC_LINKER])
|
|
||||||
AC_CACHE_CHECK([for the default library search path],
|
|
||||||
[libltdl_cv_sys_search_path],
|
|
||||||
[libltdl_cv_sys_search_path="$sys_lib_dlsearch_path_spec"])
|
|
||||||
if test -n "$libltdl_cv_sys_search_path"; then
|
|
||||||
sys_search_path=
|
|
||||||
for dir in $libltdl_cv_sys_search_path; do
|
|
||||||
if test -z "$sys_search_path"; then
|
|
||||||
sys_search_path="$dir"
|
|
||||||
else
|
|
||||||
sys_search_path="$sys_search_path$PATH_SEPARATOR$dir"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
AC_DEFINE_UNQUOTED([LTDL_SYSSEARCHPATH], ["$sys_search_path"],
|
|
||||||
[Define to the system default library search path.])
|
|
||||||
fi
|
|
||||||
])# AC_LTDL_SYSSEARCHPATH
|
|
||||||
|
|
||||||
|
|
||||||
# AC_LTDL_OBJDIR
|
|
||||||
# --------------
|
|
||||||
AC_DEFUN([AC_LTDL_OBJDIR],
|
|
||||||
[AC_CACHE_CHECK([for objdir],
|
|
||||||
[libltdl_cv_objdir],
|
|
||||||
[libltdl_cv_objdir="$objdir"
|
|
||||||
if test -n "$objdir"; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
rm -f .libs 2>/dev/null
|
|
||||||
mkdir .libs 2>/dev/null
|
|
||||||
if test -d .libs; then
|
|
||||||
libltdl_cv_objdir=.libs
|
|
||||||
else
|
|
||||||
# MS-DOS does not allow filenames that begin with a dot.
|
|
||||||
libltdl_cv_objdir=_libs
|
|
||||||
fi
|
|
||||||
rmdir .libs 2>/dev/null
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
AC_DEFINE_UNQUOTED([LTDL_OBJDIR], ["$libltdl_cv_objdir/"],
|
|
||||||
[Define to the sub-directory in which libtool stores uninstalled libraries.])
|
|
||||||
])# AC_LTDL_OBJDIR
|
|
||||||
|
|
||||||
|
|
||||||
# AC_LTDL_DLPREOPEN
|
|
||||||
# -----------------
|
|
||||||
AC_DEFUN([AC_LTDL_DLPREOPEN],
|
|
||||||
[AC_REQUIRE([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])
|
|
||||||
AC_CACHE_CHECK([whether libtool supports -dlopen/-dlpreopen],
|
|
||||||
[libltdl_cv_preloaded_symbols],
|
|
||||||
[if test -n "$lt_cv_sys_global_symbol_pipe"; then
|
|
||||||
libltdl_cv_preloaded_symbols=yes
|
|
||||||
else
|
|
||||||
libltdl_cv_preloaded_symbols=no
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
if test x"$libltdl_cv_preloaded_symbols" = xyes; then
|
|
||||||
AC_DEFINE([HAVE_PRELOADED_SYMBOLS], [1],
|
|
||||||
[Define if libtool can extract symbol lists from object files.])
|
|
||||||
fi
|
|
||||||
])# AC_LTDL_DLPREOPEN
|
|
||||||
|
|
||||||
|
|
||||||
# AC_LTDL_DLLIB
|
|
||||||
# -------------
|
|
||||||
AC_DEFUN([AC_LTDL_DLLIB],
|
|
||||||
[LIBADD_DL=
|
|
||||||
AC_SUBST(LIBADD_DL)
|
|
||||||
AC_LANG_PUSH([C])
|
|
||||||
|
|
||||||
AC_CHECK_FUNC([shl_load],
|
|
||||||
[AC_DEFINE([HAVE_SHL_LOAD], [1],
|
|
||||||
[Define if you have the shl_load function.])],
|
|
||||||
[AC_CHECK_LIB([dld], [shl_load],
|
|
||||||
[AC_DEFINE([HAVE_SHL_LOAD], [1],
|
|
||||||
[Define if you have the shl_load function.])
|
|
||||||
LIBADD_DL="$LIBADD_DL -ldld"],
|
|
||||||
[AC_CHECK_LIB([dl], [dlopen],
|
|
||||||
[AC_DEFINE([HAVE_LIBDL], [1],
|
|
||||||
[Define if you have the libdl library or equivalent.])
|
|
||||||
LIBADD_DL="-ldl" libltdl_cv_lib_dl_dlopen="yes"],
|
|
||||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H
|
|
||||||
# include <dlfcn.h>
|
|
||||||
#endif
|
|
||||||
]], [[dlopen(0, 0);]])],[AC_DEFINE([HAVE_LIBDL], [1],
|
|
||||||
[Define if you have the libdl library or equivalent.]) libltdl_cv_func_dlopen="yes"],[AC_CHECK_LIB([svld], [dlopen],
|
|
||||||
[AC_DEFINE([HAVE_LIBDL], [1],
|
|
||||||
[Define if you have the libdl library or equivalent.])
|
|
||||||
LIBADD_DL="-lsvld" libltdl_cv_func_dlopen="yes"],
|
|
||||||
[AC_CHECK_LIB([dld], [dld_link],
|
|
||||||
[AC_DEFINE([HAVE_DLD], [1],
|
|
||||||
[Define if you have the GNU dld library.])
|
|
||||||
LIBADD_DL="$LIBADD_DL -ldld"],
|
|
||||||
[AC_CHECK_FUNC([_dyld_func_lookup],
|
|
||||||
[AC_DEFINE([HAVE_DYLD], [1],
|
|
||||||
[Define if you have the _dyld_func_lookup function.])])
|
|
||||||
])
|
|
||||||
])
|
|
||||||
])
|
|
||||||
])
|
|
||||||
])
|
|
||||||
])
|
|
||||||
|
|
||||||
if test x"$libltdl_cv_func_dlopen" = xyes || test x"$libltdl_cv_lib_dl_dlopen" = xyes
|
|
||||||
then
|
|
||||||
lt_save_LIBS="$LIBS"
|
|
||||||
LIBS="$LIBS $LIBADD_DL"
|
|
||||||
AC_CHECK_FUNCS([dlerror])
|
|
||||||
LIBS="$lt_save_LIBS"
|
|
||||||
fi
|
|
||||||
AC_LANG_POP
|
|
||||||
])# AC_LTDL_DLLIB
|
|
||||||
|
|
||||||
|
|
||||||
# AC_LTDL_SYMBOL_USCORE
|
|
||||||
# ---------------------
|
|
||||||
# does the compiler prefix global symbols with an underscore?
|
|
||||||
AC_DEFUN([AC_LTDL_SYMBOL_USCORE],
|
|
||||||
[AC_REQUIRE([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])
|
|
||||||
AC_CACHE_CHECK([for _ prefix in compiled symbols],
|
|
||||||
[ac_cv_sys_symbol_underscore],
|
|
||||||
[ac_cv_sys_symbol_underscore=no
|
|
||||||
cat > conftest.$ac_ext <<EOF
|
|
||||||
void nm_test_func(){}
|
|
||||||
int main(){nm_test_func;return 0;}
|
|
||||||
EOF
|
|
||||||
if AC_TRY_EVAL(ac_compile); then
|
|
||||||
# Now try to grab the symbols.
|
|
||||||
ac_nlist=conftest.nm
|
|
||||||
if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
|
|
||||||
# See whether the symbols have a leading underscore.
|
|
||||||
if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then
|
|
||||||
ac_cv_sys_symbol_underscore=yes
|
|
||||||
else
|
|
||||||
if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
|
|
||||||
cat conftest.c >&AS_MESSAGE_LOG_FD
|
|
||||||
fi
|
|
||||||
rm -rf conftest*
|
|
||||||
])
|
|
||||||
])# AC_LTDL_SYMBOL_USCORE
|
|
||||||
|
|
||||||
|
|
||||||
# AC_LTDL_DLSYM_USCORE
|
|
||||||
# --------------------
|
|
||||||
AC_DEFUN([AC_LTDL_DLSYM_USCORE],
|
|
||||||
[AC_REQUIRE([AC_LTDL_SYMBOL_USCORE])
|
|
||||||
if test x"$ac_cv_sys_symbol_underscore" = xyes; then
|
|
||||||
if test x"$libltdl_cv_func_dlopen" = xyes ||
|
|
||||||
test x"$libltdl_cv_lib_dl_dlopen" = xyes ; then
|
|
||||||
AC_CACHE_CHECK([whether we have to add an underscore for dlsym],
|
|
||||||
[libltdl_cv_need_uscore],
|
|
||||||
[libltdl_cv_need_uscore=unknown
|
|
||||||
save_LIBS="$LIBS"
|
|
||||||
LIBS="$LIBS $LIBADD_DL"
|
|
||||||
_LT_AC_TRY_DLOPEN_SELF(
|
|
||||||
[libltdl_cv_need_uscore=no], [libltdl_cv_need_uscore=yes],
|
|
||||||
[], [libltdl_cv_need_uscore=cross])
|
|
||||||
LIBS="$save_LIBS"
|
|
||||||
])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test x"$libltdl_cv_need_uscore" = xyes; then
|
|
||||||
AC_DEFINE([NEED_USCORE], [1],
|
|
||||||
[Define if dlsym() requires a leading underscore in symbol names.])
|
|
||||||
fi
|
|
||||||
])# AC_LTDL_DLSYM_USCORE
|
|
||||||
|
|
||||||
# AC_LTDL_FUNC_ARGZ
|
|
||||||
# -----------------
|
|
||||||
AC_DEFUN([AC_LTDL_FUNC_ARGZ],
|
|
||||||
[AC_CHECK_HEADERS([argz.h])
|
|
||||||
|
|
||||||
AC_CHECK_TYPES([error_t],
|
|
||||||
[],
|
|
||||||
[AC_DEFINE([error_t], [int],
|
|
||||||
[Define to a type to use for `error_t' if it is not otherwise available.])],
|
|
||||||
[#if HAVE_ARGZ_H
|
|
||||||
# include <argz.h>
|
|
||||||
#endif])
|
|
||||||
|
|
||||||
AC_CHECK_FUNCS([argz_append argz_create_sep argz_insert argz_next argz_stringify])
|
|
||||||
])# AC_LTDL_FUNC_ARGZ
|
|
@ -1,17 +0,0 @@
|
|||||||
#
|
|
||||||
# When allocating RWX memory, check whether we need to use /dev/zero
|
|
||||||
# as the file descriptor or not.
|
|
||||||
#
|
|
||||||
AC_DEFUN([AC_NEED_DEV_ZERO_FOR_MMAP],
|
|
||||||
[AC_CACHE_CHECK([if /dev/zero is needed for mmap],
|
|
||||||
ac_cv_need_dev_zero_for_mmap,
|
|
||||||
[if test "$llvm_cv_os_type" = "Interix" ; then
|
|
||||||
ac_cv_need_dev_zero_for_mmap=yes
|
|
||||||
else
|
|
||||||
ac_cv_need_dev_zero_for_mmap=no
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
if test "$ac_cv_need_dev_zero_for_mmap" = yes; then
|
|
||||||
AC_DEFINE([NEED_DEV_ZERO_FOR_MMAP],[1],
|
|
||||||
[Define if /dev/zero should be used when mapping RWX memory, or undefine if its not necessary])
|
|
||||||
fi])
|
|
@ -1,39 +0,0 @@
|
|||||||
dnl This macro checks for tclsh which is required to run dejagnu. On some
|
|
||||||
dnl platforms (notably FreeBSD), tclsh is named tclshX.Y - this handles
|
|
||||||
dnl that for us so we can get the latest installed tclsh version.
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([DJ_AC_PATH_TCLSH], [
|
|
||||||
no_itcl=true
|
|
||||||
AC_MSG_CHECKING(for the tclsh program in tclinclude directory)
|
|
||||||
AC_ARG_WITH(tclinclude,
|
|
||||||
AS_HELP_STRING([--with-tclinclude],
|
|
||||||
[directory where tcl headers are]),
|
|
||||||
[with_tclinclude=${withval}],[with_tclinclude=''])
|
|
||||||
AC_CACHE_VAL(ac_cv_path_tclsh,[
|
|
||||||
dnl first check to see if --with-itclinclude was specified
|
|
||||||
if test x"${with_tclinclude}" != x ; then
|
|
||||||
if test -f ${with_tclinclude}/tclsh ; then
|
|
||||||
ac_cv_path_tclsh=`(cd ${with_tclinclude}; pwd)`
|
|
||||||
elif test -f ${with_tclinclude}/src/tclsh ; then
|
|
||||||
ac_cv_path_tclsh=`(cd ${with_tclinclude}/src; pwd)`
|
|
||||||
else
|
|
||||||
AC_MSG_ERROR([${with_tclinclude} directory doesn't contain tclsh])
|
|
||||||
fi
|
|
||||||
fi])
|
|
||||||
|
|
||||||
dnl see if one is installed
|
|
||||||
if test x"${ac_cv_path_tclsh}" = x ; then
|
|
||||||
AC_MSG_RESULT(none)
|
|
||||||
AC_PATH_PROGS([TCLSH],[tclsh8.4 tclsh8.4.8 tclsh8.4.7 tclsh8.4.6 tclsh8.4.5 tclsh8.4.4 tclsh8.4.3 tclsh8.4.2 tclsh8.4.1 tclsh8.4.0 tclsh8.3 tclsh8.3.5 tclsh8.3.4 tclsh8.3.3 tclsh8.3.2 tclsh8.3.1 tclsh8.3.0 tclsh])
|
|
||||||
if test x"${TCLSH}" = x ; then
|
|
||||||
ac_cv_path_tclsh='';
|
|
||||||
else
|
|
||||||
ac_cv_path_tclsh="${TCLSH}";
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT(${ac_cv_path_tclsh})
|
|
||||||
TCLSH="${ac_cv_path_tclsh}"
|
|
||||||
AC_SUBST(TCLSH)
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
|||||||
#
|
|
||||||
# This function determins if the the srand48,drand48,lrand48 functions are
|
|
||||||
# available on this platform.
|
|
||||||
#
|
|
||||||
AC_DEFUN([AC_FUNC_RAND48],[
|
|
||||||
AC_SINGLE_CXX_CHECK([ac_cv_func_rand48],
|
|
||||||
[srand48/lrand48/drand48], [<stdlib.h>],
|
|
||||||
[srand48(0);lrand48();drand48();])
|
|
||||||
if test "$ac_cv_func_rand48" = "yes" ; then
|
|
||||||
AC_DEFINE([HAVE_RAND48],1,[Define to 1 if srand48/lrand48/drand48 exist in <stdlib.h>])
|
|
||||||
fi
|
|
||||||
])
|
|
@ -1,31 +0,0 @@
|
|||||||
dnl Check a program for version sanity. The test runs a program, passes it an
|
|
||||||
dnl argument to make it print out some identification string, and filters that
|
|
||||||
dnl output with a regular expression. If the output is non-empty, the program
|
|
||||||
dnl passes the sanity check.
|
|
||||||
dnl $1 - Name or full path of the program to run
|
|
||||||
dnl $2 - Argument to pass to print out identification string
|
|
||||||
dnl $3 - grep RE to match identification string
|
|
||||||
dnl $4 - set to 1 to make errors only a warning
|
|
||||||
AC_DEFUN([CHECK_PROGRAM_SANITY],
|
|
||||||
[
|
|
||||||
AC_MSG_CHECKING([sanity for program ]$1)
|
|
||||||
sanity="0"
|
|
||||||
sanity_path=`which $1 2>/dev/null`
|
|
||||||
if test "$?" -eq 0 -a -x "$sanity_path" ; then
|
|
||||||
sanity=`$1 $2 2>&1 | grep "$3"`
|
|
||||||
if test -z "$sanity" ; then
|
|
||||||
AC_MSG_RESULT([no])
|
|
||||||
sanity="0"
|
|
||||||
if test "$4" -eq 1 ; then
|
|
||||||
AC_MSG_WARN([Program ]$1[ failed to pass sanity check.])
|
|
||||||
else
|
|
||||||
AC_MSG_ERROR([Program ]$1[ failed to pass sanity check.])
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
sanity="1"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([not found])
|
|
||||||
fi
|
|
||||||
])
|
|
@ -1,10 +0,0 @@
|
|||||||
dnl AC_SINGLE_CXX_CHECK(CACHEVAR, FUNCTION, HEADER, PROGRAM)
|
|
||||||
dnl $1, $2, $3, $4,
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([AC_SINGLE_CXX_CHECK],
|
|
||||||
[AC_CACHE_CHECK([for $2 in $3], [$1],
|
|
||||||
[AC_LANG_PUSH([C++])
|
|
||||||
AC_COMPILE_IFELSE(AC_LANG_PROGRAM([#include $3],[$4]),[$1=yes],[$1=no])
|
|
||||||
AC_LANG_POP([C++])])
|
|
||||||
])
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
|||||||
#
|
|
||||||
# Determine if the compiler accepts -fvisibility-inlines-hidden
|
|
||||||
#
|
|
||||||
# This macro is specific to LLVM.
|
|
||||||
#
|
|
||||||
AC_DEFUN([AC_CXX_USE_VISIBILITY_INLINES_HIDDEN],
|
|
||||||
[AC_CACHE_CHECK([for compiler -fvisibility-inlines-hidden option],
|
|
||||||
[llvm_cv_cxx_visibility_inlines_hidden],
|
|
||||||
[ AC_LANG_PUSH([C++])
|
|
||||||
oldcxxflags="$CXXFLAGS"
|
|
||||||
CXXFLAGS="$CXXFLAGS -O0 -fvisibility-inlines-hidden -Werror"
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
|
|
||||||
[template <typename T> struct X { void __attribute__((noinline)) f() {} };],
|
|
||||||
[X<int>().f();])],
|
|
||||||
[llvm_cv_cxx_visibility_inlines_hidden=yes],[llvm_cv_cxx_visibility_inlines_hidden=no])
|
|
||||||
CXXFLAGS="$oldcxxflags"
|
|
||||||
AC_LANG_POP([C++])
|
|
||||||
])
|
|
||||||
if test "$llvm_cv_cxx_visibility_inlines_hidden" = yes ; then
|
|
||||||
AC_SUBST([ENABLE_VISIBILITY_INLINES_HIDDEN],[1])
|
|
||||||
else
|
|
||||||
AC_SUBST([ENABLE_VISIBILITY_INLINES_HIDDEN],[0])
|
|
||||||
fi
|
|
||||||
])
|
|
@ -1,353 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# Common stub for a few missing GNU programs while installing.
|
|
||||||
|
|
||||||
scriptversion=2004-09-07.08
|
|
||||||
|
|
||||||
# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004
|
|
||||||
# Free Software Foundation, Inc.
|
|
||||||
# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
# 02111-1307, USA.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
if test $# -eq 0; then
|
|
||||||
echo 1>&2 "Try \`$0 --help' for more information"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
run=:
|
|
||||||
|
|
||||||
# In the cases where this matters, `missing' is being run in the
|
|
||||||
# srcdir already.
|
|
||||||
if test -f configure.ac; then
|
|
||||||
configure_ac=configure.ac
|
|
||||||
else
|
|
||||||
configure_ac=configure.in
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg="missing on your system"
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
--run)
|
|
||||||
# Try to run requested program, and just exit if it succeeds.
|
|
||||||
run=
|
|
||||||
shift
|
|
||||||
"$@" && exit 0
|
|
||||||
# Exit code 63 means version mismatch. This often happens
|
|
||||||
# when the user try to use an ancient version of a tool on
|
|
||||||
# a file that requires a minimum version. In this case we
|
|
||||||
# we should proceed has if the program had been absent, or
|
|
||||||
# if --run hadn't been passed.
|
|
||||||
if test $? = 63; then
|
|
||||||
run=:
|
|
||||||
msg="probably too old"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
-h|--h|--he|--hel|--help)
|
|
||||||
echo "\
|
|
||||||
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
|
||||||
|
|
||||||
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
|
|
||||||
error status if there is no known handling for PROGRAM.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-h, --help display this help and exit
|
|
||||||
-v, --version output version information and exit
|
|
||||||
--run try to run the given command, and emulate it if it fails
|
|
||||||
|
|
||||||
Supported PROGRAM values:
|
|
||||||
aclocal touch file \`aclocal.m4'
|
|
||||||
autoconf touch file \`configure'
|
|
||||||
autoheader touch file \`config.h.in'
|
|
||||||
automake touch all \`Makefile.in' files
|
|
||||||
bison create \`y.tab.[ch]', if possible, from existing .[ch]
|
|
||||||
flex create \`lex.yy.c', if possible, from existing .c
|
|
||||||
help2man touch the output file
|
|
||||||
lex create \`lex.yy.c', if possible, from existing .c
|
|
||||||
makeinfo touch the output file
|
|
||||||
tar try tar, gnutar, gtar, then tar without non-portable flags
|
|
||||||
yacc create \`y.tab.[ch]', if possible, from existing .[ch]
|
|
||||||
|
|
||||||
Send bug reports to <bug-automake@gnu.org>."
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
|
|
||||||
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
|
||||||
echo "missing $scriptversion (GNU Automake)"
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
|
|
||||||
-*)
|
|
||||||
echo 1>&2 "$0: Unknown \`$1' option"
|
|
||||||
echo 1>&2 "Try \`$0 --help' for more information"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Now exit if we have it, but it failed. Also exit now if we
|
|
||||||
# don't have it and --version was passed (most likely to detect
|
|
||||||
# the program).
|
|
||||||
case "$1" in
|
|
||||||
lex|yacc)
|
|
||||||
# Not GNU programs, they don't have --version.
|
|
||||||
;;
|
|
||||||
|
|
||||||
tar)
|
|
||||||
if test -n "$run"; then
|
|
||||||
echo 1>&2 "ERROR: \`tar' requires --run"
|
|
||||||
exit 1
|
|
||||||
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
|
|
||||||
# We have it, but it failed.
|
|
||||||
exit 1
|
|
||||||
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
|
||||||
# Could not run --version or --help. This is probably someone
|
|
||||||
# running `$TOOL --version' or `$TOOL --help' to check whether
|
|
||||||
# $TOOL exists and not knowing $TOOL uses missing.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# If it does not exist, or fails to run (possibly an outdated version),
|
|
||||||
# try to emulate it.
|
|
||||||
case "$1" in
|
|
||||||
aclocal*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`acinclude.m4' or \`${configure_ac}'. You might want
|
|
||||||
to install the \`Automake' and \`Perl' packages. Grab them from
|
|
||||||
any GNU archive site."
|
|
||||||
touch aclocal.m4
|
|
||||||
;;
|
|
||||||
|
|
||||||
autoconf)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`${configure_ac}'. You might want to install the
|
|
||||||
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU
|
|
||||||
archive site."
|
|
||||||
touch configure
|
|
||||||
;;
|
|
||||||
|
|
||||||
autoheader)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`acconfig.h' or \`${configure_ac}'. You might want
|
|
||||||
to install the \`Autoconf' and \`GNU m4' packages. Grab them
|
|
||||||
from any GNU archive site."
|
|
||||||
files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
|
|
||||||
test -z "$files" && files="config.h"
|
|
||||||
touch_files=
|
|
||||||
for f in $files; do
|
|
||||||
case "$f" in
|
|
||||||
*:*) touch_files="$touch_files "`echo "$f" |
|
|
||||||
sed -e 's/^[^:]*://' -e 's/:.*//'`;;
|
|
||||||
*) touch_files="$touch_files $f.in";;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
touch $touch_files
|
|
||||||
;;
|
|
||||||
|
|
||||||
automake*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
|
|
||||||
You might want to install the \`Automake' and \`Perl' packages.
|
|
||||||
Grab them from any GNU archive site."
|
|
||||||
find . -type f -name Makefile.am -print |
|
|
||||||
sed 's/\.am$/.in/' |
|
|
||||||
while read f; do touch "$f"; done
|
|
||||||
;;
|
|
||||||
|
|
||||||
autom4te)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is needed, but is $msg.
|
|
||||||
You might have modified some files without having the
|
|
||||||
proper tools for further handling them.
|
|
||||||
You can get \`$1' as part of \`Autoconf' from any GNU
|
|
||||||
archive site."
|
|
||||||
|
|
||||||
file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
|
|
||||||
test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
|
|
||||||
if test -f "$file"; then
|
|
||||||
touch $file
|
|
||||||
else
|
|
||||||
test -z "$file" || exec >$file
|
|
||||||
echo "#! /bin/sh"
|
|
||||||
echo "# Created by GNU Automake missing as a replacement of"
|
|
||||||
echo "# $ $@"
|
|
||||||
echo "exit 0"
|
|
||||||
chmod +x $file
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
bison|yacc)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' $msg. You should only need it if
|
|
||||||
you modified a \`.y' file. You may need the \`Bison' package
|
|
||||||
in order for those modifications to take effect. You can get
|
|
||||||
\`Bison' from any GNU archive site."
|
|
||||||
rm -f y.tab.c y.tab.h
|
|
||||||
if [ $# -ne 1 ]; then
|
|
||||||
eval LASTARG="\${$#}"
|
|
||||||
case "$LASTARG" in
|
|
||||||
*.y)
|
|
||||||
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
|
|
||||||
if [ -f "$SRCFILE" ]; then
|
|
||||||
cp "$SRCFILE" y.tab.c
|
|
||||||
fi
|
|
||||||
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
|
|
||||||
if [ -f "$SRCFILE" ]; then
|
|
||||||
cp "$SRCFILE" y.tab.h
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
if [ ! -f y.tab.h ]; then
|
|
||||||
echo >y.tab.h
|
|
||||||
fi
|
|
||||||
if [ ! -f y.tab.c ]; then
|
|
||||||
echo 'main() { return 0; }' >y.tab.c
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
lex|flex)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified a \`.l' file. You may need the \`Flex' package
|
|
||||||
in order for those modifications to take effect. You can get
|
|
||||||
\`Flex' from any GNU archive site."
|
|
||||||
rm -f lex.yy.c
|
|
||||||
if [ $# -ne 1 ]; then
|
|
||||||
eval LASTARG="\${$#}"
|
|
||||||
case "$LASTARG" in
|
|
||||||
*.l)
|
|
||||||
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
|
|
||||||
if [ -f "$SRCFILE" ]; then
|
|
||||||
cp "$SRCFILE" lex.yy.c
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
if [ ! -f lex.yy.c ]; then
|
|
||||||
echo 'main() { return 0; }' >lex.yy.c
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
help2man)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified a dependency of a manual page. You may need the
|
|
||||||
\`Help2man' package in order for those modifications to take
|
|
||||||
effect. You can get \`Help2man' from any GNU archive site."
|
|
||||||
|
|
||||||
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
|
|
||||||
if test -z "$file"; then
|
|
||||||
file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
|
|
||||||
fi
|
|
||||||
if [ -f "$file" ]; then
|
|
||||||
touch $file
|
|
||||||
else
|
|
||||||
test -z "$file" || exec >$file
|
|
||||||
echo ".ab help2man is required to generate this page"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
makeinfo)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified a \`.texi' or \`.texinfo' file, or any other file
|
|
||||||
indirectly affecting the aspect of the manual. The spurious
|
|
||||||
call might also be the consequence of using a buggy \`make' (AIX,
|
|
||||||
DU, IRIX). You might want to install the \`Texinfo' package or
|
|
||||||
the \`GNU make' package. Grab either from any GNU archive site."
|
|
||||||
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
|
|
||||||
if test -z "$file"; then
|
|
||||||
file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
|
|
||||||
file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
|
|
||||||
fi
|
|
||||||
touch $file
|
|
||||||
;;
|
|
||||||
|
|
||||||
tar)
|
|
||||||
shift
|
|
||||||
|
|
||||||
# We have already tried tar in the generic part.
|
|
||||||
# Look for gnutar/gtar before invocation to avoid ugly error
|
|
||||||
# messages.
|
|
||||||
if (gnutar --version > /dev/null 2>&1); then
|
|
||||||
gnutar "$@" && exit 0
|
|
||||||
fi
|
|
||||||
if (gtar --version > /dev/null 2>&1); then
|
|
||||||
gtar "$@" && exit 0
|
|
||||||
fi
|
|
||||||
firstarg="$1"
|
|
||||||
if shift; then
|
|
||||||
case "$firstarg" in
|
|
||||||
*o*)
|
|
||||||
firstarg=`echo "$firstarg" | sed s/o//`
|
|
||||||
tar "$firstarg" "$@" && exit 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
case "$firstarg" in
|
|
||||||
*h*)
|
|
||||||
firstarg=`echo "$firstarg" | sed s/h//`
|
|
||||||
tar "$firstarg" "$@" && exit 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: I can't seem to be able to run \`tar' with the given arguments.
|
|
||||||
You may want to install GNU tar or Free paxutils, or check the
|
|
||||||
command line arguments."
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is needed, and is $msg.
|
|
||||||
You might have modified some files without having the
|
|
||||||
proper tools for further handling them. Check the \`README' file,
|
|
||||||
it often tells you about the needed prerequisites for installing
|
|
||||||
this package. You may also peek at any GNU archive site, in case
|
|
||||||
some other package would contain this missing \`$1' program."
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
# Local variables:
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-end: "$"
|
|
||||||
# End:
|
|
@ -1,150 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# mkinstalldirs --- make directory hierarchy
|
|
||||||
|
|
||||||
scriptversion=2004-02-15.20
|
|
||||||
|
|
||||||
# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
|
|
||||||
# Created: 1993-05-16
|
|
||||||
# Public domain.
|
|
||||||
#
|
|
||||||
# This file is maintained in Automake, please report
|
|
||||||
# bugs to <bug-automake@gnu.org> or send patches to
|
|
||||||
# <automake-patches@gnu.org>.
|
|
||||||
|
|
||||||
errstatus=0
|
|
||||||
dirmode=""
|
|
||||||
|
|
||||||
usage="\
|
|
||||||
Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
|
|
||||||
|
|
||||||
Create each directory DIR (with mode MODE, if specified), including all
|
|
||||||
leading file name components.
|
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>."
|
|
||||||
|
|
||||||
# process command line arguments
|
|
||||||
while test $# -gt 0 ; do
|
|
||||||
case $1 in
|
|
||||||
-h | --help | --h*) # -h for help
|
|
||||||
echo "$usage"
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
-m) # -m PERM arg
|
|
||||||
shift
|
|
||||||
test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
|
|
||||||
dirmode=$1
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--version)
|
|
||||||
echo "$0 $scriptversion"
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
--) # stop option processing
|
|
||||||
shift
|
|
||||||
break
|
|
||||||
;;
|
|
||||||
-*) # unknown option
|
|
||||||
echo "$usage" 1>&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
*) # first non-opt arg
|
|
||||||
break
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
for file
|
|
||||||
do
|
|
||||||
if test -d "$file"; then
|
|
||||||
shift
|
|
||||||
else
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
case $# in
|
|
||||||
0) exit 0 ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and
|
|
||||||
# mkdir -p a/c at the same time, both will detect that a is missing,
|
|
||||||
# one will create a, then the other will try to create a and die with
|
|
||||||
# a "File exists" error. This is a problem when calling mkinstalldirs
|
|
||||||
# from a parallel make. We use --version in the probe to restrict
|
|
||||||
# ourselves to GNU mkdir, which is thread-safe.
|
|
||||||
case $dirmode in
|
|
||||||
'')
|
|
||||||
if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
|
|
||||||
# echo "mkdir -p -- $*"
|
|
||||||
exec mkdir -p -- "$@"
|
|
||||||
else
|
|
||||||
# On NextStep and OpenStep, the `mkdir' command does not
|
|
||||||
# recognize any option. It will interpret all options as
|
|
||||||
# directories to create, and then abort because `.' already
|
|
||||||
# exists.
|
|
||||||
test -d ./-p && rmdir ./-p
|
|
||||||
test -d ./--version && rmdir ./--version
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
|
|
||||||
test ! -d ./--version; then
|
|
||||||
# echo "mkdir -m $dirmode -p -- $*"
|
|
||||||
exec mkdir -m "$dirmode" -p -- "$@"
|
|
||||||
else
|
|
||||||
# Clean up after NextStep and OpenStep mkdir.
|
|
||||||
for d in ./-m ./-p ./--version "./$dirmode";
|
|
||||||
do
|
|
||||||
test -d $d && rmdir $d
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
for file
|
|
||||||
do
|
|
||||||
set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
|
|
||||||
shift
|
|
||||||
|
|
||||||
pathcomp=
|
|
||||||
for d
|
|
||||||
do
|
|
||||||
pathcomp="$pathcomp$d"
|
|
||||||
case $pathcomp in
|
|
||||||
-*) pathcomp=./$pathcomp ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test ! -d "$pathcomp"; then
|
|
||||||
# echo "mkdir $pathcomp"
|
|
||||||
|
|
||||||
mkdir "$pathcomp" || lasterr=$?
|
|
||||||
|
|
||||||
if test ! -d "$pathcomp"; then
|
|
||||||
errstatus=$lasterr
|
|
||||||
else
|
|
||||||
if test ! -z "$dirmode"; then
|
|
||||||
# echo "chmod $dirmode $pathcomp"
|
|
||||||
lasterr=""
|
|
||||||
chmod "$dirmode" "$pathcomp" || lasterr=$?
|
|
||||||
|
|
||||||
if test ! -z "$lasterr"; then
|
|
||||||
errstatus=$lasterr
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
pathcomp="$pathcomp/"
|
|
||||||
done
|
|
||||||
done
|
|
||||||
|
|
||||||
exit $errstatus
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: shell-script
|
|
||||||
# sh-indentation: 2
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-end: "$"
|
|
||||||
# End:
|
|
@ -1,21 +0,0 @@
|
|||||||
;===- ./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.
|
|
||||||
;
|
|
||||||
;===------------------------------------------------------------------------===;
|
|
||||||
;
|
|
||||||
; This is an LLVMBuild description file for the components in this subdirectory.
|
|
||||||
;
|
|
||||||
; For more information on the LLVMBuild system, please see:
|
|
||||||
;
|
|
||||||
; http://llvm.org/docs/LLVMBuild.html
|
|
||||||
;
|
|
||||||
;===------------------------------------------------------------------------===;
|
|
||||||
|
|
||||||
[component_0]
|
|
||||||
type = Group
|
|
||||||
name = Bindings
|
|
||||||
parent = $ROOT
|
|
@ -1,3 +0,0 @@
|
|||||||
This directory contains bindings for the LLVM compiler infrastructure to allow
|
|
||||||
programs written in languages other than C or C++ to take advantage of the LLVM
|
|
||||||
infrastructure--for instance, a self-hosted compiler front-end.
|
|
@ -1,415 +0,0 @@
|
|||||||
##===- tools/ml/Makefile -----------------------------------*- Makefile -*-===##
|
|
||||||
#
|
|
||||||
# The LLVM Compiler Infrastructure
|
|
||||||
#
|
|
||||||
# This file is distributed under the University of Illinois Open Source
|
|
||||||
# License. See LICENSE.TXT for details.
|
|
||||||
#
|
|
||||||
##===----------------------------------------------------------------------===##
|
|
||||||
#
|
|
||||||
# An ocaml library is a unique project type in the context of LLVM, so rules are
|
|
||||||
# here rather than in Makefile.rules.
|
|
||||||
#
|
|
||||||
# Reference materials on installing ocaml libraries:
|
|
||||||
#
|
|
||||||
# https://fedoraproject.org/wiki/Packaging/OCaml
|
|
||||||
# http://pkg-ocaml-maint.alioth.debian.org/ocaml_packaging_policy.txt
|
|
||||||
#
|
|
||||||
##===----------------------------------------------------------------------===##
|
|
||||||
|
|
||||||
include $(LEVEL)/Makefile.config
|
|
||||||
|
|
||||||
# CFLAGS needs to be set before Makefile.rules is included.
|
|
||||||
CXX.Flags += -I"$(shell $(OCAMLC) -where)"
|
|
||||||
C.Flags += -I"$(shell $(OCAMLC) -where)"
|
|
||||||
|
|
||||||
include $(LEVEL)/Makefile.common
|
|
||||||
|
|
||||||
# Intentionally ignore PROJ_prefix here. We want the ocaml stdlib. However, the
|
|
||||||
# user can override this with OCAML_LIBDIR or configure --with-ocaml-libdir=.
|
|
||||||
PROJ_libocamldir := $(DESTDIR)$(OCAML_LIBDIR)
|
|
||||||
OcamlDir := $(LibDir)/ocaml
|
|
||||||
|
|
||||||
# Info from llvm-config and similar
|
|
||||||
ifndef IS_CLEANING_TARGET
|
|
||||||
ifdef UsedComponents
|
|
||||||
UsedLibs = $(shell $(LLVM_CONFIG) --libs $(UsedComponents))
|
|
||||||
UsedLibNames = $(shell $(LLVM_CONFIG) --libnames $(UsedComponents))
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Tools
|
|
||||||
OCAMLCFLAGS += -I $(ObjDir) -I $(OcamlDir)
|
|
||||||
ifndef IS_CLEANING_TARGET
|
|
||||||
ifneq ($(ObjectsO),)
|
|
||||||
OCAMLAFLAGS += $(patsubst %,-cclib %, \
|
|
||||||
$(filter-out -L$(LibDir),-l$(LIBRARYNAME) \
|
|
||||||
$(shell $(LLVM_CONFIG) --ldflags)) \
|
|
||||||
$(UsedLibs))
|
|
||||||
else
|
|
||||||
OCAMLAFLAGS += $(patsubst %,-cclib %, \
|
|
||||||
$(filter-out -L$(LibDir),$(shell $(LLVM_CONFIG) --ldflags)) \
|
|
||||||
$(UsedLibs))
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# -g was introduced in 3.10.0.
|
|
||||||
#ifneq ($(ENABLE_OPTIMIZED),1)
|
|
||||||
# OCAMLDEBUGFLAG := -g
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Compile.CMI := $(strip $(OCAMLC) -c $(OCAMLCFLAGS) $(OCAMLDEBUGFLAG) -o)
|
|
||||||
Compile.CMO := $(strip $(OCAMLC) -c $(OCAMLCFLAGS) $(OCAMLDEBUGFLAG) -o)
|
|
||||||
Archive.CMA := $(strip $(OCAMLC) -a -custom $(OCAMLAFLAGS) $(OCAMLDEBUGFLAG) \
|
|
||||||
-o)
|
|
||||||
|
|
||||||
Compile.CMX := $(strip $(OCAMLOPT) -c $(OCAMLCFLAGS) $(OCAMLDEBUGFLAG) -o)
|
|
||||||
Archive.CMXA := $(strip $(OCAMLOPT) -a $(OCAMLAFLAGS) $(OCAMLDEBUGFLAG) -o)
|
|
||||||
|
|
||||||
ifdef OCAMLOPT
|
|
||||||
Archive.EXE := $(strip $(OCAMLOPT) -cc $(CXX) $(OCAMLCFLAGS) $(UsedOcamLibs:%=%.cmxa) $(OCAMLDEBUGFLAG) -o)
|
|
||||||
else
|
|
||||||
Archive.EXE := $(strip $(OCAMLC) -cc $(CXX) $(OCAMLCFLAGS) $(OCAMLDEBUGFLAG:%=%.cma) -o)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Source files
|
|
||||||
ifndef OcamlSources1
|
|
||||||
OcamlSources1 := $(sort $(wildcard $(PROJ_SRC_DIR)/*.ml))
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifndef OcamlHeaders1
|
|
||||||
OcamlHeaders1 := $(sort $(wildcard $(PROJ_SRC_DIR)/*.mli))
|
|
||||||
endif
|
|
||||||
|
|
||||||
OcamlSources2 := $(filter-out $(ExcludeSources),$(OcamlSources1))
|
|
||||||
OcamlHeaders2 := $(filter-out $(ExcludeHeaders),$(OcamlHeaders1))
|
|
||||||
|
|
||||||
OcamlSources := $(OcamlSources2:$(PROJ_SRC_DIR)/%=$(ObjDir)/%)
|
|
||||||
OcamlHeaders := $(OcamlHeaders2:$(PROJ_SRC_DIR)/%=$(ObjDir)/%)
|
|
||||||
|
|
||||||
# Intermediate files
|
|
||||||
ObjectsCMI := $(OcamlSources:%.ml=%.cmi)
|
|
||||||
ObjectsCMO := $(OcamlSources:%.ml=%.cmo)
|
|
||||||
ObjectsCMX := $(OcamlSources:%.ml=%.cmx)
|
|
||||||
|
|
||||||
ifdef LIBRARYNAME
|
|
||||||
LibraryCMA := $(ObjDir)/$(LIBRARYNAME).cma
|
|
||||||
LibraryCMXA := $(ObjDir)/$(LIBRARYNAME).cmxa
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifdef TOOLNAME
|
|
||||||
ToolEXE := $(ObjDir)/$(TOOLNAME)$(EXEEXT)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Output files
|
|
||||||
# The .cmo files are the only intermediates; all others are to be installed.
|
|
||||||
OutputsCMI := $(ObjectsCMI:$(ObjDir)/%.cmi=$(OcamlDir)/%.cmi)
|
|
||||||
OutputsCMX := $(ObjectsCMX:$(ObjDir)/%.cmx=$(OcamlDir)/%.cmx)
|
|
||||||
OutputLibs := $(UsedLibNames:%=$(OcamlDir)/%)
|
|
||||||
|
|
||||||
ifdef LIBRARYNAME
|
|
||||||
LibraryA := $(OcamlDir)/lib$(LIBRARYNAME).a
|
|
||||||
OutputCMA := $(LibraryCMA:$(ObjDir)/%.cma=$(OcamlDir)/%.cma)
|
|
||||||
OutputCMXA := $(LibraryCMXA:$(ObjDir)/%.cmxa=$(OcamlDir)/%.cmxa)
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifdef TOOLNAME
|
|
||||||
ifdef EXAMPLE_TOOL
|
|
||||||
OutputEXE := $(ExmplDir)/$(strip $(TOOLNAME))$(EXEEXT)
|
|
||||||
else
|
|
||||||
OutputEXE := $(ToolDir)/$(strip $(TOOLNAME))$(EXEEXT)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Installation targets
|
|
||||||
DestLibs := $(UsedLibNames:%=$(PROJ_libocamldir)/%)
|
|
||||||
|
|
||||||
ifdef LIBRARYNAME
|
|
||||||
DestA := $(PROJ_libocamldir)/lib$(LIBRARYNAME).a
|
|
||||||
DestCMA := $(PROJ_libocamldir)/$(LIBRARYNAME).cma
|
|
||||||
DestCMXA := $(PROJ_libocamldir)/$(LIBRARYNAME).cmxa
|
|
||||||
endif
|
|
||||||
|
|
||||||
##===- Dependencies -------------------------------------------------------===##
|
|
||||||
# Copy the sources into the intermediate directory because older ocamlc doesn't
|
|
||||||
# support -o except when linking (outputs are placed next to inputs).
|
|
||||||
|
|
||||||
$(ObjDir)/%.mli: $(PROJ_SRC_DIR)/%.mli $(ObjDir)/.dir
|
|
||||||
$(Verb) $(CP) -f $< $@
|
|
||||||
|
|
||||||
$(ObjDir)/%.ml: $(PROJ_SRC_DIR)/%.ml $(ObjDir)/.dir
|
|
||||||
$(Verb) $(CP) -f $< $@
|
|
||||||
|
|
||||||
$(ObjectsCMI): $(UsedOcamlInterfaces:%=$(OcamlDir)/%.cmi)
|
|
||||||
|
|
||||||
ifdef LIBRARYNAME
|
|
||||||
$(ObjDir)/$(LIBRARYNAME).ocamldep: $(OcamlSources) $(OcamlHeaders) \
|
|
||||||
$(OcamlDir)/.dir $(ObjDir)/.dir
|
|
||||||
$(Verb) $(OCAMLDEP) $(OCAMLCFLAGS) $(OcamlSources) $(OcamlHeaders) > $@
|
|
||||||
|
|
||||||
-include $(ObjDir)/$(LIBRARYNAME).ocamldep
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifdef TOOLNAME
|
|
||||||
$(ObjDir)/$(TOOLNAME).ocamldep: $(OcamlSources) $(OcamlHeaders) \
|
|
||||||
$(OcamlDir)/.dir $(ObjDir)/.dir
|
|
||||||
$(Verb) $(OCAMLDEP) $(OCAMLCFLAGS) $(OcamlSources) $(OcamlHeaders) > $@
|
|
||||||
|
|
||||||
-include $(ObjDir)/$(TOOLNAME).ocamldep
|
|
||||||
endif
|
|
||||||
|
|
||||||
##===- Build static library from C sources --------------------------------===##
|
|
||||||
|
|
||||||
ifdef LibraryA
|
|
||||||
all-local:: $(LibraryA)
|
|
||||||
clean-local:: clean-a
|
|
||||||
install-local:: install-a
|
|
||||||
uninstall-local:: uninstall-a
|
|
||||||
|
|
||||||
$(LibraryA): $(ObjectsO) $(OcamlDir)/.dir
|
|
||||||
$(Echo) "Building $(BuildMode) $(notdir $@)"
|
|
||||||
-$(Verb) $(RM) -f $@
|
|
||||||
$(Verb) $(Archive) $@ $(ObjectsO)
|
|
||||||
$(Verb) $(Ranlib) $@
|
|
||||||
|
|
||||||
clean-a::
|
|
||||||
-$(Verb) $(RM) -f $(LibraryA)
|
|
||||||
|
|
||||||
install-a:: $(LibraryA)
|
|
||||||
$(Echo) "Installing $(BuildMode) $(DestA)"
|
|
||||||
$(Verb) $(MKDIR) $(PROJ_libocamldir)
|
|
||||||
$(Verb) $(INSTALL) $(LibraryA) $(DestA)
|
|
||||||
$(Verb)
|
|
||||||
|
|
||||||
uninstall-a::
|
|
||||||
$(Echo) "Uninstalling $(DestA)"
|
|
||||||
-$(Verb) $(RM) -f $(DestA)
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
##===- Deposit dependent libraries adjacent to Ocaml libs -----------------===##
|
|
||||||
|
|
||||||
all-local:: build-deplibs
|
|
||||||
clean-local:: clean-deplibs
|
|
||||||
install-local:: install-deplibs
|
|
||||||
uninstall-local:: uninstall-deplibs
|
|
||||||
|
|
||||||
build-deplibs: $(OutputLibs)
|
|
||||||
|
|
||||||
$(OcamlDir)/%.a: $(LibDir)/%.a
|
|
||||||
$(Verb) ln -sf $< $@
|
|
||||||
|
|
||||||
$(OcamlDir)/%.o: $(LibDir)/%.o
|
|
||||||
$(Verb) ln -sf $< $@
|
|
||||||
|
|
||||||
clean-deplibs:
|
|
||||||
$(Verb) $(RM) -f $(OutputLibs)
|
|
||||||
|
|
||||||
install-deplibs:
|
|
||||||
$(Verb) $(MKDIR) $(PROJ_libocamldir)
|
|
||||||
$(Verb) for i in $(DestLibs:$(PROJ_libocamldir)/%=%); do \
|
|
||||||
ln -sf "$(PROJ_libdir)/$$i" "$(PROJ_libocamldir)/$$i"; \
|
|
||||||
done
|
|
||||||
|
|
||||||
uninstall-deplibs:
|
|
||||||
$(Verb) $(RM) -f $(DestLibs)
|
|
||||||
|
|
||||||
|
|
||||||
##===- Build ocaml interfaces (.mli's -> .cmi's) --------------------------===##
|
|
||||||
|
|
||||||
ifneq ($(OcamlHeaders),)
|
|
||||||
all-local:: build-cmis
|
|
||||||
clean-local:: clean-cmis
|
|
||||||
install-local:: install-cmis
|
|
||||||
uninstall-local:: uninstall-cmis
|
|
||||||
|
|
||||||
build-cmis: $(OutputsCMI)
|
|
||||||
|
|
||||||
$(OcamlDir)/%.cmi: $(ObjDir)/%.cmi $(OcamlDir)/.dir
|
|
||||||
$(Verb) $(CP) -f $< $@
|
|
||||||
|
|
||||||
$(ObjDir)/%.cmi: $(ObjDir)/%.mli $(ObjDir)/.dir
|
|
||||||
$(Echo) "Compiling $(notdir $<) for $(BuildMode) build"
|
|
||||||
$(Verb) $(Compile.CMI) $@ $<
|
|
||||||
|
|
||||||
clean-cmis::
|
|
||||||
-$(Verb) $(RM) -f $(OutputsCMI)
|
|
||||||
|
|
||||||
# Also install the .mli's (headers) as documentation.
|
|
||||||
install-cmis: $(OutputsCMI) $(OcamlHeaders)
|
|
||||||
$(Verb) $(MKDIR) $(PROJ_libocamldir)
|
|
||||||
$(Verb) for i in $(OcamlHeaders:$(ObjDir)/%=%); do \
|
|
||||||
$(EchoCmd) "Installing $(BuildMode) $(PROJ_libocamldir)/$$i"; \
|
|
||||||
$(DataInstall) $(ObjDir)/$$i "$(PROJ_libocamldir)/$$i"; \
|
|
||||||
done
|
|
||||||
$(Verb) for i in $(OutputsCMI:$(OcamlDir)/%=%); do \
|
|
||||||
$(EchoCmd) "Installing $(BuildMode) $(PROJ_libocamldir)/$$i"; \
|
|
||||||
$(DataInstall) $(OcamlDir)/$$i "$(PROJ_libocamldir)/$$i"; \
|
|
||||||
done
|
|
||||||
|
|
||||||
uninstall-cmis::
|
|
||||||
$(Verb) for i in $(OutputsCMI:$(OcamlDir)/%=%); do \
|
|
||||||
$(EchoCmd) "Uninstalling $(PROJ_libocamldir)/$$i"; \
|
|
||||||
$(RM) -f "$(PROJ_libocamldir)/$$i"; \
|
|
||||||
done
|
|
||||||
$(Verb) for i in $(OcamlHeaders:$(ObjDir)/%=%); do \
|
|
||||||
$(EchoCmd) "Uninstalling $(PROJ_libocamldir)/$$i"; \
|
|
||||||
$(RM) -f "$(PROJ_libocamldir)/$$i"; \
|
|
||||||
done
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
##===- Build ocaml bytecode archive (.ml's -> .cmo's -> .cma) -------------===##
|
|
||||||
|
|
||||||
$(ObjDir)/%.cmo: $(ObjDir)/%.ml
|
|
||||||
$(Echo) "Compiling $(notdir $<) for $(BuildMode) build"
|
|
||||||
$(Verb) $(Compile.CMO) $@ $<
|
|
||||||
|
|
||||||
ifdef LIBRARYNAME
|
|
||||||
all-local:: $(OutputCMA)
|
|
||||||
clean-local:: clean-cma
|
|
||||||
install-local:: install-cma
|
|
||||||
uninstall-local:: uninstall-cma
|
|
||||||
|
|
||||||
$(OutputCMA): $(LibraryCMA) $(OcamlDir)/.dir
|
|
||||||
$(Verb) $(CP) -f $< $@
|
|
||||||
|
|
||||||
$(LibraryCMA): $(ObjectsCMO) $(OcamlDir)/.dir
|
|
||||||
$(Echo) "Archiving $(notdir $@) for $(BuildMode) build"
|
|
||||||
$(Verb) $(Archive.CMA) $@ $(ObjectsCMO)
|
|
||||||
|
|
||||||
clean-cma::
|
|
||||||
$(Verb) $(RM) -f $(OutputCMA) $(UsedLibNames:%=$(OcamlDir)/%)
|
|
||||||
|
|
||||||
install-cma:: $(OutputCMA)
|
|
||||||
$(Echo) "Installing $(BuildMode) $(DestCMA)"
|
|
||||||
$(Verb) $(MKDIR) $(PROJ_libocamldir)
|
|
||||||
$(Verb) $(DataInstall) $(OutputCMA) "$(DestCMA)"
|
|
||||||
|
|
||||||
uninstall-cma::
|
|
||||||
$(Echo) "Uninstalling $(DestCMA)"
|
|
||||||
-$(Verb) $(RM) -f $(DestCMA)
|
|
||||||
endif
|
|
||||||
|
|
||||||
##===- Build optimized ocaml archive (.ml's -> .cmx's -> .cmxa, .a) -------===##
|
|
||||||
|
|
||||||
# The ocamlopt compiler is supported on a set of targets disjoint from LLVM's.
|
|
||||||
# If unavailable, 'configure' will not define OCAMLOPT in Makefile.config.
|
|
||||||
ifdef OCAMLOPT
|
|
||||||
|
|
||||||
$(OcamlDir)/%.cmx: $(ObjDir)/%.cmx
|
|
||||||
$(Verb) $(CP) -f $< $@
|
|
||||||
|
|
||||||
$(ObjDir)/%.cmx: $(ObjDir)/%.ml
|
|
||||||
$(Echo) "Compiling optimized $(notdir $<) for $(BuildMode) build"
|
|
||||||
$(Verb) $(Compile.CMX) $@ $<
|
|
||||||
|
|
||||||
ifdef LIBRARYNAME
|
|
||||||
all-local:: $(OutputCMXA) $(OutputsCMX)
|
|
||||||
clean-local:: clean-cmxa
|
|
||||||
install-local:: install-cmxa
|
|
||||||
uninstall-local:: uninstall-cmxa
|
|
||||||
|
|
||||||
$(OutputCMXA): $(LibraryCMXA)
|
|
||||||
$(Verb) $(CP) -f $< $@
|
|
||||||
$(Verb) $(CP) -f $(<:.cmxa=.a) $(@:.cmxa=.a)
|
|
||||||
|
|
||||||
$(LibraryCMXA): $(ObjectsCMX)
|
|
||||||
$(Echo) "Archiving $(notdir $@) for $(BuildMode) build"
|
|
||||||
$(Verb) $(Archive.CMXA) $@ $(ObjectsCMX)
|
|
||||||
$(Verb) $(RM) -f $(@:.cmxa=.o)
|
|
||||||
|
|
||||||
clean-cmxa::
|
|
||||||
$(Verb) $(RM) -f $(OutputCMXA) $(OutputCMXA:.cmxa=.a) $(OutputsCMX)
|
|
||||||
|
|
||||||
install-cmxa:: $(OutputCMXA) $(OutputsCMX)
|
|
||||||
$(Verb) $(MKDIR) $(PROJ_libocamldir)
|
|
||||||
$(Echo) "Installing $(BuildMode) $(DestCMXA)"
|
|
||||||
$(Verb) $(DataInstall) $(OutputCMXA) $(DestCMXA)
|
|
||||||
$(Echo) "Installing $(BuildMode) $(DestCMXA:.cmxa=.a)"
|
|
||||||
$(Verb) $(DataInstall) $(OutputCMXA:.cmxa=.a) $(DestCMXA:.cmxa=.a)
|
|
||||||
$(Verb) for i in $(OutputsCMX:$(OcamlDir)/%=%); do \
|
|
||||||
$(EchoCmd) "Installing $(BuildMode) $(PROJ_libocamldir)/$$i"; \
|
|
||||||
$(DataInstall) $(OcamlDir)/$$i "$(PROJ_libocamldir)/$$i"; \
|
|
||||||
done
|
|
||||||
|
|
||||||
uninstall-cmxa::
|
|
||||||
$(Echo) "Uninstalling $(DestCMXA)"
|
|
||||||
$(Verb) $(RM) -f $(DestCMXA)
|
|
||||||
$(Echo) "Uninstalling $(DestCMXA:.cmxa=.a)"
|
|
||||||
$(Verb) $(RM) -f $(DestCMXA:.cmxa=.a)
|
|
||||||
$(Verb) for i in $(OutputsCMX:$(OcamlDir)/%=%); do \
|
|
||||||
$(EchoCmd) "Uninstalling $(PROJ_libocamldir)/$$i"; \
|
|
||||||
$(RM) -f $(PROJ_libocamldir)/$$i; \
|
|
||||||
done
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
##===- Build executables --------------------------------------------------===##
|
|
||||||
|
|
||||||
ifdef TOOLNAME
|
|
||||||
all-local:: $(OutputEXE)
|
|
||||||
clean-local:: clean-exe
|
|
||||||
|
|
||||||
$(OutputEXE): $(ToolEXE) $(OcamlDir)/.dir
|
|
||||||
$(Verb) $(CP) -f $< $@
|
|
||||||
|
|
||||||
ifndef OCAMLOPT
|
|
||||||
$(ToolEXE): $(ObjectsCMO) $(OcamlDir)/.dir
|
|
||||||
$(Echo) "Archiving $(notdir $@) for $(BuildMode) build"
|
|
||||||
$(Verb) $(Archive.EXE) $@ $(ObjectsCMO)
|
|
||||||
else
|
|
||||||
$(ToolEXE): $(ObjectsCMX) $(OcamlDir)/.dir
|
|
||||||
$(Echo) "Archiving $(notdir $@) for $(BuildMode) build"
|
|
||||||
$(Verb) $(Archive.EXE) $@ $(ObjectsCMX)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
##===- Generate documentation ---------------------------------------------===##
|
|
||||||
|
|
||||||
$(ObjDir)/$(LIBRARYNAME).odoc: $(ObjectsCMI)
|
|
||||||
$(Echo) "Documenting $(notdir $@)"
|
|
||||||
$(Verb) $(OCAMLDOC) -I $(ObjDir) -I $(OcamlDir) -dump $@ $(OcamlHeaders)
|
|
||||||
|
|
||||||
ocamldoc: $(ObjDir)/$(LIBRARYNAME).odoc
|
|
||||||
|
|
||||||
##===- Debugging gunk -----------------------------------------------------===##
|
|
||||||
printvars:: printcamlvars
|
|
||||||
|
|
||||||
printcamlvars::
|
|
||||||
$(Echo) "LLVM_CONFIG : " '$(LLVM_CONFIG)'
|
|
||||||
$(Echo) "OCAMLCFLAGS : " '$(OCAMLCFLAGS)'
|
|
||||||
$(Echo) "OCAMLAFLAGS : " '$(OCAMLAFLAGS)'
|
|
||||||
$(Echo) "OCAMLC : " '$(OCAMLC)'
|
|
||||||
$(Echo) "OCAMLOPT : " '$(OCAMLOPT)'
|
|
||||||
$(Echo) "OCAMLDEP : " '$(OCAMLDEP)'
|
|
||||||
$(Echo) "Compile.CMI : " '$(Compile.CMI)'
|
|
||||||
$(Echo) "Compile.CMO : " '$(Compile.CMO)'
|
|
||||||
$(Echo) "Archive.CMA : " '$(Archive.CMA)'
|
|
||||||
$(Echo) "Compile.CMX : " '$(Compile.CMX)'
|
|
||||||
$(Echo) "Archive.CMXA : " '$(Archive.CMXA)'
|
|
||||||
$(Echo) "CAML_LIBDIR : " '$(CAML_LIBDIR)'
|
|
||||||
$(Echo) "LibraryCMA : " '$(LibraryCMA)'
|
|
||||||
$(Echo) "LibraryCMXA : " '$(LibraryCMXA)'
|
|
||||||
$(Echo) "OcamlSources1: " '$(OcamlSources1)'
|
|
||||||
$(Echo) "OcamlSources2: " '$(OcamlSources2)'
|
|
||||||
$(Echo) "OcamlSources : " '$(OcamlSources)'
|
|
||||||
$(Echo) "OcamlHeaders1: " '$(OcamlHeaders1)'
|
|
||||||
$(Echo) "OcamlHeaders2: " '$(OcamlHeaders2)'
|
|
||||||
$(Echo) "OcamlHeaders : " '$(OcamlHeaders)'
|
|
||||||
$(Echo) "ObjectsCMI : " '$(ObjectsCMI)'
|
|
||||||
$(Echo) "ObjectsCMO : " '$(ObjectsCMO)'
|
|
||||||
$(Echo) "ObjectsCMX : " '$(ObjectsCMX)'
|
|
||||||
$(Echo) "OCAML_LIBDIR : " '$(OCAML_LIBDIR)'
|
|
||||||
$(Echo) "DestA : " '$(DestA)'
|
|
||||||
$(Echo) "DestCMA : " '$(DestCMA)'
|
|
||||||
$(Echo) "DestCMXA : " '$(DestCMXA)'
|
|
||||||
$(Echo) "UsedLibs : " '$(UsedLibs)'
|
|
||||||
$(Echo) "UsedLibNames : " '$(UsedLibNames)'
|
|
||||||
|
|
||||||
.PHONY: printcamlvars build-cmis \
|
|
||||||
clean-a clean-cmis clean-cma clean-cmxa \
|
|
||||||
install-a install-cmis install-cma install-cmxa \
|
|
||||||
install-exe \
|
|
||||||
uninstall-a uninstall-cmis uninstall-cma uninstall-cmxa \
|
|
||||||
uninstall-exe
|
|
@ -1,72 +0,0 @@
|
|||||||
/*===-- 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. *|
|
|
||||||
|* *|
|
|
||||||
|*===----------------------------------------------------------------------===*|
|
|
||||||
|* *|
|
|
||||||
|* This file glues LLVM's ocaml interface to its C interface. These functions *|
|
|
||||||
|* are by and large transparent wrappers to the corresponding C functions. *|
|
|
||||||
|* *|
|
|
||||||
|* Note that these functions intentionally take liberties with the CAMLparamX *|
|
|
||||||
|* macros, since most of the parameters are not GC heap objects. *|
|
|
||||||
|* *|
|
|
||||||
\*===----------------------------------------------------------------------===*/
|
|
||||||
|
|
||||||
#include "llvm-c/Analysis.h"
|
|
||||||
#include "caml/alloc.h"
|
|
||||||
#include "caml/mlvalues.h"
|
|
||||||
#include "caml/memory.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Llvm.llmodule -> string option */
|
|
||||||
CAMLprim value llvm_verify_module(LLVMModuleRef M) {
|
|
||||||
CAMLparam0();
|
|
||||||
CAMLlocal2(String, Option);
|
|
||||||
|
|
||||||
char *Message;
|
|
||||||
int Result = LLVMVerifyModule(M, LLVMReturnStatusAction, &Message);
|
|
||||||
|
|
||||||
if (0 == Result) {
|
|
||||||
Option = Val_int(0);
|
|
||||||
} else {
|
|
||||||
Option = alloc(1, 0);
|
|
||||||
String = copy_string(Message);
|
|
||||||
Store_field(Option, 0, String);
|
|
||||||
}
|
|
||||||
|
|
||||||
LLVMDisposeMessage(Message);
|
|
||||||
|
|
||||||
CAMLreturn(Option);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Llvm.llvalue -> bool */
|
|
||||||
CAMLprim value llvm_verify_function(LLVMValueRef Fn) {
|
|
||||||
return Val_bool(LLVMVerifyFunction(Fn, LLVMReturnStatusAction) == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Llvm.llmodule -> unit */
|
|
||||||
CAMLprim value llvm_assert_valid_module(LLVMModuleRef M) {
|
|
||||||
LLVMVerifyModule(M, LLVMAbortProcessAction, 0);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Llvm.llvalue -> unit */
|
|
||||||
CAMLprim value llvm_assert_valid_function(LLVMValueRef Fn) {
|
|
||||||
LLVMVerifyFunction(Fn, LLVMAbortProcessAction);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Llvm.llvalue -> unit */
|
|
||||||
CAMLprim value llvm_view_function_cfg(LLVMValueRef Fn) {
|
|
||||||
LLVMViewFunctionCFG(Fn);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Llvm.llvalue -> unit */
|
|
||||||
CAMLprim value llvm_view_function_cfg_only(LLVMValueRef Fn) {
|
|
||||||
LLVMViewFunctionCFGOnly(Fn);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
(*===-- llvm_analysis.ml - LLVM Ocaml Interface -----------------*- C++ -*-===*
|
|
||||||
*
|
|
||||||
* The LLVM Compiler Infrastructure
|
|
||||||
*
|
|
||||||
* This file is distributed under the University of Illinois Open Source
|
|
||||||
* License. See LICENSE.TXT for details.
|
|
||||||
*
|
|
||||||
*===----------------------------------------------------------------------===*)
|
|
||||||
|
|
||||||
|
|
||||||
external verify_module : Llvm.llmodule -> string option = "llvm_verify_module"
|
|
||||||
|
|
||||||
external verify_function : Llvm.llvalue -> bool = "llvm_verify_function"
|
|
||||||
|
|
||||||
external assert_valid_module : Llvm.llmodule -> unit
|
|
||||||
= "llvm_assert_valid_module"
|
|
||||||
|
|
||||||
external assert_valid_function : Llvm.llvalue -> unit
|
|
||||||
= "llvm_assert_valid_function"
|
|
||||||
external view_function_cfg : Llvm.llvalue -> unit = "llvm_view_function_cfg"
|
|
||||||
external view_function_cfg_only : Llvm.llvalue -> unit
|
|
||||||
= "llvm_view_function_cfg_only"
|
|
@ -1,46 +0,0 @@
|
|||||||
(*===-- llvm_analysis.mli - LLVM Ocaml Interface ----------------*- C++ -*-===*
|
|
||||||
*
|
|
||||||
* The LLVM Compiler Infrastructure
|
|
||||||
*
|
|
||||||
* This file is distributed under the University of Illinois Open Source
|
|
||||||
* License. See LICENSE.TXT for details.
|
|
||||||
*
|
|
||||||
*===----------------------------------------------------------------------===*)
|
|
||||||
|
|
||||||
(** Intermediate representation analysis.
|
|
||||||
|
|
||||||
This interface provides an ocaml API for LLVM IR analyses, the classes in
|
|
||||||
the Analysis library. *)
|
|
||||||
|
|
||||||
(** [verify_module m] returns [None] if the module [m] is valid, and
|
|
||||||
[Some reason] if it is invalid. [reason] is a string containing a
|
|
||||||
human-readable validation report. See [llvm::verifyModule]. *)
|
|
||||||
external verify_module : Llvm.llmodule -> string option = "llvm_verify_module"
|
|
||||||
|
|
||||||
(** [verify_function f] returns [None] if the function [f] is valid, and
|
|
||||||
[Some reason] if it is invalid. [reason] is a string containing a
|
|
||||||
human-readable validation report. See [llvm::verifyFunction]. *)
|
|
||||||
external verify_function : Llvm.llvalue -> bool = "llvm_verify_function"
|
|
||||||
|
|
||||||
(** [verify_module m] returns if the module [m] is valid, but prints a
|
|
||||||
validation report to [stderr] and aborts the program if it is invalid. See
|
|
||||||
[llvm::verifyModule]. *)
|
|
||||||
external assert_valid_module : Llvm.llmodule -> unit
|
|
||||||
= "llvm_assert_valid_module"
|
|
||||||
|
|
||||||
(** [verify_function f] returns if the function [f] is valid, but prints a
|
|
||||||
validation report to [stderr] and aborts the program if it is invalid. See
|
|
||||||
[llvm::verifyFunction]. *)
|
|
||||||
external assert_valid_function : Llvm.llvalue -> unit
|
|
||||||
= "llvm_assert_valid_function"
|
|
||||||
|
|
||||||
(** [view_function_cfg f] opens up a ghostscript window displaying the CFG of
|
|
||||||
the current function with the code for each basic block inside.
|
|
||||||
See [llvm::Function::viewCFG]. *)
|
|
||||||
external view_function_cfg : Llvm.llvalue -> unit = "llvm_view_function_cfg"
|
|
||||||
|
|
||||||
(** [view_function_cfg_only f] works just like [view_function_cfg], but does not
|
|
||||||
include the contents of basic blocks into the nodes.
|
|
||||||
See [llvm::Function::viewCFGOnly]. *)
|
|
||||||
external view_function_cfg_only : Llvm.llvalue -> unit
|
|
||||||
= "llvm_view_function_cfg_only"
|
|
@ -1,73 +0,0 @@
|
|||||||
/*===-- 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. *|
|
|
||||||
|* *|
|
|
||||||
|*===----------------------------------------------------------------------===*|
|
|
||||||
|* *|
|
|
||||||
|* This file glues LLVM's ocaml interface to its C interface. These functions *|
|
|
||||||
|* are by and large transparent wrappers to the corresponding C functions. *|
|
|
||||||
|* *|
|
|
||||||
\*===----------------------------------------------------------------------===*/
|
|
||||||
|
|
||||||
#include "llvm-c/BitReader.h"
|
|
||||||
#include "caml/alloc.h"
|
|
||||||
#include "caml/fail.h"
|
|
||||||
#include "caml/memory.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Can't use the recommended caml_named_value mechanism for backwards
|
|
||||||
compatibility reasons. This is largely equivalent. */
|
|
||||||
static value llvm_bitreader_error_exn;
|
|
||||||
|
|
||||||
CAMLprim value llvm_register_bitreader_exns(value Error) {
|
|
||||||
llvm_bitreader_error_exn = Field(Error, 0);
|
|
||||||
register_global_root(&llvm_bitreader_error_exn);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void llvm_raise(value Prototype, char *Message) {
|
|
||||||
CAMLparam1(Prototype);
|
|
||||||
CAMLlocal1(CamlMessage);
|
|
||||||
|
|
||||||
CamlMessage = copy_string(Message);
|
|
||||||
LLVMDisposeMessage(Message);
|
|
||||||
|
|
||||||
raise_with_arg(Prototype, CamlMessage);
|
|
||||||
abort(); /* NOTREACHED */
|
|
||||||
#ifdef CAMLnoreturn
|
|
||||||
CAMLnoreturn; /* Silences warnings, but is missing in some versions. */
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*===-- Modules -----------------------------------------------------------===*/
|
|
||||||
|
|
||||||
/* Llvm.llcontext -> Llvm.llmemorybuffer -> Llvm.llmodule */
|
|
||||||
CAMLprim value llvm_get_module(LLVMContextRef C, LLVMMemoryBufferRef MemBuf) {
|
|
||||||
CAMLparam0();
|
|
||||||
CAMLlocal2(Variant, MessageVal);
|
|
||||||
char *Message;
|
|
||||||
|
|
||||||
LLVMModuleRef M;
|
|
||||||
if (LLVMGetBitcodeModuleInContext(C, MemBuf, &M, &Message))
|
|
||||||
llvm_raise(llvm_bitreader_error_exn, Message);
|
|
||||||
|
|
||||||
CAMLreturn((value) M);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Llvm.llcontext -> Llvm.llmemorybuffer -> Llvm.llmodule */
|
|
||||||
CAMLprim value llvm_parse_bitcode(LLVMContextRef C,
|
|
||||||
LLVMMemoryBufferRef MemBuf) {
|
|
||||||
CAMLparam0();
|
|
||||||
CAMLlocal2(Variant, MessageVal);
|
|
||||||
LLVMModuleRef M;
|
|
||||||
char *Message;
|
|
||||||
|
|
||||||
if (LLVMParseBitcodeInContext(C, MemBuf, &M, &Message))
|
|
||||||
llvm_raise(llvm_bitreader_error_exn, Message);
|
|
||||||
|
|
||||||
CAMLreturn((value) M);
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
(*===-- llvm_bitreader.ml - LLVM Ocaml Interface ----------------*- C++ -*-===*
|
|
||||||
*
|
|
||||||
* The LLVM Compiler Infrastructure
|
|
||||||
*
|
|
||||||
* This file is distributed under the University of Illinois Open Source
|
|
||||||
* License. See LICENSE.TXT for details.
|
|
||||||
*
|
|
||||||
*===----------------------------------------------------------------------===*)
|
|
||||||
|
|
||||||
|
|
||||||
exception Error of string
|
|
||||||
|
|
||||||
external register_exns : exn -> unit = "llvm_register_bitreader_exns"
|
|
||||||
let _ = register_exns (Error "")
|
|
||||||
|
|
||||||
external get_module : Llvm.llcontext -> Llvm.llmemorybuffer -> Llvm.llmodule
|
|
||||||
= "llvm_get_module"
|
|
||||||
|
|
||||||
external parse_bitcode : Llvm.llcontext -> Llvm.llmemorybuffer -> Llvm.llmodule
|
|
||||||
= "llvm_parse_bitcode"
|
|
@ -1,29 +0,0 @@
|
|||||||
(*===-- llvm_bitreader.mli - LLVM Ocaml Interface ---------------*- C++ -*-===*
|
|
||||||
*
|
|
||||||
* The LLVM Compiler Infrastructure
|
|
||||||
*
|
|
||||||
* This file is distributed under the University of Illinois Open Source
|
|
||||||
* License. See LICENSE.TXT for details.
|
|
||||||
*
|
|
||||||
*===----------------------------------------------------------------------===*)
|
|
||||||
|
|
||||||
(** Bitcode reader.
|
|
||||||
|
|
||||||
This interface provides an ocaml API for the LLVM bitcode reader, the
|
|
||||||
classes in the Bitreader library. *)
|
|
||||||
|
|
||||||
exception Error of string
|
|
||||||
|
|
||||||
(** [get_module context mb] reads the bitcode for a new module [m] from the
|
|
||||||
memory buffer [mb] in the context [context]. Returns [m] if successful, or
|
|
||||||
raises [Error msg] otherwise, where [msg] is a description of the error
|
|
||||||
encountered. See the function [llvm::getBitcodeModule]. *)
|
|
||||||
val get_module : Llvm.llcontext -> Llvm.llmemorybuffer -> Llvm.llmodule
|
|
||||||
|
|
||||||
|
|
||||||
(** [parse_bitcode context mb] parses the bitcode for a new module [m] from the
|
|
||||||
memory buffer [mb] in the context [context]. Returns [m] if successful, or
|
|
||||||
raises [Error msg] otherwise, where [msg] is a description of the error
|
|
||||||
encountered. See the function [llvm::ParseBitcodeFile]. *)
|
|
||||||
val parse_bitcode : Llvm.llcontext -> Llvm.llmemorybuffer -> Llvm.llmodule
|
|
||||||
|
|
@ -1,45 +0,0 @@
|
|||||||
/*===-- 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. *|
|
|
||||||
|* *|
|
|
||||||
|*===----------------------------------------------------------------------===*|
|
|
||||||
|* *|
|
|
||||||
|* This file glues LLVM's ocaml interface to its C interface. These functions *|
|
|
||||||
|* are by and large transparent wrappers to the corresponding C functions. *|
|
|
||||||
|* *|
|
|
||||||
|* Note that these functions intentionally take liberties with the CAMLparamX *|
|
|
||||||
|* macros, since most of the parameters are not GC heap objects. *|
|
|
||||||
|* *|
|
|
||||||
\*===----------------------------------------------------------------------===*/
|
|
||||||
|
|
||||||
#include "llvm-c/BitWriter.h"
|
|
||||||
#include "llvm-c/Core.h"
|
|
||||||
#include "caml/alloc.h"
|
|
||||||
#include "caml/mlvalues.h"
|
|
||||||
#include "caml/memory.h"
|
|
||||||
|
|
||||||
/*===-- Modules -----------------------------------------------------------===*/
|
|
||||||
|
|
||||||
/* Llvm.llmodule -> string -> bool */
|
|
||||||
CAMLprim value llvm_write_bitcode_file(value M, value Path) {
|
|
||||||
int res = LLVMWriteBitcodeToFile((LLVMModuleRef) M, String_val(Path));
|
|
||||||
return Val_bool(res == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ?unbuffered:bool -> Llvm.llmodule -> Unix.file_descr -> bool */
|
|
||||||
CAMLprim value llvm_write_bitcode_to_fd(value U, value M, value FD) {
|
|
||||||
int Unbuffered;
|
|
||||||
int res;
|
|
||||||
|
|
||||||
if (U == Val_int(0)) {
|
|
||||||
Unbuffered = 0;
|
|
||||||
} else {
|
|
||||||
Unbuffered = Bool_val(Field(U,0));
|
|
||||||
}
|
|
||||||
|
|
||||||
res = LLVMWriteBitcodeToFD((LLVMModuleRef) M, Int_val(FD), 0, Unbuffered);
|
|
||||||
return Val_bool(res == 0);
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
(*===-- llvm_bitwriter.ml - LLVM Ocaml Interface ----------------*- C++ -*-===*
|
|
||||||
*
|
|
||||||
* The LLVM Compiler Infrastructure
|
|
||||||
*
|
|
||||||
* This file is distributed under the University of Illinois Open Source
|
|
||||||
* License. See LICENSE.TXT for details.
|
|
||||||
*
|
|
||||||
*===----------------------------------------------------------------------===
|
|
||||||
*
|
|
||||||
* This interface provides an ocaml API for the LLVM intermediate
|
|
||||||
* representation, the classes in the VMCore library.
|
|
||||||
*
|
|
||||||
*===----------------------------------------------------------------------===*)
|
|
||||||
|
|
||||||
|
|
||||||
(* Writes the bitcode for module the given path. Returns true if successful. *)
|
|
||||||
external write_bitcode_file : Llvm.llmodule -> string -> bool
|
|
||||||
= "llvm_write_bitcode_file"
|
|
||||||
|
|
||||||
external write_bitcode_to_fd : ?unbuffered:bool -> Llvm.llmodule
|
|
||||||
-> Unix.file_descr -> bool
|
|
||||||
= "llvm_write_bitcode_to_fd"
|
|
||||||
|
|
||||||
let output_bitcode ?unbuffered channel m =
|
|
||||||
write_bitcode_to_fd ?unbuffered m (Unix.descr_of_out_channel channel)
|
|
@ -1,30 +0,0 @@
|
|||||||
(*===-- llvm_bitwriter.mli - LLVM Ocaml Interface ---------------*- C++ -*-===*
|
|
||||||
*
|
|
||||||
* The LLVM Compiler Infrastructure
|
|
||||||
*
|
|
||||||
* This file is distributed under the University of Illinois Open Source
|
|
||||||
* License. See LICENSE.TXT for details.
|
|
||||||
*
|
|
||||||
*===----------------------------------------------------------------------===*)
|
|
||||||
|
|
||||||
(** Bitcode writer.
|
|
||||||
|
|
||||||
This interface provides an ocaml API for the LLVM bitcode writer, the
|
|
||||||
classes in the Bitwriter library. *)
|
|
||||||
|
|
||||||
(** [write_bitcode_file m path] writes the bitcode for module [m] to the file at
|
|
||||||
[path]. Returns [true] if successful, [false] otherwise. *)
|
|
||||||
external write_bitcode_file : Llvm.llmodule -> string -> bool
|
|
||||||
= "llvm_write_bitcode_file"
|
|
||||||
|
|
||||||
(** [write_bitcode_to_fd ~unbuffered fd m] writes the bitcode for module
|
|
||||||
[m] to the channel [c]. If [unbuffered] is [true], after every write the fd
|
|
||||||
will be flushed. Returns [true] if successful, [false] otherwise. *)
|
|
||||||
external write_bitcode_to_fd : ?unbuffered:bool -> Llvm.llmodule
|
|
||||||
-> Unix.file_descr -> bool
|
|
||||||
= "llvm_write_bitcode_to_fd"
|
|
||||||
|
|
||||||
(** [output_bitcode ~unbuffered c m] writes the bitcode for module [m]
|
|
||||||
to the channel [c]. If [unbuffered] is [true], after every write the fd
|
|
||||||
will be flushed. Returns [true] if successful, [false] otherwise. *)
|
|
||||||
val output_bitcode : ?unbuffered:bool -> out_channel -> Llvm.llmodule -> bool
|
|
@ -1,323 +0,0 @@
|
|||||||
/*===-- 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. *|
|
|
||||||
|* *|
|
|
||||||
|*===----------------------------------------------------------------------===*|
|
|
||||||
|* *|
|
|
||||||
|* This file glues LLVM's ocaml interface to its C interface. These functions *|
|
|
||||||
|* are by and large transparent wrappers to the corresponding C functions. *|
|
|
||||||
|* *|
|
|
||||||
|* Note that these functions intentionally take liberties with the CAMLparamX *|
|
|
||||||
|* macros, since most of the parameters are not GC heap objects. *|
|
|
||||||
|* *|
|
|
||||||
\*===----------------------------------------------------------------------===*/
|
|
||||||
|
|
||||||
#include "llvm-c/ExecutionEngine.h"
|
|
||||||
#include "llvm-c/Target.h"
|
|
||||||
#include "caml/alloc.h"
|
|
||||||
#include "caml/custom.h"
|
|
||||||
#include "caml/fail.h"
|
|
||||||
#include "caml/memory.h"
|
|
||||||
#include <string.h>
|
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
/* Force the LLVM interpreter and JIT to be linked in. */
|
|
||||||
void llvm_initialize(void) {
|
|
||||||
LLVMLinkInInterpreter();
|
|
||||||
LLVMLinkInJIT();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* unit -> bool */
|
|
||||||
CAMLprim value llvm_initialize_native_target(value Unit) {
|
|
||||||
return Val_bool(LLVMInitializeNativeTarget());
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Can't use the recommended caml_named_value mechanism for backwards
|
|
||||||
compatibility reasons. This is largely equivalent. */
|
|
||||||
static value llvm_ee_error_exn;
|
|
||||||
|
|
||||||
CAMLprim value llvm_register_ee_exns(value Error) {
|
|
||||||
llvm_ee_error_exn = Field(Error, 0);
|
|
||||||
register_global_root(&llvm_ee_error_exn);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void llvm_raise(value Prototype, char *Message) {
|
|
||||||
CAMLparam1(Prototype);
|
|
||||||
CAMLlocal1(CamlMessage);
|
|
||||||
|
|
||||||
CamlMessage = copy_string(Message);
|
|
||||||
LLVMDisposeMessage(Message);
|
|
||||||
|
|
||||||
raise_with_arg(Prototype, CamlMessage);
|
|
||||||
abort(); /* NOTREACHED */
|
|
||||||
#ifdef CAMLnoreturn
|
|
||||||
CAMLnoreturn; /* Silences warnings, but is missing in some versions. */
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*--... Operations on generic values .......................................--*/
|
|
||||||
|
|
||||||
#define Genericvalue_val(v) (*(LLVMGenericValueRef *)(Data_custom_val(v)))
|
|
||||||
|
|
||||||
static void llvm_finalize_generic_value(value GenVal) {
|
|
||||||
LLVMDisposeGenericValue(Genericvalue_val(GenVal));
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct custom_operations generic_value_ops = {
|
|
||||||
(char *) "LLVMGenericValue",
|
|
||||||
llvm_finalize_generic_value,
|
|
||||||
custom_compare_default,
|
|
||||||
custom_hash_default,
|
|
||||||
custom_serialize_default,
|
|
||||||
custom_deserialize_default
|
|
||||||
};
|
|
||||||
|
|
||||||
static value alloc_generic_value(LLVMGenericValueRef Ref) {
|
|
||||||
value Val = alloc_custom(&generic_value_ops, sizeof(LLVMGenericValueRef), 0, 1);
|
|
||||||
Genericvalue_val(Val) = Ref;
|
|
||||||
return Val;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Llvm.lltype -> float -> t */
|
|
||||||
CAMLprim value llvm_genericvalue_of_float(LLVMTypeRef Ty, value N) {
|
|
||||||
CAMLparam1(N);
|
|
||||||
CAMLreturn(alloc_generic_value(
|
|
||||||
LLVMCreateGenericValueOfFloat(Ty, Double_val(N))));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 'a -> t */
|
|
||||||
CAMLprim value llvm_genericvalue_of_pointer(value V) {
|
|
||||||
CAMLparam1(V);
|
|
||||||
CAMLreturn(alloc_generic_value(LLVMCreateGenericValueOfPointer(Op_val(V))));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Llvm.lltype -> int -> t */
|
|
||||||
CAMLprim value llvm_genericvalue_of_int(LLVMTypeRef Ty, value Int) {
|
|
||||||
return alloc_generic_value(LLVMCreateGenericValueOfInt(Ty, Int_val(Int), 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Llvm.lltype -> int32 -> t */
|
|
||||||
CAMLprim value llvm_genericvalue_of_int32(LLVMTypeRef Ty, value Int32) {
|
|
||||||
CAMLparam1(Int32);
|
|
||||||
CAMLreturn(alloc_generic_value(
|
|
||||||
LLVMCreateGenericValueOfInt(Ty, Int32_val(Int32), 1)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Llvm.lltype -> nativeint -> t */
|
|
||||||
CAMLprim value llvm_genericvalue_of_nativeint(LLVMTypeRef Ty, value NatInt) {
|
|
||||||
CAMLparam1(NatInt);
|
|
||||||
CAMLreturn(alloc_generic_value(
|
|
||||||
LLVMCreateGenericValueOfInt(Ty, Nativeint_val(NatInt), 1)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Llvm.lltype -> int64 -> t */
|
|
||||||
CAMLprim value llvm_genericvalue_of_int64(LLVMTypeRef Ty, value Int64) {
|
|
||||||
CAMLparam1(Int64);
|
|
||||||
CAMLreturn(alloc_generic_value(
|
|
||||||
LLVMCreateGenericValueOfInt(Ty, Int64_val(Int64), 1)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Llvm.lltype -> t -> float */
|
|
||||||
CAMLprim value llvm_genericvalue_as_float(LLVMTypeRef Ty, value GenVal) {
|
|
||||||
CAMLparam1(GenVal);
|
|
||||||
CAMLreturn(copy_double(
|
|
||||||
LLVMGenericValueToFloat(Ty, Genericvalue_val(GenVal))));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* t -> 'a */
|
|
||||||
CAMLprim value llvm_genericvalue_as_pointer(value GenVal) {
|
|
||||||
return Val_op(LLVMGenericValueToPointer(Genericvalue_val(GenVal)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* t -> int */
|
|
||||||
CAMLprim value llvm_genericvalue_as_int(value GenVal) {
|
|
||||||
assert(LLVMGenericValueIntWidth(Genericvalue_val(GenVal)) <= 8 * sizeof(value)
|
|
||||||
&& "Generic value too wide to treat as an int!");
|
|
||||||
return Val_int(LLVMGenericValueToInt(Genericvalue_val(GenVal), 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* t -> int32 */
|
|
||||||
CAMLprim value llvm_genericvalue_as_int32(value GenVal) {
|
|
||||||
CAMLparam1(GenVal);
|
|
||||||
assert(LLVMGenericValueIntWidth(Genericvalue_val(GenVal)) <= 32
|
|
||||||
&& "Generic value too wide to treat as an int32!");
|
|
||||||
CAMLreturn(copy_int32(LLVMGenericValueToInt(Genericvalue_val(GenVal), 1)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* t -> int64 */
|
|
||||||
CAMLprim value llvm_genericvalue_as_int64(value GenVal) {
|
|
||||||
CAMLparam1(GenVal);
|
|
||||||
assert(LLVMGenericValueIntWidth(Genericvalue_val(GenVal)) <= 64
|
|
||||||
&& "Generic value too wide to treat as an int64!");
|
|
||||||
CAMLreturn(copy_int64(LLVMGenericValueToInt(Genericvalue_val(GenVal), 1)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* t -> nativeint */
|
|
||||||
CAMLprim value llvm_genericvalue_as_nativeint(value GenVal) {
|
|
||||||
CAMLparam1(GenVal);
|
|
||||||
assert(LLVMGenericValueIntWidth(Genericvalue_val(GenVal)) <= 8 * sizeof(value)
|
|
||||||
&& "Generic value too wide to treat as a nativeint!");
|
|
||||||
CAMLreturn(copy_nativeint(LLVMGenericValueToInt(Genericvalue_val(GenVal),1)));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*--... Operations on execution engines ....................................--*/
|
|
||||||
|
|
||||||
/* llmodule -> ExecutionEngine.t */
|
|
||||||
CAMLprim LLVMExecutionEngineRef llvm_ee_create(LLVMModuleRef M) {
|
|
||||||
LLVMExecutionEngineRef Interp;
|
|
||||||
char *Error;
|
|
||||||
if (LLVMCreateExecutionEngineForModule(&Interp, M, &Error))
|
|
||||||
llvm_raise(llvm_ee_error_exn, Error);
|
|
||||||
return Interp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* llmodule -> ExecutionEngine.t */
|
|
||||||
CAMLprim LLVMExecutionEngineRef
|
|
||||||
llvm_ee_create_interpreter(LLVMModuleRef M) {
|
|
||||||
LLVMExecutionEngineRef Interp;
|
|
||||||
char *Error;
|
|
||||||
if (LLVMCreateInterpreterForModule(&Interp, M, &Error))
|
|
||||||
llvm_raise(llvm_ee_error_exn, Error);
|
|
||||||
return Interp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* llmodule -> int -> ExecutionEngine.t */
|
|
||||||
CAMLprim LLVMExecutionEngineRef
|
|
||||||
llvm_ee_create_jit(LLVMModuleRef M, value OptLevel) {
|
|
||||||
LLVMExecutionEngineRef JIT;
|
|
||||||
char *Error;
|
|
||||||
if (LLVMCreateJITCompilerForModule(&JIT, M, Int_val(OptLevel), &Error))
|
|
||||||
llvm_raise(llvm_ee_error_exn, Error);
|
|
||||||
return JIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ExecutionEngine.t -> unit */
|
|
||||||
CAMLprim value llvm_ee_dispose(LLVMExecutionEngineRef EE) {
|
|
||||||
LLVMDisposeExecutionEngine(EE);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* llmodule -> ExecutionEngine.t -> unit */
|
|
||||||
CAMLprim value llvm_ee_add_module(LLVMModuleRef M, LLVMExecutionEngineRef EE) {
|
|
||||||
LLVMAddModule(EE, M);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* llmodule -> ExecutionEngine.t -> llmodule */
|
|
||||||
CAMLprim LLVMModuleRef llvm_ee_remove_module(LLVMModuleRef M,
|
|
||||||
LLVMExecutionEngineRef EE) {
|
|
||||||
LLVMModuleRef RemovedModule;
|
|
||||||
char *Error;
|
|
||||||
if (LLVMRemoveModule(EE, M, &RemovedModule, &Error))
|
|
||||||
llvm_raise(llvm_ee_error_exn, Error);
|
|
||||||
return RemovedModule;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* string -> ExecutionEngine.t -> llvalue option */
|
|
||||||
CAMLprim value llvm_ee_find_function(value Name, LLVMExecutionEngineRef EE) {
|
|
||||||
CAMLparam1(Name);
|
|
||||||
CAMLlocal1(Option);
|
|
||||||
LLVMValueRef Found;
|
|
||||||
if (LLVMFindFunction(EE, String_val(Name), &Found))
|
|
||||||
CAMLreturn(Val_unit);
|
|
||||||
Option = alloc(1, 0);
|
|
||||||
Field(Option, 0) = Val_op(Found);
|
|
||||||
CAMLreturn(Option);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* llvalue -> GenericValue.t array -> ExecutionEngine.t -> GenericValue.t */
|
|
||||||
CAMLprim value llvm_ee_run_function(LLVMValueRef F, value Args,
|
|
||||||
LLVMExecutionEngineRef EE) {
|
|
||||||
unsigned NumArgs;
|
|
||||||
LLVMGenericValueRef Result, *GVArgs;
|
|
||||||
unsigned I;
|
|
||||||
|
|
||||||
NumArgs = Wosize_val(Args);
|
|
||||||
GVArgs = (LLVMGenericValueRef*) malloc(NumArgs * sizeof(LLVMGenericValueRef));
|
|
||||||
for (I = 0; I != NumArgs; ++I)
|
|
||||||
GVArgs[I] = Genericvalue_val(Field(Args, I));
|
|
||||||
|
|
||||||
Result = LLVMRunFunction(EE, F, NumArgs, GVArgs);
|
|
||||||
|
|
||||||
free(GVArgs);
|
|
||||||
return alloc_generic_value(Result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ExecutionEngine.t -> unit */
|
|
||||||
CAMLprim value llvm_ee_run_static_ctors(LLVMExecutionEngineRef EE) {
|
|
||||||
LLVMRunStaticConstructors(EE);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ExecutionEngine.t -> unit */
|
|
||||||
CAMLprim value llvm_ee_run_static_dtors(LLVMExecutionEngineRef EE) {
|
|
||||||
LLVMRunStaticDestructors(EE);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* llvalue -> string array -> (string * string) array -> ExecutionEngine.t ->
|
|
||||||
int */
|
|
||||||
CAMLprim value llvm_ee_run_function_as_main(LLVMValueRef F,
|
|
||||||
value Args, value Env,
|
|
||||||
LLVMExecutionEngineRef EE) {
|
|
||||||
CAMLparam2(Args, Env);
|
|
||||||
int I, NumArgs, NumEnv, EnvSize, Result;
|
|
||||||
const char **CArgs, **CEnv;
|
|
||||||
char *CEnvBuf, *Pos;
|
|
||||||
|
|
||||||
NumArgs = Wosize_val(Args);
|
|
||||||
NumEnv = Wosize_val(Env);
|
|
||||||
|
|
||||||
/* Build the environment. */
|
|
||||||
CArgs = (const char **) malloc(NumArgs * sizeof(char*));
|
|
||||||
for (I = 0; I != NumArgs; ++I)
|
|
||||||
CArgs[I] = String_val(Field(Args, I));
|
|
||||||
|
|
||||||
/* Compute the size of the environment string buffer. */
|
|
||||||
for (I = 0, EnvSize = 0; I != NumEnv; ++I) {
|
|
||||||
EnvSize += strlen(String_val(Field(Field(Env, I), 0))) + 1;
|
|
||||||
EnvSize += strlen(String_val(Field(Field(Env, I), 1))) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Build the environment. */
|
|
||||||
CEnv = (const char **) malloc((NumEnv + 1) * sizeof(char*));
|
|
||||||
CEnvBuf = (char*) malloc(EnvSize);
|
|
||||||
Pos = CEnvBuf;
|
|
||||||
for (I = 0; I != NumEnv; ++I) {
|
|
||||||
char *Name = String_val(Field(Field(Env, I), 0)),
|
|
||||||
*Value = String_val(Field(Field(Env, I), 1));
|
|
||||||
int NameLen = strlen(Name),
|
|
||||||
ValueLen = strlen(Value);
|
|
||||||
|
|
||||||
CEnv[I] = Pos;
|
|
||||||
memcpy(Pos, Name, NameLen);
|
|
||||||
Pos += NameLen;
|
|
||||||
*Pos++ = '=';
|
|
||||||
memcpy(Pos, Value, ValueLen);
|
|
||||||
Pos += ValueLen;
|
|
||||||
*Pos++ = '\0';
|
|
||||||
}
|
|
||||||
CEnv[NumEnv] = NULL;
|
|
||||||
|
|
||||||
Result = LLVMRunFunctionAsMain(EE, F, NumArgs, CArgs, CEnv);
|
|
||||||
|
|
||||||
free(CArgs);
|
|
||||||
free(CEnv);
|
|
||||||
free(CEnvBuf);
|
|
||||||
|
|
||||||
CAMLreturn(Val_int(Result));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* llvalue -> ExecutionEngine.t -> unit */
|
|
||||||
CAMLprim value llvm_ee_free_machine_code(LLVMValueRef F,
|
|
||||||
LLVMExecutionEngineRef EE) {
|
|
||||||
LLVMFreeMachineCodeForFunction(EE, F);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
@ -1,112 +0,0 @@
|
|||||||
(*===-- llvm_executionengine.ml - LLVM Ocaml Interface ----------*- C++ -*-===*
|
|
||||||
*
|
|
||||||
* The LLVM Compiler Infrastructure
|
|
||||||
*
|
|
||||||
* This file is distributed under the University of Illinois Open Source
|
|
||||||
* License. See LICENSE.TXT for details.
|
|
||||||
*
|
|
||||||
*===----------------------------------------------------------------------===*)
|
|
||||||
|
|
||||||
|
|
||||||
exception Error of string
|
|
||||||
|
|
||||||
external register_exns: exn -> unit
|
|
||||||
= "llvm_register_ee_exns"
|
|
||||||
|
|
||||||
|
|
||||||
module GenericValue = struct
|
|
||||||
type t
|
|
||||||
|
|
||||||
external of_float: Llvm.lltype -> float -> t
|
|
||||||
= "llvm_genericvalue_of_float"
|
|
||||||
external of_pointer: 'a -> t
|
|
||||||
= "llvm_genericvalue_of_pointer"
|
|
||||||
external of_int32: Llvm.lltype -> int32 -> t
|
|
||||||
= "llvm_genericvalue_of_int32"
|
|
||||||
external of_int: Llvm.lltype -> int -> t
|
|
||||||
= "llvm_genericvalue_of_int"
|
|
||||||
external of_nativeint: Llvm.lltype -> nativeint -> t
|
|
||||||
= "llvm_genericvalue_of_nativeint"
|
|
||||||
external of_int64: Llvm.lltype -> int64 -> t
|
|
||||||
= "llvm_genericvalue_of_int64"
|
|
||||||
|
|
||||||
external as_float: Llvm.lltype -> t -> float
|
|
||||||
= "llvm_genericvalue_as_float"
|
|
||||||
external as_pointer: t -> 'a
|
|
||||||
= "llvm_genericvalue_as_pointer"
|
|
||||||
external as_int32: t -> int32
|
|
||||||
= "llvm_genericvalue_as_int32"
|
|
||||||
external as_int: t -> int
|
|
||||||
= "llvm_genericvalue_as_int"
|
|
||||||
external as_nativeint: t -> nativeint
|
|
||||||
= "llvm_genericvalue_as_nativeint"
|
|
||||||
external as_int64: t -> int64
|
|
||||||
= "llvm_genericvalue_as_int64"
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
module ExecutionEngine = struct
|
|
||||||
type t
|
|
||||||
|
|
||||||
(* FIXME: Ocaml is not running this setup code unless we use 'val' in the
|
|
||||||
interface, which causes the emission of a stub for each function;
|
|
||||||
using 'external' in the module allows direct calls into
|
|
||||||
ocaml_executionengine.c. This is hardly fatal, but it is unnecessary
|
|
||||||
overhead on top of the two stubs that are already invoked for each
|
|
||||||
call into LLVM. *)
|
|
||||||
let _ = register_exns (Error "")
|
|
||||||
|
|
||||||
external create: Llvm.llmodule -> t
|
|
||||||
= "llvm_ee_create"
|
|
||||||
external create_interpreter: Llvm.llmodule -> t
|
|
||||||
= "llvm_ee_create_interpreter"
|
|
||||||
external create_jit: Llvm.llmodule -> int -> t
|
|
||||||
= "llvm_ee_create_jit"
|
|
||||||
external dispose: t -> unit
|
|
||||||
= "llvm_ee_dispose"
|
|
||||||
external add_module: Llvm.llmodule -> t -> unit
|
|
||||||
= "llvm_ee_add_module"
|
|
||||||
external remove_module: Llvm.llmodule -> t -> Llvm.llmodule
|
|
||||||
= "llvm_ee_remove_module"
|
|
||||||
external find_function: string -> t -> Llvm.llvalue option
|
|
||||||
= "llvm_ee_find_function"
|
|
||||||
external run_function: Llvm.llvalue -> GenericValue.t array -> t ->
|
|
||||||
GenericValue.t
|
|
||||||
= "llvm_ee_run_function"
|
|
||||||
external run_static_ctors: t -> unit
|
|
||||||
= "llvm_ee_run_static_ctors"
|
|
||||||
external run_static_dtors: t -> unit
|
|
||||||
= "llvm_ee_run_static_dtors"
|
|
||||||
external run_function_as_main: Llvm.llvalue -> string array ->
|
|
||||||
(string * string) array -> t -> int
|
|
||||||
= "llvm_ee_run_function_as_main"
|
|
||||||
external free_machine_code: Llvm.llvalue -> t -> unit
|
|
||||||
= "llvm_ee_free_machine_code"
|
|
||||||
|
|
||||||
external target_data: t -> Llvm_target.TargetData.t
|
|
||||||
= "LLVMGetExecutionEngineTargetData"
|
|
||||||
|
|
||||||
(* The following are not bound. Patches are welcome.
|
|
||||||
|
|
||||||
get_target_data: t -> lltargetdata
|
|
||||||
add_global_mapping: llvalue -> llgenericvalue -> t -> unit
|
|
||||||
clear_all_global_mappings: t -> unit
|
|
||||||
update_global_mapping: llvalue -> llgenericvalue -> t -> unit
|
|
||||||
get_pointer_to_global_if_available: llvalue -> t -> llgenericvalue
|
|
||||||
get_pointer_to_global: llvalue -> t -> llgenericvalue
|
|
||||||
get_pointer_to_function: llvalue -> t -> llgenericvalue
|
|
||||||
get_pointer_to_function_or_stub: llvalue -> t -> llgenericvalue
|
|
||||||
get_global_value_at_address: llgenericvalue -> t -> llvalue option
|
|
||||||
store_value_to_memory: llgenericvalue -> llgenericvalue -> lltype -> unit
|
|
||||||
initialize_memory: llvalue -> llgenericvalue -> t -> unit
|
|
||||||
recompile_and_relink_function: llvalue -> t -> llgenericvalue
|
|
||||||
get_or_emit_global_variable: llvalue -> t -> llgenericvalue
|
|
||||||
disable_lazy_compilation: t -> unit
|
|
||||||
lazy_compilation_enabled: t -> bool
|
|
||||||
install_lazy_function_creator: (string -> llgenericvalue) -> t -> unit
|
|
||||||
|
|
||||||
*)
|
|
||||||
end
|
|
||||||
|
|
||||||
external initialize_native_target : unit -> bool
|
|
||||||
= "llvm_initialize_native_target"
|
|
@ -1,163 +0,0 @@
|
|||||||
(*===-- llvm_executionengine.mli - LLVM Ocaml Interface ---------*- C++ -*-===*
|
|
||||||
*
|
|
||||||
* The LLVM Compiler Infrastructure
|
|
||||||
*
|
|
||||||
* This file is distributed under the University of Illinois Open Source
|
|
||||||
* License. See LICENSE.TXT for details.
|
|
||||||
*
|
|
||||||
*===----------------------------------------------------------------------===*)
|
|
||||||
|
|
||||||
(** JIT Interpreter.
|
|
||||||
|
|
||||||
This interface provides an ocaml API for LLVM execution engine (JIT/
|
|
||||||
interpreter), the classes in the ExecutionEngine library. *)
|
|
||||||
|
|
||||||
exception Error of string
|
|
||||||
|
|
||||||
module GenericValue: sig
|
|
||||||
(** [GenericValue.t] is a boxed union type used to portably pass arguments to
|
|
||||||
and receive values from the execution engine. It supports only a limited
|
|
||||||
selection of types; for more complex argument types, it is necessary to
|
|
||||||
generate a stub function by hand or to pass parameters by reference.
|
|
||||||
See the struct [llvm::GenericValue]. *)
|
|
||||||
type t
|
|
||||||
|
|
||||||
(** [of_float fpty n] boxes the float [n] in a float-valued generic value
|
|
||||||
according to the floating point type [fpty]. See the fields
|
|
||||||
[llvm::GenericValue::DoubleVal] and [llvm::GenericValue::FloatVal]. *)
|
|
||||||
val of_float : Llvm.lltype -> float -> t
|
|
||||||
|
|
||||||
(** [of_pointer v] boxes the pointer value [v] in a generic value. See the
|
|
||||||
field [llvm::GenericValue::PointerVal]. *)
|
|
||||||
val of_pointer : 'a -> t
|
|
||||||
|
|
||||||
(** [of_int32 n w] boxes the int32 [i] in a generic value with the bitwidth
|
|
||||||
[w]. See the field [llvm::GenericValue::IntVal]. *)
|
|
||||||
val of_int32 : Llvm.lltype -> int32 -> t
|
|
||||||
|
|
||||||
(** [of_int n w] boxes the int [i] in a generic value with the bitwidth
|
|
||||||
[w]. See the field [llvm::GenericValue::IntVal]. *)
|
|
||||||
val of_int : Llvm.lltype -> int -> t
|
|
||||||
|
|
||||||
(** [of_natint n w] boxes the native int [i] in a generic value with the
|
|
||||||
bitwidth [w]. See the field [llvm::GenericValue::IntVal]. *)
|
|
||||||
val of_nativeint : Llvm.lltype -> nativeint -> t
|
|
||||||
|
|
||||||
|
|
||||||
(** [of_int64 n w] boxes the int64 [i] in a generic value with the bitwidth
|
|
||||||
[w]. See the field [llvm::GenericValue::IntVal]. *)
|
|
||||||
val of_int64 : Llvm.lltype -> int64 -> t
|
|
||||||
|
|
||||||
(** [as_float fpty gv] unboxes the floating point-valued generic value [gv] of
|
|
||||||
floating point type [fpty]. See the fields [llvm::GenericValue::DoubleVal]
|
|
||||||
and [llvm::GenericValue::FloatVal]. *)
|
|
||||||
val as_float : Llvm.lltype -> t -> float
|
|
||||||
|
|
||||||
(** [as_pointer gv] unboxes the pointer-valued generic value [gv]. See the
|
|
||||||
field [llvm::GenericValue::PointerVal]. *)
|
|
||||||
val as_pointer : t -> 'a
|
|
||||||
|
|
||||||
(** [as_int32 gv] unboxes the integer-valued generic value [gv] as an [int32].
|
|
||||||
Is invalid if [gv] has a bitwidth greater than 32 bits. See the field
|
|
||||||
[llvm::GenericValue::IntVal]. *)
|
|
||||||
val as_int32 : t -> int32
|
|
||||||
|
|
||||||
(** [as_int gv] unboxes the integer-valued generic value [gv] as an [int].
|
|
||||||
Is invalid if [gv] has a bitwidth greater than the host bit width (but the
|
|
||||||
most significant bit may be lost). See the field
|
|
||||||
[llvm::GenericValue::IntVal]. *)
|
|
||||||
val as_int : t -> int
|
|
||||||
|
|
||||||
(** [as_natint gv] unboxes the integer-valued generic value [gv] as a
|
|
||||||
[nativeint]. Is invalid if [gv] has a bitwidth greater than
|
|
||||||
[nativeint]. See the field [llvm::GenericValue::IntVal]. *)
|
|
||||||
val as_nativeint : t -> nativeint
|
|
||||||
|
|
||||||
(** [as_int64 gv] returns the integer-valued generic value [gv] as an [int64].
|
|
||||||
Is invalid if [gv] has a bitwidth greater than [int64]. See the field
|
|
||||||
[llvm::GenericValue::IntVal]. *)
|
|
||||||
val as_int64 : t -> int64
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
module ExecutionEngine: sig
|
|
||||||
(** An execution engine is either a JIT compiler or an interpreter, capable of
|
|
||||||
directly loading an LLVM module and executing its functions without first
|
|
||||||
invoking a static compiler and generating a native executable. *)
|
|
||||||
type t
|
|
||||||
|
|
||||||
(** [create m] creates a new execution engine, taking ownership of the
|
|
||||||
module [m] if successful. Creates a JIT if possible, else falls back to an
|
|
||||||
interpreter. Raises [Error msg] if an error occurrs. The execution engine
|
|
||||||
is not garbage collected and must be destroyed with [dispose ee].
|
|
||||||
See the function [llvm::EngineBuilder::create]. *)
|
|
||||||
val create : Llvm.llmodule -> t
|
|
||||||
|
|
||||||
(** [create_interpreter m] creates a new interpreter, taking ownership of the
|
|
||||||
module [m] if successful. Raises [Error msg] if an error occurrs. The
|
|
||||||
execution engine is not garbage collected and must be destroyed with
|
|
||||||
[dispose ee].
|
|
||||||
See the function [llvm::EngineBuilder::create]. *)
|
|
||||||
val create_interpreter : Llvm.llmodule -> t
|
|
||||||
|
|
||||||
(** [create_jit m optlevel] creates a new JIT (just-in-time compiler), taking
|
|
||||||
ownership of the module [m] if successful with the desired optimization
|
|
||||||
level [optlevel]. Raises [Error msg] if an error occurrs. The execution
|
|
||||||
engine is not garbage collected and must be destroyed with [dispose ee].
|
|
||||||
See the function [llvm::EngineBuilder::create]. *)
|
|
||||||
val create_jit : Llvm.llmodule -> int -> t
|
|
||||||
|
|
||||||
(** [dispose ee] releases the memory used by the execution engine and must be
|
|
||||||
invoked to avoid memory leaks. *)
|
|
||||||
val dispose : t -> unit
|
|
||||||
|
|
||||||
(** [add_module m ee] adds the module [m] to the execution engine [ee]. *)
|
|
||||||
val add_module : Llvm.llmodule -> t -> unit
|
|
||||||
|
|
||||||
(** [remove_module m ee] removes the module [m] from the execution engine
|
|
||||||
[ee], disposing of [m] and the module referenced by [mp]. Raises
|
|
||||||
[Error msg] if an error occurs. *)
|
|
||||||
val remove_module : Llvm.llmodule -> t -> Llvm.llmodule
|
|
||||||
|
|
||||||
|
|
||||||
(** [find_function n ee] finds the function named [n] defined in any of the
|
|
||||||
modules owned by the execution engine [ee]. Returns [None] if the function
|
|
||||||
is not found and [Some f] otherwise. *)
|
|
||||||
val find_function : string -> t -> Llvm.llvalue option
|
|
||||||
|
|
||||||
|
|
||||||
(** [run_function f args ee] synchronously executes the function [f] with the
|
|
||||||
arguments [args], which must be compatible with the parameter types. *)
|
|
||||||
val run_function : Llvm.llvalue -> GenericValue.t array -> t ->
|
|
||||||
GenericValue.t
|
|
||||||
|
|
||||||
|
|
||||||
(** [run_static_ctors ee] executes the static constructors of each module in
|
|
||||||
the execution engine [ee]. *)
|
|
||||||
val run_static_ctors : t -> unit
|
|
||||||
|
|
||||||
(** [run_static_dtors ee] executes the static destructors of each module in
|
|
||||||
the execution engine [ee]. *)
|
|
||||||
val run_static_dtors : t -> unit
|
|
||||||
|
|
||||||
(** [run_function_as_main f args env ee] executes the function [f] as a main
|
|
||||||
function, passing it [argv] and [argc] according to the string array
|
|
||||||
[args], and [envp] as specified by the array [env]. Returns the integer
|
|
||||||
return value of the function. *)
|
|
||||||
val run_function_as_main : Llvm.llvalue -> string array ->
|
|
||||||
(string * string) array -> t -> int
|
|
||||||
|
|
||||||
|
|
||||||
(** [free_machine_code f ee] releases the memory in the execution engine [ee]
|
|
||||||
used to store the machine code for the function [f]. *)
|
|
||||||
val free_machine_code : Llvm.llvalue -> t -> unit
|
|
||||||
|
|
||||||
|
|
||||||
(** [target_data ee] is the target data owned by the execution engine
|
|
||||||
[ee]. *)
|
|
||||||
val target_data : t -> Llvm_target.TargetData.t
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
val initialize_native_target : unit -> bool
|
|
||||||
|
|
@ -1,63 +0,0 @@
|
|||||||
name = "llvm"
|
|
||||||
version = "@PACKAGE_VERSION@"
|
|
||||||
description = "LLVM OCaml bindings"
|
|
||||||
archive(byte) = "llvm.cma"
|
|
||||||
archive(native) = "llvm.cmxa"
|
|
||||||
directory = "."
|
|
||||||
linkopts = "-ccopt -lstdc++"
|
|
||||||
|
|
||||||
package "analysis" (
|
|
||||||
requires = "llvm"
|
|
||||||
version = "@PACKAGE_VERSION@"
|
|
||||||
description = "Intermediate representation analysis for LLVM"
|
|
||||||
archive(byte) = "llvm_analysis.cma"
|
|
||||||
archive(native) = "llvm_analysis.cmxa"
|
|
||||||
)
|
|
||||||
|
|
||||||
package "bitreader" (
|
|
||||||
requires = "llvm"
|
|
||||||
version = "@PACKAGE_VERSION@"
|
|
||||||
description = "Bitcode reader for LLVM"
|
|
||||||
archive(byte) = "llvm_bitreader.cma"
|
|
||||||
archive(native) = "llvm_bitreader.cmxa"
|
|
||||||
)
|
|
||||||
|
|
||||||
package "bitwriter" (
|
|
||||||
requires = "llvm,unix"
|
|
||||||
version = "@PACKAGE_VERSION@"
|
|
||||||
description = "Bitcode writer for LLVM"
|
|
||||||
archive(byte) = "llvm_bitwriter.cma"
|
|
||||||
archive(native) = "llvm_bitwriter.cmxa"
|
|
||||||
)
|
|
||||||
|
|
||||||
package "executionengine" (
|
|
||||||
requires = "llvm,llvm.target"
|
|
||||||
version = "@PACKAGE_VERSION@"
|
|
||||||
description = "JIT and Interpreter for LLVM"
|
|
||||||
archive(byte) = "llvm_executionengine.cma"
|
|
||||||
archive(native) = "llvm_executionengine.cmxa"
|
|
||||||
)
|
|
||||||
|
|
||||||
package "ipo" (
|
|
||||||
requires = "llvm"
|
|
||||||
version = "@PACKAGE_VERSION@"
|
|
||||||
description = "IPO Transforms for LLVM"
|
|
||||||
archive(byte) = "llvm_ipo.cma"
|
|
||||||
archive(native) = "llvm_ipo.cmxa"
|
|
||||||
)
|
|
||||||
|
|
||||||
package "scalar_opts" (
|
|
||||||
requires = "llvm"
|
|
||||||
version = "@PACKAGE_VERSION@"
|
|
||||||
description = "Scalar Transforms for LLVM"
|
|
||||||
archive(byte) = "llvm_scalar_opts.cma"
|
|
||||||
archive(native) = "llvm_scalar_opts.cmxa"
|
|
||||||
)
|
|
||||||
|
|
||||||
package "target" (
|
|
||||||
requires = "llvm"
|
|
||||||
version = "@PACKAGE_VERSION@"
|
|
||||||
description = "Target Information for LLVM"
|
|
||||||
archive(byte) = "llvm_target.cma"
|
|
||||||
archive(native) = "llvm_target.cmxa"
|
|
||||||
)
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,42 +0,0 @@
|
|||||||
(*===-- 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.
|
|
||||||
*
|
|
||||||
*===----------------------------------------------------------------------===*)
|
|
||||||
|
|
||||||
module Endian = struct
|
|
||||||
type t =
|
|
||||||
| Big
|
|
||||||
| Little
|
|
||||||
end
|
|
||||||
|
|
||||||
module TargetData = struct
|
|
||||||
type t
|
|
||||||
|
|
||||||
external create : string -> t = "llvm_targetdata_create"
|
|
||||||
external add : t -> [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_targetdata_add"
|
|
||||||
external as_string : t -> string = "llvm_targetdata_as_string"
|
|
||||||
external dispose : t -> unit = "llvm_targetdata_dispose"
|
|
||||||
end
|
|
||||||
|
|
||||||
external byte_order : TargetData.t -> Endian.t = "llvm_byte_order"
|
|
||||||
external pointer_size : TargetData.t -> int = "llvm_pointer_size"
|
|
||||||
external intptr_type : TargetData.t -> Llvm.lltype = "LLVMIntPtrType"
|
|
||||||
external size_in_bits : TargetData.t -> Llvm.lltype -> Int64.t
|
|
||||||
= "llvm_size_in_bits"
|
|
||||||
external store_size : TargetData.t -> Llvm.lltype -> Int64.t = "llvm_store_size"
|
|
||||||
external abi_size : TargetData.t -> Llvm.lltype -> Int64.t = "llvm_abi_size"
|
|
||||||
external abi_align : TargetData.t -> Llvm.lltype -> int = "llvm_abi_align"
|
|
||||||
external stack_align : TargetData.t -> Llvm.lltype -> int = "llvm_stack_align"
|
|
||||||
external preferred_align : TargetData.t -> Llvm.lltype -> int
|
|
||||||
= "llvm_preferred_align"
|
|
||||||
external preferred_align_of_global : TargetData.t -> Llvm.llvalue -> int
|
|
||||||
= "llvm_preferred_align_of_global"
|
|
||||||
external element_at_offset : TargetData.t -> Llvm.lltype -> Int64.t -> int
|
|
||||||
= "llvm_element_at_offset"
|
|
||||||
external offset_of_element : TargetData.t -> Llvm.lltype -> int -> Int64.t
|
|
||||||
= "llvm_offset_of_element"
|
|
@ -1,95 +0,0 @@
|
|||||||
(*===-- 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.
|
|
||||||
*
|
|
||||||
*===----------------------------------------------------------------------===*)
|
|
||||||
|
|
||||||
(** Target Information.
|
|
||||||
|
|
||||||
This interface provides an ocaml API for LLVM target information,
|
|
||||||
the classes in the Target library. *)
|
|
||||||
|
|
||||||
module Endian : sig
|
|
||||||
type t =
|
|
||||||
| Big
|
|
||||||
| Little
|
|
||||||
end
|
|
||||||
|
|
||||||
module TargetData : sig
|
|
||||||
type t
|
|
||||||
|
|
||||||
(** [TargetData.create rep] parses the target data string representation [rep].
|
|
||||||
See the constructor llvm::TargetData::TargetData. *)
|
|
||||||
external create : string -> t = "llvm_targetdata_create"
|
|
||||||
|
|
||||||
(** [add_target_data td pm] adds the target data [td] to the pass manager [pm].
|
|
||||||
Does not take ownership of the target data.
|
|
||||||
See the method llvm::PassManagerBase::add. *)
|
|
||||||
external add : t -> [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_targetdata_add"
|
|
||||||
|
|
||||||
(** [as_string td] is the string representation of the target data [td].
|
|
||||||
See the constructor llvm::TargetData::TargetData. *)
|
|
||||||
external as_string : t -> string = "llvm_targetdata_as_string"
|
|
||||||
|
|
||||||
(** Deallocates a TargetData.
|
|
||||||
See the destructor llvm::TargetData::~TargetData. *)
|
|
||||||
external dispose : t -> unit = "llvm_targetdata_dispose"
|
|
||||||
end
|
|
||||||
|
|
||||||
(** Returns the byte order of a target, either LLVMBigEndian or
|
|
||||||
LLVMLittleEndian.
|
|
||||||
See the method llvm::TargetData::isLittleEndian. *)
|
|
||||||
external byte_order : TargetData.t -> Endian.t = "llvm_byte_order"
|
|
||||||
|
|
||||||
(** Returns the pointer size in bytes for a target.
|
|
||||||
See the method llvm::TargetData::getPointerSize. *)
|
|
||||||
external pointer_size : TargetData.t -> int = "llvm_pointer_size"
|
|
||||||
|
|
||||||
(** Returns the integer type that is the same size as a pointer on a target.
|
|
||||||
See the method llvm::TargetData::getIntPtrType. *)
|
|
||||||
external intptr_type : TargetData.t -> Llvm.lltype = "LLVMIntPtrType"
|
|
||||||
|
|
||||||
(** Computes the size of a type in bytes for a target.
|
|
||||||
See the method llvm::TargetData::getTypeSizeInBits. *)
|
|
||||||
external size_in_bits : TargetData.t -> Llvm.lltype -> Int64.t
|
|
||||||
= "llvm_size_in_bits"
|
|
||||||
|
|
||||||
(** Computes the storage size of a type in bytes for a target.
|
|
||||||
See the method llvm::TargetData::getTypeStoreSize. *)
|
|
||||||
external store_size : TargetData.t -> Llvm.lltype -> Int64.t = "llvm_store_size"
|
|
||||||
|
|
||||||
(** Computes the ABI size of a type in bytes for a target.
|
|
||||||
See the method llvm::TargetData::getTypeAllocSize. *)
|
|
||||||
external abi_size : TargetData.t -> Llvm.lltype -> Int64.t = "llvm_abi_size"
|
|
||||||
|
|
||||||
(** Computes the ABI alignment of a type in bytes for a target.
|
|
||||||
See the method llvm::TargetData::getTypeABISize. *)
|
|
||||||
external abi_align : TargetData.t -> Llvm.lltype -> int = "llvm_abi_align"
|
|
||||||
|
|
||||||
(** Computes the call frame alignment of a type in bytes for a target.
|
|
||||||
See the method llvm::TargetData::getTypeABISize. *)
|
|
||||||
external stack_align : TargetData.t -> Llvm.lltype -> int = "llvm_stack_align"
|
|
||||||
|
|
||||||
(** Computes the preferred alignment of a type in bytes for a target.
|
|
||||||
See the method llvm::TargetData::getTypeABISize. *)
|
|
||||||
external preferred_align : TargetData.t -> Llvm.lltype -> int
|
|
||||||
= "llvm_preferred_align"
|
|
||||||
|
|
||||||
(** Computes the preferred alignment of a global variable in bytes for a target.
|
|
||||||
See the method llvm::TargetData::getPreferredAlignment. *)
|
|
||||||
external preferred_align_of_global : TargetData.t -> Llvm.llvalue -> int
|
|
||||||
= "llvm_preferred_align_of_global"
|
|
||||||
|
|
||||||
(** Computes the structure element that contains the byte offset for a target.
|
|
||||||
See the method llvm::StructLayout::getElementContainingOffset. *)
|
|
||||||
external element_at_offset : TargetData.t -> Llvm.lltype -> Int64.t -> int
|
|
||||||
= "llvm_element_at_offset"
|
|
||||||
|
|
||||||
(** Computes the byte offset of the indexed struct element for a target.
|
|
||||||
See the method llvm::StructLayout::getElementContainingOffset. *)
|
|
||||||
external offset_of_element : TargetData.t -> Llvm.lltype -> int -> Int64.t
|
|
||||||
= "llvm_offset_of_element"
|
|
@ -1,102 +0,0 @@
|
|||||||
/*===-- 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. *|
|
|
||||||
|* *|
|
|
||||||
|*===----------------------------------------------------------------------===*|
|
|
||||||
|* *|
|
|
||||||
|* This file glues LLVM's ocaml interface to its C interface. These functions *|
|
|
||||||
|* are by and large transparent wrappers to the corresponding C functions. *|
|
|
||||||
|* *|
|
|
||||||
|* Note that these functions intentionally take liberties with the CAMLparamX *|
|
|
||||||
|* macros, since most of the parameters are not GC heap objects. *|
|
|
||||||
|* *|
|
|
||||||
\*===----------------------------------------------------------------------===*/
|
|
||||||
|
|
||||||
#include "llvm-c/Target.h"
|
|
||||||
#include "caml/alloc.h"
|
|
||||||
|
|
||||||
/* string -> TargetData.t */
|
|
||||||
CAMLprim LLVMTargetDataRef llvm_targetdata_create(value StringRep) {
|
|
||||||
return LLVMCreateTargetData(String_val(StringRep));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TargetData.t -> [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_targetdata_add(LLVMTargetDataRef TD, LLVMPassManagerRef PM){
|
|
||||||
LLVMAddTargetData(TD, PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TargetData.t -> string */
|
|
||||||
CAMLprim value llvm_targetdata_as_string(LLVMTargetDataRef TD) {
|
|
||||||
char *StringRep = LLVMCopyStringRepOfTargetData(TD);
|
|
||||||
value Copy = copy_string(StringRep);
|
|
||||||
LLVMDisposeMessage(StringRep);
|
|
||||||
return Copy;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TargetData.t -> unit */
|
|
||||||
CAMLprim value llvm_targetdata_dispose(LLVMTargetDataRef TD) {
|
|
||||||
LLVMDisposeTargetData(TD);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TargetData.t -> Endian.t */
|
|
||||||
CAMLprim value llvm_byte_order(LLVMTargetDataRef TD) {
|
|
||||||
return Val_int(LLVMByteOrder(TD));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TargetData.t -> int */
|
|
||||||
CAMLprim value llvm_pointer_size(LLVMTargetDataRef TD) {
|
|
||||||
return Val_int(LLVMPointerSize(TD));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TargetData.t -> Llvm.lltype -> Int64.t */
|
|
||||||
CAMLprim value llvm_size_in_bits(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
|
|
||||||
return caml_copy_int64(LLVMSizeOfTypeInBits(TD, Ty));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TargetData.t -> Llvm.lltype -> Int64.t */
|
|
||||||
CAMLprim value llvm_store_size(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
|
|
||||||
return caml_copy_int64(LLVMStoreSizeOfType(TD, Ty));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TargetData.t -> Llvm.lltype -> Int64.t */
|
|
||||||
CAMLprim value llvm_abi_size(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
|
|
||||||
return caml_copy_int64(LLVMABISizeOfType(TD, Ty));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TargetData.t -> Llvm.lltype -> int */
|
|
||||||
CAMLprim value llvm_abi_align(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
|
|
||||||
return Val_int(LLVMABIAlignmentOfType(TD, Ty));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TargetData.t -> Llvm.lltype -> int */
|
|
||||||
CAMLprim value llvm_stack_align(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
|
|
||||||
return Val_int(LLVMCallFrameAlignmentOfType(TD, Ty));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TargetData.t -> Llvm.lltype -> int */
|
|
||||||
CAMLprim value llvm_preferred_align(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
|
|
||||||
return Val_int(LLVMPreferredAlignmentOfType(TD, Ty));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TargetData.t -> Llvm.llvalue -> int */
|
|
||||||
CAMLprim value llvm_preferred_align_of_global(LLVMTargetDataRef TD,
|
|
||||||
LLVMValueRef GlobalVar) {
|
|
||||||
return Val_int(LLVMPreferredAlignmentOfGlobal(TD, GlobalVar));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TargetData.t -> Llvm.lltype -> Int64.t -> int */
|
|
||||||
CAMLprim value llvm_element_at_offset(LLVMTargetDataRef TD, LLVMTypeRef Ty,
|
|
||||||
value Offset) {
|
|
||||||
return Val_int(LLVMElementAtOffset(TD, Ty, Int_val(Offset)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TargetData.t -> Llvm.lltype -> int -> Int64.t */
|
|
||||||
CAMLprim value llvm_offset_of_element(LLVMTargetDataRef TD, LLVMTypeRef Ty,
|
|
||||||
value Index) {
|
|
||||||
return caml_copy_int64(LLVMOffsetOfElement(TD, Ty, Int_val(Index)));
|
|
||||||
}
|
|
@ -1,104 +0,0 @@
|
|||||||
/*===-- 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. *|
|
|
||||||
|* *|
|
|
||||||
|*===----------------------------------------------------------------------===*|
|
|
||||||
|* *|
|
|
||||||
|* This file glues LLVM's ocaml interface to its C interface. These functions *|
|
|
||||||
|* are by and large transparent wrappers to the corresponding C functions. *|
|
|
||||||
|* *|
|
|
||||||
|* Note that these functions intentionally take liberties with the CAMLparamX *|
|
|
||||||
|* macros, since most of the parameters are not GC heap objects. *|
|
|
||||||
|* *|
|
|
||||||
\*===----------------------------------------------------------------------===*/
|
|
||||||
|
|
||||||
#include "llvm-c/Transforms/IPO.h"
|
|
||||||
#include "caml/mlvalues.h"
|
|
||||||
#include "caml/misc.h"
|
|
||||||
|
|
||||||
/* [`Module] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_argument_promotion(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddArgumentPromotionPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [`Module] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_constant_merge(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddConstantMergePass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [`Module] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_dead_arg_elimination(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddDeadArgEliminationPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [`Module] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_function_attrs(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddFunctionAttrsPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [`Module] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_function_inlining(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddFunctionInliningPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [`Module] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_always_inliner_pass(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddAlwaysInlinerPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [`Module] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_global_dce(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddGlobalDCEPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [`Module] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_global_optimizer(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddGlobalOptimizerPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [`Module] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_ipc_propagation(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddIPConstantPropagationPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [`Module] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_prune_eh(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddPruneEHPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [`Module] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_ipsccp(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddIPSCCPPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [`Module] Llvm.PassManager.t -> bool -> unit */
|
|
||||||
CAMLprim value llvm_add_internalize(LLVMPassManagerRef PM, value AllButMain) {
|
|
||||||
LLVMAddInternalizePass(PM, Bool_val(AllButMain));
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [`Module] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_strip_dead_prototypes(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddStripDeadPrototypesPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [`Module] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_strip_symbols(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddStripSymbolsPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
@ -1,65 +0,0 @@
|
|||||||
(*===-- 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.
|
|
||||||
*
|
|
||||||
*===----------------------------------------------------------------------===*)
|
|
||||||
|
|
||||||
(** IPO Transforms.
|
|
||||||
|
|
||||||
This interface provides an ocaml API for LLVM interprocedural optimizations, the
|
|
||||||
classes in the [LLVMIPO] library. *)
|
|
||||||
|
|
||||||
(** See llvm::createAddArgumentPromotionPass *)
|
|
||||||
external add_argument_promotion : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
"llvm_add_argument_promotion"
|
|
||||||
|
|
||||||
(** See llvm::createConstantMergePass function. *)
|
|
||||||
external add_constant_merge : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
"llvm_add_constant_merge"
|
|
||||||
|
|
||||||
(** See llvm::createDeadArgEliminationPass function. *)
|
|
||||||
external add_dead_arg_elimination :
|
|
||||||
[ | `Module ] Llvm.PassManager.t -> unit = "llvm_add_dead_arg_elimination"
|
|
||||||
|
|
||||||
(** See llvm::createFunctionAttrsPass function. *)
|
|
||||||
external add_function_attrs : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
"llvm_add_function_attrs"
|
|
||||||
|
|
||||||
(** See llvm::createFunctionInliningPass function. *)
|
|
||||||
external add_function_inlining : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
"llvm_add_function_inlining"
|
|
||||||
|
|
||||||
(** See llvm::createGlobalDCEPass function. *)
|
|
||||||
external add_global_dce : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
"llvm_add_global_dce"
|
|
||||||
|
|
||||||
(** See llvm::createGlobalOptimizerPass function. *)
|
|
||||||
external add_global_optimizer : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
"llvm_add_global_optimizer"
|
|
||||||
|
|
||||||
(** See llvm::createIPConstantPropagationPass function. *)
|
|
||||||
external add_ipc_propagation : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
"llvm_add_ipc_propagation"
|
|
||||||
|
|
||||||
(** See llvm::createPruneEHPass function. *)
|
|
||||||
external add_prune_eh : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
"llvm_add_prune_eh"
|
|
||||||
|
|
||||||
(** See llvm::createIPSCCPPass function. *)
|
|
||||||
external add_ipsccp : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
"llvm_add_ipsccp"
|
|
||||||
|
|
||||||
(** See llvm::createInternalizePass function. *)
|
|
||||||
external add_internalize : [ | `Module ] Llvm.PassManager.t -> bool -> unit =
|
|
||||||
"llvm_add_internalize"
|
|
||||||
|
|
||||||
(** See llvm::createStripDeadPrototypesPass function. *)
|
|
||||||
external add_strip_dead_prototypes :
|
|
||||||
[ | `Module ] Llvm.PassManager.t -> unit = "llvm_add_strip_dead_prototypes"
|
|
||||||
|
|
||||||
(** See llvm::createStripSymbolsPass function. *)
|
|
||||||
external add_strip_symbols : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
"llvm_add_strip_symbols"
|
|
@ -1,65 +0,0 @@
|
|||||||
(*===-- 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.
|
|
||||||
*
|
|
||||||
*===----------------------------------------------------------------------===*)
|
|
||||||
|
|
||||||
(** IPO Transforms.
|
|
||||||
|
|
||||||
This interface provides an ocaml API for LLVM interprocedural optimizations, the
|
|
||||||
classes in the [LLVMIPO] library. *)
|
|
||||||
|
|
||||||
(** See llvm::createAddArgumentPromotionPass *)
|
|
||||||
external add_argument_promotion : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
|
|
||||||
"llvm_add_argument_promotion"
|
|
||||||
(** See llvm::createConstantMergePass function. *)
|
|
||||||
external add_constant_merge : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
"llvm_add_constant_merge"
|
|
||||||
|
|
||||||
(** See llvm::createDeadArgEliminationPass function. *)
|
|
||||||
external add_dead_arg_elimination :
|
|
||||||
[ | `Module ] Llvm.PassManager.t -> unit = "llvm_add_dead_arg_elimination"
|
|
||||||
|
|
||||||
(** See llvm::createFunctionAttrsPass function. *)
|
|
||||||
external add_function_attrs : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
"llvm_add_function_attrs"
|
|
||||||
|
|
||||||
(** See llvm::createFunctionInliningPass function. *)
|
|
||||||
external add_function_inlining : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
"llvm_add_function_inlining"
|
|
||||||
|
|
||||||
(** See llvm::createGlobalDCEPass function. *)
|
|
||||||
external add_global_dce : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
"llvm_add_global_dce"
|
|
||||||
|
|
||||||
(** See llvm::createGlobalOptimizerPass function. *)
|
|
||||||
external add_global_optimizer : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
"llvm_add_global_optimizer"
|
|
||||||
|
|
||||||
(** See llvm::createIPConstantPropagationPass function. *)
|
|
||||||
external add_ipc_propagation : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
"llvm_add_ipc_propagation"
|
|
||||||
|
|
||||||
(** See llvm::createPruneEHPass function. *)
|
|
||||||
external add_prune_eh : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
"llvm_add_prune_eh"
|
|
||||||
|
|
||||||
(** See llvm::createIPSCCPPass function. *)
|
|
||||||
external add_ipsccp : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
"llvm_add_ipsccp"
|
|
||||||
|
|
||||||
(** See llvm::createInternalizePass function. *)
|
|
||||||
external add_internalize : [ | `Module ] Llvm.PassManager.t -> bool -> unit =
|
|
||||||
"llvm_add_internalize"
|
|
||||||
|
|
||||||
(** See llvm::createStripDeadPrototypesPass function. *)
|
|
||||||
external add_strip_dead_prototypes :
|
|
||||||
[ | `Module ] Llvm.PassManager.t -> unit = "llvm_add_strip_dead_prototypes"
|
|
||||||
|
|
||||||
(** See llvm::createStripSymbolsPass function. *)
|
|
||||||
external add_strip_symbols : [ | `Module ] Llvm.PassManager.t -> unit =
|
|
||||||
"llvm_add_strip_symbols"
|
|
@ -1,111 +0,0 @@
|
|||||||
(*===-- 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.
|
|
||||||
*
|
|
||||||
*===----------------------------------------------------------------------===*)
|
|
||||||
|
|
||||||
external add_constant_propagation : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_constant_propagation"
|
|
||||||
external add_sccp : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_sccp"
|
|
||||||
external add_dead_store_elimination : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_dead_store_elimination"
|
|
||||||
external add_aggressive_dce : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_aggressive_dce"
|
|
||||||
external
|
|
||||||
add_scalar_repl_aggregation : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_scalar_repl_aggregation"
|
|
||||||
|
|
||||||
external
|
|
||||||
add_scalar_repl_aggregation_ssa : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_scalar_repl_aggregation_ssa"
|
|
||||||
|
|
||||||
external
|
|
||||||
add_scalar_repl_aggregation_with_threshold : int -> [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_scalar_repl_aggregation_with_threshold"
|
|
||||||
external add_ind_var_simplification : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_ind_var_simplification"
|
|
||||||
external
|
|
||||||
add_instruction_combination : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_instruction_combination"
|
|
||||||
external add_licm : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_licm"
|
|
||||||
external add_loop_unswitch : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_loop_unswitch"
|
|
||||||
external add_loop_unroll : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_loop_unroll"
|
|
||||||
external add_loop_rotation : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_loop_rotation"
|
|
||||||
external
|
|
||||||
add_memory_to_register_promotion : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_memory_to_register_promotion"
|
|
||||||
external
|
|
||||||
add_memory_to_register_demotion : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_memory_to_register_demotion"
|
|
||||||
external add_reassociation : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_reassociation"
|
|
||||||
external add_jump_threading : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_jump_threading"
|
|
||||||
external add_cfg_simplification : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_cfg_simplification"
|
|
||||||
external
|
|
||||||
add_tail_call_elimination : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_tail_call_elimination"
|
|
||||||
external add_gvn : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_gvn"
|
|
||||||
external add_memcpy_opt : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_memcpy_opt"
|
|
||||||
external add_loop_deletion : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_loop_deletion"
|
|
||||||
|
|
||||||
external add_loop_idiom : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_loop_idiom"
|
|
||||||
|
|
||||||
external
|
|
||||||
add_lib_call_simplification : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_lib_call_simplification"
|
|
||||||
|
|
||||||
external
|
|
||||||
add_verifier : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_verifier"
|
|
||||||
|
|
||||||
external
|
|
||||||
add_correlated_value_propagation : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_correlated_value_propagation"
|
|
||||||
|
|
||||||
external
|
|
||||||
add_early_cse : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_early_cse"
|
|
||||||
|
|
||||||
external
|
|
||||||
add_lower_expect_intrinsic : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_lower_expect_intrinsic"
|
|
||||||
|
|
||||||
external
|
|
||||||
add_type_based_alias_analysis : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_type_based_alias_analysis"
|
|
||||||
|
|
||||||
external
|
|
||||||
add_basic_alias_analysis : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_basic_alias_analysis"
|
|
||||||
|
|
@ -1,164 +0,0 @@
|
|||||||
(*===-- 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.
|
|
||||||
*
|
|
||||||
*===----------------------------------------------------------------------===*)
|
|
||||||
|
|
||||||
(** Scalar Transforms.
|
|
||||||
|
|
||||||
This interface provides an ocaml API for LLVM scalar transforms, the
|
|
||||||
classes in the [LLVMScalarOpts] library. *)
|
|
||||||
|
|
||||||
(** See the [llvm::createConstantPropogationPass] function. *)
|
|
||||||
external add_constant_propagation : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_constant_propagation"
|
|
||||||
|
|
||||||
(** See the [llvm::createSCCPPass] function. *)
|
|
||||||
external add_sccp : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_sccp"
|
|
||||||
|
|
||||||
(** See [llvm::createDeadStoreEliminationPass] function. *)
|
|
||||||
external add_dead_store_elimination : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_dead_store_elimination"
|
|
||||||
|
|
||||||
(** See The [llvm::createAggressiveDCEPass] function. *)
|
|
||||||
external add_aggressive_dce : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_aggressive_dce"
|
|
||||||
|
|
||||||
(** See the [llvm::createScalarReplAggregatesPass] function. *)
|
|
||||||
external
|
|
||||||
add_scalar_repl_aggregation : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_scalar_repl_aggregation"
|
|
||||||
|
|
||||||
(** See the [llvm::createScalarReplAggregatesPassSSA] function. *)
|
|
||||||
external
|
|
||||||
add_scalar_repl_aggregation_ssa : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_scalar_repl_aggregation_ssa"
|
|
||||||
|
|
||||||
(** See the [llvm::createScalarReplAggregatesWithThreshold] function. *)
|
|
||||||
external
|
|
||||||
add_scalar_repl_aggregation_with_threshold : int -> [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_scalar_repl_aggregation_with_threshold"
|
|
||||||
|
|
||||||
(** See the [llvm::createIndVarSimplifyPass] function. *)
|
|
||||||
external add_ind_var_simplification : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_ind_var_simplification"
|
|
||||||
|
|
||||||
(** See the [llvm::createInstructionCombiningPass] function. *)
|
|
||||||
external
|
|
||||||
add_instruction_combination : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_instruction_combination"
|
|
||||||
|
|
||||||
(** See the [llvm::createLICMPass] function. *)
|
|
||||||
external add_licm : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_licm"
|
|
||||||
|
|
||||||
(** See the [llvm::createLoopUnswitchPass] function. *)
|
|
||||||
external add_loop_unswitch : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_loop_unswitch"
|
|
||||||
|
|
||||||
(** See the [llvm::createLoopUnrollPass] function. *)
|
|
||||||
external add_loop_unroll : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_loop_unroll"
|
|
||||||
|
|
||||||
(** See the [llvm::createLoopRotatePass] function. *)
|
|
||||||
external add_loop_rotation : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_loop_rotation"
|
|
||||||
|
|
||||||
(** See the [llvm::createPromoteMemoryToRegisterPass] function. *)
|
|
||||||
external
|
|
||||||
add_memory_to_register_promotion : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_memory_to_register_promotion"
|
|
||||||
|
|
||||||
(** See the [llvm::createDemoteMemoryToRegisterPass] function. *)
|
|
||||||
external
|
|
||||||
add_memory_to_register_demotion : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_memory_to_register_demotion"
|
|
||||||
|
|
||||||
(** See the [llvm::createReassociatePass] function. *)
|
|
||||||
external add_reassociation : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_reassociation"
|
|
||||||
|
|
||||||
(** See the [llvm::createJumpThreadingPass] function. *)
|
|
||||||
external add_jump_threading : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_jump_threading"
|
|
||||||
|
|
||||||
(** See the [llvm::createCFGSimplificationPass] function. *)
|
|
||||||
external add_cfg_simplification : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_cfg_simplification"
|
|
||||||
|
|
||||||
(** See the [llvm::createTailCallEliminationPass] function. *)
|
|
||||||
external
|
|
||||||
add_tail_call_elimination : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_tail_call_elimination"
|
|
||||||
|
|
||||||
(** See the [llvm::createGVNPass] function. *)
|
|
||||||
external add_gvn : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_gvn"
|
|
||||||
|
|
||||||
(** See the [llvm::createMemCpyOptPass] function. *)
|
|
||||||
external add_memcpy_opt : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_memcpy_opt"
|
|
||||||
|
|
||||||
(** See the [llvm::createLoopDeletionPass] function. *)
|
|
||||||
external add_loop_deletion : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_loop_deletion"
|
|
||||||
|
|
||||||
external add_loop_idiom : [<Llvm.PassManager.any] Llvm.PassManager.t
|
|
||||||
-> unit
|
|
||||||
= "llvm_add_loop_idiom"
|
|
||||||
|
|
||||||
(** See the [llvm::createSimplifyLibCallsPass] function. *)
|
|
||||||
external
|
|
||||||
add_lib_call_simplification : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_lib_call_simplification"
|
|
||||||
|
|
||||||
(** See the [llvm::createVerifierPass] function. *)
|
|
||||||
external
|
|
||||||
add_verifier : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_verifier"
|
|
||||||
|
|
||||||
(** See the [llvm::createCorrelatedValuePropagationPass] function. *)
|
|
||||||
external
|
|
||||||
add_correlated_value_propagation : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_correlated_value_propagation"
|
|
||||||
|
|
||||||
(** See the [llvm::createEarlyCSE] function. *)
|
|
||||||
external
|
|
||||||
add_early_cse : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_early_cse"
|
|
||||||
|
|
||||||
(** See the [llvm::createLowerExpectIntrinsicPass] function. *)
|
|
||||||
external
|
|
||||||
add_lower_expect_intrinsic : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_lower_expect_intrinsic"
|
|
||||||
|
|
||||||
(** See the [llvm::createTypeBasedAliasAnalysisPass] function. *)
|
|
||||||
external
|
|
||||||
add_type_based_alias_analysis : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_type_based_alias_analysis"
|
|
||||||
|
|
||||||
(** See the [llvm::createBasicAliasAnalysisPass] function. *)
|
|
||||||
external
|
|
||||||
add_basic_alias_analysis : [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
|
|
||||||
= "llvm_add_basic_alias_analysis"
|
|
||||||
|
|
@ -1,201 +0,0 @@
|
|||||||
/*===-- 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. *|
|
|
||||||
|* *|
|
|
||||||
|*===----------------------------------------------------------------------===*|
|
|
||||||
|* *|
|
|
||||||
|* This file glues LLVM's ocaml interface to its C interface. These functions *|
|
|
||||||
|* are by and large transparent wrappers to the corresponding C functions. *|
|
|
||||||
|* *|
|
|
||||||
|* Note that these functions intentionally take liberties with the CAMLparamX *|
|
|
||||||
|* macros, since most of the parameters are not GC heap objects. *|
|
|
||||||
|* *|
|
|
||||||
\*===----------------------------------------------------------------------===*/
|
|
||||||
|
|
||||||
#include "llvm-c/Transforms/Scalar.h"
|
|
||||||
#include "caml/mlvalues.h"
|
|
||||||
#include "caml/misc.h"
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_constant_propagation(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddConstantPropagationPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_sccp(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddSCCPPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_dead_store_elimination(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddDeadStoreEliminationPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_aggressive_dce(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddAggressiveDCEPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_scalar_repl_aggregation(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddScalarReplAggregatesPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_scalar_repl_aggregation_ssa(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddScalarReplAggregatesPassSSA(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> int -> unit */
|
|
||||||
CAMLprim value llvm_add_scalar_repl_aggregation_with_threshold(value threshold,
|
|
||||||
LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddScalarReplAggregatesPassWithThreshold(PM, Int_val(threshold));
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_ind_var_simplification(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddIndVarSimplifyPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_instruction_combination(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddInstructionCombiningPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_licm(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddLICMPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_loop_unswitch(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddLoopUnswitchPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_loop_unroll(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddLoopUnrollPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_loop_rotation(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddLoopRotatePass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_memory_to_register_promotion(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddPromoteMemoryToRegisterPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_memory_to_register_demotion(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddDemoteMemoryToRegisterPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_reassociation(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddReassociatePass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_jump_threading(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddJumpThreadingPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_cfg_simplification(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddCFGSimplificationPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_tail_call_elimination(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddTailCallEliminationPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_gvn(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddGVNPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_memcpy_opt(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddMemCpyOptPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_loop_deletion(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddLoopDeletionPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_loop_idiom(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddLoopIdiomPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_lib_call_simplification(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddSimplifyLibCallsPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_verifier(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddVerifierPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_correlated_value_propagation(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddCorrelatedValuePropagationPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_early_cse(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddEarlyCSEPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_lower_expect_intrinsic(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddLowerExpectIntrinsicPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_type_based_alias_analysis(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddTypeBasedAliasAnalysisPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
|
||||||
CAMLprim value llvm_add_basic_alias_analysis(LLVMPassManagerRef PM) {
|
|
||||||
LLVMAddBasicAliasAnalysisPass(PM);
|
|
||||||
return Val_unit;
|
|
||||||
}
|
|
@ -1,67 +0,0 @@
|
|||||||
This directory contains Python bindings for LLVM's C library.
|
|
||||||
|
|
||||||
The bindings are currently a work in progress and are far from complete.
|
|
||||||
Use at your own risk.
|
|
||||||
|
|
||||||
Developer Info
|
|
||||||
==============
|
|
||||||
|
|
||||||
The single Python package is "llvm." Modules inside this package roughly
|
|
||||||
follow the names of the modules/headers defined by LLVM's C API.
|
|
||||||
|
|
||||||
Testing
|
|
||||||
-------
|
|
||||||
|
|
||||||
All test code is location in llvm/tests. Tests are written as classes
|
|
||||||
which inherit from llvm.tests.base.TestBase, which is a convenience base
|
|
||||||
class that provides common functionality.
|
|
||||||
|
|
||||||
Tests can be executed by installing nose:
|
|
||||||
|
|
||||||
pip install nosetests
|
|
||||||
|
|
||||||
Then by running nosetests:
|
|
||||||
|
|
||||||
nosetests
|
|
||||||
|
|
||||||
To see more output:
|
|
||||||
|
|
||||||
nosetests -v
|
|
||||||
|
|
||||||
To step into the Python debugger while running a test, add the following
|
|
||||||
to your test at the point you wish to enter the debugger:
|
|
||||||
|
|
||||||
import pdb; pdb.set_trace()
|
|
||||||
|
|
||||||
Then run nosetests:
|
|
||||||
|
|
||||||
nosetests -s -v
|
|
||||||
|
|
||||||
You should strive for high code coverage. To see current coverage:
|
|
||||||
|
|
||||||
pip install coverage
|
|
||||||
nosetests --with-coverage --cover-html
|
|
||||||
|
|
||||||
Then open cover/index.html in your browser of choice to see the code coverage.
|
|
||||||
|
|
||||||
Style Convention
|
|
||||||
----------------
|
|
||||||
|
|
||||||
All code should pass PyFlakes. First, install PyFlakes:
|
|
||||||
|
|
||||||
pip install pyflakes
|
|
||||||
|
|
||||||
Then at any time run it to see a report:
|
|
||||||
|
|
||||||
pyflakes .
|
|
||||||
|
|
||||||
Eventually we'll provide a Pylint config file. In the meantime, install
|
|
||||||
Pylint:
|
|
||||||
|
|
||||||
pip install pylint
|
|
||||||
|
|
||||||
And run:
|
|
||||||
|
|
||||||
pylint llvm
|
|
||||||
|
|
||||||
And try to keep the number of violations to a minimum.
|
|
@ -1,106 +0,0 @@
|
|||||||
#===- 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.
|
|
||||||
#
|
|
||||||
#===------------------------------------------------------------------------===#
|
|
||||||
|
|
||||||
from ctypes import POINTER
|
|
||||||
from ctypes import c_void_p
|
|
||||||
from ctypes import cdll
|
|
||||||
|
|
||||||
import ctypes.util
|
|
||||||
|
|
||||||
__all__ = [
|
|
||||||
'c_object_p',
|
|
||||||
'find_library',
|
|
||||||
'get_library',
|
|
||||||
]
|
|
||||||
|
|
||||||
c_object_p = POINTER(c_void_p)
|
|
||||||
|
|
||||||
class LLVMObject(object):
|
|
||||||
"""Base class for objects that are backed by an LLVM data structure.
|
|
||||||
|
|
||||||
This class should never be instantiated outside of this package.
|
|
||||||
"""
|
|
||||||
def __init__(self, ptr, ownable=True, disposer=None):
|
|
||||||
assert isinstance(ptr, c_object_p)
|
|
||||||
|
|
||||||
self._ptr = self._as_parameter_ = ptr
|
|
||||||
|
|
||||||
self._self_owned = True
|
|
||||||
self._ownable = ownable
|
|
||||||
self._disposer = disposer
|
|
||||||
|
|
||||||
self._owned_objects = []
|
|
||||||
|
|
||||||
def take_ownership(self, obj):
|
|
||||||
"""Take ownership of another object.
|
|
||||||
|
|
||||||
When you take ownership of another object, you are responsible for
|
|
||||||
destroying that object. In addition, a reference to that object is
|
|
||||||
placed inside this object so the Python garbage collector will not
|
|
||||||
collect the object while it is still alive in libLLVM.
|
|
||||||
|
|
||||||
This method should likely only be called from within modules inside
|
|
||||||
this package.
|
|
||||||
"""
|
|
||||||
assert isinstance(obj, LLVMObject)
|
|
||||||
|
|
||||||
self._owned_objects.append(obj)
|
|
||||||
obj._self_owned = False
|
|
||||||
|
|
||||||
def from_param(self):
|
|
||||||
"""ctypes function that converts this object to a function parameter."""
|
|
||||||
return self._as_parameter_
|
|
||||||
|
|
||||||
def __del__(self):
|
|
||||||
if not hasattr(self, '_self_owned') or not hasattr(self, '_disposer'):
|
|
||||||
return
|
|
||||||
|
|
||||||
if self._self_owned and self._disposer:
|
|
||||||
self._disposer(self)
|
|
||||||
|
|
||||||
class CachedProperty(object):
|
|
||||||
"""Decorator that caches the result of a property lookup.
|
|
||||||
|
|
||||||
This is a useful replacement for @property. It is recommended to use this
|
|
||||||
decorator on properties that invoke C API calls for which the result of the
|
|
||||||
call will be idempotent.
|
|
||||||
"""
|
|
||||||
def __init__(self, wrapped):
|
|
||||||
self.wrapped = wrapped
|
|
||||||
try:
|
|
||||||
self.__doc__ = wrapped.__doc__
|
|
||||||
except: # pragma: no cover
|
|
||||||
pass
|
|
||||||
|
|
||||||
def __get__(self, instance, instance_type=None):
|
|
||||||
if instance is None:
|
|
||||||
return self
|
|
||||||
|
|
||||||
value = self.wrapped(instance)
|
|
||||||
setattr(instance, self.wrapped.__name__, value)
|
|
||||||
|
|
||||||
return value
|
|
||||||
|
|
||||||
def find_library():
|
|
||||||
# FIXME should probably have build system define absolute path of shared
|
|
||||||
# library at install time.
|
|
||||||
for lib in ['LLVM-3.1svn', 'libLLVM-3.1svn', 'LLVM', 'libLLVM']:
|
|
||||||
result = ctypes.util.find_library(lib)
|
|
||||||
if result:
|
|
||||||
return result
|
|
||||||
|
|
||||||
return None
|
|
||||||
|
|
||||||
def get_library():
|
|
||||||
"""Obtain a reference to the llvm library."""
|
|
||||||
lib = find_library()
|
|
||||||
if not lib:
|
|
||||||
raise Exception('LLVM shared library not found!')
|
|
||||||
|
|
||||||
return cdll.LoadLibrary(lib)
|
|
@ -1,98 +0,0 @@
|
|||||||
#===- 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.
|
|
||||||
#
|
|
||||||
#===------------------------------------------------------------------------===#
|
|
||||||
|
|
||||||
from .common import LLVMObject
|
|
||||||
from .common import c_object_p
|
|
||||||
from .common import get_library
|
|
||||||
|
|
||||||
from . import enumerations
|
|
||||||
|
|
||||||
from ctypes import POINTER
|
|
||||||
from ctypes import byref
|
|
||||||
from ctypes import c_char_p
|
|
||||||
|
|
||||||
__all__ = [
|
|
||||||
"lib",
|
|
||||||
"MemoryBuffer",
|
|
||||||
]
|
|
||||||
|
|
||||||
lib = get_library()
|
|
||||||
|
|
||||||
class OpCode(object):
|
|
||||||
"""Represents an individual OpCode enumeration."""
|
|
||||||
|
|
||||||
_value_map = {}
|
|
||||||
|
|
||||||
def __init__(self, name, value):
|
|
||||||
self.name = name
|
|
||||||
self.value = value
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return 'OpCode.%s' % self.name
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def from_value(value):
|
|
||||||
"""Obtain an OpCode instance from a numeric value."""
|
|
||||||
result = OpCode._value_map.get(value, None)
|
|
||||||
|
|
||||||
if result is None:
|
|
||||||
raise ValueError('Unknown OpCode: %d' % value)
|
|
||||||
|
|
||||||
return result
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def register(name, value):
|
|
||||||
"""Registers a new OpCode enumeration.
|
|
||||||
|
|
||||||
This is called by this module for each enumeration defined in
|
|
||||||
enumerations. You should not need to call this outside this module.
|
|
||||||
"""
|
|
||||||
if value in OpCode._value_map:
|
|
||||||
raise ValueError('OpCode value already registered: %d' % value)
|
|
||||||
|
|
||||||
opcode = OpCode(name, value)
|
|
||||||
OpCode._value_map[value] = opcode
|
|
||||||
setattr(OpCode, name, opcode)
|
|
||||||
|
|
||||||
class MemoryBuffer(LLVMObject):
|
|
||||||
"""Represents an opaque memory buffer."""
|
|
||||||
|
|
||||||
def __init__(self, filename=None):
|
|
||||||
"""Create a new memory buffer.
|
|
||||||
|
|
||||||
Currently, we support creating from the contents of a file at the
|
|
||||||
specified filename.
|
|
||||||
"""
|
|
||||||
if filename is None:
|
|
||||||
raise Exception("filename argument must be defined")
|
|
||||||
|
|
||||||
memory = c_object_p()
|
|
||||||
out = c_char_p(None)
|
|
||||||
|
|
||||||
result = lib.LLVMCreateMemoryBufferWithContentsOfFile(filename,
|
|
||||||
byref(memory), byref(out))
|
|
||||||
|
|
||||||
if result:
|
|
||||||
raise Exception("Could not create memory buffer: %s" % out.value)
|
|
||||||
|
|
||||||
LLVMObject.__init__(self, memory, disposer=lib.LLVMDisposeMemoryBuffer)
|
|
||||||
|
|
||||||
def register_library(library):
|
|
||||||
library.LLVMCreateMemoryBufferWithContentsOfFile.argtypes = [c_char_p,
|
|
||||||
POINTER(c_object_p), POINTER(c_char_p)]
|
|
||||||
library.LLVMCreateMemoryBufferWithContentsOfFile.restype = bool
|
|
||||||
|
|
||||||
library.LLVMDisposeMemoryBuffer.argtypes = [MemoryBuffer]
|
|
||||||
|
|
||||||
def register_enumerations():
|
|
||||||
for name, value in enumerations.OpCodes:
|
|
||||||
OpCode.register(name, value)
|
|
||||||
|
|
||||||
register_library(lib)
|
|
||||||
register_enumerations()
|
|
@ -1,134 +0,0 @@
|
|||||||
#===- 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.
|
|
||||||
#
|
|
||||||
#===------------------------------------------------------------------------===#
|
|
||||||
|
|
||||||
from ctypes import CFUNCTYPE
|
|
||||||
from ctypes import POINTER
|
|
||||||
from ctypes import addressof
|
|
||||||
from ctypes import byref
|
|
||||||
from ctypes import c_byte
|
|
||||||
from ctypes import c_char_p
|
|
||||||
from ctypes import c_int
|
|
||||||
from ctypes import c_size_t
|
|
||||||
from ctypes import c_ubyte
|
|
||||||
from ctypes import c_uint64
|
|
||||||
from ctypes import c_void_p
|
|
||||||
from ctypes import cast
|
|
||||||
|
|
||||||
from .common import LLVMObject
|
|
||||||
from .common import c_object_p
|
|
||||||
from .common import get_library
|
|
||||||
|
|
||||||
__all__ = [
|
|
||||||
'Disassembler',
|
|
||||||
]
|
|
||||||
|
|
||||||
lib = get_library()
|
|
||||||
callbacks = {}
|
|
||||||
|
|
||||||
class Disassembler(LLVMObject):
|
|
||||||
"""Represents a disassembler instance.
|
|
||||||
|
|
||||||
Disassembler instances are tied to specific "triple," which must be defined
|
|
||||||
at creation time.
|
|
||||||
|
|
||||||
Disassembler instances can disassemble instructions from multiple sources.
|
|
||||||
"""
|
|
||||||
def __init__(self, triple):
|
|
||||||
"""Create a new disassembler instance.
|
|
||||||
|
|
||||||
The triple argument is the triple to create the disassembler for. This
|
|
||||||
is something like 'i386-apple-darwin9'.
|
|
||||||
"""
|
|
||||||
ptr = lib.LLVMCreateDisasm(c_char_p(triple), c_void_p(None), c_int(0),
|
|
||||||
callbacks['op_info'](0), callbacks['symbol_lookup'](0))
|
|
||||||
if not ptr.contents:
|
|
||||||
raise Exception('Could not obtain disassembler for triple: %s' %
|
|
||||||
triple)
|
|
||||||
|
|
||||||
LLVMObject.__init__(self, ptr, disposer=lib.LLVMDisasmDispose)
|
|
||||||
|
|
||||||
def get_instruction(self, source, pc=0):
|
|
||||||
"""Obtain the next instruction from an input source.
|
|
||||||
|
|
||||||
The input source should be a str or bytearray or something that
|
|
||||||
represents a sequence of bytes.
|
|
||||||
|
|
||||||
This function will start reading bytes from the beginning of the
|
|
||||||
source.
|
|
||||||
|
|
||||||
The pc argument specifies the address that the first byte is at.
|
|
||||||
|
|
||||||
This returns a 2-tuple of:
|
|
||||||
|
|
||||||
long number of bytes read. 0 if no instruction was read.
|
|
||||||
str representation of instruction. This will be the assembly that
|
|
||||||
represents the instruction.
|
|
||||||
"""
|
|
||||||
buf = cast(c_char_p(source), POINTER(c_ubyte))
|
|
||||||
out_str = cast((c_byte * 255)(), c_char_p)
|
|
||||||
|
|
||||||
result = lib.LLVMDisasmInstruction(self, buf, c_uint64(len(source)),
|
|
||||||
c_uint64(pc), out_str, 255)
|
|
||||||
|
|
||||||
return (result, out_str.value)
|
|
||||||
|
|
||||||
def get_instructions(self, source, pc=0):
|
|
||||||
"""Obtain multiple instructions from an input source.
|
|
||||||
|
|
||||||
This is like get_instruction() except it is a generator for all
|
|
||||||
instructions within the source. It starts at the beginning of the
|
|
||||||
source and reads instructions until no more can be read.
|
|
||||||
|
|
||||||
This generator returns 3-tuple of:
|
|
||||||
|
|
||||||
long address of instruction.
|
|
||||||
long size of instruction, in bytes.
|
|
||||||
str representation of instruction.
|
|
||||||
"""
|
|
||||||
source_bytes = c_char_p(source)
|
|
||||||
out_str = cast((c_byte * 255)(), c_char_p)
|
|
||||||
|
|
||||||
# This could probably be written cleaner. But, it does work.
|
|
||||||
buf = cast(source_bytes, POINTER(c_ubyte * len(source))).contents
|
|
||||||
offset = 0
|
|
||||||
address = pc
|
|
||||||
end_address = pc + len(source)
|
|
||||||
while address < end_address:
|
|
||||||
b = cast(addressof(buf) + offset, POINTER(c_ubyte))
|
|
||||||
result = lib.LLVMDisasmInstruction(self, b,
|
|
||||||
c_uint64(len(source) - offset), c_uint64(address),
|
|
||||||
out_str, 255)
|
|
||||||
|
|
||||||
if result == 0:
|
|
||||||
break
|
|
||||||
|
|
||||||
yield (address, result, out_str.value)
|
|
||||||
|
|
||||||
address += result
|
|
||||||
offset += result
|
|
||||||
|
|
||||||
|
|
||||||
def register_library(library):
|
|
||||||
library.LLVMCreateDisasm.argtypes = [c_char_p, c_void_p, c_int,
|
|
||||||
callbacks['op_info'], callbacks['symbol_lookup']]
|
|
||||||
library.LLVMCreateDisasm.restype = c_object_p
|
|
||||||
|
|
||||||
library.LLVMDisasmDispose.argtypes = [Disassembler]
|
|
||||||
|
|
||||||
library.LLVMDisasmInstruction.argtypes = [Disassembler, POINTER(c_ubyte),
|
|
||||||
c_uint64, c_uint64, c_char_p, c_size_t]
|
|
||||||
library.LLVMDisasmInstruction.restype = c_size_t
|
|
||||||
|
|
||||||
callbacks['op_info'] = CFUNCTYPE(c_int, c_void_p, c_uint64, c_uint64, c_uint64,
|
|
||||||
c_int, c_void_p)
|
|
||||||
callbacks['symbol_lookup'] = CFUNCTYPE(c_char_p, c_void_p, c_uint64,
|
|
||||||
POINTER(c_uint64), c_uint64,
|
|
||||||
POINTER(c_char_p))
|
|
||||||
|
|
||||||
register_library(lib)
|
|
@ -1,211 +0,0 @@
|
|||||||
#===- 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.
|
|
||||||
#
|
|
||||||
#===------------------------------------------------------------------------===#
|
|
||||||
|
|
||||||
r"""
|
|
||||||
LLVM Enumerations
|
|
||||||
=================
|
|
||||||
|
|
||||||
This file defines enumerations from LLVM.
|
|
||||||
|
|
||||||
Each enumeration is exposed as a list of 2-tuples. These lists are consumed by
|
|
||||||
dedicated types elsewhere in the package. The enumerations are centrally
|
|
||||||
defined in this file so they are easier to locate and maintain.
|
|
||||||
"""
|
|
||||||
|
|
||||||
__all__ = [
|
|
||||||
'Attributes',
|
|
||||||
'OpCodes',
|
|
||||||
'TypeKinds',
|
|
||||||
'Linkages',
|
|
||||||
'Visibility',
|
|
||||||
'CallConv',
|
|
||||||
'IntPredicate',
|
|
||||||
'RealPredicate',
|
|
||||||
'LandingPadClauseTy',
|
|
||||||
]
|
|
||||||
|
|
||||||
Attributes = [
|
|
||||||
('ZExt', 1 << 0),
|
|
||||||
('MSExt', 1 << 1),
|
|
||||||
('NoReturn', 1 << 2),
|
|
||||||
('InReg', 1 << 3),
|
|
||||||
('StructRet', 1 << 4),
|
|
||||||
('NoUnwind', 1 << 5),
|
|
||||||
('NoAlias', 1 << 6),
|
|
||||||
('ByVal', 1 << 7),
|
|
||||||
('Nest', 1 << 8),
|
|
||||||
('ReadNone', 1 << 9),
|
|
||||||
('ReadOnly', 1 << 10),
|
|
||||||
('NoInline', 1 << 11),
|
|
||||||
('AlwaysInline', 1 << 12),
|
|
||||||
('OptimizeForSize', 1 << 13),
|
|
||||||
('StackProtect', 1 << 14),
|
|
||||||
('StackProtectReq', 1 << 15),
|
|
||||||
('Alignment', 31 << 16),
|
|
||||||
('NoCapture', 1 << 21),
|
|
||||||
('NoRedZone', 1 << 22),
|
|
||||||
('ImplicitFloat', 1 << 23),
|
|
||||||
('Naked', 1 << 24),
|
|
||||||
('InlineHint', 1 << 25),
|
|
||||||
('StackAlignment', 7 << 26),
|
|
||||||
('ReturnsTwice', 1 << 29),
|
|
||||||
('UWTable', 1 << 30),
|
|
||||||
('NonLazyBind', 1 << 31),
|
|
||||||
]
|
|
||||||
|
|
||||||
OpCodes = [
|
|
||||||
('Ret', 1),
|
|
||||||
('Br', 2),
|
|
||||||
('Switch', 3),
|
|
||||||
('IndirectBr', 4),
|
|
||||||
('Invoke', 5),
|
|
||||||
('Unreachable', 7),
|
|
||||||
('Add', 8),
|
|
||||||
('FAdd', 9),
|
|
||||||
('Sub', 10),
|
|
||||||
('FSub', 11),
|
|
||||||
('Mul', 12),
|
|
||||||
('FMul', 13),
|
|
||||||
('UDiv', 14),
|
|
||||||
('SDiv', 15),
|
|
||||||
('FDiv', 16),
|
|
||||||
('URem', 17),
|
|
||||||
('SRem', 18),
|
|
||||||
('FRem', 19),
|
|
||||||
('Shl', 20),
|
|
||||||
('LShr', 21),
|
|
||||||
('AShr', 22),
|
|
||||||
('And', 23),
|
|
||||||
('Or', 24),
|
|
||||||
('Xor', 25),
|
|
||||||
('Alloca', 26),
|
|
||||||
('Load', 27),
|
|
||||||
('Store', 28),
|
|
||||||
('GetElementPtr', 29),
|
|
||||||
('Trunc', 30),
|
|
||||||
('ZExt', 31),
|
|
||||||
('SExt', 32),
|
|
||||||
('FPToUI', 33),
|
|
||||||
('FPToSI', 34),
|
|
||||||
('UIToFP', 35),
|
|
||||||
('SIToFP', 36),
|
|
||||||
('FPTrunc', 37),
|
|
||||||
('FPExt', 38),
|
|
||||||
('PtrToInt', 39),
|
|
||||||
('IntToPtr', 40),
|
|
||||||
('BitCast', 41),
|
|
||||||
('ICmp', 42),
|
|
||||||
('FCmpl', 43),
|
|
||||||
('PHI', 44),
|
|
||||||
('Call', 45),
|
|
||||||
('Select', 46),
|
|
||||||
('UserOp1', 47),
|
|
||||||
('UserOp2', 48),
|
|
||||||
('AArg', 49),
|
|
||||||
('ExtractElement', 50),
|
|
||||||
('InsertElement', 51),
|
|
||||||
('ShuffleVector', 52),
|
|
||||||
('ExtractValue', 53),
|
|
||||||
('InsertValue', 54),
|
|
||||||
('Fence', 55),
|
|
||||||
('AtomicCmpXchg', 56),
|
|
||||||
('AtomicRMW', 57),
|
|
||||||
('Resume', 58),
|
|
||||||
('LandingPad', 59),
|
|
||||||
]
|
|
||||||
|
|
||||||
TypeKinds = [
|
|
||||||
('Void', 0),
|
|
||||||
('Half', 1),
|
|
||||||
('Float', 2),
|
|
||||||
('Double', 3),
|
|
||||||
('X86_FP80', 4),
|
|
||||||
('FP128', 5),
|
|
||||||
('PPC_FP128', 6),
|
|
||||||
('Label', 7),
|
|
||||||
('Integer', 8),
|
|
||||||
('Function', 9),
|
|
||||||
('Struct', 10),
|
|
||||||
('Array', 11),
|
|
||||||
('Pointer', 12),
|
|
||||||
('Vector', 13),
|
|
||||||
('Metadata', 14),
|
|
||||||
('X86_MMX', 15),
|
|
||||||
]
|
|
||||||
|
|
||||||
Linkages = [
|
|
||||||
('External', 0),
|
|
||||||
('AvailableExternally', 1),
|
|
||||||
('LinkOnceAny', 2),
|
|
||||||
('LinkOnceODR', 3),
|
|
||||||
('WeakAny', 4),
|
|
||||||
('WeakODR', 5),
|
|
||||||
('Appending', 6),
|
|
||||||
('Internal', 7),
|
|
||||||
('Private', 8),
|
|
||||||
('DLLImport', 9),
|
|
||||||
('DLLExport', 10),
|
|
||||||
('ExternalWeak', 11),
|
|
||||||
('Ghost', 12),
|
|
||||||
('Common', 13),
|
|
||||||
('LinkerPrivate', 14),
|
|
||||||
('LinkerPrivateWeak', 15),
|
|
||||||
('LinkerPrivateWeakDefAuto', 16),
|
|
||||||
]
|
|
||||||
|
|
||||||
Visibility = [
|
|
||||||
('Default', 0),
|
|
||||||
('Hidden', 1),
|
|
||||||
('Protected', 2),
|
|
||||||
]
|
|
||||||
|
|
||||||
CallConv = [
|
|
||||||
('CCall', 0),
|
|
||||||
('FastCall', 8),
|
|
||||||
('ColdCall', 9),
|
|
||||||
('X86StdcallCall', 64),
|
|
||||||
('X86FastcallCall', 65),
|
|
||||||
]
|
|
||||||
|
|
||||||
IntPredicate = [
|
|
||||||
('EQ', 32),
|
|
||||||
('NE', 33),
|
|
||||||
('UGT', 34),
|
|
||||||
('UGE', 35),
|
|
||||||
('ULT', 36),
|
|
||||||
('ULE', 37),
|
|
||||||
('SGT', 38),
|
|
||||||
('SGE', 39),
|
|
||||||
('SLT', 40),
|
|
||||||
('SLE', 41),
|
|
||||||
]
|
|
||||||
|
|
||||||
RealPredicate = [
|
|
||||||
('PredicateFalse', 0),
|
|
||||||
('OEQ', 1),
|
|
||||||
('OGT', 2),
|
|
||||||
('OGE', 3),
|
|
||||||
('OLT', 4),
|
|
||||||
('OLE', 5),
|
|
||||||
('ONE', 6),
|
|
||||||
('ORD', 7),
|
|
||||||
('UNO', 8),
|
|
||||||
('UEQ', 9),
|
|
||||||
('UGT', 10),
|
|
||||||
('UGE', 11),
|
|
||||||
('ULT', 12),
|
|
||||||
('ULE', 13),
|
|
||||||
('UNE', 14),
|
|
||||||
('PredicateTrue', 15),
|
|
||||||
]
|
|
||||||
|
|
||||||
LandingPadClauseTy = [
|
|
||||||
('Catch', 0),
|
|
||||||
('Filter', 1),
|
|
||||||
]
|
|
@ -1,523 +0,0 @@
|
|||||||
#===- 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.
|
|
||||||
#
|
|
||||||
#===------------------------------------------------------------------------===#
|
|
||||||
|
|
||||||
r"""
|
|
||||||
Object File Interface
|
|
||||||
=====================
|
|
||||||
|
|
||||||
This module provides an interface for reading information from object files
|
|
||||||
(e.g. binary executables and libraries).
|
|
||||||
|
|
||||||
Using this module, you can obtain information about an object file's sections,
|
|
||||||
symbols, and relocations. These are represented by the classes ObjectFile,
|
|
||||||
Section, Symbol, and Relocation, respectively.
|
|
||||||
|
|
||||||
Usage
|
|
||||||
-----
|
|
||||||
|
|
||||||
The only way to use this module is to start by creating an ObjectFile. You can
|
|
||||||
create an ObjectFile by loading a file (specified by its path) or by creating a
|
|
||||||
llvm.core.MemoryBuffer and loading that.
|
|
||||||
|
|
||||||
Once you have an object file, you can inspect its sections and symbols directly
|
|
||||||
by calling get_sections() and get_symbols() respectively. To inspect
|
|
||||||
relocations, call get_relocations() on a Section instance.
|
|
||||||
|
|
||||||
Iterator Interface
|
|
||||||
------------------
|
|
||||||
|
|
||||||
The LLVM bindings expose iteration over sections, symbols, and relocations in a
|
|
||||||
way that only allows one instance to be operated on at a single time. This is
|
|
||||||
slightly annoying from a Python perspective, as it isn't very Pythonic to have
|
|
||||||
objects that "expire" but are still active from a dynamic language.
|
|
||||||
|
|
||||||
To aid working around this limitation, each Section, Symbol, and Relocation
|
|
||||||
instance caches its properties after first access. So, if the underlying
|
|
||||||
iterator is advanced, the properties can still be obtained provided they have
|
|
||||||
already been retrieved.
|
|
||||||
|
|
||||||
In addition, we also provide a "cache" method on each class to cache all
|
|
||||||
available data. You can call this on each obtained instance. Or, you can pass
|
|
||||||
cache=True to the appropriate get_XXX() method to have this done for you.
|
|
||||||
|
|
||||||
Here are some examples on how to perform iteration:
|
|
||||||
|
|
||||||
obj = ObjectFile(filename='/bin/ls')
|
|
||||||
|
|
||||||
# This is OK. Each Section is only accessed inside its own iteration slot.
|
|
||||||
section_names = []
|
|
||||||
for section in obj.get_sections():
|
|
||||||
section_names.append(section.name)
|
|
||||||
|
|
||||||
# This is NOT OK. You perform a lookup after the object has expired.
|
|
||||||
symbols = list(obj.get_symbols())
|
|
||||||
for symbol in symbols:
|
|
||||||
print symbol.name # This raises because the object has expired.
|
|
||||||
|
|
||||||
# In this example, we mix a working and failing scenario.
|
|
||||||
symbols = []
|
|
||||||
for symbol in obj.get_symbols():
|
|
||||||
symbols.append(symbol)
|
|
||||||
print symbol.name
|
|
||||||
|
|
||||||
for symbol in symbols:
|
|
||||||
print symbol.name # OK
|
|
||||||
print symbol.address # NOT OK. We didn't look up this property before.
|
|
||||||
|
|
||||||
# Cache everything up front.
|
|
||||||
symbols = list(obj.get_symbols(cache=True))
|
|
||||||
for symbol in symbols:
|
|
||||||
print symbol.name # OK
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
from ctypes import c_char_p
|
|
||||||
from ctypes import c_uint64
|
|
||||||
|
|
||||||
from .common import CachedProperty
|
|
||||||
from .common import LLVMObject
|
|
||||||
from .common import c_object_p
|
|
||||||
from .common import get_library
|
|
||||||
from .core import MemoryBuffer
|
|
||||||
|
|
||||||
__all__ = [
|
|
||||||
"lib",
|
|
||||||
"ObjectFile",
|
|
||||||
"Relocation",
|
|
||||||
"Section",
|
|
||||||
"Symbol",
|
|
||||||
]
|
|
||||||
|
|
||||||
class ObjectFile(LLVMObject):
|
|
||||||
"""Represents an object/binary file."""
|
|
||||||
|
|
||||||
def __init__(self, filename=None, contents=None):
|
|
||||||
"""Construct an instance from a filename or binary data.
|
|
||||||
|
|
||||||
filename must be a path to a file that can be opened with open().
|
|
||||||
contents can be either a native Python buffer type (like str) or a
|
|
||||||
llvm.core.MemoryBuffer instance.
|
|
||||||
"""
|
|
||||||
if contents:
|
|
||||||
assert isinstance(contents, MemoryBuffer)
|
|
||||||
|
|
||||||
if filename is not None:
|
|
||||||
contents = MemoryBuffer(filename=filename)
|
|
||||||
|
|
||||||
if contents is None:
|
|
||||||
raise Exception('No input found.')
|
|
||||||
|
|
||||||
ptr = lib.LLVMCreateObjectFile(contents)
|
|
||||||
LLVMObject.__init__(self, ptr, disposer=lib.LLVMDisposeObjectFile)
|
|
||||||
self.take_ownership(contents)
|
|
||||||
|
|
||||||
def get_sections(self, cache=False):
|
|
||||||
"""Obtain the sections in this object file.
|
|
||||||
|
|
||||||
This is a generator for llvm.object.Section instances.
|
|
||||||
|
|
||||||
Sections are exposed as limited-use objects. See the module's
|
|
||||||
documentation on iterators for more.
|
|
||||||
"""
|
|
||||||
sections = lib.LLVMGetSections(self)
|
|
||||||
last = None
|
|
||||||
while True:
|
|
||||||
if lib.LLVMIsSectionIteratorAtEnd(self, sections):
|
|
||||||
break
|
|
||||||
|
|
||||||
last = Section(sections)
|
|
||||||
if cache:
|
|
||||||
last.cache()
|
|
||||||
|
|
||||||
yield last
|
|
||||||
|
|
||||||
lib.LLVMMoveToNextSection(sections)
|
|
||||||
last.expire()
|
|
||||||
|
|
||||||
if last is not None:
|
|
||||||
last.expire()
|
|
||||||
|
|
||||||
lib.LLVMDisposeSectionIterator(sections)
|
|
||||||
|
|
||||||
def get_symbols(self, cache=False):
|
|
||||||
"""Obtain the symbols in this object file.
|
|
||||||
|
|
||||||
This is a generator for llvm.object.Symbol instances.
|
|
||||||
|
|
||||||
Each Symbol instance is a limited-use object. See this module's
|
|
||||||
documentation on iterators for more.
|
|
||||||
"""
|
|
||||||
symbols = lib.LLVMGetSymbols(self)
|
|
||||||
last = None
|
|
||||||
while True:
|
|
||||||
if lib.LLVMIsSymbolIteratorAtEnd(self, symbols):
|
|
||||||
break
|
|
||||||
|
|
||||||
last = Symbol(symbols, self)
|
|
||||||
if cache:
|
|
||||||
last.cache()
|
|
||||||
|
|
||||||
yield last
|
|
||||||
|
|
||||||
lib.LLVMMoveToNextSymbol(symbols)
|
|
||||||
last.expire()
|
|
||||||
|
|
||||||
if last is not None:
|
|
||||||
last.expire()
|
|
||||||
|
|
||||||
lib.LLVMDisposeSymbolIterator(symbols)
|
|
||||||
|
|
||||||
class Section(LLVMObject):
|
|
||||||
"""Represents a section in an object file."""
|
|
||||||
|
|
||||||
def __init__(self, ptr):
|
|
||||||
"""Construct a new section instance.
|
|
||||||
|
|
||||||
Section instances can currently only be created from an ObjectFile
|
|
||||||
instance. Therefore, this constructor should not be used outside of
|
|
||||||
this module.
|
|
||||||
"""
|
|
||||||
LLVMObject.__init__(self, ptr)
|
|
||||||
|
|
||||||
self.expired = False
|
|
||||||
|
|
||||||
@CachedProperty
|
|
||||||
def name(self):
|
|
||||||
"""Obtain the string name of the section.
|
|
||||||
|
|
||||||
This is typically something like '.dynsym' or '.rodata'.
|
|
||||||
"""
|
|
||||||
if self.expired:
|
|
||||||
raise Exception('Section instance has expired.')
|
|
||||||
|
|
||||||
return lib.LLVMGetSectionName(self)
|
|
||||||
|
|
||||||
@CachedProperty
|
|
||||||
def size(self):
|
|
||||||
"""The size of the section, in long bytes."""
|
|
||||||
if self.expired:
|
|
||||||
raise Exception('Section instance has expired.')
|
|
||||||
|
|
||||||
return lib.LLVMGetSectionSize(self)
|
|
||||||
|
|
||||||
@CachedProperty
|
|
||||||
def contents(self):
|
|
||||||
if self.expired:
|
|
||||||
raise Exception('Section instance has expired.')
|
|
||||||
|
|
||||||
return lib.LLVMGetSectionContents(self)
|
|
||||||
|
|
||||||
@CachedProperty
|
|
||||||
def address(self):
|
|
||||||
"""The address of this section, in long bytes."""
|
|
||||||
if self.expired:
|
|
||||||
raise Exception('Section instance has expired.')
|
|
||||||
|
|
||||||
return lib.LLVMGetSectionAddress(self)
|
|
||||||
|
|
||||||
def has_symbol(self, symbol):
|
|
||||||
"""Returns whether a Symbol instance is present in this Section."""
|
|
||||||
if self.expired:
|
|
||||||
raise Exception('Section instance has expired.')
|
|
||||||
|
|
||||||
assert isinstance(symbol, Symbol)
|
|
||||||
return lib.LLVMGetSectionContainsSymbol(self, symbol)
|
|
||||||
|
|
||||||
def get_relocations(self, cache=False):
|
|
||||||
"""Obtain the relocations in this Section.
|
|
||||||
|
|
||||||
This is a generator for llvm.object.Relocation instances.
|
|
||||||
|
|
||||||
Each instance is a limited used object. See this module's documentation
|
|
||||||
on iterators for more.
|
|
||||||
"""
|
|
||||||
if self.expired:
|
|
||||||
raise Exception('Section instance has expired.')
|
|
||||||
|
|
||||||
relocations = lib.LLVMGetRelocations(self)
|
|
||||||
last = None
|
|
||||||
while True:
|
|
||||||
if lib.LLVMIsRelocationIteratorAtEnd(self, relocations):
|
|
||||||
break
|
|
||||||
|
|
||||||
last = Relocation(relocations)
|
|
||||||
if cache:
|
|
||||||
last.cache()
|
|
||||||
|
|
||||||
yield last
|
|
||||||
|
|
||||||
lib.LLVMMoveToNextRelocation(relocations)
|
|
||||||
last.expire()
|
|
||||||
|
|
||||||
if last is not None:
|
|
||||||
last.expire()
|
|
||||||
|
|
||||||
lib.LLVMDisposeRelocationIterator(relocations)
|
|
||||||
|
|
||||||
def cache(self):
|
|
||||||
"""Cache properties of this Section.
|
|
||||||
|
|
||||||
This can be called as a workaround to the single active Section
|
|
||||||
limitation. When called, the properties of the Section are fetched so
|
|
||||||
they are still available after the Section has been marked inactive.
|
|
||||||
"""
|
|
||||||
getattr(self, 'name')
|
|
||||||
getattr(self, 'size')
|
|
||||||
getattr(self, 'contents')
|
|
||||||
getattr(self, 'address')
|
|
||||||
|
|
||||||
def expire(self):
|
|
||||||
"""Expire the section.
|
|
||||||
|
|
||||||
This is called internally by the section iterator.
|
|
||||||
"""
|
|
||||||
self.expired = True
|
|
||||||
|
|
||||||
class Symbol(LLVMObject):
|
|
||||||
"""Represents a symbol in an object file."""
|
|
||||||
def __init__(self, ptr, object_file):
|
|
||||||
assert isinstance(ptr, c_object_p)
|
|
||||||
assert isinstance(object_file, ObjectFile)
|
|
||||||
|
|
||||||
LLVMObject.__init__(self, ptr)
|
|
||||||
|
|
||||||
self.expired = False
|
|
||||||
self._object_file = object_file
|
|
||||||
|
|
||||||
@CachedProperty
|
|
||||||
def name(self):
|
|
||||||
"""The str name of the symbol.
|
|
||||||
|
|
||||||
This is often a function or variable name. Keep in mind that name
|
|
||||||
mangling could be in effect.
|
|
||||||
"""
|
|
||||||
if self.expired:
|
|
||||||
raise Exception('Symbol instance has expired.')
|
|
||||||
|
|
||||||
return lib.LLVMGetSymbolName(self)
|
|
||||||
|
|
||||||
@CachedProperty
|
|
||||||
def address(self):
|
|
||||||
"""The address of this symbol, in long bytes."""
|
|
||||||
if self.expired:
|
|
||||||
raise Exception('Symbol instance has expired.')
|
|
||||||
|
|
||||||
return lib.LLVMGetSymbolAddress(self)
|
|
||||||
|
|
||||||
@CachedProperty
|
|
||||||
def file_offset(self):
|
|
||||||
"""The offset of this symbol in the file, in long bytes."""
|
|
||||||
if self.expired:
|
|
||||||
raise Exception('Symbol instance has expired.')
|
|
||||||
|
|
||||||
return lib.LLVMGetSymbolFileOffset(self)
|
|
||||||
|
|
||||||
@CachedProperty
|
|
||||||
def size(self):
|
|
||||||
"""The size of the symbol, in long bytes."""
|
|
||||||
if self.expired:
|
|
||||||
raise Exception('Symbol instance has expired.')
|
|
||||||
|
|
||||||
return lib.LLVMGetSymbolSize(self)
|
|
||||||
|
|
||||||
@CachedProperty
|
|
||||||
def section(self):
|
|
||||||
"""The Section to which this Symbol belongs.
|
|
||||||
|
|
||||||
The returned Section instance does not expire, unlike Sections that are
|
|
||||||
commonly obtained through iteration.
|
|
||||||
|
|
||||||
Because this obtains a new section iterator each time it is accessed,
|
|
||||||
calling this on a number of Symbol instances could be expensive.
|
|
||||||
"""
|
|
||||||
sections = lib.LLVMGetSections(self._object_file)
|
|
||||||
lib.LLVMMoveToContainingSection(sections, self)
|
|
||||||
|
|
||||||
return Section(sections)
|
|
||||||
|
|
||||||
def cache(self):
|
|
||||||
"""Cache all cacheable properties."""
|
|
||||||
getattr(self, 'name')
|
|
||||||
getattr(self, 'address')
|
|
||||||
getattr(self, 'file_offset')
|
|
||||||
getattr(self, 'size')
|
|
||||||
|
|
||||||
def expire(self):
|
|
||||||
"""Mark the object as expired to prevent future API accesses.
|
|
||||||
|
|
||||||
This is called internally by this module and it is unlikely that
|
|
||||||
external callers have a legitimate reason for using it.
|
|
||||||
"""
|
|
||||||
self.expired = True
|
|
||||||
|
|
||||||
class Relocation(LLVMObject):
|
|
||||||
"""Represents a relocation definition."""
|
|
||||||
def __init__(self, ptr):
|
|
||||||
"""Create a new relocation instance.
|
|
||||||
|
|
||||||
Relocations are created from objects derived from Section instances.
|
|
||||||
Therefore, this constructor should not be called outside of this
|
|
||||||
module. See Section.get_relocations() for the proper method to obtain
|
|
||||||
a Relocation instance.
|
|
||||||
"""
|
|
||||||
assert isinstance(ptr, c_object_p)
|
|
||||||
|
|
||||||
LLVMObject.__init__(self, ptr)
|
|
||||||
|
|
||||||
self.expired = False
|
|
||||||
|
|
||||||
@CachedProperty
|
|
||||||
def address(self):
|
|
||||||
"""The address of this relocation, in long bytes."""
|
|
||||||
if self.expired:
|
|
||||||
raise Exception('Relocation instance has expired.')
|
|
||||||
|
|
||||||
return lib.LLVMGetRelocationAddress(self)
|
|
||||||
|
|
||||||
@CachedProperty
|
|
||||||
def offset(self):
|
|
||||||
"""The offset of this relocation, in long bytes."""
|
|
||||||
if self.expired:
|
|
||||||
raise Exception('Relocation instance has expired.')
|
|
||||||
|
|
||||||
return lib.LLVMGetRelocationOffset(self)
|
|
||||||
|
|
||||||
@CachedProperty
|
|
||||||
def symbol(self):
|
|
||||||
"""The Symbol corresponding to this Relocation."""
|
|
||||||
if self.expired:
|
|
||||||
raise Exception('Relocation instance has expired.')
|
|
||||||
|
|
||||||
ptr = lib.LLVMGetRelocationSymbol(self)
|
|
||||||
return Symbol(ptr)
|
|
||||||
|
|
||||||
@CachedProperty
|
|
||||||
def type_number(self):
|
|
||||||
"""The relocation type, as a long."""
|
|
||||||
if self.expired:
|
|
||||||
raise Exception('Relocation instance has expired.')
|
|
||||||
|
|
||||||
return lib.LLVMGetRelocationType(self)
|
|
||||||
|
|
||||||
@CachedProperty
|
|
||||||
def type_name(self):
|
|
||||||
"""The relocation type's name, as a str."""
|
|
||||||
if self.expired:
|
|
||||||
raise Exception('Relocation instance has expired.')
|
|
||||||
|
|
||||||
return lib.LLVMGetRelocationTypeName(self)
|
|
||||||
|
|
||||||
@CachedProperty
|
|
||||||
def value_string(self):
|
|
||||||
if self.expired:
|
|
||||||
raise Exception('Relocation instance has expired.')
|
|
||||||
|
|
||||||
return lib.LLVMGetRelocationValueString(self)
|
|
||||||
|
|
||||||
def expire(self):
|
|
||||||
"""Expire this instance, making future API accesses fail."""
|
|
||||||
self.expired = True
|
|
||||||
|
|
||||||
def cache(self):
|
|
||||||
"""Cache all cacheable properties on this instance."""
|
|
||||||
getattr(self, 'address')
|
|
||||||
getattr(self, 'offset')
|
|
||||||
getattr(self, 'symbol')
|
|
||||||
getattr(self, 'type')
|
|
||||||
getattr(self, 'type_name')
|
|
||||||
getattr(self, 'value_string')
|
|
||||||
|
|
||||||
def register_library(library):
|
|
||||||
"""Register function prototypes with LLVM library instance."""
|
|
||||||
|
|
||||||
# Object.h functions
|
|
||||||
library.LLVMCreateObjectFile.argtypes = [MemoryBuffer]
|
|
||||||
library.LLVMCreateObjectFile.restype = c_object_p
|
|
||||||
|
|
||||||
library.LLVMDisposeObjectFile.argtypes = [ObjectFile]
|
|
||||||
|
|
||||||
library.LLVMGetSections.argtypes = [ObjectFile]
|
|
||||||
library.LLVMGetSections.restype = c_object_p
|
|
||||||
|
|
||||||
library.LLVMDisposeSectionIterator.argtypes = [c_object_p]
|
|
||||||
|
|
||||||
library.LLVMIsSectionIteratorAtEnd.argtypes = [ObjectFile, c_object_p]
|
|
||||||
library.LLVMIsSectionIteratorAtEnd.restype = bool
|
|
||||||
|
|
||||||
library.LLVMMoveToNextSection.argtypes = [c_object_p]
|
|
||||||
|
|
||||||
library.LLVMMoveToContainingSection.argtypes = [c_object_p, c_object_p]
|
|
||||||
|
|
||||||
library.LLVMGetSymbols.argtypes = [ObjectFile]
|
|
||||||
library.LLVMGetSymbols.restype = c_object_p
|
|
||||||
|
|
||||||
library.LLVMDisposeSymbolIterator.argtypes = [c_object_p]
|
|
||||||
|
|
||||||
library.LLVMIsSymbolIteratorAtEnd.argtypes = [ObjectFile, c_object_p]
|
|
||||||
library.LLVMIsSymbolIteratorAtEnd.restype = bool
|
|
||||||
|
|
||||||
library.LLVMMoveToNextSymbol.argtypes = [c_object_p]
|
|
||||||
|
|
||||||
library.LLVMGetSectionName.argtypes = [c_object_p]
|
|
||||||
library.LLVMGetSectionName.restype = c_char_p
|
|
||||||
|
|
||||||
library.LLVMGetSectionSize.argtypes = [c_object_p]
|
|
||||||
library.LLVMGetSectionSize.restype = c_uint64
|
|
||||||
|
|
||||||
library.LLVMGetSectionContents.argtypes = [c_object_p]
|
|
||||||
library.LLVMGetSectionContents.restype = c_char_p
|
|
||||||
|
|
||||||
library.LLVMGetSectionAddress.argtypes = [c_object_p]
|
|
||||||
library.LLVMGetSectionAddress.restype = c_uint64
|
|
||||||
|
|
||||||
library.LLVMGetSectionContainsSymbol.argtypes = [c_object_p, c_object_p]
|
|
||||||
library.LLVMGetSectionContainsSymbol.restype = bool
|
|
||||||
|
|
||||||
library.LLVMGetRelocations.argtypes = [c_object_p]
|
|
||||||
library.LLVMGetRelocations.restype = c_object_p
|
|
||||||
|
|
||||||
library.LLVMDisposeRelocationIterator.argtypes = [c_object_p]
|
|
||||||
|
|
||||||
library.LLVMIsRelocationIteratorAtEnd.argtypes = [c_object_p, c_object_p]
|
|
||||||
library.LLVMIsRelocationIteratorAtEnd.restype = bool
|
|
||||||
|
|
||||||
library.LLVMMoveToNextRelocation.argtypes = [c_object_p]
|
|
||||||
|
|
||||||
library.LLVMGetSymbolName.argtypes = [Symbol]
|
|
||||||
library.LLVMGetSymbolName.restype = c_char_p
|
|
||||||
|
|
||||||
library.LLVMGetSymbolAddress.argtypes = [Symbol]
|
|
||||||
library.LLVMGetSymbolAddress.restype = c_uint64
|
|
||||||
|
|
||||||
library.LLVMGetSymbolFileOffset.argtypes = [Symbol]
|
|
||||||
library.LLVMGetSymbolFileOffset.restype = c_uint64
|
|
||||||
|
|
||||||
library.LLVMGetSymbolSize.argtypes = [Symbol]
|
|
||||||
library.LLVMGetSymbolSize.restype = c_uint64
|
|
||||||
|
|
||||||
library.LLVMGetRelocationAddress.argtypes = [c_object_p]
|
|
||||||
library.LLVMGetRelocationAddress.restype = c_uint64
|
|
||||||
|
|
||||||
library.LLVMGetRelocationOffset.argtypes = [c_object_p]
|
|
||||||
library.LLVMGetRelocationOffset.restype = c_uint64
|
|
||||||
|
|
||||||
library.LLVMGetRelocationSymbol.argtypes = [c_object_p]
|
|
||||||
library.LLVMGetRelocationSymbol.restype = c_object_p
|
|
||||||
|
|
||||||
library.LLVMGetRelocationType.argtypes = [c_object_p]
|
|
||||||
library.LLVMGetRelocationType.restype = c_uint64
|
|
||||||
|
|
||||||
library.LLVMGetRelocationTypeName.argtypes = [c_object_p]
|
|
||||||
library.LLVMGetRelocationTypeName.restype = c_char_p
|
|
||||||
|
|
||||||
library.LLVMGetRelocationValueString.argtypes = [c_object_p]
|
|
||||||
library.LLVMGetRelocationValueString.restype = c_char_p
|
|
||||||
|
|
||||||
lib = get_library()
|
|
||||||
register_library(lib)
|
|
@ -1,32 +0,0 @@
|
|||||||
import os.path
|
|
||||||
import unittest
|
|
||||||
|
|
||||||
POSSIBLE_TEST_BINARIES = [
|
|
||||||
'libreadline.so.5',
|
|
||||||
'libreadline.so.6',
|
|
||||||
]
|
|
||||||
|
|
||||||
POSSIBLE_TEST_BINARY_PATHS = [
|
|
||||||
'/usr/lib/debug',
|
|
||||||
'/lib',
|
|
||||||
'/usr/lib',
|
|
||||||
'/usr/local/lib',
|
|
||||||
'/lib/i386-linux-gnu',
|
|
||||||
]
|
|
||||||
|
|
||||||
class TestBase(unittest.TestCase):
|
|
||||||
def get_test_binary(self):
|
|
||||||
"""Helper to obtain a test binary for object file testing.
|
|
||||||
|
|
||||||
FIXME Support additional, highly-likely targets or create one
|
|
||||||
ourselves.
|
|
||||||
"""
|
|
||||||
for d in POSSIBLE_TEST_BINARY_PATHS:
|
|
||||||
for lib in POSSIBLE_TEST_BINARIES:
|
|
||||||
path = os.path.join(d, lib)
|
|
||||||
|
|
||||||
if os.path.exists(path):
|
|
||||||
return path
|
|
||||||
|
|
||||||
raise Exception('No suitable test binaries available!')
|
|
||||||
get_test_binary.__test__ = False
|
|
@ -1,23 +0,0 @@
|
|||||||
from .base import TestBase
|
|
||||||
from ..core import OpCode
|
|
||||||
from ..core import MemoryBuffer
|
|
||||||
|
|
||||||
class TestCore(TestBase):
|
|
||||||
def test_opcode(self):
|
|
||||||
self.assertTrue(hasattr(OpCode, 'Ret'))
|
|
||||||
self.assertTrue(isinstance(OpCode.Ret, OpCode))
|
|
||||||
self.assertEqual(OpCode.Ret.value, 1)
|
|
||||||
|
|
||||||
op = OpCode.from_value(1)
|
|
||||||
self.assertTrue(isinstance(op, OpCode))
|
|
||||||
self.assertEqual(op, OpCode.Ret)
|
|
||||||
|
|
||||||
def test_memory_buffer_create_from_file(self):
|
|
||||||
source = self.get_test_binary()
|
|
||||||
|
|
||||||
MemoryBuffer(filename=source)
|
|
||||||
|
|
||||||
def test_memory_buffer_failing(self):
|
|
||||||
with self.assertRaises(Exception):
|
|
||||||
MemoryBuffer(filename="/hopefully/this/path/doesnt/exist")
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
|||||||
from .base import TestBase
|
|
||||||
|
|
||||||
from ..disassembler import Disassembler
|
|
||||||
|
|
||||||
class TestDisassembler(TestBase):
|
|
||||||
def test_instantiate(self):
|
|
||||||
Disassembler('i686-apple-darwin9')
|
|
||||||
|
|
||||||
def test_basic(self):
|
|
||||||
sequence = '\x67\xe3\x81' # jcxz -127
|
|
||||||
triple = 'i686-apple-darwin9'
|
|
||||||
|
|
||||||
disassembler = Disassembler(triple)
|
|
||||||
|
|
||||||
count, s = disassembler.get_instruction(sequence)
|
|
||||||
self.assertEqual(count, 3)
|
|
||||||
self.assertEqual(s, '\tjcxz\t-127')
|
|
||||||
|
|
||||||
def test_get_instructions(self):
|
|
||||||
sequence = '\x67\xe3\x81\x01\xc7' # jcxz -127; addl %eax, %edi
|
|
||||||
|
|
||||||
disassembler = Disassembler('i686-apple-darwin9')
|
|
||||||
|
|
||||||
instructions = list(disassembler.get_instructions(sequence))
|
|
||||||
self.assertEqual(len(instructions), 2)
|
|
||||||
|
|
||||||
self.assertEqual(instructions[0], (0, 3, '\tjcxz\t-127'))
|
|
||||||
self.assertEqual(instructions[1], (3, 2, '\taddl\t%eax, %edi'))
|
|
@ -1,67 +0,0 @@
|
|||||||
from .base import TestBase
|
|
||||||
from ..object import ObjectFile
|
|
||||||
from ..object import Relocation
|
|
||||||
from ..object import Section
|
|
||||||
from ..object import Symbol
|
|
||||||
|
|
||||||
class TestObjectFile(TestBase):
|
|
||||||
def get_object_file(self):
|
|
||||||
source = self.get_test_binary()
|
|
||||||
return ObjectFile(filename=source)
|
|
||||||
|
|
||||||
def test_create_from_file(self):
|
|
||||||
self.get_object_file()
|
|
||||||
|
|
||||||
def test_get_sections(self):
|
|
||||||
o = self.get_object_file()
|
|
||||||
|
|
||||||
count = 0
|
|
||||||
for section in o.get_sections():
|
|
||||||
count += 1
|
|
||||||
assert isinstance(section, Section)
|
|
||||||
assert isinstance(section.name, str)
|
|
||||||
assert isinstance(section.size, long)
|
|
||||||
assert isinstance(section.contents, str)
|
|
||||||
assert isinstance(section.address, long)
|
|
||||||
|
|
||||||
self.assertGreater(count, 0)
|
|
||||||
|
|
||||||
for section in o.get_sections():
|
|
||||||
section.cache()
|
|
||||||
|
|
||||||
def test_get_symbols(self):
|
|
||||||
o = self.get_object_file()
|
|
||||||
|
|
||||||
count = 0
|
|
||||||
for symbol in o.get_symbols():
|
|
||||||
count += 1
|
|
||||||
assert isinstance(symbol, Symbol)
|
|
||||||
assert isinstance(symbol.name, str)
|
|
||||||
assert isinstance(symbol.address, long)
|
|
||||||
assert isinstance(symbol.size, long)
|
|
||||||
assert isinstance(symbol.file_offset, long)
|
|
||||||
|
|
||||||
self.assertGreater(count, 0)
|
|
||||||
|
|
||||||
for symbol in o.get_symbols():
|
|
||||||
symbol.cache()
|
|
||||||
|
|
||||||
def test_symbol_section_accessor(self):
|
|
||||||
o = self.get_object_file()
|
|
||||||
|
|
||||||
for symbol in o.get_symbols():
|
|
||||||
section = symbol.section
|
|
||||||
assert isinstance(section, Section)
|
|
||||||
|
|
||||||
break
|
|
||||||
|
|
||||||
def test_get_relocations(self):
|
|
||||||
o = self.get_object_file()
|
|
||||||
for section in o.get_sections():
|
|
||||||
for relocation in section.get_relocations():
|
|
||||||
assert isinstance(relocation, Relocation)
|
|
||||||
assert isinstance(relocation.address, long)
|
|
||||||
assert isinstance(relocation.offset, long)
|
|
||||||
assert isinstance(relocation.type_number, long)
|
|
||||||
assert isinstance(relocation.type_name, str)
|
|
||||||
assert isinstance(relocation.value_string, str)
|
|
@ -1 +0,0 @@
|
|||||||
See docs/CMake.html for instructions on how to build LLVM with CMake.
|
|
@ -1,407 +0,0 @@
|
|||||||
if( WIN32 AND NOT CYGWIN )
|
|
||||||
# We consider Cygwin as another Unix
|
|
||||||
set(PURE_WINDOWS 1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(CheckIncludeFile)
|
|
||||||
include(CheckLibraryExists)
|
|
||||||
include(CheckSymbolExists)
|
|
||||||
include(CheckFunctionExists)
|
|
||||||
include(CheckCXXSourceCompiles)
|
|
||||||
include(TestBigEndian)
|
|
||||||
|
|
||||||
if( UNIX AND NOT BEOS )
|
|
||||||
# Used by check_symbol_exists:
|
|
||||||
set(CMAKE_REQUIRED_LIBRARIES m)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Helper macros and functions
|
|
||||||
macro(add_cxx_include result files)
|
|
||||||
set(${result} "")
|
|
||||||
foreach (file_name ${files})
|
|
||||||
set(${result} "${${result}}#include<${file_name}>\n")
|
|
||||||
endforeach()
|
|
||||||
endmacro(add_cxx_include files result)
|
|
||||||
|
|
||||||
function(check_type_exists type files variable)
|
|
||||||
add_cxx_include(includes "${files}")
|
|
||||||
CHECK_CXX_SOURCE_COMPILES("
|
|
||||||
${includes} ${type} typeVar;
|
|
||||||
int main() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
" ${variable})
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
# include checks
|
|
||||||
check_include_file(argz.h HAVE_ARGZ_H)
|
|
||||||
check_include_file(assert.h HAVE_ASSERT_H)
|
|
||||||
check_include_file(ctype.h HAVE_CTYPE_H)
|
|
||||||
check_include_file(dirent.h HAVE_DIRENT_H)
|
|
||||||
check_include_file(dl.h HAVE_DL_H)
|
|
||||||
check_include_file(dld.h HAVE_DLD_H)
|
|
||||||
check_include_file(dlfcn.h HAVE_DLFCN_H)
|
|
||||||
check_include_file(errno.h HAVE_ERRNO_H)
|
|
||||||
check_include_file(execinfo.h HAVE_EXECINFO_H)
|
|
||||||
check_include_file(fcntl.h HAVE_FCNTL_H)
|
|
||||||
check_include_file(inttypes.h HAVE_INTTYPES_H)
|
|
||||||
check_include_file(limits.h HAVE_LIMITS_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(memory.h HAVE_MEMORY_H)
|
|
||||||
check_include_file(ndir.h HAVE_NDIR_H)
|
|
||||||
if( NOT PURE_WINDOWS )
|
|
||||||
check_include_file(pthread.h HAVE_PTHREAD_H)
|
|
||||||
endif()
|
|
||||||
check_include_file(setjmp.h HAVE_SETJMP_H)
|
|
||||||
check_include_file(signal.h HAVE_SIGNAL_H)
|
|
||||||
check_include_file(stdint.h HAVE_STDINT_H)
|
|
||||||
check_include_file(stdio.h HAVE_STDIO_H)
|
|
||||||
check_include_file(stdlib.h HAVE_STDLIB_H)
|
|
||||||
check_include_file(string.h HAVE_STRING_H)
|
|
||||||
check_include_file(strings.h HAVE_STRINGS_H)
|
|
||||||
check_include_file(sys/dir.h HAVE_SYS_DIR_H)
|
|
||||||
check_include_file(sys/dl.h HAVE_SYS_DL_H)
|
|
||||||
check_include_file(sys/ioctl.h HAVE_SYS_IOCTL_H)
|
|
||||||
check_include_file(sys/mman.h HAVE_SYS_MMAN_H)
|
|
||||||
check_include_file(sys/ndir.h HAVE_SYS_NDIR_H)
|
|
||||||
check_include_file(sys/param.h HAVE_SYS_PARAM_H)
|
|
||||||
check_include_file(sys/resource.h HAVE_SYS_RESOURCE_H)
|
|
||||||
check_include_file(sys/stat.h HAVE_SYS_STAT_H)
|
|
||||||
check_include_file(sys/time.h HAVE_SYS_TIME_H)
|
|
||||||
check_include_file(sys/types.h HAVE_SYS_TYPES_H)
|
|
||||||
check_include_file(sys/uio.h HAVE_SYS_UIO_H)
|
|
||||||
check_include_file(sys/wait.h HAVE_SYS_WAIT_H)
|
|
||||||
check_include_file(termios.h HAVE_TERMIOS_H)
|
|
||||||
check_include_file(unistd.h HAVE_UNISTD_H)
|
|
||||||
check_include_file(utime.h HAVE_UTIME_H)
|
|
||||||
check_include_file(valgrind/valgrind.h HAVE_VALGRIND_VALGRIND_H)
|
|
||||||
check_include_file(windows.h HAVE_WINDOWS_H)
|
|
||||||
check_include_file(fenv.h HAVE_FENV_H)
|
|
||||||
check_include_file(mach/mach.h HAVE_MACH_MACH_H)
|
|
||||||
check_include_file(mach-o/dyld.h HAVE_MACH_O_DYLD_H)
|
|
||||||
|
|
||||||
# library checks
|
|
||||||
if( NOT PURE_WINDOWS )
|
|
||||||
check_library_exists(pthread pthread_create "" HAVE_LIBPTHREAD)
|
|
||||||
check_library_exists(pthread pthread_getspecific "" HAVE_PTHREAD_GETSPECIFIC)
|
|
||||||
check_library_exists(pthread pthread_rwlock_init "" HAVE_PTHREAD_RWLOCK_INIT)
|
|
||||||
check_library_exists(dl dlopen "" HAVE_LIBDL)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# function checks
|
|
||||||
check_symbol_exists(getpagesize unistd.h HAVE_GETPAGESIZE)
|
|
||||||
check_symbol_exists(getrusage sys/resource.h HAVE_GETRUSAGE)
|
|
||||||
check_symbol_exists(setrlimit sys/resource.h HAVE_SETRLIMIT)
|
|
||||||
check_symbol_exists(isatty unistd.h HAVE_ISATTY)
|
|
||||||
check_symbol_exists(index strings.h HAVE_INDEX)
|
|
||||||
check_symbol_exists(isinf cmath HAVE_ISINF_IN_CMATH)
|
|
||||||
check_symbol_exists(isinf math.h HAVE_ISINF_IN_MATH_H)
|
|
||||||
check_symbol_exists(finite ieeefp.h HAVE_FINITE_IN_IEEEFP_H)
|
|
||||||
check_symbol_exists(isnan cmath HAVE_ISNAN_IN_CMATH)
|
|
||||||
check_symbol_exists(isnan math.h HAVE_ISNAN_IN_MATH_H)
|
|
||||||
check_symbol_exists(ceilf math.h HAVE_CEILF)
|
|
||||||
check_symbol_exists(floorf math.h HAVE_FLOORF)
|
|
||||||
check_symbol_exists(fmodf math.h HAVE_FMODF)
|
|
||||||
if( HAVE_SETJMP_H )
|
|
||||||
check_symbol_exists(longjmp setjmp.h HAVE_LONGJMP)
|
|
||||||
check_symbol_exists(setjmp setjmp.h HAVE_SETJMP)
|
|
||||||
check_symbol_exists(siglongjmp setjmp.h HAVE_SIGLONGJMP)
|
|
||||||
check_symbol_exists(sigsetjmp setjmp.h HAVE_SIGSETJMP)
|
|
||||||
endif()
|
|
||||||
if( HAVE_SYS_UIO_H )
|
|
||||||
check_symbol_exists(writev sys/uio.h HAVE_WRITEV)
|
|
||||||
endif()
|
|
||||||
check_symbol_exists(nearbyintf math.h HAVE_NEARBYINTF)
|
|
||||||
check_symbol_exists(mallinfo malloc.h HAVE_MALLINFO)
|
|
||||||
check_symbol_exists(malloc_zone_statistics malloc/malloc.h
|
|
||||||
HAVE_MALLOC_ZONE_STATISTICS)
|
|
||||||
check_symbol_exists(mkdtemp "stdlib.h;unistd.h" HAVE_MKDTEMP)
|
|
||||||
check_symbol_exists(mkstemp "stdlib.h;unistd.h" HAVE_MKSTEMP)
|
|
||||||
check_symbol_exists(mktemp "stdlib.h;unistd.h" HAVE_MKTEMP)
|
|
||||||
check_symbol_exists(closedir "sys/types.h;dirent.h" HAVE_CLOSEDIR)
|
|
||||||
check_symbol_exists(opendir "sys/types.h;dirent.h" HAVE_OPENDIR)
|
|
||||||
check_symbol_exists(readdir "sys/types.h;dirent.h" HAVE_READDIR)
|
|
||||||
check_symbol_exists(getcwd unistd.h HAVE_GETCWD)
|
|
||||||
check_symbol_exists(gettimeofday sys/time.h HAVE_GETTIMEOFDAY)
|
|
||||||
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(pread unistd.h HAVE_PREAD)
|
|
||||||
check_symbol_exists(rindex strings.h HAVE_RINDEX)
|
|
||||||
check_symbol_exists(strchr string.h HAVE_STRCHR)
|
|
||||||
check_symbol_exists(strcmp string.h HAVE_STRCMP)
|
|
||||||
check_symbol_exists(strdup string.h HAVE_STRDUP)
|
|
||||||
check_symbol_exists(strrchr string.h HAVE_STRRCHR)
|
|
||||||
if( NOT PURE_WINDOWS )
|
|
||||||
check_symbol_exists(pthread_mutex_lock pthread.h HAVE_PTHREAD_MUTEX_LOCK)
|
|
||||||
endif()
|
|
||||||
check_symbol_exists(sbrk unistd.h HAVE_SBRK)
|
|
||||||
check_symbol_exists(srand48 stdlib.h HAVE_RAND48_SRAND48)
|
|
||||||
if( HAVE_RAND48_SRAND48 )
|
|
||||||
check_symbol_exists(lrand48 stdlib.h HAVE_RAND48_LRAND48)
|
|
||||||
if( HAVE_RAND48_LRAND48 )
|
|
||||||
check_symbol_exists(drand48 stdlib.h HAVE_RAND48_DRAND48)
|
|
||||||
if( HAVE_RAND48_DRAND48 )
|
|
||||||
set(HAVE_RAND48 1 CACHE INTERNAL "are srand48/lrand48/drand48 available?")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
check_symbol_exists(strtoll stdlib.h HAVE_STRTOLL)
|
|
||||||
check_symbol_exists(strtoq stdlib.h HAVE_STRTOQ)
|
|
||||||
check_symbol_exists(strerror string.h HAVE_STRERROR)
|
|
||||||
check_symbol_exists(strerror_r string.h HAVE_STRERROR_R)
|
|
||||||
check_symbol_exists(strerror_s string.h HAVE_DECL_STRERROR_S)
|
|
||||||
check_symbol_exists(memcpy string.h HAVE_MEMCPY)
|
|
||||||
check_symbol_exists(memmove string.h HAVE_MEMMOVE)
|
|
||||||
check_symbol_exists(setenv stdlib.h HAVE_SETENV)
|
|
||||||
if( PURE_WINDOWS )
|
|
||||||
check_symbol_exists(_chsize_s io.h HAVE__CHSIZE_S)
|
|
||||||
|
|
||||||
check_function_exists(_alloca HAVE__ALLOCA)
|
|
||||||
check_function_exists(__alloca HAVE___ALLOCA)
|
|
||||||
check_function_exists(__chkstk HAVE___CHKSTK)
|
|
||||||
check_function_exists(___chkstk HAVE____CHKSTK)
|
|
||||||
|
|
||||||
check_function_exists(__ashldi3 HAVE___ASHLDI3)
|
|
||||||
check_function_exists(__ashrdi3 HAVE___ASHRDI3)
|
|
||||||
check_function_exists(__divdi3 HAVE___DIVDI3)
|
|
||||||
check_function_exists(__fixdfdi HAVE___FIXDFDI)
|
|
||||||
check_function_exists(__fixsfdi HAVE___FIXSFDI)
|
|
||||||
check_function_exists(__floatdidf HAVE___FLOATDIDF)
|
|
||||||
check_function_exists(__lshrdi3 HAVE___LSHRDI3)
|
|
||||||
check_function_exists(__moddi3 HAVE___MODDI3)
|
|
||||||
check_function_exists(__udivdi3 HAVE___UDIVDI3)
|
|
||||||
check_function_exists(__umoddi3 HAVE___UMODDI3)
|
|
||||||
|
|
||||||
check_function_exists(__main HAVE___MAIN)
|
|
||||||
check_function_exists(__cmpdi2 HAVE___CMPDI2)
|
|
||||||
endif()
|
|
||||||
if( HAVE_ARGZ_H )
|
|
||||||
check_symbol_exists(argz_append argz.h HAVE_ARGZ_APPEND)
|
|
||||||
check_symbol_exists(argz_create_sep argz.h HAVE_ARGZ_CREATE_SEP)
|
|
||||||
check_symbol_exists(argz_insert argz.h HAVE_ARGZ_INSERT)
|
|
||||||
check_symbol_exists(argz_next argz.h HAVE_ARGZ_NEXT)
|
|
||||||
check_symbol_exists(argz_stringify argz.h HAVE_ARGZ_STRINGIFY)
|
|
||||||
endif()
|
|
||||||
if( HAVE_DLFCN_H )
|
|
||||||
if( HAVE_LIBDL )
|
|
||||||
list(APPEND CMAKE_REQUIRED_LIBRARIES dl)
|
|
||||||
endif()
|
|
||||||
check_symbol_exists(dlerror dlfcn.h HAVE_DLERROR)
|
|
||||||
check_symbol_exists(dlopen dlfcn.h HAVE_DLOPEN)
|
|
||||||
if( HAVE_LIBDL )
|
|
||||||
list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES dl)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
check_symbol_exists(__GLIBC__ stdio.h LLVM_USING_GLIBC)
|
|
||||||
if( LLVM_USING_GLIBC )
|
|
||||||
add_llvm_definitions( -D_GNU_SOURCE )
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(headers "")
|
|
||||||
if (HAVE_SYS_TYPES_H)
|
|
||||||
set(headers ${headers} "sys/types.h")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (HAVE_INTTYPES_H)
|
|
||||||
set(headers ${headers} "inttypes.h")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (HAVE_STDINT_H)
|
|
||||||
set(headers ${headers} "stdint.h")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
check_type_exists(int64_t "${headers}" HAVE_INT64_T)
|
|
||||||
check_type_exists(uint64_t "${headers}" HAVE_UINT64_T)
|
|
||||||
check_type_exists(u_int64_t "${headers}" HAVE_U_INT64_T)
|
|
||||||
check_type_exists(error_t errno.h HAVE_ERROR_T)
|
|
||||||
|
|
||||||
# available programs checks
|
|
||||||
function(llvm_find_program name)
|
|
||||||
string(TOUPPER ${name} NAME)
|
|
||||||
string(REGEX REPLACE "\\." "_" NAME ${NAME})
|
|
||||||
find_program(LLVM_PATH_${NAME} ${name})
|
|
||||||
mark_as_advanced(LLVM_PATH_${NAME})
|
|
||||||
if(LLVM_PATH_${NAME})
|
|
||||||
set(HAVE_${NAME} 1 CACHE INTERNAL "Is ${name} available ?")
|
|
||||||
mark_as_advanced(HAVE_${NAME})
|
|
||||||
else(LLVM_PATH_${NAME})
|
|
||||||
set(HAVE_${NAME} "" CACHE INTERNAL "Is ${name} available ?")
|
|
||||||
endif(LLVM_PATH_${NAME})
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
llvm_find_program(gv)
|
|
||||||
llvm_find_program(circo)
|
|
||||||
llvm_find_program(twopi)
|
|
||||||
llvm_find_program(neato)
|
|
||||||
llvm_find_program(fdp)
|
|
||||||
llvm_find_program(dot)
|
|
||||||
llvm_find_program(dotty)
|
|
||||||
llvm_find_program(xdot.py)
|
|
||||||
|
|
||||||
if( LLVM_ENABLE_FFI )
|
|
||||||
find_path(FFI_INCLUDE_PATH ffi.h PATHS ${FFI_INCLUDE_DIR})
|
|
||||||
if( FFI_INCLUDE_PATH )
|
|
||||||
set(FFI_HEADER ffi.h CACHE INTERNAL "")
|
|
||||||
set(HAVE_FFI_H 1 CACHE INTERNAL "")
|
|
||||||
else()
|
|
||||||
find_path(FFI_INCLUDE_PATH ffi/ffi.h PATHS ${FFI_INCLUDE_DIR})
|
|
||||||
if( FFI_INCLUDE_PATH )
|
|
||||||
set(FFI_HEADER ffi/ffi.h CACHE INTERNAL "")
|
|
||||||
set(HAVE_FFI_FFI_H 1 CACHE INTERNAL "")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if( NOT FFI_HEADER )
|
|
||||||
message(FATAL_ERROR "libffi includes are not found.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_library(FFI_LIBRARY_PATH ffi PATHS ${FFI_LIBRARY_DIR})
|
|
||||||
if( NOT FFI_LIBRARY_PATH )
|
|
||||||
message(FATAL_ERROR "libffi is not found.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
list(APPEND CMAKE_REQUIRED_LIBRARIES ${FFI_LIBRARY_PATH})
|
|
||||||
list(APPEND CMAKE_REQUIRED_INCLUDES ${FFI_INCLUDE_PATH})
|
|
||||||
check_symbol_exists(ffi_call ${FFI_HEADER} HAVE_FFI_CALL)
|
|
||||||
list(REMOVE_ITEM CMAKE_REQUIRED_INCLUDES ${FFI_INCLUDE_PATH})
|
|
||||||
list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES ${FFI_LIBRARY_PATH})
|
|
||||||
else()
|
|
||||||
unset(HAVE_FFI_FFI_H CACHE)
|
|
||||||
unset(HAVE_FFI_H CACHE)
|
|
||||||
unset(HAVE_FFI_CALL CACHE)
|
|
||||||
endif( LLVM_ENABLE_FFI )
|
|
||||||
|
|
||||||
# Define LLVM_HAS_ATOMICS if gcc or MSVC atomic builtins are supported.
|
|
||||||
include(CheckAtomic)
|
|
||||||
|
|
||||||
if( LLVM_ENABLE_PIC )
|
|
||||||
set(ENABLE_PIC 1)
|
|
||||||
else()
|
|
||||||
set(ENABLE_PIC 0)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(CheckCXXCompilerFlag)
|
|
||||||
|
|
||||||
check_cxx_compiler_flag("-Wno-variadic-macros" SUPPORTS_NO_VARIADIC_MACROS_FLAG)
|
|
||||||
|
|
||||||
include(GetHostTriple)
|
|
||||||
get_host_triple(LLVM_HOST_TRIPLE)
|
|
||||||
|
|
||||||
# By default, we target the host, but this can be overridden at CMake
|
|
||||||
# invocation time.
|
|
||||||
set(LLVM_DEFAULT_TARGET_TRIPLE "${LLVM_HOST_TRIPLE}")
|
|
||||||
set(TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}")
|
|
||||||
|
|
||||||
# Determine the native architecture.
|
|
||||||
string(TOLOWER "${LLVM_TARGET_ARCH}" LLVM_NATIVE_ARCH)
|
|
||||||
if( LLVM_NATIVE_ARCH STREQUAL "host" )
|
|
||||||
string(REGEX MATCH "^[^-]*" LLVM_NATIVE_ARCH ${LLVM_HOST_TRIPLE})
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (LLVM_NATIVE_ARCH MATCHES "i[2-6]86")
|
|
||||||
set(LLVM_NATIVE_ARCH X86)
|
|
||||||
elseif (LLVM_NATIVE_ARCH STREQUAL "x86")
|
|
||||||
set(LLVM_NATIVE_ARCH X86)
|
|
||||||
elseif (LLVM_NATIVE_ARCH STREQUAL "amd64")
|
|
||||||
set(LLVM_NATIVE_ARCH X86)
|
|
||||||
elseif (LLVM_NATIVE_ARCH STREQUAL "x86_64")
|
|
||||||
set(LLVM_NATIVE_ARCH X86)
|
|
||||||
elseif (LLVM_NATIVE_ARCH MATCHES "sparc")
|
|
||||||
set(LLVM_NATIVE_ARCH Sparc)
|
|
||||||
elseif (LLVM_NATIVE_ARCH MATCHES "powerpc")
|
|
||||||
set(LLVM_NATIVE_ARCH PowerPC)
|
|
||||||
elseif (LLVM_NATIVE_ARCH MATCHES "arm")
|
|
||||||
set(LLVM_NATIVE_ARCH ARM)
|
|
||||||
elseif (LLVM_NATIVE_ARCH MATCHES "mips")
|
|
||||||
set(LLVM_NATIVE_ARCH Mips)
|
|
||||||
elseif (LLVM_NATIVE_ARCH MATCHES "xcore")
|
|
||||||
set(LLVM_NATIVE_ARCH XCore)
|
|
||||||
elseif (LLVM_NATIVE_ARCH MATCHES "msp430")
|
|
||||||
set(LLVM_NATIVE_ARCH MSP430)
|
|
||||||
else ()
|
|
||||||
message(FATAL_ERROR "Unknown architecture ${LLVM_NATIVE_ARCH}")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
list(FIND LLVM_TARGETS_TO_BUILD ${LLVM_NATIVE_ARCH} NATIVE_ARCH_IDX)
|
|
||||||
if (NATIVE_ARCH_IDX EQUAL -1)
|
|
||||||
message(STATUS
|
|
||||||
"Native target ${LLVM_NATIVE_ARCH} is not selected; lli will not JIT code")
|
|
||||||
else ()
|
|
||||||
message(STATUS "Native target architecture is ${LLVM_NATIVE_ARCH}")
|
|
||||||
set(LLVM_NATIVE_TARGET LLVMInitialize${LLVM_NATIVE_ARCH}Target)
|
|
||||||
set(LLVM_NATIVE_TARGETINFO LLVMInitialize${LLVM_NATIVE_ARCH}TargetInfo)
|
|
||||||
set(LLVM_NATIVE_TARGETMC LLVMInitialize${LLVM_NATIVE_ARCH}TargetMC)
|
|
||||||
set(LLVM_NATIVE_ASMPRINTER LLVMInitialize${LLVM_NATIVE_ARCH}AsmPrinter)
|
|
||||||
|
|
||||||
# We don't have an ASM parser for all architectures yet.
|
|
||||||
if (EXISTS ${CMAKE_SOURCE_DIR}/lib/Target/${LLVM_NATIVE_ARCH}/AsmParser/CMakeLists.txt)
|
|
||||||
set(LLVM_NATIVE_ASMPARSER LLVMInitialize${LLVM_NATIVE_ARCH}AsmParser)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
# We don't have an disassembler for all architectures yet.
|
|
||||||
if (EXISTS ${CMAKE_SOURCE_DIR}/lib/Target/${LLVM_NATIVE_ARCH}/Disassembler/CMakeLists.txt)
|
|
||||||
set(LLVM_NATIVE_DISASSEMBLER LLVMInitialize${LLVM_NATIVE_ARCH}Disassembler)
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if( MINGW )
|
|
||||||
set(HAVE_LIBIMAGEHLP 1)
|
|
||||||
set(HAVE_LIBPSAPI 1)
|
|
||||||
# TODO: Check existence of libraries.
|
|
||||||
# include(CheckLibraryExists)
|
|
||||||
# CHECK_LIBRARY_EXISTS(imagehlp ??? . HAVE_LIBIMAGEHLP)
|
|
||||||
endif( MINGW )
|
|
||||||
|
|
||||||
if( MSVC )
|
|
||||||
set(error_t int)
|
|
||||||
set(LTDL_SHLIBPATH_VAR "PATH")
|
|
||||||
set(LTDL_SYSSEARCHPATH "")
|
|
||||||
set(LTDL_DLOPEN_DEPLIBS 1)
|
|
||||||
set(SHLIBEXT ".lib")
|
|
||||||
set(LTDL_OBJDIR "_libs")
|
|
||||||
set(HAVE_STRTOLL 1)
|
|
||||||
set(strtoll "_strtoi64")
|
|
||||||
set(strtoull "_strtoui64")
|
|
||||||
set(stricmp "_stricmp")
|
|
||||||
set(strdup "_strdup")
|
|
||||||
else( MSVC )
|
|
||||||
set(LTDL_SHLIBPATH_VAR "LD_LIBRARY_PATH")
|
|
||||||
set(LTDL_SYSSEARCHPATH "") # TODO
|
|
||||||
set(LTDL_DLOPEN_DEPLIBS 0) # TODO
|
|
||||||
endif( MSVC )
|
|
||||||
|
|
||||||
if( PURE_WINDOWS )
|
|
||||||
CHECK_CXX_SOURCE_COMPILES("
|
|
||||||
#include <windows.h>
|
|
||||||
#include <imagehlp.h>
|
|
||||||
extern \"C\" void foo(PENUMLOADED_MODULES_CALLBACK);
|
|
||||||
extern \"C\" void foo(BOOL(CALLBACK*)(PCSTR,ULONG_PTR,ULONG,PVOID));
|
|
||||||
int main(){return 0;}"
|
|
||||||
HAVE_ELMCB_PCSTR)
|
|
||||||
if( HAVE_ELMCB_PCSTR )
|
|
||||||
set(WIN32_ELMCB_PCSTR "PCSTR")
|
|
||||||
else()
|
|
||||||
set(WIN32_ELMCB_PCSTR "PSTR")
|
|
||||||
endif()
|
|
||||||
endif( PURE_WINDOWS )
|
|
||||||
|
|
||||||
# FIXME: Signal handler return type, currently hardcoded to 'void'
|
|
||||||
set(RETSIGTYPE void)
|
|
||||||
|
|
||||||
if( LLVM_ENABLE_THREADS )
|
|
||||||
# Check if threading primitives aren't supported on this platform
|
|
||||||
if( NOT HAVE_PTHREAD_H AND NOT WIN32 )
|
|
||||||
set(LLVM_ENABLE_THREADS 0)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if( LLVM_ENABLE_THREADS )
|
|
||||||
message(STATUS "Threads enabled.")
|
|
||||||
else( LLVM_ENABLE_THREADS )
|
|
||||||
message(STATUS "Threads disabled.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(LLVM_PREFIX ${CMAKE_INSTALL_PREFIX})
|
|
@ -1,132 +0,0 @@
|
|||||||
include(LLVMProcessSources)
|
|
||||||
include(LLVM-Config)
|
|
||||||
|
|
||||||
macro(add_llvm_library name)
|
|
||||||
llvm_process_sources( ALL_FILES ${ARGN} )
|
|
||||||
add_library( ${name} ${ALL_FILES} )
|
|
||||||
set_property( GLOBAL APPEND PROPERTY LLVM_LIBS ${name} )
|
|
||||||
if( LLVM_COMMON_DEPENDS )
|
|
||||||
add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} )
|
|
||||||
endif( LLVM_COMMON_DEPENDS )
|
|
||||||
|
|
||||||
if( BUILD_SHARED_LIBS )
|
|
||||||
llvm_config( ${name} ${LLVM_LINK_COMPONENTS} )
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Ensure that the system libraries always comes last on the
|
|
||||||
# list. Without this, linking the unit tests on MinGW fails.
|
|
||||||
link_system_libs( ${name} )
|
|
||||||
|
|
||||||
if( EXCLUDE_FROM_ALL )
|
|
||||||
set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON)
|
|
||||||
else()
|
|
||||||
install(TARGETS ${name}
|
|
||||||
LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
|
|
||||||
ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX})
|
|
||||||
endif()
|
|
||||||
set_target_properties(${name} PROPERTIES FOLDER "Libraries")
|
|
||||||
|
|
||||||
# Add the explicit dependency information for this library.
|
|
||||||
#
|
|
||||||
# It would be nice to verify that we have the dependencies for this library
|
|
||||||
# name, but using get_property(... SET) doesn't suffice to determine if a
|
|
||||||
# property has been set to an empty value.
|
|
||||||
get_property(lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${name})
|
|
||||||
target_link_libraries(${name} ${lib_deps})
|
|
||||||
endmacro(add_llvm_library name)
|
|
||||||
|
|
||||||
macro(add_llvm_loadable_module name)
|
|
||||||
if( NOT LLVM_ON_UNIX OR CYGWIN )
|
|
||||||
message(STATUS "Loadable modules not supported on this platform.
|
|
||||||
${name} ignored.")
|
|
||||||
# Add empty "phony" target
|
|
||||||
add_custom_target(${name})
|
|
||||||
else()
|
|
||||||
llvm_process_sources( ALL_FILES ${ARGN} )
|
|
||||||
if (MODULE)
|
|
||||||
set(libkind MODULE)
|
|
||||||
else()
|
|
||||||
set(libkind SHARED)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_library( ${name} ${libkind} ${ALL_FILES} )
|
|
||||||
set_target_properties( ${name} PROPERTIES PREFIX "" )
|
|
||||||
|
|
||||||
llvm_config( ${name} ${LLVM_LINK_COMPONENTS} )
|
|
||||||
link_system_libs( ${name} )
|
|
||||||
|
|
||||||
if (APPLE)
|
|
||||||
# Darwin-specific linker flags for loadable modules.
|
|
||||||
set_target_properties(${name} PROPERTIES
|
|
||||||
LINK_FLAGS "-Wl,-flat_namespace -Wl,-undefined -Wl,suppress")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if( EXCLUDE_FROM_ALL )
|
|
||||||
set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON)
|
|
||||||
else()
|
|
||||||
install(TARGETS ${name}
|
|
||||||
LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
|
|
||||||
ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX})
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set_target_properties(${name} PROPERTIES FOLDER "Loadable modules")
|
|
||||||
endmacro(add_llvm_loadable_module name)
|
|
||||||
|
|
||||||
|
|
||||||
macro(add_llvm_executable name)
|
|
||||||
llvm_process_sources( ALL_FILES ${ARGN} )
|
|
||||||
if( EXCLUDE_FROM_ALL )
|
|
||||||
add_executable(${name} EXCLUDE_FROM_ALL ${ALL_FILES})
|
|
||||||
else()
|
|
||||||
add_executable(${name} ${ALL_FILES})
|
|
||||||
endif()
|
|
||||||
set(EXCLUDE_FROM_ALL OFF)
|
|
||||||
target_link_libraries( ${name} ${LLVM_USED_LIBS} )
|
|
||||||
llvm_config( ${name} ${LLVM_LINK_COMPONENTS} )
|
|
||||||
if( LLVM_COMMON_DEPENDS )
|
|
||||||
add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} )
|
|
||||||
endif( LLVM_COMMON_DEPENDS )
|
|
||||||
link_system_libs( ${name} )
|
|
||||||
endmacro(add_llvm_executable name)
|
|
||||||
|
|
||||||
|
|
||||||
macro(add_llvm_tool name)
|
|
||||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR})
|
|
||||||
if( NOT LLVM_BUILD_TOOLS )
|
|
||||||
set(EXCLUDE_FROM_ALL ON)
|
|
||||||
endif()
|
|
||||||
add_llvm_executable(${name} ${ARGN})
|
|
||||||
if( LLVM_BUILD_TOOLS )
|
|
||||||
install(TARGETS ${name} RUNTIME DESTINATION bin)
|
|
||||||
endif()
|
|
||||||
set_target_properties(${name} PROPERTIES FOLDER "Tools")
|
|
||||||
endmacro(add_llvm_tool name)
|
|
||||||
|
|
||||||
|
|
||||||
macro(add_llvm_example name)
|
|
||||||
# set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_EXAMPLES_BINARY_DIR})
|
|
||||||
if( NOT LLVM_BUILD_EXAMPLES )
|
|
||||||
set(EXCLUDE_FROM_ALL ON)
|
|
||||||
endif()
|
|
||||||
add_llvm_executable(${name} ${ARGN})
|
|
||||||
if( LLVM_BUILD_EXAMPLES )
|
|
||||||
install(TARGETS ${name} RUNTIME DESTINATION examples)
|
|
||||||
endif()
|
|
||||||
set_target_properties(${name} PROPERTIES FOLDER "Examples")
|
|
||||||
endmacro(add_llvm_example name)
|
|
||||||
|
|
||||||
|
|
||||||
macro(add_llvm_utility name)
|
|
||||||
add_llvm_executable(${name} ${ARGN})
|
|
||||||
set_target_properties(${name} PROPERTIES FOLDER "Utils")
|
|
||||||
endmacro(add_llvm_utility name)
|
|
||||||
|
|
||||||
|
|
||||||
macro(add_llvm_target target_name)
|
|
||||||
include_directories(BEFORE
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR})
|
|
||||||
add_llvm_library(LLVM${target_name} ${ARGN} ${TABLEGEN_OUTPUT})
|
|
||||||
set( CURRENT_LLVM_TARGET LLVM${target_name} )
|
|
||||||
endmacro(add_llvm_target)
|
|
@ -1,13 +0,0 @@
|
|||||||
# There is no clear way of keeping track of compiler command-line
|
|
||||||
# options chosen via `add_definitions', so we need our own method for
|
|
||||||
# using it on tools/llvm-config/CMakeLists.txt.
|
|
||||||
|
|
||||||
# Beware that there is no implementation of remove_llvm_definitions.
|
|
||||||
|
|
||||||
macro(add_llvm_definitions)
|
|
||||||
# We don't want no semicolons on LLVM_DEFINITIONS:
|
|
||||||
foreach(arg ${ARGN})
|
|
||||||
set(LLVM_DEFINITIONS "${LLVM_DEFINITIONS} ${arg}")
|
|
||||||
endforeach(arg)
|
|
||||||
add_definitions( ${ARGN} )
|
|
||||||
endmacro(add_llvm_definitions)
|
|
@ -1,37 +0,0 @@
|
|||||||
set(llvm_cmake_builddir "${LLVM_BINARY_DIR}/share/llvm/cmake")
|
|
||||||
set(LLVM_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
|
|
||||||
|
|
||||||
get_property(llvm_libs GLOBAL PROPERTY LLVM_LIBS)
|
|
||||||
|
|
||||||
foreach(lib ${llvm_libs})
|
|
||||||
get_property(llvm_lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${lib})
|
|
||||||
set(all_llvm_lib_deps
|
|
||||||
"${all_llvm_lib_deps}\nset_property(GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${lib} ${llvm_lib_deps})")
|
|
||||||
endforeach(lib)
|
|
||||||
|
|
||||||
configure_file(
|
|
||||||
LLVMConfig.cmake.in
|
|
||||||
${llvm_cmake_builddir}/LLVMConfig.cmake
|
|
||||||
@ONLY)
|
|
||||||
|
|
||||||
configure_file(
|
|
||||||
LLVMConfigVersion.cmake.in
|
|
||||||
${llvm_cmake_builddir}/LLVMConfigVersion.cmake
|
|
||||||
@ONLY)
|
|
||||||
|
|
||||||
install(FILES
|
|
||||||
${llvm_cmake_builddir}/LLVMConfig.cmake
|
|
||||||
${llvm_cmake_builddir}/LLVMConfigVersion.cmake
|
|
||||||
LLVM-Config.cmake
|
|
||||||
DESTINATION share/llvm/cmake)
|
|
||||||
|
|
||||||
install(DIRECTORY .
|
|
||||||
DESTINATION share/llvm/cmake
|
|
||||||
FILES_MATCHING PATTERN *.cmake
|
|
||||||
PATTERN .svn EXCLUDE
|
|
||||||
PATTERN LLVMConfig.cmake EXCLUDE
|
|
||||||
PATTERN LLVMConfigVersion.cmake EXCLUDE
|
|
||||||
PATTERN LLVM-Config.cmake EXCLUDE
|
|
||||||
PATTERN GetHostTriple.cmake EXCLUDE
|
|
||||||
PATTERN VersionFromVCS.cmake EXCLUDE
|
|
||||||
PATTERN CheckAtomic.cmake EXCLUDE)
|
|
@ -1,29 +0,0 @@
|
|||||||
# atomic builtins are required for threading support.
|
|
||||||
|
|
||||||
INCLUDE(CheckCXXSourceCompiles)
|
|
||||||
|
|
||||||
CHECK_CXX_SOURCE_COMPILES("
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#include <windows.h>
|
|
||||||
#endif
|
|
||||||
int main() {
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
volatile LONG val = 1;
|
|
||||||
MemoryBarrier();
|
|
||||||
InterlockedCompareExchange(&val, 0, 1);
|
|
||||||
InterlockedIncrement(&val);
|
|
||||||
InterlockedDecrement(&val);
|
|
||||||
#else
|
|
||||||
volatile unsigned long val = 1;
|
|
||||||
__sync_synchronize();
|
|
||||||
__sync_val_compare_and_swap(&val, 1, 0);
|
|
||||||
__sync_add_and_fetch(&val, 1);
|
|
||||||
__sync_sub_and_fetch(&val, 1);
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
" LLVM_HAS_ATOMICS)
|
|
||||||
|
|
||||||
if( NOT LLVM_HAS_ATOMICS )
|
|
||||||
message(STATUS "Warning: LLVM will be built thread-unsafe because atomic builtins are missing")
|
|
||||||
endif()
|
|
@ -1,106 +0,0 @@
|
|||||||
# The macro choose_msvc_crt() takes a list of possible
|
|
||||||
# C runtimes to choose from, in the form of compiler flags,
|
|
||||||
# to present to the user. (MTd for /MTd, etc)
|
|
||||||
#
|
|
||||||
# The macro is invoked at the end of the file.
|
|
||||||
#
|
|
||||||
# CMake already sets CRT flags in the CMAKE_CXX_FLAGS_* and
|
|
||||||
# CMAKE_C_FLAGS_* variables by default. To let the user
|
|
||||||
# override that for each build type:
|
|
||||||
# 1. Detect which CRT is already selected, and reflect this in
|
|
||||||
# LLVM_USE_CRT_* so the user can have a better idea of what
|
|
||||||
# changes they're making.
|
|
||||||
# 2. Replace the flags in both variables with the new flag via a regex.
|
|
||||||
# 3. set() the variables back into the cache so the changes
|
|
||||||
# are user-visible.
|
|
||||||
|
|
||||||
### Helper macros: ###
|
|
||||||
macro(make_crt_regex regex crts)
|
|
||||||
set(${regex} "")
|
|
||||||
foreach(crt ${${crts}})
|
|
||||||
# Trying to match the beginning or end of the string with stuff
|
|
||||||
# like [ ^]+ didn't work, so use a bunch of parentheses instead.
|
|
||||||
set(${regex} "${${regex}}|(^| +)/${crt}($| +)")
|
|
||||||
endforeach(crt)
|
|
||||||
string(REGEX REPLACE "^\\|" "" ${regex} "${${regex}}")
|
|
||||||
endmacro(make_crt_regex)
|
|
||||||
|
|
||||||
macro(get_current_crt crt_current regex flagsvar)
|
|
||||||
# Find the selected-by-CMake CRT for each build type, if any.
|
|
||||||
# Strip off the leading slash and any whitespace.
|
|
||||||
string(REGEX MATCH "${${regex}}" ${crt_current} "${${flagsvar}}")
|
|
||||||
string(REPLACE "/" " " ${crt_current} "${${crt_current}}")
|
|
||||||
string(STRIP "${${crt_current}}" ${crt_current})
|
|
||||||
endmacro(get_current_crt)
|
|
||||||
|
|
||||||
# Replaces or adds a flag to a variable.
|
|
||||||
# Expects 'flag' to be padded with spaces.
|
|
||||||
macro(set_flag_in_var flagsvar regex flag)
|
|
||||||
string(REGEX MATCH "${${regex}}" current_flag "${${flagsvar}}")
|
|
||||||
if("${current_flag}" STREQUAL "")
|
|
||||||
set(${flagsvar} "${${flagsvar}}${${flag}}")
|
|
||||||
else()
|
|
||||||
string(REGEX REPLACE "${${regex}}" "${${flag}}" ${flagsvar} "${${flagsvar}}")
|
|
||||||
endif()
|
|
||||||
string(STRIP "${${flagsvar}}" ${flagsvar})
|
|
||||||
# Make sure this change gets reflected in the cache/gui.
|
|
||||||
# CMake requires the docstring parameter whenever set() touches the cache,
|
|
||||||
# so get the existing docstring and re-use that.
|
|
||||||
get_property(flagsvar_docs CACHE ${flagsvar} PROPERTY HELPSTRING)
|
|
||||||
set(${flagsvar} "${${flagsvar}}" CACHE STRING "${flagsvar_docs}" FORCE)
|
|
||||||
endmacro(set_flag_in_var)
|
|
||||||
|
|
||||||
|
|
||||||
macro(choose_msvc_crt MSVC_CRT)
|
|
||||||
if(LLVM_USE_CRT)
|
|
||||||
message(FATAL_ERROR
|
|
||||||
"LLVM_USE_CRT is deprecated. Use the CMAKE_BUILD_TYPE-specific
|
|
||||||
variables (LLVM_USE_CRT_DEBUG, etc) instead.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
make_crt_regex(MSVC_CRT_REGEX ${MSVC_CRT})
|
|
||||||
|
|
||||||
foreach(build_type ${CMAKE_CONFIGURATION_TYPES} ${CMAKE_BUILD_TYPE})
|
|
||||||
string(TOUPPER "${build_type}" build)
|
|
||||||
if (NOT LLVM_USE_CRT_${build})
|
|
||||||
get_current_crt(LLVM_USE_CRT_${build}
|
|
||||||
MSVC_CRT_REGEX
|
|
||||||
CMAKE_CXX_FLAGS_${build})
|
|
||||||
set(LLVM_USE_CRT_${build}
|
|
||||||
"${LLVM_USE_CRT_${build}}"
|
|
||||||
CACHE STRING "Specify VC++ CRT to use for ${build_type} configurations."
|
|
||||||
FORCE)
|
|
||||||
set_property(CACHE LLVM_USE_CRT_${build}
|
|
||||||
PROPERTY STRINGS "";${${MSVC_CRT}})
|
|
||||||
endif(NOT LLVM_USE_CRT_${build})
|
|
||||||
endforeach(build_type)
|
|
||||||
|
|
||||||
foreach(build_type ${CMAKE_CONFIGURATION_TYPES} ${CMAKE_BUILD_TYPE})
|
|
||||||
string(TOUPPER "${build_type}" build)
|
|
||||||
if ("${LLVM_USE_CRT_${build}}" STREQUAL "")
|
|
||||||
set(flag_string " ")
|
|
||||||
else()
|
|
||||||
set(flag_string " /${LLVM_USE_CRT_${build}} ")
|
|
||||||
list(FIND ${MSVC_CRT} ${LLVM_USE_CRT_${build}} idx)
|
|
||||||
if (idx LESS 0)
|
|
||||||
message(FATAL_ERROR
|
|
||||||
"Invalid value for LLVM_USE_CRT_${build}: ${LLVM_USE_CRT_${build}}. Valid options are one of: ${${MSVC_CRT}}")
|
|
||||||
endif (idx LESS 0)
|
|
||||||
message(STATUS "Using ${build_type} VC++ CRT: ${LLVM_USE_CRT_${build}}")
|
|
||||||
endif()
|
|
||||||
foreach(lang C CXX)
|
|
||||||
set_flag_in_var(CMAKE_${lang}_FLAGS_${build} MSVC_CRT_REGEX flag_string)
|
|
||||||
endforeach(lang)
|
|
||||||
endforeach(build_type)
|
|
||||||
endmacro(choose_msvc_crt MSVC_CRT)
|
|
||||||
|
|
||||||
|
|
||||||
# List of valid CRTs for MSVC
|
|
||||||
set(MSVC_CRT
|
|
||||||
MD
|
|
||||||
MDd
|
|
||||||
MT
|
|
||||||
MTd)
|
|
||||||
|
|
||||||
choose_msvc_crt(MSVC_CRT)
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
|||||||
# Returns the host triple.
|
|
||||||
# Invokes config.guess
|
|
||||||
|
|
||||||
function( get_host_triple var )
|
|
||||||
if( MSVC )
|
|
||||||
if( CMAKE_CL_64 )
|
|
||||||
set( value "x86_64-pc-win32" )
|
|
||||||
else()
|
|
||||||
set( value "i686-pc-win32" )
|
|
||||||
endif()
|
|
||||||
elseif( MINGW AND NOT MSYS )
|
|
||||||
if( CMAKE_SIZEOF_VOID_P EQUAL 8 )
|
|
||||||
set( value "x86_64-w64-mingw32" )
|
|
||||||
else()
|
|
||||||
set( value "i686-pc-mingw32" )
|
|
||||||
endif()
|
|
||||||
else( MSVC )
|
|
||||||
set(config_guess ${LLVM_MAIN_SRC_DIR}/autoconf/config.guess)
|
|
||||||
execute_process(COMMAND sh ${config_guess}
|
|
||||||
RESULT_VARIABLE TT_RV
|
|
||||||
OUTPUT_VARIABLE TT_OUT
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
if( NOT TT_RV EQUAL 0 )
|
|
||||||
message(FATAL_ERROR "Failed to execute ${config_guess}")
|
|
||||||
endif( NOT TT_RV EQUAL 0 )
|
|
||||||
set( value ${TT_OUT} )
|
|
||||||
endif( MSVC )
|
|
||||||
set( ${var} ${value} PARENT_SCOPE )
|
|
||||||
message(STATUS "Target triple: ${value}")
|
|
||||||
endfunction( get_host_triple var )
|
|
@ -1,201 +0,0 @@
|
|||||||
# This CMake module is responsible for interpreting the user defined LLVM_
|
|
||||||
# options and executing the appropriate CMake commands to realize the users'
|
|
||||||
# selections.
|
|
||||||
|
|
||||||
include(AddLLVMDefinitions)
|
|
||||||
|
|
||||||
if( CMAKE_COMPILER_IS_GNUCXX )
|
|
||||||
set(LLVM_COMPILER_IS_GCC_COMPATIBLE ON)
|
|
||||||
elseif( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
|
|
||||||
set(LLVM_COMPILER_IS_GCC_COMPATIBLE ON)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Run-time build mode; It is used for unittests.
|
|
||||||
if(MSVC_IDE)
|
|
||||||
# Expect "$(Configuration)", "$(OutDir)", etc.
|
|
||||||
# It is expanded by msbuild or similar.
|
|
||||||
set(RUNTIME_BUILD_MODE "${CMAKE_CFG_INTDIR}")
|
|
||||||
elseif(NOT CMAKE_BUILD_TYPE STREQUAL "")
|
|
||||||
# Expect "Release" "Debug", etc.
|
|
||||||
# Or unittests could not run.
|
|
||||||
set(RUNTIME_BUILD_MODE ${CMAKE_BUILD_TYPE})
|
|
||||||
else()
|
|
||||||
# It might be "."
|
|
||||||
set(RUNTIME_BUILD_MODE "${CMAKE_CFG_INTDIR}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if( LLVM_ENABLE_ASSERTIONS )
|
|
||||||
# MSVC doesn't like _DEBUG on release builds. See PR 4379.
|
|
||||||
if( NOT MSVC )
|
|
||||||
add_definitions( -D_DEBUG )
|
|
||||||
endif()
|
|
||||||
# On Release builds cmake automatically defines NDEBUG, so we
|
|
||||||
# explicitly undefine it:
|
|
||||||
if( uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
|
|
||||||
add_definitions( -UNDEBUG )
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE" )
|
|
||||||
if( NOT MSVC_IDE AND NOT XCODE )
|
|
||||||
add_definitions( -DNDEBUG )
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
if(CYGWIN)
|
|
||||||
set(LLVM_ON_WIN32 0)
|
|
||||||
set(LLVM_ON_UNIX 1)
|
|
||||||
else(CYGWIN)
|
|
||||||
set(LLVM_ON_WIN32 1)
|
|
||||||
set(LLVM_ON_UNIX 0)
|
|
||||||
endif(CYGWIN)
|
|
||||||
set(LTDL_SHLIB_EXT ".dll")
|
|
||||||
set(EXEEXT ".exe")
|
|
||||||
# Maximum path length is 160 for non-unicode paths
|
|
||||||
set(MAXPATHLEN 160)
|
|
||||||
else(WIN32)
|
|
||||||
if(UNIX)
|
|
||||||
set(LLVM_ON_WIN32 0)
|
|
||||||
set(LLVM_ON_UNIX 1)
|
|
||||||
if(APPLE)
|
|
||||||
set(LTDL_SHLIB_EXT ".dylib")
|
|
||||||
else(APPLE)
|
|
||||||
set(LTDL_SHLIB_EXT ".so")
|
|
||||||
endif(APPLE)
|
|
||||||
set(EXEEXT "")
|
|
||||||
# FIXME: Maximum path length is currently set to 'safe' fixed value
|
|
||||||
set(MAXPATHLEN 2024)
|
|
||||||
else(UNIX)
|
|
||||||
MESSAGE(SEND_ERROR "Unable to determine platform")
|
|
||||||
endif(UNIX)
|
|
||||||
endif(WIN32)
|
|
||||||
|
|
||||||
if( LLVM_ENABLE_PIC )
|
|
||||||
if( XCODE )
|
|
||||||
# Xcode has -mdynamic-no-pic on by default, which overrides -fPIC. I don't
|
|
||||||
# know how to disable this, so just force ENABLE_PIC off for now.
|
|
||||||
message(WARNING "-fPIC not supported with Xcode.")
|
|
||||||
elseif( WIN32 OR CYGWIN)
|
|
||||||
# On Windows all code is PIC. MinGW warns if -fPIC is used.
|
|
||||||
else()
|
|
||||||
include(CheckCXXCompilerFlag)
|
|
||||||
check_cxx_compiler_flag("-fPIC" SUPPORTS_FPIC_FLAG)
|
|
||||||
if( SUPPORTS_FPIC_FLAG )
|
|
||||||
message(STATUS "Building with -fPIC")
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
|
|
||||||
else( SUPPORTS_FPIC_FLAG )
|
|
||||||
message(WARNING "-fPIC not supported.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if( WIN32 OR CYGWIN)
|
|
||||||
# MinGW warns if -fvisibility-inlines-hidden is used.
|
|
||||||
else()
|
|
||||||
check_cxx_compiler_flag("-fvisibility-inlines-hidden" SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG)
|
|
||||||
if( SUPPORTS_FVISIBILITY_INLINES_HIDDEN_FLAG )
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
|
|
||||||
# TODO: support other platforms and toolchains.
|
|
||||||
if( LLVM_BUILD_32_BITS )
|
|
||||||
message(STATUS "Building 32 bits executables and libraries.")
|
|
||||||
add_llvm_definitions( -m32 )
|
|
||||||
list(APPEND CMAKE_EXE_LINKER_FLAGS -m32)
|
|
||||||
list(APPEND CMAKE_SHARED_LINKER_FLAGS -m32)
|
|
||||||
endif( LLVM_BUILD_32_BITS )
|
|
||||||
endif( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
|
|
||||||
|
|
||||||
# On Win32 using MS tools, provide an option to set the number of parallel jobs
|
|
||||||
# to use.
|
|
||||||
if( MSVC_IDE )
|
|
||||||
set(LLVM_COMPILER_JOBS "0" CACHE STRING
|
|
||||||
"Number of parallel compiler jobs. 0 means use all processors. Default is 0.")
|
|
||||||
if( NOT LLVM_COMPILER_JOBS STREQUAL "1" )
|
|
||||||
if( LLVM_COMPILER_JOBS STREQUAL "0" )
|
|
||||||
add_llvm_definitions( /MP )
|
|
||||||
else()
|
|
||||||
if (MSVC10)
|
|
||||||
message(FATAL_ERROR
|
|
||||||
"Due to a bug in CMake only 0 and 1 is supported for "
|
|
||||||
"LLVM_COMPILER_JOBS when generating for Visual Studio 2010")
|
|
||||||
else()
|
|
||||||
message(STATUS "Number of parallel compiler jobs set to " ${LLVM_COMPILER_JOBS})
|
|
||||||
add_llvm_definitions( /MP${LLVM_COMPILER_JOBS} )
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
message(STATUS "Parallel compilation disabled")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if( MSVC )
|
|
||||||
include(ChooseMSVCCRT)
|
|
||||||
|
|
||||||
if( MSVC11 )
|
|
||||||
add_llvm_definitions(-D_VARIADIC_MAX=10)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Add definitions that make MSVC much less annoying.
|
|
||||||
add_llvm_definitions(
|
|
||||||
# For some reason MS wants to deprecate a bunch of standard functions...
|
|
||||||
-D_CRT_SECURE_NO_DEPRECATE
|
|
||||||
-D_CRT_SECURE_NO_WARNINGS
|
|
||||||
-D_CRT_NONSTDC_NO_DEPRECATE
|
|
||||||
-D_CRT_NONSTDC_NO_WARNINGS
|
|
||||||
-D_SCL_SECURE_NO_DEPRECATE
|
|
||||||
-D_SCL_SECURE_NO_WARNINGS
|
|
||||||
|
|
||||||
-wd4146 # Suppress 'unary minus operator applied to unsigned type, result still unsigned'
|
|
||||||
-wd4180 # Suppress 'qualifier applied to function type has no meaning; ignored'
|
|
||||||
-wd4224 # Suppress 'nonstandard extension used : formal parameter 'identifier' was previously defined as a type'
|
|
||||||
-wd4244 # Suppress ''argument' : conversion from 'type1' to 'type2', possible loss of data'
|
|
||||||
-wd4267 # Suppress ''var' : conversion from 'size_t' to 'type', possible loss of data'
|
|
||||||
-wd4275 # Suppress 'An exported class was derived from a class that was not exported.'
|
|
||||||
-wd4291 # Suppress ''declaration' : no matching operator delete found; memory will not be freed if initialization throws an exception'
|
|
||||||
-wd4345 # Suppress 'behavior change: an object of POD type constructed with an initializer of the form () will be default-initialized'
|
|
||||||
-wd4351 # Suppress 'new behavior: elements of array 'array' will be default initialized'
|
|
||||||
-wd4355 # Suppress ''this' : used in base member initializer list'
|
|
||||||
-wd4503 # Suppress ''identifier' : decorated name length exceeded, name was truncated'
|
|
||||||
-wd4551 # Suppress 'function call missing argument list'
|
|
||||||
-wd4624 # Suppress ''derived class' : destructor could not be generated because a base class destructor is inaccessible'
|
|
||||||
-wd4715 # Suppress ''function' : not all control paths return a value'
|
|
||||||
-wd4800 # Suppress ''type' : forcing value to bool 'true' or 'false' (performance warning)'
|
|
||||||
-wd4065 # Suppress 'switch statement contains 'default' but no 'case' labels'
|
|
||||||
-wd4181 # Suppress 'qualifier applied to reference type; ignored'
|
|
||||||
-w14062 # Promote "enumerator in switch of enum is not handled" to level 1 warning.
|
|
||||||
)
|
|
||||||
|
|
||||||
# Enable warnings
|
|
||||||
if (LLVM_ENABLE_WARNINGS)
|
|
||||||
add_llvm_definitions( /W4 /Wall )
|
|
||||||
if (LLVM_ENABLE_PEDANTIC)
|
|
||||||
# No MSVC equivalent available
|
|
||||||
endif (LLVM_ENABLE_PEDANTIC)
|
|
||||||
endif (LLVM_ENABLE_WARNINGS)
|
|
||||||
if (LLVM_ENABLE_WERROR)
|
|
||||||
add_llvm_definitions( /WX )
|
|
||||||
endif (LLVM_ENABLE_WERROR)
|
|
||||||
elseif( LLVM_COMPILER_IS_GCC_COMPATIBLE )
|
|
||||||
if (LLVM_ENABLE_WARNINGS)
|
|
||||||
add_llvm_definitions( -Wall -W -Wno-unused-parameter -Wwrite-strings )
|
|
||||||
if (LLVM_ENABLE_PEDANTIC)
|
|
||||||
add_llvm_definitions( -pedantic -Wno-long-long )
|
|
||||||
endif (LLVM_ENABLE_PEDANTIC)
|
|
||||||
check_cxx_compiler_flag("-Werror -Wcovered-switch-default" SUPPORTS_COVERED_SWITCH_DEFAULT_FLAG)
|
|
||||||
if( SUPPORTS_COVERED_SWITCH_DEFAULT_FLAG )
|
|
||||||
add_llvm_definitions( -Wcovered-switch-default )
|
|
||||||
endif()
|
|
||||||
endif (LLVM_ENABLE_WARNINGS)
|
|
||||||
if (LLVM_ENABLE_WERROR)
|
|
||||||
add_llvm_definitions( -Werror )
|
|
||||||
endif (LLVM_ENABLE_WERROR)
|
|
||||||
endif( MSVC )
|
|
||||||
|
|
||||||
add_llvm_definitions( -D__STDC_CONSTANT_MACROS )
|
|
||||||
add_llvm_definitions( -D__STDC_FORMAT_MACROS )
|
|
||||||
add_llvm_definitions( -D__STDC_LIMIT_MACROS )
|
|
@ -1,178 +0,0 @@
|
|||||||
function(get_system_libs return_var)
|
|
||||||
# Returns in `return_var' a list of system libraries used by LLVM.
|
|
||||||
if( NOT MSVC )
|
|
||||||
if( MINGW )
|
|
||||||
set(system_libs ${system_libs} imagehlp psapi)
|
|
||||||
elseif( CMAKE_HOST_UNIX )
|
|
||||||
if( HAVE_LIBDL )
|
|
||||||
set(system_libs ${system_libs} ${CMAKE_DL_LIBS})
|
|
||||||
endif()
|
|
||||||
if( LLVM_ENABLE_THREADS AND HAVE_LIBPTHREAD )
|
|
||||||
set(system_libs ${system_libs} pthread)
|
|
||||||
endif()
|
|
||||||
endif( MINGW )
|
|
||||||
endif( NOT MSVC )
|
|
||||||
set(${return_var} ${system_libs} PARENT_SCOPE)
|
|
||||||
endfunction(get_system_libs)
|
|
||||||
|
|
||||||
|
|
||||||
function(link_system_libs target)
|
|
||||||
get_system_libs(llvm_system_libs)
|
|
||||||
target_link_libraries(${target} ${llvm_system_libs})
|
|
||||||
endfunction(link_system_libs)
|
|
||||||
|
|
||||||
|
|
||||||
function(is_llvm_target_library library return_var)
|
|
||||||
# Sets variable `return_var' to ON if `library' corresponds to a
|
|
||||||
# LLVM supported target. To OFF if it doesn't.
|
|
||||||
set(${return_var} OFF PARENT_SCOPE)
|
|
||||||
string(TOUPPER "${library}" capitalized_lib)
|
|
||||||
string(TOUPPER "${LLVM_ALL_TARGETS}" targets)
|
|
||||||
foreach(t ${targets})
|
|
||||||
if( capitalized_lib STREQUAL t OR
|
|
||||||
capitalized_lib STREQUAL "LLVM${t}" OR
|
|
||||||
capitalized_lib STREQUAL "LLVM${t}CODEGEN" OR
|
|
||||||
capitalized_lib STREQUAL "LLVM${t}ASMPARSER" OR
|
|
||||||
capitalized_lib STREQUAL "LLVM${t}ASMPRINTER" OR
|
|
||||||
capitalized_lib STREQUAL "LLVM${t}DISASSEMBLER" OR
|
|
||||||
capitalized_lib STREQUAL "LLVM${t}INFO" )
|
|
||||||
set(${return_var} ON PARENT_SCOPE)
|
|
||||||
break()
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
endfunction(is_llvm_target_library)
|
|
||||||
|
|
||||||
|
|
||||||
macro(llvm_config executable)
|
|
||||||
explicit_llvm_config(${executable} ${ARGN})
|
|
||||||
endmacro(llvm_config)
|
|
||||||
|
|
||||||
|
|
||||||
function(explicit_llvm_config executable)
|
|
||||||
set( link_components ${ARGN} )
|
|
||||||
|
|
||||||
explicit_map_components_to_libraries(LIBRARIES ${link_components})
|
|
||||||
target_link_libraries(${executable} ${LIBRARIES})
|
|
||||||
endfunction(explicit_llvm_config)
|
|
||||||
|
|
||||||
|
|
||||||
# This is a variant intended for the final user:
|
|
||||||
function(llvm_map_components_to_libraries OUT_VAR)
|
|
||||||
explicit_map_components_to_libraries(result ${ARGN})
|
|
||||||
get_system_libs(sys_result)
|
|
||||||
set( ${OUT_VAR} ${result} ${sys_result} PARENT_SCOPE )
|
|
||||||
endfunction(llvm_map_components_to_libraries)
|
|
||||||
|
|
||||||
|
|
||||||
function(explicit_map_components_to_libraries out_libs)
|
|
||||||
set( link_components ${ARGN} )
|
|
||||||
get_property(llvm_libs GLOBAL PROPERTY LLVM_LIBS)
|
|
||||||
string(TOUPPER "${llvm_libs}" capitalized_libs)
|
|
||||||
|
|
||||||
# Expand some keywords:
|
|
||||||
list(FIND LLVM_TARGETS_TO_BUILD "${LLVM_NATIVE_ARCH}" have_native_backend)
|
|
||||||
list(FIND link_components "engine" engine_required)
|
|
||||||
if( NOT engine_required EQUAL -1 )
|
|
||||||
list(FIND LLVM_TARGETS_WITH_JIT "${LLVM_NATIVE_ARCH}" have_jit)
|
|
||||||
if( NOT have_native_backend EQUAL -1 AND NOT have_jit EQUAL -1 )
|
|
||||||
list(APPEND link_components "jit")
|
|
||||||
list(APPEND link_components "native")
|
|
||||||
else()
|
|
||||||
list(APPEND link_components "interpreter")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
list(FIND link_components "native" native_required)
|
|
||||||
if( NOT native_required EQUAL -1 )
|
|
||||||
if( NOT have_native_backend EQUAL -1 )
|
|
||||||
list(APPEND link_components ${LLVM_NATIVE_ARCH})
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Translate symbolic component names to real libraries:
|
|
||||||
foreach(c ${link_components})
|
|
||||||
# add codegen, asmprinter, asmparser, disassembler
|
|
||||||
list(FIND LLVM_TARGETS_TO_BUILD ${c} idx)
|
|
||||||
if( NOT idx LESS 0 )
|
|
||||||
list(FIND llvm_libs "LLVM${c}CodeGen" idx)
|
|
||||||
if( NOT idx LESS 0 )
|
|
||||||
list(APPEND expanded_components "LLVM${c}CodeGen")
|
|
||||||
else()
|
|
||||||
list(FIND llvm_libs "LLVM${c}" idx)
|
|
||||||
if( NOT idx LESS 0 )
|
|
||||||
list(APPEND expanded_components "LLVM${c}")
|
|
||||||
else()
|
|
||||||
message(FATAL_ERROR "Target ${c} is not in the set of libraries.")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
list(FIND llvm_libs "LLVM${c}AsmPrinter" asmidx)
|
|
||||||
if( NOT asmidx LESS 0 )
|
|
||||||
list(APPEND expanded_components "LLVM${c}AsmPrinter")
|
|
||||||
endif()
|
|
||||||
list(FIND llvm_libs "LLVM${c}AsmParser" asmidx)
|
|
||||||
if( NOT asmidx LESS 0 )
|
|
||||||
list(APPEND expanded_components "LLVM${c}AsmParser")
|
|
||||||
endif()
|
|
||||||
list(FIND llvm_libs "LLVM${c}Info" asmidx)
|
|
||||||
if( NOT asmidx LESS 0 )
|
|
||||||
list(APPEND expanded_components "LLVM${c}Info")
|
|
||||||
endif()
|
|
||||||
list(FIND llvm_libs "LLVM${c}Disassembler" asmidx)
|
|
||||||
if( NOT asmidx LESS 0 )
|
|
||||||
list(APPEND expanded_components "LLVM${c}Disassembler")
|
|
||||||
endif()
|
|
||||||
elseif( c STREQUAL "native" )
|
|
||||||
# already processed
|
|
||||||
elseif( c STREQUAL "nativecodegen" )
|
|
||||||
list(APPEND expanded_components "LLVM${LLVM_NATIVE_ARCH}CodeGen")
|
|
||||||
elseif( c STREQUAL "backend" )
|
|
||||||
# same case as in `native'.
|
|
||||||
elseif( c STREQUAL "engine" )
|
|
||||||
# already processed
|
|
||||||
elseif( c STREQUAL "all" )
|
|
||||||
list(APPEND expanded_components ${llvm_libs})
|
|
||||||
else( NOT idx LESS 0 )
|
|
||||||
# Canonize the component name:
|
|
||||||
string(TOUPPER "${c}" capitalized)
|
|
||||||
list(FIND capitalized_libs LLVM${capitalized} lib_idx)
|
|
||||||
if( lib_idx LESS 0 )
|
|
||||||
# The component is unknown. Maybe is an omitted target?
|
|
||||||
is_llvm_target_library(${c} iltl_result)
|
|
||||||
if( NOT iltl_result )
|
|
||||||
message(FATAL_ERROR "Library `${c}' not found in list of llvm libraries.")
|
|
||||||
endif()
|
|
||||||
else( lib_idx LESS 0 )
|
|
||||||
list(GET llvm_libs ${lib_idx} canonical_lib)
|
|
||||||
list(APPEND expanded_components ${canonical_lib})
|
|
||||||
endif( lib_idx LESS 0 )
|
|
||||||
endif( NOT idx LESS 0 )
|
|
||||||
endforeach(c)
|
|
||||||
# Expand dependencies while topologically sorting the list of libraries:
|
|
||||||
list(LENGTH expanded_components lst_size)
|
|
||||||
set(cursor 0)
|
|
||||||
set(processed)
|
|
||||||
while( cursor LESS lst_size )
|
|
||||||
list(GET expanded_components ${cursor} lib)
|
|
||||||
get_property(lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${lib})
|
|
||||||
list(APPEND expanded_components ${lib_deps})
|
|
||||||
# Remove duplicates at the front:
|
|
||||||
list(REVERSE expanded_components)
|
|
||||||
list(REMOVE_DUPLICATES expanded_components)
|
|
||||||
list(REVERSE expanded_components)
|
|
||||||
list(APPEND processed ${lib})
|
|
||||||
# Find the maximum index that doesn't have to be re-processed:
|
|
||||||
while(NOT "${expanded_components}" MATCHES "^${processed}.*" )
|
|
||||||
list(REMOVE_AT processed -1)
|
|
||||||
endwhile()
|
|
||||||
list(LENGTH processed cursor)
|
|
||||||
list(LENGTH expanded_components lst_size)
|
|
||||||
endwhile( cursor LESS lst_size )
|
|
||||||
# Return just the libraries included in this build:
|
|
||||||
set(result)
|
|
||||||
foreach(c ${expanded_components})
|
|
||||||
list(FIND llvm_libs ${c} lib_idx)
|
|
||||||
if( NOT lib_idx LESS 0 )
|
|
||||||
set(result ${result} ${c})
|
|
||||||
endif()
|
|
||||||
endforeach(c)
|
|
||||||
set(${out_libs} ${result} PARENT_SCOPE)
|
|
||||||
endfunction(explicit_map_components_to_libraries)
|
|
@ -1,51 +0,0 @@
|
|||||||
# This file provides information and services to the final user.
|
|
||||||
|
|
||||||
set(LLVM_VERSION_MAJOR @LLVM_VERSION_MAJOR@)
|
|
||||||
set(LLVM_VERSION_MINOR @LLVM_VERSION_MINOR@)
|
|
||||||
set(LLVM_PACKAGE_VERSION @PACKAGE_VERSION@)
|
|
||||||
|
|
||||||
set(LLVM_COMMON_DEPENDS @LLVM_COMMON_DEPENDS@)
|
|
||||||
|
|
||||||
set_property( GLOBAL PROPERTY LLVM_LIBS "@llvm_libs@")
|
|
||||||
|
|
||||||
set(LLVM_ALL_TARGETS @LLVM_ALL_TARGETS@)
|
|
||||||
|
|
||||||
set(LLVM_TARGETS_TO_BUILD @LLVM_TARGETS_TO_BUILD@)
|
|
||||||
|
|
||||||
set(LLVM_TARGETS_WITH_JIT @LLVM_TARGETS_WITH_JIT@)
|
|
||||||
|
|
||||||
@all_llvm_lib_deps@
|
|
||||||
|
|
||||||
set(TARGET_TRIPLE "@TARGET_TRIPLE@")
|
|
||||||
|
|
||||||
set(LLVM_TOOLS_BINARY_DIR @LLVM_TOOLS_BINARY_DIR@)
|
|
||||||
|
|
||||||
set(LLVM_ENABLE_THREADS @LLVM_ENABLE_THREADS@)
|
|
||||||
|
|
||||||
set(LLVM_NATIVE_ARCH @LLVM_NATIVE_ARCH@)
|
|
||||||
|
|
||||||
set(LLVM_ENABLE_PIC @LLVM_ENABLE_PIC@)
|
|
||||||
|
|
||||||
set(HAVE_LIBDL @HAVE_LIBDL@)
|
|
||||||
set(HAVE_LIBPTHREAD @HAVE_LIBPTHREAD@)
|
|
||||||
set(LLVM_ON_UNIX @LLVM_ON_UNIX@)
|
|
||||||
set(LLVM_ON_WIN32 @LLVM_ON_WIN32@)
|
|
||||||
|
|
||||||
set(LLVM_INSTALL_PREFIX @LLVM_INSTALL_PREFIX@)
|
|
||||||
set(LLVM_INCLUDE_DIRS ${LLVM_INSTALL_PREFIX}/include)
|
|
||||||
set(LLVM_LIBRARY_DIRS ${LLVM_INSTALL_PREFIX}/lib)
|
|
||||||
set(LLVM_DEFINITIONS "-D__STDC_LIMIT_MACROS" "-D__STDC_CONSTANT_MACROS")
|
|
||||||
|
|
||||||
# We try to include using the current setting of CMAKE_MODULE_PATH,
|
|
||||||
# which suppossedly was filled by the user with the directory where
|
|
||||||
# this file was installed:
|
|
||||||
include( LLVM-Config OPTIONAL RESULT_VARIABLE LLVMCONFIG_INCLUDED )
|
|
||||||
|
|
||||||
# If failed, we assume that this is an un-installed build:
|
|
||||||
if( NOT LLVMCONFIG_INCLUDED )
|
|
||||||
set(CMAKE_MODULE_PATH
|
|
||||||
${CMAKE_MODULE_PATH}
|
|
||||||
"@LLVM_SOURCE_DIR@/cmake/modules")
|
|
||||||
include( LLVM-Config )
|
|
||||||
endif()
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
set(PACKAGE_VERSION "@PACKAGE_VERSION@")
|
|
@ -1,80 +0,0 @@
|
|||||||
# Copied from http://www.itk.org/Wiki/CMakeMacroParseArguments under
|
|
||||||
# http://creativecommons.org/licenses/by/2.5/.
|
|
||||||
#
|
|
||||||
# The PARSE_ARGUMENTS macro will take the arguments of another macro and define
|
|
||||||
# several variables. The first argument to PARSE_ARGUMENTS is a prefix to put on
|
|
||||||
# all variables it creates. The second argument is a list of names, and the
|
|
||||||
# third argument is a list of options. Both of these lists should be quoted. The
|
|
||||||
# rest of PARSE_ARGUMENTS are arguments from another macro to be parsed.
|
|
||||||
#
|
|
||||||
# PARSE_ARGUMENTS(prefix arg_names options arg1 arg2...)
|
|
||||||
#
|
|
||||||
# For each item in options, PARSE_ARGUMENTS will create a variable with that
|
|
||||||
# name, prefixed with prefix_. So, for example, if prefix is MY_MACRO and
|
|
||||||
# options is OPTION1;OPTION2, then PARSE_ARGUMENTS will create the variables
|
|
||||||
# MY_MACRO_OPTION1 and MY_MACRO_OPTION2. These variables will be set to true if
|
|
||||||
# the option exists in the command line or false otherwise.
|
|
||||||
#
|
|
||||||
#For each item in arg_names, PARSE_ARGUMENTS will create a variable with that
|
|
||||||
#name, prefixed with prefix_. Each variable will be filled with the arguments
|
|
||||||
#that occur after the given arg_name is encountered up to the next arg_name or
|
|
||||||
#the end of the arguments. All options are removed from these
|
|
||||||
#lists. PARSE_ARGUMENTS also creates a prefix_DEFAULT_ARGS variable containing
|
|
||||||
#the list of all arguments up to the first arg_name encountered.
|
|
||||||
#
|
|
||||||
#Here is a simple, albeit impractical, example of using PARSE_ARGUMENTS that
|
|
||||||
#demonstrates its behavior.
|
|
||||||
#
|
|
||||||
# SET(arguments
|
|
||||||
# hello OPTION3 world
|
|
||||||
# LIST3 foo bar
|
|
||||||
# OPTION2
|
|
||||||
# LIST1 fuz baz
|
|
||||||
# )
|
|
||||||
#
|
|
||||||
# PARSE_ARGUMENTS(ARG "LIST1;LIST2;LIST3" "OPTION1;OPTION2;OPTION3" ${arguments})
|
|
||||||
#
|
|
||||||
# PARSE_ARGUMENTS creates 7 variables and sets them as follows:
|
|
||||||
# ARG_DEFAULT_ARGS: hello;world
|
|
||||||
# ARG_LIST1: fuz;baz
|
|
||||||
# ARG_LIST2:
|
|
||||||
# ARG_LIST3: foo;bar
|
|
||||||
# ARG_OPTION1: FALSE
|
|
||||||
# ARG_OPTION2: TRUE
|
|
||||||
# ARG_OPTION3: TRUE
|
|
||||||
#
|
|
||||||
# If you don't have any options, use an empty string in its place.
|
|
||||||
# PARSE_ARGUMENTS(ARG "LIST1;LIST2;LIST3" "" ${arguments})
|
|
||||||
# Likewise if you have no lists.
|
|
||||||
# PARSE_ARGUMENTS(ARG "" "OPTION1;OPTION2;OPTION3" ${arguments})
|
|
||||||
|
|
||||||
MACRO(PARSE_ARGUMENTS prefix arg_names option_names)
|
|
||||||
SET(DEFAULT_ARGS)
|
|
||||||
FOREACH(arg_name ${arg_names})
|
|
||||||
SET(${prefix}_${arg_name})
|
|
||||||
ENDFOREACH(arg_name)
|
|
||||||
FOREACH(option ${option_names})
|
|
||||||
SET(${prefix}_${option} FALSE)
|
|
||||||
ENDFOREACH(option)
|
|
||||||
|
|
||||||
SET(current_arg_name DEFAULT_ARGS)
|
|
||||||
SET(current_arg_list)
|
|
||||||
FOREACH(arg ${ARGN})
|
|
||||||
SET(larg_names ${arg_names})
|
|
||||||
LIST(FIND larg_names "${arg}" is_arg_name)
|
|
||||||
IF (is_arg_name GREATER -1)
|
|
||||||
SET(${prefix}_${current_arg_name} ${current_arg_list})
|
|
||||||
SET(current_arg_name ${arg})
|
|
||||||
SET(current_arg_list)
|
|
||||||
ELSE (is_arg_name GREATER -1)
|
|
||||||
SET(loption_names ${option_names})
|
|
||||||
LIST(FIND loption_names "${arg}" is_option)
|
|
||||||
IF (is_option GREATER -1)
|
|
||||||
SET(${prefix}_${arg} TRUE)
|
|
||||||
ELSE (is_option GREATER -1)
|
|
||||||
SET(current_arg_list ${current_arg_list} ${arg})
|
|
||||||
ENDIF (is_option GREATER -1)
|
|
||||||
ENDIF (is_arg_name GREATER -1)
|
|
||||||
ENDFOREACH(arg)
|
|
||||||
SET(${prefix}_${current_arg_name} ${current_arg_list})
|
|
||||||
ENDMACRO(PARSE_ARGUMENTS)
|
|
@ -1,90 +0,0 @@
|
|||||||
include(AddFileDependencies)
|
|
||||||
|
|
||||||
function(llvm_replace_compiler_option var old new)
|
|
||||||
# Replaces a compiler option or switch `old' in `var' by `new'.
|
|
||||||
# If `old' is not in `var', appends `new' to `var'.
|
|
||||||
# Example: llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2")
|
|
||||||
# If the option already is on the variable, don't add it:
|
|
||||||
if( "${${var}}" MATCHES "(^| )${new}($| )" )
|
|
||||||
set(n "")
|
|
||||||
else()
|
|
||||||
set(n "${new}")
|
|
||||||
endif()
|
|
||||||
if( "${${var}}" MATCHES "(^| )${old}($| )" )
|
|
||||||
string( REGEX REPLACE "(^| )${old}($| )" " ${n} " ${var} "${${var}}" )
|
|
||||||
else()
|
|
||||||
set( ${var} "${${var}} ${n}" )
|
|
||||||
endif()
|
|
||||||
set( ${var} "${${var}}" PARENT_SCOPE )
|
|
||||||
endfunction(llvm_replace_compiler_option)
|
|
||||||
|
|
||||||
macro(add_td_sources srcs)
|
|
||||||
file(GLOB tds *.td)
|
|
||||||
if( tds )
|
|
||||||
source_group("TableGen descriptions" FILES ${tds})
|
|
||||||
set_source_files_properties(${tds} PROPERTIES HEADER_FILE_ONLY ON)
|
|
||||||
list(APPEND ${srcs} ${tds})
|
|
||||||
endif()
|
|
||||||
endmacro(add_td_sources)
|
|
||||||
|
|
||||||
|
|
||||||
macro(add_header_files srcs)
|
|
||||||
file(GLOB hds *.h *.def)
|
|
||||||
if( hds )
|
|
||||||
set_source_files_properties(${hds} PROPERTIES HEADER_FILE_ONLY ON)
|
|
||||||
list(APPEND ${srcs} ${hds})
|
|
||||||
endif()
|
|
||||||
endmacro(add_header_files)
|
|
||||||
|
|
||||||
|
|
||||||
function(llvm_process_sources OUT_VAR)
|
|
||||||
set( sources ${ARGN} )
|
|
||||||
llvm_check_source_file_list( ${sources} )
|
|
||||||
# Create file dependencies on the tablegenned files, if any. Seems
|
|
||||||
# that this is not strictly needed, as dependencies of the .cpp
|
|
||||||
# sources on the tablegenned .inc files are detected and handled,
|
|
||||||
# but just in case...
|
|
||||||
foreach( s ${sources} )
|
|
||||||
set( f ${CMAKE_CURRENT_SOURCE_DIR}/${s} )
|
|
||||||
add_file_dependencies( ${f} ${TABLEGEN_OUTPUT} )
|
|
||||||
endforeach(s)
|
|
||||||
if( MSVC_IDE )
|
|
||||||
# This adds .td and .h files to the Visual Studio solution:
|
|
||||||
add_td_sources(sources)
|
|
||||||
add_header_files(sources)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Set common compiler options:
|
|
||||||
if( NOT LLVM_REQUIRES_EH )
|
|
||||||
if( LLVM_COMPILER_IS_GCC_COMPATIBLE )
|
|
||||||
add_definitions( -fno-exceptions )
|
|
||||||
elseif( MSVC )
|
|
||||||
llvm_replace_compiler_option(CMAKE_CXX_FLAGS "/EHsc" "/EHs-c-")
|
|
||||||
add_definitions( /D_HAS_EXCEPTIONS=0 )
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
if( NOT LLVM_REQUIRES_RTTI )
|
|
||||||
if( LLVM_COMPILER_IS_GCC_COMPATIBLE )
|
|
||||||
llvm_replace_compiler_option(CMAKE_CXX_FLAGS "-frtti" "-fno-rtti")
|
|
||||||
elseif( MSVC )
|
|
||||||
llvm_replace_compiler_option(CMAKE_CXX_FLAGS "/GR" "/GR-")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" PARENT_SCOPE )
|
|
||||||
set( ${OUT_VAR} ${sources} PARENT_SCOPE )
|
|
||||||
endfunction(llvm_process_sources)
|
|
||||||
|
|
||||||
|
|
||||||
function(llvm_check_source_file_list)
|
|
||||||
set(listed ${ARGN})
|
|
||||||
file(GLOB globbed *.cpp)
|
|
||||||
foreach(g ${globbed})
|
|
||||||
get_filename_component(fn ${g} NAME)
|
|
||||||
list(FIND listed ${fn} idx)
|
|
||||||
if( idx LESS 0 )
|
|
||||||
message(SEND_ERROR "Found unknown source file ${g}
|
|
||||||
Please update ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt\n")
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
endfunction(llvm_check_source_file_list)
|
|
@ -1,128 +0,0 @@
|
|||||||
# LLVM_TARGET_DEFINITIONS must contain the name of the .td file to process.
|
|
||||||
# Extra parameters for `tblgen' may come after `ofn' parameter.
|
|
||||||
# Adds the name of the generated file to TABLEGEN_OUTPUT.
|
|
||||||
|
|
||||||
macro(tablegen project ofn)
|
|
||||||
file(GLOB local_tds "*.td")
|
|
||||||
file(GLOB_RECURSE global_tds "${LLVM_MAIN_SRC_DIR}/include/llvm/*.td")
|
|
||||||
|
|
||||||
if (IS_ABSOLUTE ${LLVM_TARGET_DEFINITIONS})
|
|
||||||
set(LLVM_TARGET_DEFINITIONS_ABSOLUTE ${LLVM_TARGET_DEFINITIONS})
|
|
||||||
else()
|
|
||||||
set(LLVM_TARGET_DEFINITIONS_ABSOLUTE
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/${LLVM_TARGET_DEFINITIONS})
|
|
||||||
endif()
|
|
||||||
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${ofn}.tmp
|
|
||||||
# Generate tablegen output in a temporary file.
|
|
||||||
COMMAND ${${project}_TABLEGEN_EXE} ${ARGN} -I ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
-I ${LLVM_MAIN_SRC_DIR}/lib/Target -I ${LLVM_MAIN_INCLUDE_DIR}
|
|
||||||
${LLVM_TARGET_DEFINITIONS_ABSOLUTE}
|
|
||||||
-o ${CMAKE_CURRENT_BINARY_DIR}/${ofn}.tmp
|
|
||||||
# The file in LLVM_TARGET_DEFINITIONS may be not in the current
|
|
||||||
# directory and local_tds may not contain it, so we must
|
|
||||||
# explicitly list it here:
|
|
||||||
DEPENDS ${${project}_TABLEGEN_EXE} ${local_tds} ${global_tds}
|
|
||||||
${LLVM_TARGET_DEFINITIONS_ABSOLUTE}
|
|
||||||
COMMENT "Building ${ofn}..."
|
|
||||||
)
|
|
||||||
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${ofn}
|
|
||||||
# Only update the real output file if there are any differences.
|
|
||||||
# This prevents recompilation of all the files depending on it if there
|
|
||||||
# aren't any.
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/${ofn}.tmp
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/${ofn}
|
|
||||||
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${ofn}.tmp
|
|
||||||
COMMENT ""
|
|
||||||
)
|
|
||||||
|
|
||||||
# `make clean' must remove all those generated files:
|
|
||||||
set_property(DIRECTORY APPEND
|
|
||||||
PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${ofn}.tmp ${ofn})
|
|
||||||
|
|
||||||
set(TABLEGEN_OUTPUT ${TABLEGEN_OUTPUT} ${CMAKE_CURRENT_BINARY_DIR}/${ofn})
|
|
||||||
set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${ofn}
|
|
||||||
PROPERTIES GENERATED 1)
|
|
||||||
endmacro(tablegen)
|
|
||||||
|
|
||||||
function(add_public_tablegen_target target)
|
|
||||||
# Creates a target for publicly exporting tablegen dependencies.
|
|
||||||
if( TABLEGEN_OUTPUT )
|
|
||||||
add_custom_target(${target}
|
|
||||||
DEPENDS ${TABLEGEN_OUTPUT})
|
|
||||||
add_dependencies(${target} ${LLVM_COMMON_DEPENDS})
|
|
||||||
set_target_properties(${target} PROPERTIES FOLDER "Tablegenning")
|
|
||||||
endif( TABLEGEN_OUTPUT )
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
if(CMAKE_CROSSCOMPILING)
|
|
||||||
set(CX_NATIVE_TG_DIR "${CMAKE_BINARY_DIR}/native")
|
|
||||||
|
|
||||||
add_custom_command(OUTPUT ${CX_NATIVE_TG_DIR}
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${CX_NATIVE_TG_DIR}
|
|
||||||
COMMENT "Creating ${CX_NATIVE_TG_DIR}...")
|
|
||||||
|
|
||||||
add_custom_command(OUTPUT ${CX_NATIVE_TG_DIR}/CMakeCache.txt
|
|
||||||
COMMAND ${CMAKE_COMMAND} -UMAKE_TOOLCHAIN_FILE -DCMAKE_BUILD_TYPE=Release
|
|
||||||
-DLLVM_BUILD_POLLY=OFF ${CMAKE_SOURCE_DIR}
|
|
||||||
WORKING_DIRECTORY ${CX_NATIVE_TG_DIR}
|
|
||||||
DEPENDS ${CX_NATIVE_TG_DIR}
|
|
||||||
COMMENT "Configuring native TableGen...")
|
|
||||||
|
|
||||||
add_custom_target(ConfigureNativeTableGen DEPENDS ${CX_NATIVE_TG_DIR}/CMakeCache.txt)
|
|
||||||
|
|
||||||
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${CX_NATIVE_TG_DIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
macro(add_tablegen target project)
|
|
||||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR})
|
|
||||||
|
|
||||||
set(${target}_OLD_LLVM_LINK_COMPONENTS ${LLVM_LINK_COMPONENTS})
|
|
||||||
set(LLVM_LINK_COMPONENTS ${LLVM_LINK_COMPONENTS} TableGen)
|
|
||||||
add_llvm_utility(${target} ${ARGN})
|
|
||||||
set(LLVM_LINK_COMPONENTS ${${target}_OLD_LLVM_LINK_COMPONENTS})
|
|
||||||
|
|
||||||
set(${project}_TABLEGEN "${target}" CACHE
|
|
||||||
STRING "Native TableGen executable. Saves building one when cross-compiling.")
|
|
||||||
|
|
||||||
# Upgrade existing LLVM_TABLEGEN setting.
|
|
||||||
if(${project} STREQUAL LLVM)
|
|
||||||
if(${LLVM_TABLEGEN} STREQUAL tblgen)
|
|
||||||
set(LLVM_TABLEGEN "${target}" CACHE
|
|
||||||
STRING "Native TableGen executable. Saves building one when cross-compiling."
|
|
||||||
FORCE)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Effective tblgen executable to be used:
|
|
||||||
set(${project}_TABLEGEN_EXE ${${project}_TABLEGEN} PARENT_SCOPE)
|
|
||||||
|
|
||||||
if(CMAKE_CROSSCOMPILING)
|
|
||||||
if( ${${project}_TABLEGEN} STREQUAL "${target}" )
|
|
||||||
set(${project}_TABLEGEN_EXE "${CX_NATIVE_TG_DIR}/bin/${target}")
|
|
||||||
set(${project}_TABLEGEN_EXE ${${project}_TABLEGEN_EXE} PARENT_SCOPE)
|
|
||||||
|
|
||||||
add_custom_command(OUTPUT ${${project}_TABLEGEN_EXE}
|
|
||||||
COMMAND ${CMAKE_BUILD_TOOL} ${target}
|
|
||||||
DEPENDS ${CX_NATIVE_TG_DIR}/CMakeCache.txt
|
|
||||||
WORKING_DIRECTORY ${CX_NATIVE_TG_DIR}
|
|
||||||
COMMENT "Building native TableGen...")
|
|
||||||
add_custom_target(${project}NativeTableGen DEPENDS ${${project}_TABLEGEN_EXE})
|
|
||||||
add_dependencies(${project}NativeTableGen ConfigureNativeTableGen)
|
|
||||||
|
|
||||||
add_dependencies(${target} ${project}NativeTableGen)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if( MINGW )
|
|
||||||
target_link_libraries(${target} imagehlp psapi)
|
|
||||||
if(CMAKE_SIZEOF_VOID_P MATCHES "8")
|
|
||||||
set_target_properties(${target} PROPERTIES LINK_FLAGS -Wl,--stack,16777216)
|
|
||||||
endif(CMAKE_SIZEOF_VOID_P MATCHES "8")
|
|
||||||
endif( MINGW )
|
|
||||||
if( LLVM_ENABLE_THREADS AND HAVE_LIBPTHREAD AND NOT BEOS )
|
|
||||||
target_link_libraries(${target} pthread)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
install(TARGETS ${target} RUNTIME DESTINATION bin)
|
|
||||||
endmacro()
|
|
@ -1,70 +0,0 @@
|
|||||||
# Adds version control information to the variable VERS. For
|
|
||||||
# determining the Version Control System used (if any) it inspects the
|
|
||||||
# existence of certain subdirectories under CMAKE_CURRENT_SOURCE_DIR.
|
|
||||||
|
|
||||||
function(add_version_info_from_vcs VERS)
|
|
||||||
string(REPLACE "svn" "" result "${${VERS}}")
|
|
||||||
if( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.svn" )
|
|
||||||
set(result "${result}svn")
|
|
||||||
# FindSubversion does not work with symlinks. See PR 8437
|
|
||||||
if( NOT IS_SYMLINK "${CMAKE_CURRENT_SOURCE_DIR}" )
|
|
||||||
find_package(Subversion)
|
|
||||||
endif()
|
|
||||||
if( Subversion_FOUND )
|
|
||||||
subversion_wc_info( ${CMAKE_CURRENT_SOURCE_DIR} Project )
|
|
||||||
if( Project_WC_REVISION )
|
|
||||||
set(SVN_REVISION ${Project_WC_REVISION} PARENT_SCOPE)
|
|
||||||
set(result "${result}-r${Project_WC_REVISION}")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
elseif( EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git )
|
|
||||||
set(result "${result}git")
|
|
||||||
# Try to get a ref-id
|
|
||||||
find_program(git_executable NAMES git git.exe git.cmd)
|
|
||||||
if( git_executable )
|
|
||||||
set(is_git_svn_rev_exact false)
|
|
||||||
execute_process(COMMAND ${git_executable} svn log --limit=1 --oneline
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
TIMEOUT 5
|
|
||||||
RESULT_VARIABLE git_result
|
|
||||||
OUTPUT_VARIABLE git_output)
|
|
||||||
if( git_result EQUAL 0 )
|
|
||||||
string(REGEX MATCH r[0-9]+ git_svn_rev ${git_output})
|
|
||||||
string(LENGTH "${git_svn_rev}" rev_length)
|
|
||||||
math(EXPR rev_length "${rev_length}-1")
|
|
||||||
string(SUBSTRING "${git_svn_rev}" 1 ${rev_length} git_svn_rev_number)
|
|
||||||
set(SVN_REVISION ${git_svn_rev_number} PARENT_SCOPE)
|
|
||||||
set(git_svn_rev "-svn-${git_svn_rev}")
|
|
||||||
|
|
||||||
# Determine if the HEAD points directly at a subversion revision.
|
|
||||||
execute_process(COMMAND ${git_executable} svn find-rev HEAD
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
TIMEOUT 5
|
|
||||||
RESULT_VARIABLE git_result
|
|
||||||
OUTPUT_VARIABLE git_output)
|
|
||||||
if( git_result EQUAL 0 )
|
|
||||||
string(STRIP "${git_output}" git_head_svn_rev_number)
|
|
||||||
if( git_head_svn_rev_number EQUAL git_svn_rev_number )
|
|
||||||
set(is_git_svn_rev_exact true)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
set(git_svn_rev "")
|
|
||||||
endif()
|
|
||||||
execute_process(COMMAND
|
|
||||||
${git_executable} rev-parse --short HEAD
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
TIMEOUT 5
|
|
||||||
RESULT_VARIABLE git_result
|
|
||||||
OUTPUT_VARIABLE git_output)
|
|
||||||
if( git_result EQUAL 0 AND NOT is_git_svn_rev_exact )
|
|
||||||
string(STRIP "${git_output}" git_ref_id)
|
|
||||||
set(GIT_COMMIT ${git_ref_id} PARENT_SCOPE)
|
|
||||||
set(result "${result}${git_svn_rev}-${git_ref_id}")
|
|
||||||
else()
|
|
||||||
set(result "${result}${git_svn_rev}")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
set(${VERS} ${result} PARENT_SCOPE)
|
|
||||||
endfunction(add_version_info_from_vcs)
|
|
22910
cpp/llvm/configure
vendored
22910
cpp/llvm/configure
vendored
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user