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…
x
Reference in New Issue
Block a user