Vendor import of llvm trunk r240225:
https://llvm.org/svn/llvm-project/llvm/trunk@240225
This commit is contained in:
parent
85d8b2bbe3
commit
3a0822f094
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/vendor/llvm/dist/; revision=284677 svn path=/vendor/llvm/llvm-trunk-r240225/; revision=284678; tag=vendor/llvm/llvm-trunk-r240225
@ -176,6 +176,7 @@ set(LLVM_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include)
|
||||
|
||||
set(LLVM_ALL_TARGETS
|
||||
AArch64
|
||||
AMDGPU
|
||||
ARM
|
||||
BPF
|
||||
CppBackend
|
||||
@ -184,7 +185,6 @@ set(LLVM_ALL_TARGETS
|
||||
MSP430
|
||||
NVPTX
|
||||
PowerPC
|
||||
R600
|
||||
Sparc
|
||||
SystemZ
|
||||
X86
|
||||
|
@ -1097,7 +1097,7 @@ if test "$llvm_cv_enable_crash_overrides" = "yes" ; then
|
||||
fi
|
||||
|
||||
dnl List all possible targets
|
||||
ALL_TARGETS="X86 Sparc PowerPC ARM AArch64 Mips XCore MSP430 CppBackend NVPTX Hexagon SystemZ R600"
|
||||
ALL_TARGETS="X86 Sparc PowerPC ARM AArch64 Mips XCore MSP430 CppBackend NVPTX Hexagon SystemZ AMDGPU BPF"
|
||||
AC_SUBST(ALL_TARGETS,$ALL_TARGETS)
|
||||
|
||||
dnl Allow specific targets to be specified for building (or not)
|
||||
@ -1105,7 +1105,7 @@ TARGETS_TO_BUILD=""
|
||||
AC_ARG_ENABLE([targets],AS_HELP_STRING([--enable-targets],
|
||||
[Build specific host targets: all or target1,target2,... Valid targets are:
|
||||
host, x86, x86_64, sparc, powerpc, arm64, arm, aarch64, mips, hexagon,
|
||||
xcore, msp430, nvptx, systemz, r600, and cpp (default=all)]),,
|
||||
xcore, msp430, nvptx, systemz, r600, bpf, and cpp (default=all)]),,
|
||||
enableval=all)
|
||||
if test "$enableval" = host-only ; then
|
||||
enableval=host
|
||||
@ -1121,6 +1121,7 @@ case "$enableval" in
|
||||
aarch64) TARGETS_TO_BUILD="AArch64 $TARGETS_TO_BUILD" ;;
|
||||
arm64) TARGETS_TO_BUILD="AArch64 $TARGETS_TO_BUILD" ;;
|
||||
arm) TARGETS_TO_BUILD="ARM $TARGETS_TO_BUILD" ;;
|
||||
bpf) TARGETS_TO_BUILD="BPF $TARGETS_TO_BUILD" ;;
|
||||
mips) TARGETS_TO_BUILD="Mips $TARGETS_TO_BUILD" ;;
|
||||
mipsel) TARGETS_TO_BUILD="Mips $TARGETS_TO_BUILD" ;;
|
||||
mips64) TARGETS_TO_BUILD="Mips $TARGETS_TO_BUILD" ;;
|
||||
@ -1131,7 +1132,8 @@ case "$enableval" in
|
||||
hexagon) TARGETS_TO_BUILD="Hexagon $TARGETS_TO_BUILD" ;;
|
||||
nvptx) TARGETS_TO_BUILD="NVPTX $TARGETS_TO_BUILD" ;;
|
||||
systemz) TARGETS_TO_BUILD="SystemZ $TARGETS_TO_BUILD" ;;
|
||||
r600) TARGETS_TO_BUILD="R600 $TARGETS_TO_BUILD" ;;
|
||||
amdgpu) TARGETS_TO_BUILD="AMDGPU $TARGETS_TO_BUILD" ;;
|
||||
r600) TARGETS_TO_BUILD="AMDGPU $TARGETS_TO_BUILD" ;;
|
||||
host) case "$llvm_cv_target_arch" in
|
||||
x86) TARGETS_TO_BUILD="X86 $TARGETS_TO_BUILD" ;;
|
||||
x86_64) TARGETS_TO_BUILD="X86 $TARGETS_TO_BUILD" ;;
|
||||
@ -1630,6 +1632,7 @@ dnl===-----------------------------------------------------------------------===
|
||||
AC_CHECK_LIB(m,sin)
|
||||
if test "$llvm_cv_os_type" = "MingW" ; then
|
||||
AC_CHECK_LIB(imagehlp, main)
|
||||
AC_CHECK_LIB(ole32, main)
|
||||
AC_CHECK_LIB(psapi, main)
|
||||
AC_CHECK_LIB(shell32, main)
|
||||
fi
|
||||
@ -2170,7 +2173,10 @@ dnl contains the same list of files as AC_CONFIG_HEADERS below. This ensures the
|
||||
dnl files can be updated automatically when their *.in sources change.
|
||||
AC_CONFIG_HEADERS([include/llvm/Config/config.h include/llvm/Config/llvm-config.h])
|
||||
AH_TOP([#ifndef CONFIG_H
|
||||
#define CONFIG_H])
|
||||
#define CONFIG_H
|
||||
|
||||
/* Exported configuration */
|
||||
#include "llvm/Config/llvm-config.h"])
|
||||
AH_BOTTOM([#endif])
|
||||
|
||||
AC_CONFIG_FILES([include/llvm/Config/Targets.def])
|
||||
|
@ -160,6 +160,8 @@ const (
|
||||
InAllocaAttribute Attribute = 1 << 43
|
||||
NonNullAttribute Attribute = 1 << 44
|
||||
JumpTableAttribute Attribute = 1 << 45
|
||||
ConvergentAttribute Attribute = 1 << 46
|
||||
SafeStackAttribute Attribute = 1 << 47
|
||||
)
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
@ -1726,7 +1728,7 @@ func (b Builder) CreatePtrDiff(lhs, rhs Value, name string) (v Value) {
|
||||
func (b Builder) CreateLandingPad(t Type, personality Value, nclauses int, name string) (l Value) {
|
||||
cname := C.CString(name)
|
||||
defer C.free(unsafe.Pointer(cname))
|
||||
l.C = C.LLVMBuildLandingPad(b.C, t.C, personality.C, C.unsigned(nclauses), cname)
|
||||
l.C = C.LLVMBuildLandingPad(b.C, t.C, C.unsigned(nclauses), cname)
|
||||
return l
|
||||
}
|
||||
|
||||
|
@ -53,6 +53,7 @@ func TestAttributes(t *testing.T) {
|
||||
{AlwaysInlineAttribute, "alwaysinline"},
|
||||
{BuiltinAttribute, "builtin"},
|
||||
{ByValAttribute, "byval"},
|
||||
{ConvergentAttribute, "convergent"},
|
||||
{InAllocaAttribute, "inalloca"},
|
||||
{InlineHintAttribute, "inlinehint"},
|
||||
{InRegAttribute, "inreg"},
|
||||
@ -78,6 +79,7 @@ func TestAttributes(t *testing.T) {
|
||||
{ReturnedAttribute, "returned"},
|
||||
{ReturnsTwiceAttribute, "returns_twice"},
|
||||
{SExtAttribute, "signext"},
|
||||
{SafeStackAttribute, "safestack"},
|
||||
{StackProtectAttribute, "ssp"},
|
||||
{StackProtectReqAttribute, "sspreq"},
|
||||
{StackProtectStrongAttribute, "sspstrong"},
|
||||
|
@ -1745,7 +1745,7 @@ CAMLprim LLVMValueRef llvm_build_invoke_bc(value Args[], int NumArgs) {
|
||||
CAMLprim LLVMValueRef llvm_build_landingpad(LLVMTypeRef Ty, LLVMValueRef PersFn,
|
||||
value NumClauses, value Name,
|
||||
value B) {
|
||||
return LLVMBuildLandingPad(Builder_val(B), Ty, PersFn, Int_val(NumClauses),
|
||||
return LLVMBuildLandingPad(Builder_val(B), Ty, Int_val(NumClauses),
|
||||
String_val(Name));
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
include(LLVMParseArguments)
|
||||
include(LLVMProcessSources)
|
||||
include(LLVM-Config)
|
||||
|
||||
@ -228,6 +227,78 @@ function(set_output_directory target bindir libdir)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# If on Windows and building with MSVC, add the resource script containing the
|
||||
# VERSIONINFO data to the project. This embeds version resource information
|
||||
# into the output .exe or .dll.
|
||||
# TODO: Enable for MinGW Windows builds too.
|
||||
#
|
||||
function(add_windows_version_resource_file OUT_VAR)
|
||||
set(sources ${ARGN})
|
||||
if (MSVC)
|
||||
set(resource_file ${LLVM_SOURCE_DIR}/resources/windows_version_resource.rc)
|
||||
if(EXISTS ${resource_file})
|
||||
set(sources ${sources} ${resource_file})
|
||||
source_group("Resource Files" ${resource_file})
|
||||
set(windows_resource_file ${resource_file} PARENT_SCOPE)
|
||||
endif()
|
||||
endif(MSVC)
|
||||
|
||||
set(${OUT_VAR} ${sources} PARENT_SCOPE)
|
||||
endfunction(add_windows_version_resource_file)
|
||||
|
||||
# set_windows_version_resource_properties(name resource_file...
|
||||
# VERSION_MAJOR int
|
||||
# Optional major version number (defaults to LLVM_VERSION_MAJOR)
|
||||
# VERSION_MINOR int
|
||||
# Optional minor version number (defaults to LLVM_VERSION_MINOR)
|
||||
# VERSION_PATCHLEVEL int
|
||||
# Optional patchlevel version number (defaults to LLVM_VERSION_PATCH)
|
||||
# VERSION_STRING
|
||||
# Optional version string (defaults to PACKAGE_VERSION)
|
||||
# PRODUCT_NAME
|
||||
# Optional product name string (defaults to "LLVM")
|
||||
# )
|
||||
function(set_windows_version_resource_properties name resource_file)
|
||||
cmake_parse_arguments(ARG
|
||||
""
|
||||
"VERSION_MAJOR;VERSION_MINOR;VERSION_PATCHLEVEL;VERSION_STRING;PRODUCT_NAME"
|
||||
""
|
||||
${ARGN})
|
||||
|
||||
if (NOT DEFINED ARG_VERSION_MAJOR)
|
||||
set(ARG_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
|
||||
endif()
|
||||
|
||||
if (NOT DEFINED ARG_VERSION_MINOR)
|
||||
set(ARG_VERSION_MINOR ${LLVM_VERSION_MINOR})
|
||||
endif()
|
||||
|
||||
if (NOT DEFINED ARG_VERSION_PATCHLEVEL)
|
||||
set(ARG_VERSION_PATCHLEVEL ${LLVM_VERSION_PATCH})
|
||||
endif()
|
||||
|
||||
if (NOT DEFINED ARG_VERSION_STRING)
|
||||
set(ARG_VERSION_STRING ${PACKAGE_VERSION})
|
||||
endif()
|
||||
|
||||
if (NOT DEFINED ARG_PRODUCT_NAME)
|
||||
set(ARG_PRODUCT_NAME "LLVM")
|
||||
endif()
|
||||
|
||||
set_property(SOURCE ${resource_file}
|
||||
PROPERTY COMPILE_FLAGS /nologo)
|
||||
set_property(SOURCE ${resource_file}
|
||||
PROPERTY COMPILE_DEFINITIONS
|
||||
"RC_VERSION_FIELD_1=${ARG_VERSION_MAJOR}"
|
||||
"RC_VERSION_FIELD_2=${ARG_VERSION_MINOR}"
|
||||
"RC_VERSION_FIELD_3=${ARG_VERSION_PATCHLEVEL}"
|
||||
"RC_VERSION_FIELD_4=0"
|
||||
"RC_FILE_VERSION=\"${ARG_VERSION_STRING}\""
|
||||
"RC_INTERNAL_NAME=\"${name}\""
|
||||
"RC_PRODUCT_NAME=\"${ARG_PRODUCT_NAME}\""
|
||||
"RC_PRODUCT_VERSION=\"${ARG_VERSION_STRING}\"")
|
||||
endfunction(set_windows_version_resource_properties)
|
||||
|
||||
# llvm_add_library(name sources...
|
||||
# SHARED;STATIC
|
||||
# STATIC by default w/o BUILD_SHARED_LIBS.
|
||||
@ -316,10 +387,17 @@ function(llvm_add_library name)
|
||||
if(ARG_MODULE)
|
||||
add_library(${name} MODULE ${ALL_FILES})
|
||||
elseif(ARG_SHARED)
|
||||
add_windows_version_resource_file(ALL_FILES ${ALL_FILES})
|
||||
add_library(${name} SHARED ${ALL_FILES})
|
||||
else()
|
||||
add_library(${name} STATIC ${ALL_FILES})
|
||||
endif()
|
||||
|
||||
if(DEFINED windows_resource_file)
|
||||
set_windows_version_resource_properties(${name} ${windows_resource_file})
|
||||
set(windows_resource_file ${windows_resource_file} PARENT_SCOPE)
|
||||
endif()
|
||||
|
||||
set_output_directory(${name} ${LLVM_RUNTIME_OUTPUT_INTDIR} ${LLVM_LIBRARY_OUTPUT_INTDIR})
|
||||
llvm_update_compile_flags(${name})
|
||||
add_link_opts( ${name} )
|
||||
@ -482,11 +560,18 @@ endmacro(add_llvm_loadable_module name)
|
||||
|
||||
macro(add_llvm_executable name)
|
||||
llvm_process_sources( ALL_FILES ${ARGN} )
|
||||
add_windows_version_resource_file(ALL_FILES ${ALL_FILES})
|
||||
|
||||
if( EXCLUDE_FROM_ALL )
|
||||
add_executable(${name} EXCLUDE_FROM_ALL ${ALL_FILES})
|
||||
else()
|
||||
add_executable(${name} ${ALL_FILES})
|
||||
endif()
|
||||
|
||||
if(DEFINED windows_resource_file)
|
||||
set_windows_version_resource_properties(${name} ${windows_resource_file})
|
||||
endif()
|
||||
|
||||
llvm_update_compile_flags(${name})
|
||||
add_link_opts( ${name} )
|
||||
|
||||
@ -761,7 +846,7 @@ endfunction()
|
||||
# A raw function to create a lit target. This is used to implement the testuite
|
||||
# management functions.
|
||||
function(add_lit_target target comment)
|
||||
parse_arguments(ARG "PARAMS;DEPENDS;ARGS" "" ${ARGN})
|
||||
cmake_parse_arguments(ARG "" "" "PARAMS;DEPENDS;ARGS" ${ARGN})
|
||||
set(LIT_ARGS "${ARG_ARGS} ${LLVM_LIT_ARGS}")
|
||||
separate_arguments(LIT_ARGS)
|
||||
if (NOT CMAKE_CFG_INTDIR STREQUAL ".")
|
||||
@ -776,9 +861,9 @@ function(add_lit_target target comment)
|
||||
foreach(param ${ARG_PARAMS})
|
||||
list(APPEND LIT_COMMAND --param ${param})
|
||||
endforeach()
|
||||
if (ARG_DEFAULT_ARGS)
|
||||
if (ARG_UNPARSED_ARGUMENTS)
|
||||
add_custom_target(${target}
|
||||
COMMAND ${LIT_COMMAND} ${ARG_DEFAULT_ARGS}
|
||||
COMMAND ${LIT_COMMAND} ${ARG_UNPARSED_ARGUMENTS}
|
||||
COMMENT "${comment}"
|
||||
${cmake_3_2_USES_TERMINAL}
|
||||
)
|
||||
@ -797,12 +882,12 @@ endfunction()
|
||||
|
||||
# A function to add a set of lit test suites to be driven through 'check-*' targets.
|
||||
function(add_lit_testsuite target comment)
|
||||
parse_arguments(ARG "PARAMS;DEPENDS;ARGS" "" ${ARGN})
|
||||
cmake_parse_arguments(ARG "" "" "PARAMS;DEPENDS;ARGS" ${ARGN})
|
||||
|
||||
# EXCLUDE_FROM_ALL excludes the test ${target} out of check-all.
|
||||
if(NOT EXCLUDE_FROM_ALL)
|
||||
# Register the testsuites, params and depends for the global check rule.
|
||||
set_property(GLOBAL APPEND PROPERTY LLVM_LIT_TESTSUITES ${ARG_DEFAULT_ARGS})
|
||||
set_property(GLOBAL APPEND PROPERTY LLVM_LIT_TESTSUITES ${ARG_UNPARSED_ARGUMENTS})
|
||||
set_property(GLOBAL APPEND PROPERTY LLVM_LIT_PARAMS ${ARG_PARAMS})
|
||||
set_property(GLOBAL APPEND PROPERTY LLVM_LIT_DEPENDS ${ARG_DEPENDS})
|
||||
set_property(GLOBAL APPEND PROPERTY LLVM_LIT_EXTRA_ARGS ${ARG_ARGS})
|
||||
@ -810,7 +895,7 @@ function(add_lit_testsuite target comment)
|
||||
|
||||
# Produce a specific suffixed check rule.
|
||||
add_lit_target(${target} ${comment}
|
||||
${ARG_DEFAULT_ARGS}
|
||||
${ARG_UNPARSED_ARGUMENTS}
|
||||
PARAMS ${ARG_PARAMS}
|
||||
DEPENDS ${ARG_DEPENDS}
|
||||
ARGS ${ARG_ARGS}
|
||||
@ -819,7 +904,7 @@ endfunction()
|
||||
|
||||
function(add_lit_testsuites project directory)
|
||||
if (NOT CMAKE_CONFIGURATION_TYPES)
|
||||
parse_arguments(ARG "PARAMS;DEPENDS;ARGS" "" ${ARGN})
|
||||
cmake_parse_arguments(ARG "" "" "PARAMS;DEPENDS;ARGS" ${ARGN})
|
||||
file(GLOB_RECURSE litCfg ${directory}/lit*.cfg)
|
||||
set(lit_suites)
|
||||
foreach(f ${litCfg})
|
||||
|
@ -2,15 +2,45 @@
|
||||
|
||||
INCLUDE(CheckCXXSourceCompiles)
|
||||
|
||||
check_function_exists(__atomic_fetch_add_4 HAVE___ATOMIC_FETCH_ADD_4)
|
||||
if( NOT HAVE___ATOMIC_FETCH_ADD_4 )
|
||||
check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC)
|
||||
set(HAVE_LIBATOMIC False)
|
||||
if( HAVE_LIBATOMIC )
|
||||
list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
|
||||
# Sometimes linking against libatomic is required for atomic ops, if
|
||||
# the platform doesn't support lock-free atomics.
|
||||
|
||||
function(check_working_cxx_atomics varname)
|
||||
set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
|
||||
set(CMAKE_REQUIRED_FLAGS "-std=c++11")
|
||||
CHECK_CXX_SOURCE_COMPILES("
|
||||
#include <atomic>
|
||||
std::atomic<int> x;
|
||||
int main() {
|
||||
return x;
|
||||
}
|
||||
" ${varname})
|
||||
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
|
||||
endfunction(check_working_cxx_atomics)
|
||||
|
||||
# This isn't necessary on MSVC, so avoid command-line switch annoyance
|
||||
# by only running on GCC-like hosts.
|
||||
if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
|
||||
# First check if atomics work without the library.
|
||||
check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB)
|
||||
# If not, check if the library exists, and atomics work with it.
|
||||
if(NOT HAVE_CXX_ATOMICS_WITHOUT_LIB)
|
||||
check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC)
|
||||
if( HAVE_LIBATOMIC )
|
||||
list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
|
||||
check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITH_LIB)
|
||||
if (NOT HAVE_CXX_ATOMICS_WITH_LIB)
|
||||
message(FATAL_ERROR "Host compiler must support std::atomic!")
|
||||
endif()
|
||||
else()
|
||||
message(FATAL_ERROR "Host compiler appears to require libatomic, but cannot find it.")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
## TODO: This define is only used for the legacy atomic operations in
|
||||
## llvm's Atomic.h, which should be replaced. Other code simply
|
||||
## assumes C++11 <atomic> works.
|
||||
CHECK_CXX_SOURCE_COMPILES("
|
||||
#ifdef _MSC_VER
|
||||
#include <Intrin.h> /* Workaround for PR19898. */
|
||||
|
@ -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)
|
91
configure
vendored
91
configure
vendored
@ -1462,8 +1462,8 @@ Optional Features:
|
||||
--enable-targets Build specific host targets: all or
|
||||
target1,target2,... Valid targets are: host, x86,
|
||||
x86_64, sparc, powerpc, arm64, arm, aarch64, mips,
|
||||
hexagon, xcore, msp430, nvptx, systemz, r600, and
|
||||
cpp (default=all)
|
||||
hexagon, xcore, msp430, nvptx, systemz, r600, bpf,
|
||||
and cpp (default=all)
|
||||
--enable-experimental-targets
|
||||
Build experimental host targets: disable or
|
||||
target1,target2,... (default=disable)
|
||||
@ -5628,7 +5628,7 @@ _ACEOF
|
||||
|
||||
fi
|
||||
|
||||
ALL_TARGETS="X86 Sparc PowerPC ARM AArch64 Mips XCore MSP430 CppBackend NVPTX Hexagon SystemZ R600"
|
||||
ALL_TARGETS="X86 Sparc PowerPC ARM AArch64 Mips XCore MSP430 CppBackend NVPTX Hexagon SystemZ AMDGPU BPF"
|
||||
ALL_TARGETS=$ALL_TARGETS
|
||||
|
||||
|
||||
@ -5654,6 +5654,7 @@ case "$enableval" in
|
||||
aarch64) TARGETS_TO_BUILD="AArch64 $TARGETS_TO_BUILD" ;;
|
||||
arm64) TARGETS_TO_BUILD="AArch64 $TARGETS_TO_BUILD" ;;
|
||||
arm) TARGETS_TO_BUILD="ARM $TARGETS_TO_BUILD" ;;
|
||||
bpf) TARGETS_TO_BUILD="BPF $TARGETS_TO_BUILD" ;;
|
||||
mips) TARGETS_TO_BUILD="Mips $TARGETS_TO_BUILD" ;;
|
||||
mipsel) TARGETS_TO_BUILD="Mips $TARGETS_TO_BUILD" ;;
|
||||
mips64) TARGETS_TO_BUILD="Mips $TARGETS_TO_BUILD" ;;
|
||||
@ -5664,7 +5665,8 @@ case "$enableval" in
|
||||
hexagon) TARGETS_TO_BUILD="Hexagon $TARGETS_TO_BUILD" ;;
|
||||
nvptx) TARGETS_TO_BUILD="NVPTX $TARGETS_TO_BUILD" ;;
|
||||
systemz) TARGETS_TO_BUILD="SystemZ $TARGETS_TO_BUILD" ;;
|
||||
r600) TARGETS_TO_BUILD="R600 $TARGETS_TO_BUILD" ;;
|
||||
amdgpu) TARGETS_TO_BUILD="AMDGPU $TARGETS_TO_BUILD" ;;
|
||||
r600) TARGETS_TO_BUILD="AMDGPU $TARGETS_TO_BUILD" ;;
|
||||
host) case "$llvm_cv_target_arch" in
|
||||
x86) TARGETS_TO_BUILD="X86 $TARGETS_TO_BUILD" ;;
|
||||
x86_64) TARGETS_TO_BUILD="X86 $TARGETS_TO_BUILD" ;;
|
||||
@ -8731,6 +8733,87 @@ _ACEOF
|
||||
fi
|
||||
|
||||
|
||||
{ echo "$as_me:$LINENO: checking for main in -lole32" >&5
|
||||
echo $ECHO_N "checking for main in -lole32... $ECHO_C" >&6; }
|
||||
if test "${ac_cv_lib_ole32_main+set}" = set; then
|
||||
echo $ECHO_N "(cached) $ECHO_C" >&6
|
||||
else
|
||||
ac_check_lib_save_LIBS=$LIBS
|
||||
LIBS="-lole32 $LIBS"
|
||||
cat >conftest.$ac_ext <<_ACEOF
|
||||
/* confdefs.h. */
|
||||
_ACEOF
|
||||
cat confdefs.h >>conftest.$ac_ext
|
||||
cat >>conftest.$ac_ext <<_ACEOF
|
||||
/* end confdefs.h. */
|
||||
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
return main ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
rm -f conftest.$ac_objext conftest$ac_exeext
|
||||
if { (ac_try="$ac_link"
|
||||
case "(($ac_try" in
|
||||
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
|
||||
*) ac_try_echo=$ac_try;;
|
||||
esac
|
||||
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
|
||||
(eval "$ac_link") 2>conftest.er1
|
||||
ac_status=$?
|
||||
grep -v '^ *+' conftest.er1 >conftest.err
|
||||
rm -f conftest.er1
|
||||
cat conftest.err >&5
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); } &&
|
||||
{ ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|
||||
{ (case "(($ac_try" in
|
||||
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
|
||||
*) ac_try_echo=$ac_try;;
|
||||
esac
|
||||
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
|
||||
(eval "$ac_try") 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; } &&
|
||||
{ ac_try='test -s conftest$ac_exeext'
|
||||
{ (case "(($ac_try" in
|
||||
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
|
||||
*) ac_try_echo=$ac_try;;
|
||||
esac
|
||||
eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
|
||||
(eval "$ac_try") 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; }; then
|
||||
ac_cv_lib_ole32_main=yes
|
||||
else
|
||||
echo "$as_me: failed program was:" >&5
|
||||
sed 's/^/| /' conftest.$ac_ext >&5
|
||||
|
||||
ac_cv_lib_ole32_main=no
|
||||
fi
|
||||
|
||||
rm -f core conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS=$ac_check_lib_save_LIBS
|
||||
fi
|
||||
{ echo "$as_me:$LINENO: result: $ac_cv_lib_ole32_main" >&5
|
||||
echo "${ECHO_T}$ac_cv_lib_ole32_main" >&6; }
|
||||
if test $ac_cv_lib_ole32_main = yes; then
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define HAVE_LIBOLE32 1
|
||||
_ACEOF
|
||||
|
||||
LIBS="-lole32 $LIBS"
|
||||
|
||||
fi
|
||||
|
||||
|
||||
{ echo "$as_me:$LINENO: checking for main in -lpsapi" >&5
|
||||
echo $ECHO_N "checking for main in -lpsapi... $ECHO_C" >&6; }
|
||||
if test "${ac_cv_lib_psapi_main+set}" = set; then
|
||||
|
@ -1,11 +1,11 @@
|
||||
============================
|
||||
User Guide for R600 Back-end
|
||||
============================
|
||||
==============================
|
||||
User Guide for AMDGPU Back-end
|
||||
==============================
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
The R600 back-end provides ISA code generation for AMD GPUs, starting with
|
||||
The AMDGPU back-end provides ISA code generation for AMD GPUs, starting with
|
||||
the R600 family up until the current Volcanic Islands (GCN Gen 3).
|
||||
|
||||
|
||||
@ -14,7 +14,7 @@ Assembler
|
||||
|
||||
The assembler is currently considered experimental.
|
||||
|
||||
For syntax examples look in test/MC/R600.
|
||||
For syntax examples look in test/MC/AMDGPU.
|
||||
|
||||
Below some of the currently supported features (modulo bugs). These
|
||||
all apply to the Southern Islands ISA, Sea Islands and Volcanic Islands
|
||||
@ -24,6 +24,11 @@ DS Instructions
|
||||
---------------
|
||||
All DS instructions are supported.
|
||||
|
||||
FLAT Instructions
|
||||
------------------
|
||||
These instructions are only present in the Sea Islands and Volcanic Islands
|
||||
instruction set. All FLAT instructions are supported for these architectures
|
||||
|
||||
MUBUF Instructions
|
||||
------------------
|
||||
All non-atomic MUBUF instructions are supported.
|
@ -741,7 +741,7 @@ global variable. The operand fields are:
|
||||
MODULE_CODE_FUNCTION Record
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``[FUNCTION, type, callingconv, isproto, linkage, paramattr, alignment, section, visibility, gc, prologuedata, dllstorageclass, comdat, prefixdata]``
|
||||
``[FUNCTION, type, callingconv, isproto, linkage, paramattr, alignment, section, visibility, gc, prologuedata, dllstorageclass, comdat, prefixdata, personalityfn]``
|
||||
|
||||
The ``FUNCTION`` record (code 8) marks the declaration or definition of a
|
||||
function. The operand fields are:
|
||||
@ -795,6 +795,8 @@ function. The operand fields are:
|
||||
* *prefixdata*: If non-zero, the value index of the prefix data for this function,
|
||||
plus 1.
|
||||
|
||||
* *personalityfn*: If non-zero, the value index of the personality function for this function,
|
||||
plus 1.
|
||||
|
||||
MODULE_CODE_ALIAS Record
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -161,7 +161,7 @@ ADDITIONAL OPTIONS
|
||||
|
||||
.. option:: --show-tests
|
||||
|
||||
List all of the the discovered tests and exit.
|
||||
List all of the discovered tests and exit.
|
||||
|
||||
EXIT STATUS
|
||||
-----------
|
||||
|
@ -68,8 +68,8 @@ Other documents, collections, notes
|
||||
* `PowerPC64 alignment of long doubles (from GCC) <http://gcc.gnu.org/ml/gcc-patches/2003-09/msg00997.html>`_
|
||||
* `Long branch stubs for powerpc64-linux (from binutils) <http://sources.redhat.com/ml/binutils/2002-04/msg00573.html>`_
|
||||
|
||||
R600
|
||||
----
|
||||
AMDGPU
|
||||
------
|
||||
|
||||
* `AMD R6xx shader ISA <http://developer.amd.com/wordpress/media/2012/10/R600_Instruction_Set_Architecture.pdf>`_
|
||||
* `AMD R7xx shader ISA <http://developer.amd.com/wordpress/media/2012/10/R700-Family_Instruction_Set_Architecture.pdf>`_
|
||||
|
54
docs/FaultMaps.rst
Normal file
54
docs/FaultMaps.rst
Normal file
@ -0,0 +1,54 @@
|
||||
==============================
|
||||
FaultMaps and implicit checks
|
||||
==============================
|
||||
|
||||
.. contents::
|
||||
:local:
|
||||
:depth: 2
|
||||
|
||||
Motivation
|
||||
==========
|
||||
|
||||
Code generated by managed language runtimes tend to have checks that
|
||||
are required for safety but never fail in practice. In such cases, it
|
||||
is profitable to make the non-failing case cheaper even if it makes
|
||||
the failing case significantly more expensive. This asymmetry can be
|
||||
exploited by folding such safety checks into operations that can be
|
||||
made to fault reliably if the check would have failed, and recovering
|
||||
from such a fault by using a signal handler.
|
||||
|
||||
For example, Java requires null checks on objects before they are read
|
||||
from or written to. If the object is ``null`` then a
|
||||
``NullPointerException`` has to be thrown, interrupting normal
|
||||
execution. In practice, however, dereferencing a ``null`` pointer is
|
||||
extremely rare in well-behaved Java programs, and typically the null
|
||||
check can be folded into a nearby memory operation that operates on
|
||||
the same memory location.
|
||||
|
||||
The Fault Map Section
|
||||
=====================
|
||||
|
||||
Information about implicit checks generated by LLVM are put in a
|
||||
special "fault map" section. On Darwin this section is named
|
||||
``__llvm_faultmaps``.
|
||||
|
||||
The format of this section is
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
Header {
|
||||
uint8 : Fault Map Version (current version is 1)
|
||||
uint8 : Reserved (expected to be 0)
|
||||
uint16 : Reserved (expected to be 0)
|
||||
}
|
||||
uint32 : NumFunctions
|
||||
FunctionInfo[NumFunctions] {
|
||||
uint64 : FunctionAddress
|
||||
uint32 : NumFaultingPCs
|
||||
uint32 : Reserved (expected to be 0)
|
||||
FunctionFaultInfo[NumFaultingPCs] {
|
||||
uint32 : FaultKind = FaultMaps::FaultingLoad (only legal value currently)
|
||||
uint32 : FaultingPCOffset
|
||||
uint32 : handlerPCOffset
|
||||
}
|
||||
}
|
@ -711,7 +711,7 @@ used by people developing LLVM.
|
||||
| | as ``LLVM_ALL_TARGETS``, and can be set to include |
|
||||
| | out-of-tree targets. The default value includes: |
|
||||
| | ``AArch64, ARM, CppBackend, Hexagon, |
|
||||
| | Mips, MSP430, NVPTX, PowerPC, R600, Sparc, |
|
||||
| | Mips, MSP430, NVPTX, PowerPC, AMDGPU, Sparc, |
|
||||
| | SystemZ, X86, XCore``. |
|
||||
+-------------------------+----------------------------------------------------+
|
||||
| LLVM_ENABLE_DOXYGEN | Build doxygen-based documentation from the source |
|
||||
|
@ -635,8 +635,9 @@ attributes <paramattrs>`), optional :ref:`function attributes <fnattrs>`,
|
||||
an optional section, an optional alignment,
|
||||
an optional :ref:`comdat <langref_comdats>`,
|
||||
an optional :ref:`garbage collector name <gc>`, an optional :ref:`prefix <prefixdata>`,
|
||||
an optional :ref:`prologue <prologuedata>`, an opening
|
||||
curly brace, a list of basic blocks, and a closing curly brace.
|
||||
an optional :ref:`prologue <prologuedata>`,
|
||||
an optional :ref:`personality <personalityfn>`,
|
||||
an opening curly brace, a list of basic blocks, and a closing curly brace.
|
||||
|
||||
LLVM function declarations consist of the "``declare``" keyword, an
|
||||
optional :ref:`linkage type <linkage>`, an optional :ref:`visibility
|
||||
@ -683,7 +684,8 @@ Syntax::
|
||||
[cconv] [ret attrs]
|
||||
<ResultType> @<FunctionName> ([argument list])
|
||||
[unnamed_addr] [fn Attrs] [section "name"] [comdat [($name)]]
|
||||
[align N] [gc] [prefix Constant] [prologue Constant] { ... }
|
||||
[align N] [gc] [prefix Constant] [prologue Constant]
|
||||
[personality Constant] { ... }
|
||||
|
||||
The argument list is a comma seperated sequence of arguments where each
|
||||
argument is of the following form
|
||||
@ -1130,6 +1132,14 @@ A function may have prologue data but no body. This has similar semantics
|
||||
to the ``available_externally`` linkage in that the data may be used by the
|
||||
optimizers but will not be emitted in the object file.
|
||||
|
||||
.. _personalityfn:
|
||||
|
||||
Personality Function
|
||||
--------------------
|
||||
|
||||
The ``personality`` attribute permits functions to specify what function
|
||||
to use for exception handling.
|
||||
|
||||
.. _attrgrp:
|
||||
|
||||
Attribute Groups
|
||||
@ -1319,6 +1329,15 @@ example:
|
||||
``setjmp`` is an example of such a function. The compiler disables
|
||||
some optimizations (like tail calls) in the caller of these
|
||||
functions.
|
||||
``safestack``
|
||||
This attribute indicates that
|
||||
`SafeStack <http://clang.llvm.org/docs/SafeStack.html>`_
|
||||
protection is enabled for this function.
|
||||
|
||||
If a function that has a ``safestack`` attribute is inlined into a
|
||||
function that doesn't have a ``safestack`` attribute or which has an
|
||||
``ssp``, ``sspstrong`` or ``sspreq`` attribute, then the resulting
|
||||
function will have a ``safestack`` attribute.
|
||||
``sanitize_address``
|
||||
This attribute indicates that AddressSanitizer checks
|
||||
(dynamic address safety analysis) are enabled for this function.
|
||||
@ -7274,8 +7293,8 @@ Syntax:
|
||||
|
||||
::
|
||||
|
||||
<resultval> = landingpad <resultty> personality <type> <pers_fn> <clause>+
|
||||
<resultval> = landingpad <resultty> personality <type> <pers_fn> cleanup <clause>*
|
||||
<resultval> = landingpad <resultty> <clause>+
|
||||
<resultval> = landingpad <resultty> cleanup <clause>*
|
||||
|
||||
<clause> := catch <type> <value>
|
||||
<clause> := filter <array constant type> <array constant>
|
||||
@ -7287,14 +7306,13 @@ The '``landingpad``' instruction is used by `LLVM's exception handling
|
||||
system <ExceptionHandling.html#overview>`_ to specify that a basic block
|
||||
is a landing pad --- one where the exception lands, and corresponds to the
|
||||
code found in the ``catch`` portion of a ``try``/``catch`` sequence. It
|
||||
defines values supplied by the personality function (``pers_fn``) upon
|
||||
defines values supplied by the :ref:`personality function <personalityfn>` upon
|
||||
re-entry to the function. The ``resultval`` has the type ``resultty``.
|
||||
|
||||
Arguments:
|
||||
""""""""""
|
||||
|
||||
This instruction takes a ``pers_fn`` value. This is the personality
|
||||
function associated with the unwinding mechanism. The optional
|
||||
The optional
|
||||
``cleanup`` flag indicates that the landing pad block is a cleanup.
|
||||
|
||||
A ``clause`` begins with the clause type --- ``catch`` or ``filter`` --- and
|
||||
@ -7309,7 +7327,7 @@ Semantics:
|
||||
""""""""""
|
||||
|
||||
The '``landingpad``' instruction defines the values which are set by the
|
||||
personality function (``pers_fn``) upon re-entry to the function, and
|
||||
:ref:`personality function <personalityfn>` upon re-entry to the function, and
|
||||
therefore the "result type" of the ``landingpad`` instruction. As with
|
||||
calling conventions, how the personality function results are
|
||||
represented in LLVM IR is target specific.
|
||||
@ -7332,8 +7350,6 @@ The ``landingpad`` instruction has several restrictions:
|
||||
pad block.
|
||||
- A basic block that is not a landing pad block may not include a
|
||||
'``landingpad``' instruction.
|
||||
- All '``landingpad``' instructions in a function must have the same
|
||||
personality function.
|
||||
|
||||
Example:
|
||||
""""""""
|
||||
@ -7341,13 +7357,13 @@ Example:
|
||||
.. code-block:: llvm
|
||||
|
||||
;; A landing pad which can catch an integer.
|
||||
%res = landingpad { i8*, i32 } personality i32 (...)* @__gxx_personality_v0
|
||||
%res = landingpad { i8*, i32 }
|
||||
catch i8** @_ZTIi
|
||||
;; A landing pad that is a cleanup.
|
||||
%res = landingpad { i8*, i32 } personality i32 (...)* @__gxx_personality_v0
|
||||
%res = landingpad { i8*, i32 }
|
||||
cleanup
|
||||
;; A landing pad which can catch an integer and can only throw a double.
|
||||
%res = landingpad { i8*, i32 } personality i32 (...)* @__gxx_personality_v0
|
||||
%res = landingpad { i8*, i32 }
|
||||
catch i8** @_ZTIi
|
||||
filter [1 x i8**] [@_ZTId]
|
||||
|
||||
|
@ -112,7 +112,7 @@ Here we show how to use lib/Fuzzer on something real, yet simple: pcre2_::
|
||||
(cd pcre; ./autogen.sh; CC="clang -fsanitize=address $COV_FLAGS" ./configure --prefix=`pwd`/../inst && make -j && make install)
|
||||
# Build lib/Fuzzer files.
|
||||
clang -c -g -O2 -std=c++11 Fuzzer/*.cpp -IFuzzer
|
||||
# Build the the actual function that does something interesting with PCRE2.
|
||||
# Build the actual function that does something interesting with PCRE2.
|
||||
cat << EOF > pcre_fuzzer.cc
|
||||
#include <string.h>
|
||||
#include "pcre2posix.h"
|
||||
|
@ -252,7 +252,7 @@ For API clients and LLVM developers.
|
||||
WritingAnLLVMPass
|
||||
HowToUseAttributes
|
||||
NVPTXUsage
|
||||
R600Usage
|
||||
AMDGPUUsage
|
||||
StackMaps
|
||||
InAlloca
|
||||
BigEndianNEON
|
||||
@ -260,6 +260,7 @@ For API clients and LLVM developers.
|
||||
Statepoints
|
||||
MergeFunctions
|
||||
BitSets
|
||||
FaultMaps
|
||||
|
||||
:doc:`WritingAnLLVMPass`
|
||||
Information on how to write LLVM transformations and analyses.
|
||||
@ -338,8 +339,8 @@ For API clients and LLVM developers.
|
||||
:doc:`NVPTXUsage`
|
||||
This document describes using the NVPTX back-end to compile GPU kernels.
|
||||
|
||||
:doc:`R600Usage`
|
||||
This document describes how to use the R600 back-end.
|
||||
:doc:`AMDGPUUsage`
|
||||
This document describes how to use the AMDGPU back-end.
|
||||
|
||||
:doc:`StackMaps`
|
||||
LLVM support for mapping instruction addresses to the location of
|
||||
@ -362,6 +363,9 @@ For API clients and LLVM developers.
|
||||
:doc:`InAlloca`
|
||||
Description of the ``inalloca`` argument attribute.
|
||||
|
||||
:doc:`FaultMaps`
|
||||
LLVM support for folding control flow into faulting machine instructions.
|
||||
|
||||
Development Process Documentation
|
||||
=================================
|
||||
|
||||
|
@ -161,15 +161,15 @@ typedef enum {
|
||||
/* FIXME: These attributes are currently not included in the C API as
|
||||
a temporary measure until the API/ABI impact to the C API is understood
|
||||
and the path forward agreed upon.
|
||||
LLVMAddressSafety = 1ULL << 32,
|
||||
LLVMStackProtectStrongAttribute = 1ULL<<33,
|
||||
LLVMCold = 1ULL << 34,
|
||||
LLVMOptimizeNone = 1ULL << 35,
|
||||
LLVMInAllocaAttribute = 1ULL << 36,
|
||||
LLVMNonNullAttribute = 1ULL << 37,
|
||||
LLVMJumpTableAttribute = 1ULL << 38,
|
||||
LLVMDereferenceableAttribute = 1ULL << 39,
|
||||
LLVMDereferenceableOrNullAttribute = 1ULL << 40,
|
||||
LLVMSanitizeAddressAttribute = 1ULL << 32,
|
||||
LLVMStackProtectStrongAttribute = 1ULL<<35,
|
||||
LLVMColdAttribute = 1ULL << 40,
|
||||
LLVMOptimizeNoneAttribute = 1ULL << 42,
|
||||
LLVMInAllocaAttribute = 1ULL << 43,
|
||||
LLVMNonNullAttribute = 1ULL << 44,
|
||||
LLVMJumpTableAttribute = 1ULL << 45,
|
||||
LLVMConvergentAttribute = 1ULL << 46,
|
||||
LLVMSafeStackAttribute = 1ULL << 47,
|
||||
*/
|
||||
} LLVMAttribute;
|
||||
|
||||
@ -2661,8 +2661,7 @@ LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
|
||||
LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
|
||||
const char *Name);
|
||||
LLVMValueRef LLVMBuildLandingPad(LLVMBuilderRef B, LLVMTypeRef Ty,
|
||||
LLVMValueRef PersFn, unsigned NumClauses,
|
||||
const char *Name);
|
||||
unsigned NumClauses, const char *Name);
|
||||
LLVMValueRef LLVMBuildResume(LLVMBuilderRef B, LLVMValueRef Exn);
|
||||
LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
|
||||
|
||||
|
@ -62,7 +62,8 @@ typedef enum {
|
||||
LTO_SYMBOL_SCOPE_HIDDEN = 0x00001000,
|
||||
LTO_SYMBOL_SCOPE_PROTECTED = 0x00002000,
|
||||
LTO_SYMBOL_SCOPE_DEFAULT = 0x00001800,
|
||||
LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN = 0x00002800
|
||||
LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN = 0x00002800,
|
||||
LTO_SYMBOL_COMDAT = 0x00004000
|
||||
} lto_symbol_attributes;
|
||||
|
||||
/**
|
||||
|
@ -129,7 +129,7 @@ class APInt {
|
||||
|
||||
/// \brief Clear unused high order bits
|
||||
///
|
||||
/// This method is used internally to clear the to "N" bits in the high order
|
||||
/// This method is used internally to clear the top "N" bits in the high order
|
||||
/// word that are not used by the APInt. This is needed after the most
|
||||
/// significant word is assigned a value to ensure that those bits are
|
||||
/// zero'd out.
|
||||
@ -795,7 +795,7 @@ class APInt {
|
||||
|
||||
/// \brief Bitwise OR function.
|
||||
///
|
||||
/// Performs a bitwise or on *this and RHS. This is implemented bny simply
|
||||
/// Performs a bitwise or on *this and RHS. This is implemented by simply
|
||||
/// calling operator|.
|
||||
///
|
||||
/// \returns An APInt value representing the bitwise OR of *this and RHS.
|
||||
@ -1896,11 +1896,11 @@ inline APInt Xor(const APInt &LHS, const APInt &RHS) { return LHS ^ RHS; }
|
||||
/// Performs a bitwise complement operation on APInt.
|
||||
inline APInt Not(const APInt &APIVal) { return ~APIVal; }
|
||||
|
||||
} // End of APIntOps namespace
|
||||
} // namespace APIntOps
|
||||
|
||||
// See friend declaration above. This additional declaration is required in
|
||||
// order to compile LLVM with IBM xlC compiler.
|
||||
hash_code hash_value(const APInt &Arg);
|
||||
} // End of llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -361,6 +361,6 @@ namespace llvm {
|
||||
template <typename T> struct isPodLike<ArrayRef<T> > {
|
||||
static const bool value = true;
|
||||
};
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -568,7 +568,7 @@ class BitVector {
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
namespace std {
|
||||
/// Implement std::swap in terms of BitVector swap.
|
||||
|
@ -42,7 +42,7 @@ struct DenseMapPair : public std::pair<KeyT, ValueT> {
|
||||
ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
|
||||
const ValueT &getSecond() const { return std::pair<KeyT, ValueT>::second; }
|
||||
};
|
||||
}
|
||||
} // namespace detail
|
||||
|
||||
template <
|
||||
typename KeyT, typename ValueT, typename KeyInfoT = DenseMapInfo<KeyT>,
|
||||
|
@ -32,7 +32,7 @@ template <typename KeyT> class DenseSetPair : public DenseSetEmpty {
|
||||
DenseSetEmpty &getSecond() { return *this; }
|
||||
const DenseSetEmpty &getSecond() const { return *this; }
|
||||
};
|
||||
}
|
||||
} // namespace detail
|
||||
|
||||
/// DenseSet - This implements a dense probed hash-table based set.
|
||||
template<typename ValueT, typename ValueInfoT = DenseMapInfo<ValueT> >
|
||||
|
@ -288,6 +288,6 @@ iterator_range<idf_ext_iterator<T, SetTy>> inverse_depth_first_ext(const T& G,
|
||||
return make_range(idf_ext_begin(G, S), idf_ext_end(G, S));
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -278,6 +278,6 @@ class EquivalenceClasses {
|
||||
};
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -101,6 +101,6 @@ struct GraphTraits<Inverse<Inverse<T> > > {
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -53,6 +53,7 @@
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <iterator>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
namespace llvm {
|
||||
|
@ -80,6 +80,6 @@ template <typename T, typename ToIndexT = llvm::identity<unsigned> >
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -83,6 +83,6 @@ class IntEqClasses {
|
||||
void uncompress();
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -204,6 +204,6 @@ void operator>=(const Optional<T> &X, const Optional<U> &Y);
|
||||
template<typename T, typename U>
|
||||
void operator>(const Optional<T> &X, const Optional<U> &Y);
|
||||
|
||||
} // end llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -507,6 +507,6 @@ namespace llvm {
|
||||
RHS.template get<U>()));
|
||||
}
|
||||
};
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -295,6 +295,6 @@ class ReversePostOrderTraversal {
|
||||
rpo_iterator end() { return Blocks.rend(); }
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -79,6 +79,6 @@ class PriorityQueue : public std::priority_queue<T, Sequence, Compare> {
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -240,6 +240,6 @@ template <class T> scc_iterator<Inverse<T> > scc_end(const Inverse<T> &G) {
|
||||
return scc_iterator<Inverse<T> >::end(G);
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -417,6 +417,6 @@ template <typename T> struct deref {
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -66,6 +66,6 @@ void set_subtract(S1Ty &S1, const S2Ty &S2) {
|
||||
S1.erase(*SI);
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -225,7 +225,7 @@ class SmallSetVector : public SetVector<T, SmallVector<T, N>, SmallSet<T, N> > {
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
// vim: sw=2 ai
|
||||
#endif
|
||||
|
@ -588,7 +588,7 @@ operator^(const SmallBitVector &LHS, const SmallBitVector &RHS) {
|
||||
return Result;
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
namespace std {
|
||||
/// Implement std::swap in terms of BitVector swap.
|
||||
|
@ -334,7 +334,7 @@ class SmallPtrSet : public SmallPtrSetImpl<PtrType> {
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
namespace std {
|
||||
/// Implement std::swap in terms of SmallPtrSet swap.
|
||||
|
@ -292,6 +292,6 @@ class SmallString : public SmallVector<char, InternalLen> {
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -924,7 +924,7 @@ static inline size_t capacity_in_bytes(const SmallVector<T, N> &X) {
|
||||
return X.capacity_in_bytes();
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
namespace std {
|
||||
/// Implement std::swap in terms of SmallVector swap.
|
||||
@ -940,6 +940,6 @@ namespace std {
|
||||
swap(llvm::SmallVector<T, N> &LHS, llvm::SmallVector<T, N> &RHS) {
|
||||
LHS.swap(RHS);
|
||||
}
|
||||
}
|
||||
} // namespace std
|
||||
|
||||
#endif
|
||||
|
@ -176,6 +176,6 @@ void PrintStatistics();
|
||||
/// \brief Print statistics to the given output stream.
|
||||
void PrintStatistics(raw_ostream &OS);
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -207,6 +207,6 @@ inline std::string join(IteratorT Begin, IteratorT End, StringRef Separator) {
|
||||
return join_impl(Begin, End, Separator, tag());
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -447,6 +447,6 @@ class StringMapIterator : public StringMapConstIterator<ValueTy> {
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -566,6 +566,6 @@ namespace llvm {
|
||||
// StringRefs can be treated like a POD type.
|
||||
template <typename T> struct isPodLike;
|
||||
template <> struct isPodLike<StringRef> { static const bool value = true; };
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -29,6 +29,6 @@ namespace llvm {
|
||||
return base::insert(std::make_pair(Key, '\0'));
|
||||
}
|
||||
};
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif // LLVM_ADT_STRINGSET_H
|
||||
|
@ -84,7 +84,8 @@ class Triple {
|
||||
spir, // SPIR: standard portable IR for OpenCL 32-bit version
|
||||
spir64, // SPIR: standard portable IR for OpenCL 64-bit version
|
||||
kalimba, // Kalimba: generic kalimba
|
||||
LastArchType = kalimba
|
||||
shave, // SHAVE: Movidius vector VLIW processors
|
||||
LastArchType = shave
|
||||
};
|
||||
enum SubArchType {
|
||||
NoSubArch,
|
||||
@ -608,7 +609,7 @@ class Triple {
|
||||
/// @}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -537,6 +537,6 @@ namespace llvm {
|
||||
}
|
||||
|
||||
/// @}
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -97,6 +97,6 @@ unsigned ComputeEditDistance(ArrayRef<T> FromArray, ArrayRef<T> ToArray,
|
||||
return Result;
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -655,7 +655,7 @@ struct ilist : public iplist<NodeTy> {
|
||||
void resize(size_type newsize) { resize(newsize, NodeTy()); }
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
namespace std {
|
||||
// Ensure that swap uses the fast list swap...
|
||||
|
@ -101,6 +101,6 @@ class ilist_node : private ilist_half_node<NodeTy> {
|
||||
/// @}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -239,6 +239,6 @@ struct pointee_iterator
|
||||
T &operator*() const { return **this->I; }
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -51,6 +51,6 @@ template <class T> iterator_range<T> make_range(T x, T y) {
|
||||
template <typename T> iterator_range<T> make_range(std::pair<T, T> p) {
|
||||
return iterator_range<T>(std::move(p.first), std::move(p.second));
|
||||
}
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -16,11 +16,12 @@
|
||||
// which automatically provides functionality for the entire suite of client
|
||||
// APIs.
|
||||
//
|
||||
// This API identifies memory regions with the Location class. The pointer
|
||||
// This API identifies memory regions with the MemoryLocation class. The pointer
|
||||
// component specifies the base memory address of the region. The Size specifies
|
||||
// the maximum size (in address units) of the memory region, or UnknownSize if
|
||||
// the size is not known. The TBAA tag identifies the "type" of the memory
|
||||
// reference; see the TypeBasedAliasAnalysis class for details.
|
||||
// the maximum size (in address units) of the memory region, or
|
||||
// MemoryLocation::UnknownSize if the size is not known. The TBAA tag
|
||||
// identifies the "type" of the memory reference; see the
|
||||
// TypeBasedAliasAnalysis class for details.
|
||||
//
|
||||
// Some non-obvious details include:
|
||||
// - Pointers that point to two completely different objects in memory never
|
||||
@ -80,11 +81,6 @@ class AliasAnalysis {
|
||||
AliasAnalysis() : DL(nullptr), TLI(nullptr), AA(nullptr) {}
|
||||
virtual ~AliasAnalysis(); // We want to be subclassed
|
||||
|
||||
/// UnknownSize - This is a special value which can be used with the
|
||||
/// size arguments in alias queries to indicate that the caller does not
|
||||
/// know the sizes of the potential memory references.
|
||||
static uint64_t const UnknownSize = MemoryLocation::UnknownSize;
|
||||
|
||||
/// getTargetLibraryInfo - Return a pointer to the current TargetLibraryInfo
|
||||
/// object, or null if no TargetLibraryInfo object is available.
|
||||
///
|
||||
@ -99,10 +95,6 @@ class AliasAnalysis {
|
||||
/// Alias Queries...
|
||||
///
|
||||
|
||||
/// Legacy typedef for the AA location object. New code should use \c
|
||||
/// MemoryLocation directly.
|
||||
typedef MemoryLocation Location;
|
||||
|
||||
/// Alias analysis result - Either we know for sure that it does not alias, we
|
||||
/// know for sure it must alias, or we don't know anything: The two pointers
|
||||
/// _might_ alias. This enum is designed so you can do things like:
|
||||
@ -123,38 +115,40 @@ class AliasAnalysis {
|
||||
/// Returns an AliasResult indicating whether the two pointers are aliased to
|
||||
/// each other. This is the interface that must be implemented by specific
|
||||
/// alias analysis implementations.
|
||||
virtual AliasResult alias(const Location &LocA, const Location &LocB);
|
||||
virtual AliasResult alias(const MemoryLocation &LocA,
|
||||
const MemoryLocation &LocB);
|
||||
|
||||
/// alias - A convenience wrapper.
|
||||
AliasResult alias(const Value *V1, uint64_t V1Size,
|
||||
const Value *V2, uint64_t V2Size) {
|
||||
return alias(Location(V1, V1Size), Location(V2, V2Size));
|
||||
return alias(MemoryLocation(V1, V1Size), MemoryLocation(V2, V2Size));
|
||||
}
|
||||
|
||||
/// alias - A convenience wrapper.
|
||||
AliasResult alias(const Value *V1, const Value *V2) {
|
||||
return alias(V1, UnknownSize, V2, UnknownSize);
|
||||
return alias(V1, MemoryLocation::UnknownSize, V2,
|
||||
MemoryLocation::UnknownSize);
|
||||
}
|
||||
|
||||
/// isNoAlias - A trivial helper function to check to see if the specified
|
||||
/// pointers are no-alias.
|
||||
bool isNoAlias(const Location &LocA, const Location &LocB) {
|
||||
bool isNoAlias(const MemoryLocation &LocA, const MemoryLocation &LocB) {
|
||||
return alias(LocA, LocB) == NoAlias;
|
||||
}
|
||||
|
||||
/// isNoAlias - A convenience wrapper.
|
||||
bool isNoAlias(const Value *V1, uint64_t V1Size,
|
||||
const Value *V2, uint64_t V2Size) {
|
||||
return isNoAlias(Location(V1, V1Size), Location(V2, V2Size));
|
||||
return isNoAlias(MemoryLocation(V1, V1Size), MemoryLocation(V2, V2Size));
|
||||
}
|
||||
|
||||
/// isNoAlias - A convenience wrapper.
|
||||
bool isNoAlias(const Value *V1, const Value *V2) {
|
||||
return isNoAlias(Location(V1), Location(V2));
|
||||
return isNoAlias(MemoryLocation(V1), MemoryLocation(V2));
|
||||
}
|
||||
|
||||
/// isMustAlias - A convenience wrapper.
|
||||
bool isMustAlias(const Location &LocA, const Location &LocB) {
|
||||
bool isMustAlias(const MemoryLocation &LocA, const MemoryLocation &LocB) {
|
||||
return alias(LocA, LocB) == MustAlias;
|
||||
}
|
||||
|
||||
@ -167,12 +161,12 @@ class AliasAnalysis {
|
||||
/// known to be constant, return true. If OrLocal is true and the
|
||||
/// specified memory location is known to be "local" (derived from
|
||||
/// an alloca), return true. Otherwise return false.
|
||||
virtual bool pointsToConstantMemory(const Location &Loc,
|
||||
virtual bool pointsToConstantMemory(const MemoryLocation &Loc,
|
||||
bool OrLocal = false);
|
||||
|
||||
/// pointsToConstantMemory - A convenient wrapper.
|
||||
bool pointsToConstantMemory(const Value *P, bool OrLocal = false) {
|
||||
return pointsToConstantMemory(Location(P), OrLocal);
|
||||
return pointsToConstantMemory(MemoryLocation(P), OrLocal);
|
||||
}
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
@ -228,13 +222,12 @@ class AliasAnalysis {
|
||||
UnknownModRefBehavior = Anywhere | ModRef
|
||||
};
|
||||
|
||||
/// Get the location associated with a pointer argument of a callsite.
|
||||
/// The mask bits are set to indicate the allowed aliasing ModRef kinds.
|
||||
/// Note that these mask bits do not necessarily account for the overall
|
||||
/// behavior of the function, but rather only provide additional
|
||||
/// per-argument information.
|
||||
virtual Location getArgLocation(ImmutableCallSite CS, unsigned ArgIdx,
|
||||
ModRefResult &Mask);
|
||||
/// Get the ModRef info associated with a pointer argument of a callsite. The
|
||||
/// result's bits are set to indicate the allowed aliasing ModRef kinds. Note
|
||||
/// that these bits do not necessarily account for the overall behavior of
|
||||
/// the function, but rather only provide additional per-argument
|
||||
/// information.
|
||||
virtual ModRefResult getArgModRefInfo(ImmutableCallSite CS, unsigned ArgIdx);
|
||||
|
||||
/// getModRefBehavior - Return the behavior when calling the given call site.
|
||||
virtual ModRefBehavior getModRefBehavior(ImmutableCallSite CS);
|
||||
@ -324,14 +317,13 @@ class AliasAnalysis {
|
||||
return NoModRef;
|
||||
}
|
||||
|
||||
return getModRefInfo(I, Location());
|
||||
return getModRefInfo(I, MemoryLocation());
|
||||
}
|
||||
|
||||
/// getModRefInfo - Return information about whether or not an instruction may
|
||||
/// read or write the specified memory location. An instruction
|
||||
/// that doesn't read or write memory may be trivially LICM'd for example.
|
||||
ModRefResult getModRefInfo(const Instruction *I,
|
||||
const Location &Loc) {
|
||||
ModRefResult getModRefInfo(const Instruction *I, const MemoryLocation &Loc) {
|
||||
switch (I->getOpcode()) {
|
||||
case Instruction::VAArg: return getModRefInfo((const VAArgInst*)I, Loc);
|
||||
case Instruction::Load: return getModRefInfo((const LoadInst*)I, Loc);
|
||||
@ -350,65 +342,64 @@ class AliasAnalysis {
|
||||
/// getModRefInfo - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(const Instruction *I,
|
||||
const Value *P, uint64_t Size) {
|
||||
return getModRefInfo(I, Location(P, Size));
|
||||
return getModRefInfo(I, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// getModRefInfo (for call sites) - Return information about whether
|
||||
/// a particular call site modifies or reads the specified memory location.
|
||||
virtual ModRefResult getModRefInfo(ImmutableCallSite CS,
|
||||
const Location &Loc);
|
||||
const MemoryLocation &Loc);
|
||||
|
||||
/// getModRefInfo (for call sites) - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(ImmutableCallSite CS,
|
||||
const Value *P, uint64_t Size) {
|
||||
return getModRefInfo(CS, Location(P, Size));
|
||||
return getModRefInfo(CS, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// getModRefInfo (for calls) - Return information about whether
|
||||
/// a particular call modifies or reads the specified memory location.
|
||||
ModRefResult getModRefInfo(const CallInst *C, const Location &Loc) {
|
||||
ModRefResult getModRefInfo(const CallInst *C, const MemoryLocation &Loc) {
|
||||
return getModRefInfo(ImmutableCallSite(C), Loc);
|
||||
}
|
||||
|
||||
/// getModRefInfo (for calls) - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(const CallInst *C, const Value *P, uint64_t Size) {
|
||||
return getModRefInfo(C, Location(P, Size));
|
||||
return getModRefInfo(C, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// getModRefInfo (for invokes) - Return information about whether
|
||||
/// a particular invoke modifies or reads the specified memory location.
|
||||
ModRefResult getModRefInfo(const InvokeInst *I,
|
||||
const Location &Loc) {
|
||||
ModRefResult getModRefInfo(const InvokeInst *I, const MemoryLocation &Loc) {
|
||||
return getModRefInfo(ImmutableCallSite(I), Loc);
|
||||
}
|
||||
|
||||
/// getModRefInfo (for invokes) - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(const InvokeInst *I,
|
||||
const Value *P, uint64_t Size) {
|
||||
return getModRefInfo(I, Location(P, Size));
|
||||
return getModRefInfo(I, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// getModRefInfo (for loads) - Return information about whether
|
||||
/// a particular load modifies or reads the specified memory location.
|
||||
ModRefResult getModRefInfo(const LoadInst *L, const Location &Loc);
|
||||
ModRefResult getModRefInfo(const LoadInst *L, const MemoryLocation &Loc);
|
||||
|
||||
/// getModRefInfo (for loads) - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(const LoadInst *L, const Value *P, uint64_t Size) {
|
||||
return getModRefInfo(L, Location(P, Size));
|
||||
return getModRefInfo(L, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// getModRefInfo (for stores) - Return information about whether
|
||||
/// a particular store modifies or reads the specified memory location.
|
||||
ModRefResult getModRefInfo(const StoreInst *S, const Location &Loc);
|
||||
ModRefResult getModRefInfo(const StoreInst *S, const MemoryLocation &Loc);
|
||||
|
||||
/// getModRefInfo (for stores) - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(const StoreInst *S, const Value *P, uint64_t Size){
|
||||
return getModRefInfo(S, Location(P, Size));
|
||||
return getModRefInfo(S, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// getModRefInfo (for fences) - Return information about whether
|
||||
/// a particular store modifies or reads the specified memory location.
|
||||
ModRefResult getModRefInfo(const FenceInst *S, const Location &Loc) {
|
||||
ModRefResult getModRefInfo(const FenceInst *S, const MemoryLocation &Loc) {
|
||||
// Conservatively correct. (We could possibly be a bit smarter if
|
||||
// Loc is a alloca that doesn't escape.)
|
||||
return ModRef;
|
||||
@ -416,36 +407,38 @@ class AliasAnalysis {
|
||||
|
||||
/// getModRefInfo (for fences) - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(const FenceInst *S, const Value *P, uint64_t Size){
|
||||
return getModRefInfo(S, Location(P, Size));
|
||||
return getModRefInfo(S, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// getModRefInfo (for cmpxchges) - Return information about whether
|
||||
/// a particular cmpxchg modifies or reads the specified memory location.
|
||||
ModRefResult getModRefInfo(const AtomicCmpXchgInst *CX, const Location &Loc);
|
||||
ModRefResult getModRefInfo(const AtomicCmpXchgInst *CX,
|
||||
const MemoryLocation &Loc);
|
||||
|
||||
/// getModRefInfo (for cmpxchges) - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(const AtomicCmpXchgInst *CX,
|
||||
const Value *P, unsigned Size) {
|
||||
return getModRefInfo(CX, Location(P, Size));
|
||||
return getModRefInfo(CX, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// getModRefInfo (for atomicrmws) - Return information about whether
|
||||
/// a particular atomicrmw modifies or reads the specified memory location.
|
||||
ModRefResult getModRefInfo(const AtomicRMWInst *RMW, const Location &Loc);
|
||||
ModRefResult getModRefInfo(const AtomicRMWInst *RMW,
|
||||
const MemoryLocation &Loc);
|
||||
|
||||
/// getModRefInfo (for atomicrmws) - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(const AtomicRMWInst *RMW,
|
||||
const Value *P, unsigned Size) {
|
||||
return getModRefInfo(RMW, Location(P, Size));
|
||||
return getModRefInfo(RMW, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// getModRefInfo (for va_args) - Return information about whether
|
||||
/// a particular va_arg modifies or reads the specified memory location.
|
||||
ModRefResult getModRefInfo(const VAArgInst* I, const Location &Loc);
|
||||
ModRefResult getModRefInfo(const VAArgInst *I, const MemoryLocation &Loc);
|
||||
|
||||
/// getModRefInfo (for va_args) - A convenience wrapper.
|
||||
ModRefResult getModRefInfo(const VAArgInst* I, const Value* P, uint64_t Size){
|
||||
return getModRefInfo(I, Location(P, Size));
|
||||
return getModRefInfo(I, MemoryLocation(P, Size));
|
||||
}
|
||||
/// getModRefInfo - Return information about whether a call and an instruction
|
||||
/// may refer to the same memory locations.
|
||||
@ -462,13 +455,13 @@ class AliasAnalysis {
|
||||
/// callCapturesBefore - Return information about whether a particular call
|
||||
/// site modifies or reads the specified memory location.
|
||||
ModRefResult callCapturesBefore(const Instruction *I,
|
||||
const AliasAnalysis::Location &MemLoc,
|
||||
const MemoryLocation &MemLoc,
|
||||
DominatorTree *DT);
|
||||
|
||||
/// callCapturesBefore - A convenience wrapper.
|
||||
ModRefResult callCapturesBefore(const Instruction *I, const Value *P,
|
||||
uint64_t Size, DominatorTree *DT) {
|
||||
return callCapturesBefore(I, Location(P, Size), DT);
|
||||
return callCapturesBefore(I, MemoryLocation(P, Size), DT);
|
||||
}
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
@ -477,11 +470,11 @@ class AliasAnalysis {
|
||||
|
||||
/// canBasicBlockModify - Return true if it is possible for execution of the
|
||||
/// specified basic block to modify the location Loc.
|
||||
bool canBasicBlockModify(const BasicBlock &BB, const Location &Loc);
|
||||
bool canBasicBlockModify(const BasicBlock &BB, const MemoryLocation &Loc);
|
||||
|
||||
/// canBasicBlockModify - A convenience wrapper.
|
||||
bool canBasicBlockModify(const BasicBlock &BB, const Value *P, uint64_t Size){
|
||||
return canBasicBlockModify(BB, Location(P, Size));
|
||||
return canBasicBlockModify(BB, MemoryLocation(P, Size));
|
||||
}
|
||||
|
||||
/// canInstructionRangeModRef - Return true if it is possible for the
|
||||
@ -489,15 +482,15 @@ class AliasAnalysis {
|
||||
/// mode) the location Loc. The instructions to consider are all
|
||||
/// of the instructions in the range of [I1,I2] INCLUSIVE.
|
||||
/// I1 and I2 must be in the same basic block.
|
||||
bool canInstructionRangeModRef(const Instruction &I1,
|
||||
const Instruction &I2, const Location &Loc,
|
||||
const ModRefResult Mode);
|
||||
bool canInstructionRangeModRef(const Instruction &I1, const Instruction &I2,
|
||||
const MemoryLocation &Loc,
|
||||
const ModRefResult Mode);
|
||||
|
||||
/// canInstructionRangeModRef - A convenience wrapper.
|
||||
bool canInstructionRangeModRef(const Instruction &I1,
|
||||
const Instruction &I2, const Value *Ptr,
|
||||
uint64_t Size, const ModRefResult Mode) {
|
||||
return canInstructionRangeModRef(I1, I2, Location(Ptr, Size), Mode);
|
||||
return canInstructionRangeModRef(I1, I2, MemoryLocation(Ptr, Size), Mode);
|
||||
}
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
@ -565,6 +558,6 @@ bool isIdentifiedObject(const Value *V);
|
||||
/// IdentifiedObjects.
|
||||
bool isIdentifiedFunctionLocal(const Value *V);
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -437,6 +437,6 @@ inline raw_ostream& operator<<(raw_ostream &OS, const AliasSetTracker &AST) {
|
||||
return OS;
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -63,6 +63,6 @@ class BlockFrequencyInfo : public FunctionPass {
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -196,23 +196,26 @@ class BlockFrequencyInfoImplBase {
|
||||
struct LoopData {
|
||||
typedef SmallVector<std::pair<BlockNode, BlockMass>, 4> ExitMap;
|
||||
typedef SmallVector<BlockNode, 4> NodeList;
|
||||
LoopData *Parent; ///< The parent loop.
|
||||
bool IsPackaged; ///< Whether this has been packaged.
|
||||
uint32_t NumHeaders; ///< Number of headers.
|
||||
ExitMap Exits; ///< Successor edges (and weights).
|
||||
NodeList Nodes; ///< Header and the members of the loop.
|
||||
BlockMass BackedgeMass; ///< Mass returned to loop header.
|
||||
typedef SmallVector<BlockMass, 1> HeaderMassList;
|
||||
LoopData *Parent; ///< The parent loop.
|
||||
bool IsPackaged; ///< Whether this has been packaged.
|
||||
uint32_t NumHeaders; ///< Number of headers.
|
||||
ExitMap Exits; ///< Successor edges (and weights).
|
||||
NodeList Nodes; ///< Header and the members of the loop.
|
||||
HeaderMassList BackedgeMass; ///< Mass returned to each loop header.
|
||||
BlockMass Mass;
|
||||
Scaled64 Scale;
|
||||
|
||||
LoopData(LoopData *Parent, const BlockNode &Header)
|
||||
: Parent(Parent), IsPackaged(false), NumHeaders(1), Nodes(1, Header) {}
|
||||
: Parent(Parent), IsPackaged(false), NumHeaders(1), Nodes(1, Header),
|
||||
BackedgeMass(1) {}
|
||||
template <class It1, class It2>
|
||||
LoopData(LoopData *Parent, It1 FirstHeader, It1 LastHeader, It2 FirstOther,
|
||||
It2 LastOther)
|
||||
: Parent(Parent), IsPackaged(false), Nodes(FirstHeader, LastHeader) {
|
||||
NumHeaders = Nodes.size();
|
||||
Nodes.insert(Nodes.end(), FirstOther, LastOther);
|
||||
BackedgeMass.resize(NumHeaders);
|
||||
}
|
||||
bool isHeader(const BlockNode &Node) const {
|
||||
if (isIrreducible())
|
||||
@ -223,6 +226,14 @@ class BlockFrequencyInfoImplBase {
|
||||
BlockNode getHeader() const { return Nodes[0]; }
|
||||
bool isIrreducible() const { return NumHeaders > 1; }
|
||||
|
||||
HeaderMassList::difference_type getHeaderIndex(const BlockNode &B) {
|
||||
assert(isHeader(B) && "this is only valid on loop header blocks");
|
||||
if (isIrreducible())
|
||||
return std::lower_bound(Nodes.begin(), Nodes.begin() + NumHeaders, B) -
|
||||
Nodes.begin();
|
||||
return 0;
|
||||
}
|
||||
|
||||
NodeList::const_iterator members_begin() const {
|
||||
return Nodes.begin() + NumHeaders;
|
||||
}
|
||||
@ -431,6 +442,16 @@ class BlockFrequencyInfoImplBase {
|
||||
/// \brief Compute the loop scale for a loop.
|
||||
void computeLoopScale(LoopData &Loop);
|
||||
|
||||
/// Adjust the mass of all headers in an irreducible loop.
|
||||
///
|
||||
/// Initially, irreducible loops are assumed to distribute their mass
|
||||
/// equally among its headers. This can lead to wrong frequency estimates
|
||||
/// since some headers may be executed more frequently than others.
|
||||
///
|
||||
/// This adjusts header mass distribution so it matches the weights of
|
||||
/// the backedges going into each of the loop headers.
|
||||
void adjustLoopHeaderMass(LoopData &Loop);
|
||||
|
||||
/// \brief Package up a loop.
|
||||
void packageLoop(LoopData &Loop);
|
||||
|
||||
@ -607,7 +628,7 @@ void IrreducibleGraph::addEdges(const BlockNode &Node,
|
||||
else
|
||||
addBlockEdges(*this, Irr, OuterLoop);
|
||||
}
|
||||
}
|
||||
} // namespace bfi_detail
|
||||
|
||||
/// \brief Shared implementation for block frequency analysis.
|
||||
///
|
||||
@ -695,6 +716,17 @@ void IrreducibleGraph::addEdges(const BlockNode &Node,
|
||||
/// - Distribute the mass accordingly, dithering to minimize mass loss,
|
||||
/// as described in \a distributeMass().
|
||||
///
|
||||
/// In the case of irreducible loops, instead of a single loop header,
|
||||
/// there will be several. The computation of backedge masses is similar
|
||||
/// but instead of having a single backedge mass, there will be one
|
||||
/// backedge per loop header. In these cases, each backedge will carry
|
||||
/// a mass proportional to the edge weights along the corresponding
|
||||
/// path.
|
||||
///
|
||||
/// At the end of propagation, the full mass assigned to the loop will be
|
||||
/// distributed among the loop headers proportionally according to the
|
||||
/// mass flowing through their backedges.
|
||||
///
|
||||
/// Finally, calculate the loop scale from the accumulated backedge mass.
|
||||
///
|
||||
/// 3. Distribute mass in the function (\a computeMassInFunction()).
|
||||
@ -735,11 +767,6 @@ void IrreducibleGraph::addEdges(const BlockNode &Node,
|
||||
/// as sub-loops, rather than arbitrarily shoving the problematic
|
||||
/// blocks into the headers of the main irreducible SCC.
|
||||
///
|
||||
/// - Backedge frequencies are assumed to be evenly split between the
|
||||
/// headers of a given irreducible SCC. Instead, we could track the
|
||||
/// backedge mass separately for each header, and adjust their relative
|
||||
/// frequencies.
|
||||
///
|
||||
/// - Entry frequencies are assumed to be evenly split between the
|
||||
/// headers of a given irreducible SCC, which is the only option if we
|
||||
/// need to compute mass in the SCC before its parent loop. Instead,
|
||||
@ -846,7 +873,7 @@ template <class BT> class BlockFrequencyInfoImpl : BlockFrequencyInfoImplBase {
|
||||
///
|
||||
/// \pre \a computeMassInLoop() has been called for each subloop of \c
|
||||
/// OuterLoop.
|
||||
/// \pre \c Insert points at the the last loop successfully processed by \a
|
||||
/// \pre \c Insert points at the last loop successfully processed by \a
|
||||
/// computeMassInLoop().
|
||||
/// \pre \c OuterLoop has irreducible SCCs.
|
||||
void computeIrreducibleMass(LoopData *OuterLoop,
|
||||
@ -1042,6 +1069,8 @@ bool BlockFrequencyInfoImpl<BT>::computeMassInLoop(LoopData &Loop) {
|
||||
for (const BlockNode &M : Loop.Nodes)
|
||||
if (!propagateMassToSuccessors(&Loop, M))
|
||||
llvm_unreachable("unhandled irreducible control flow");
|
||||
|
||||
adjustLoopHeaderMass(Loop);
|
||||
} else {
|
||||
Working[Loop.getHeader().Index].getMass() = BlockMass::getFull();
|
||||
if (!propagateMassToSuccessors(&Loop, Loop.getHeader()))
|
||||
@ -1104,7 +1133,7 @@ template <class BT> struct BlockEdgesAdder {
|
||||
G.addEdge(Irr, BFI.getNode(*I), OuterLoop);
|
||||
}
|
||||
};
|
||||
}
|
||||
} // namespace bfi_detail
|
||||
template <class BT>
|
||||
void BlockFrequencyInfoImpl<BT>::computeIrreducibleMass(
|
||||
LoopData *OuterLoop, std::list<LoopData>::iterator Insert) {
|
||||
|
@ -158,6 +158,6 @@ class BranchProbabilityInfo : public FunctionPass {
|
||||
bool calcInvokeHeuristics(BasicBlock *BB);
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -78,6 +78,6 @@ bool isPotentiallyReachable(const BasicBlock *From, const BasicBlock *To,
|
||||
const DominatorTree *DT = nullptr,
|
||||
const LoopInfo *LI = nullptr);
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -119,7 +119,7 @@ struct DOTGraphTraits<const Function*> : public DefaultDOTGraphTraits {
|
||||
return "";
|
||||
}
|
||||
};
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
namespace llvm {
|
||||
class FunctionPass;
|
||||
|
@ -485,6 +485,6 @@ CGSCCToFunctionPassAdaptor<FunctionPassT>
|
||||
createCGSCCToFunctionPassAdaptor(FunctionPassT Pass) {
|
||||
return CGSCCToFunctionPassAdaptor<FunctionPassT>(std::move(Pass));
|
||||
}
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -56,6 +56,7 @@
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/IR/CallSite.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/Intrinsics.h"
|
||||
#include "llvm/IR/ValueHandle.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include <map>
|
||||
@ -229,7 +230,8 @@ class CallGraphNode {
|
||||
/// \brief Adds a function to the list of functions called by this one.
|
||||
void addCalledFunction(CallSite CS, CallGraphNode *M) {
|
||||
assert(!CS.getInstruction() || !CS.getCalledFunction() ||
|
||||
!CS.getCalledFunction()->isIntrinsic());
|
||||
!CS.getCalledFunction()->isIntrinsic() ||
|
||||
!Intrinsic::isLeaf(CS.getCalledFunction()->getIntrinsicID()));
|
||||
CalledFunctions.emplace_back(CS.getInstruction(), M);
|
||||
M->AddRef();
|
||||
}
|
||||
@ -479,6 +481,6 @@ struct GraphTraits<const CallGraph *> : public GraphTraits<
|
||||
static const CallGraphNode &CGdereference(PairTy P) { return *P.second; }
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -102,6 +102,6 @@ class CallGraphSCC {
|
||||
iterator end() const { return Nodes.end(); }
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -102,6 +102,6 @@ struct CodeMetrics {
|
||||
SmallPtrSetImpl<const Value *> &EphValues);
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -97,6 +97,6 @@ bool canConstantFoldCallTo(const Function *F);
|
||||
/// with the specified arguments, returning null if unsuccessful.
|
||||
Constant *ConstantFoldCall(Function *F, ArrayRef<Constant *> Operands,
|
||||
const TargetLibraryInfo *TLI = nullptr);
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -25,6 +25,6 @@ namespace llvm {
|
||||
FunctionPass *createPostDomOnlyPrinterPass();
|
||||
FunctionPass *createPostDomViewerPass();
|
||||
FunctionPass *createPostDomOnlyViewerPass();
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -205,6 +205,6 @@ class DominanceFrontier : public FunctionPass {
|
||||
EXTERN_TEMPLATE_INSTANTIATION(class DominanceFrontierBase<BasicBlock>);
|
||||
EXTERN_TEMPLATE_INSTANTIATION(class ForwardDominanceFrontierBase<BasicBlock>);
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -221,6 +221,6 @@ ForwardDominanceFrontierBase<BlockT>::calculate(const DomTreeT &DT,
|
||||
return *Result;
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -178,6 +178,6 @@ class IVUsers : public LoopPass {
|
||||
|
||||
Pass *createIVUsersPass();
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -36,7 +36,7 @@ namespace InlineConstants {
|
||||
/// Do not inline functions which allocate this many bytes on the stack
|
||||
/// when the caller is recursive.
|
||||
const unsigned TotalAllocaSizeRecursiveCaller = 1024;
|
||||
}
|
||||
} // namespace InlineConstants
|
||||
|
||||
/// \brief Represents the cost of inlining a function.
|
||||
///
|
||||
@ -138,6 +138,6 @@ class InlineCostAnalysis : public CallGraphSCCPass {
|
||||
bool isInlineViable(Function &Callee);
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -145,6 +145,6 @@ template <> struct GraphTraits<Inverse<Interval*> > {
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -263,6 +263,6 @@ inline interval_part_interval_iterator intervals_end(IntervalPartition &IP) {
|
||||
return interval_part_interval_iterator();
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -106,6 +106,6 @@ class IntervalPartition : public FunctionPass {
|
||||
void updatePredecessors(Interval *Int);
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -92,5 +92,5 @@ class IDFCalculator {
|
||||
const SmallPtrSetImpl<BasicBlock *> *DefBlocks;
|
||||
SmallVector<BasicBlock *, 32> PHIBlocks;
|
||||
};
|
||||
}
|
||||
} // namespace llvm
|
||||
#endif
|
||||
|
@ -66,6 +66,6 @@ class JumpInstrTableInfo : public ImmutablePass {
|
||||
/// bound specifies the maximum number of bytes needed to represent an
|
||||
/// unconditional jump or a trap instruction in the back end currently in use.
|
||||
ModulePass *createJumpInstrTableInfoPass(unsigned Bound);
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif /* LLVM_ANALYSIS_JUMPINSTRTABLEINFO_H */
|
||||
|
@ -569,6 +569,6 @@ class LazyCallGraphPrinterPass {
|
||||
static StringRef name() { return "LazyCallGraphPrinterPass"; }
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -39,8 +39,8 @@ namespace llvm {
|
||||
~LibCallAliasAnalysis() override;
|
||||
|
||||
ModRefResult getModRefInfo(ImmutableCallSite CS,
|
||||
const Location &Loc) override;
|
||||
|
||||
const MemoryLocation &Loc) override;
|
||||
|
||||
ModRefResult getModRefInfo(ImmutableCallSite CS1,
|
||||
ImmutableCallSite CS2) override {
|
||||
// TODO: Could compare two direct calls against each other if we cared to.
|
||||
@ -64,8 +64,8 @@ namespace llvm {
|
||||
private:
|
||||
ModRefResult AnalyzeLibCallDetails(const LibCallFunctionInfo *FI,
|
||||
ImmutableCallSite CS,
|
||||
const Location &Loc);
|
||||
const MemoryLocation &Loc);
|
||||
};
|
||||
} // End of llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -48,8 +48,7 @@ class InvokeInst;
|
||||
enum LocResult {
|
||||
Yes, No, Unknown
|
||||
};
|
||||
LocResult (*isLocation)(ImmutableCallSite CS,
|
||||
const AliasAnalysis::Location &Loc);
|
||||
LocResult (*isLocation)(ImmutableCallSite CS, const MemoryLocation &Loc);
|
||||
};
|
||||
|
||||
/// LibCallFunctionInfo - Each record in the array of FunctionInfo structs
|
||||
@ -207,7 +206,7 @@ class InvokeInst;
|
||||
llvm_unreachable("invalid enum");
|
||||
}
|
||||
|
||||
bool canSimplifyInvokeNoUnwind(const InvokeInst *II);
|
||||
bool canSimplifyInvokeNoUnwind(const Function *F);
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
|
@ -44,6 +44,6 @@ void lintFunction(
|
||||
const Function &F ///< The function to be checked
|
||||
);
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -52,6 +52,6 @@ Value *FindAvailableLoadedValue(Value *Ptr, BasicBlock *ScanBB,
|
||||
AliasAnalysis *AA = nullptr,
|
||||
AAMDNodes *AATags = nullptr);
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -555,6 +555,6 @@ class LoopAccessAnalysis : public FunctionPass {
|
||||
DominatorTree *DT;
|
||||
LoopInfo *LI;
|
||||
};
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -763,6 +763,6 @@ class LoopInfoWrapperPass : public FunctionPass {
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override;
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -535,6 +535,6 @@ void LoopInfoBase<BlockT, LoopT>::verify() const {
|
||||
#endif
|
||||
}
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -169,6 +169,6 @@ class LPPassManager : public FunctionPass, public PMDataManager {
|
||||
Loop *CurrentLoop;
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -262,6 +262,6 @@ class ObjectSizeOffsetEvaluator
|
||||
SizeOffsetEvalType visitInstruction(Instruction &I);
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -287,7 +287,7 @@ namespace llvm {
|
||||
/// conflicting tags.
|
||||
AAMDNodes AATags;
|
||||
|
||||
NonLocalPointerInfo() : Size(AliasAnalysis::UnknownSize) {}
|
||||
NonLocalPointerInfo() : Size(MemoryLocation::UnknownSize) {}
|
||||
};
|
||||
|
||||
/// CachedNonLocalPointerInfo - This map stores the cached results of doing
|
||||
@ -403,13 +403,12 @@ namespace llvm {
|
||||
///
|
||||
/// Note that this is an uncached query, and thus may be inefficient.
|
||||
///
|
||||
MemDepResult getPointerDependencyFrom(const AliasAnalysis::Location &Loc,
|
||||
MemDepResult getPointerDependencyFrom(const MemoryLocation &Loc,
|
||||
bool isLoad,
|
||||
BasicBlock::iterator ScanIt,
|
||||
BasicBlock *BB,
|
||||
Instruction *QueryInst = nullptr);
|
||||
|
||||
|
||||
/// getLoadLoadClobberFullWidthSize - This is a little bit of analysis that
|
||||
/// looks at a memory location for a load (specified by MemLocBase, Offs,
|
||||
/// and Size) and compares it against a load. If the specified load could
|
||||
@ -428,15 +427,14 @@ namespace llvm {
|
||||
BasicBlock *BB);
|
||||
bool getNonLocalPointerDepFromBB(Instruction *QueryInst,
|
||||
const PHITransAddr &Pointer,
|
||||
const AliasAnalysis::Location &Loc,
|
||||
bool isLoad, BasicBlock *BB,
|
||||
const MemoryLocation &Loc, bool isLoad,
|
||||
BasicBlock *BB,
|
||||
SmallVectorImpl<NonLocalDepResult> &Result,
|
||||
DenseMap<BasicBlock*, Value*> &Visited,
|
||||
DenseMap<BasicBlock *, Value *> &Visited,
|
||||
bool SkipFirstBlock = false);
|
||||
MemDepResult GetNonLocalInfoForBlock(Instruction *QueryInst,
|
||||
const AliasAnalysis::Location &Loc,
|
||||
bool isLoad, BasicBlock *BB,
|
||||
NonLocalDepInfo *Cache,
|
||||
const MemoryLocation &Loc, bool isLoad,
|
||||
BasicBlock *BB, NonLocalDepInfo *Cache,
|
||||
unsigned NumSortedEntries);
|
||||
|
||||
void RemoveCachedNonLocalPointerDependencies(ValueIsLoadPair P);
|
||||
@ -447,6 +445,6 @@ namespace llvm {
|
||||
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -26,6 +26,7 @@ class LoadInst;
|
||||
class StoreInst;
|
||||
class MemTransferInst;
|
||||
class MemIntrinsic;
|
||||
class TargetLibraryInfo;
|
||||
|
||||
/// Representation for a specific memory location.
|
||||
///
|
||||
@ -87,6 +88,10 @@ class MemoryLocation {
|
||||
/// transfer.
|
||||
static MemoryLocation getForDest(const MemIntrinsic *MI);
|
||||
|
||||
/// Return a location representing a particular argument of a call.
|
||||
static MemoryLocation getForArgument(ImmutableCallSite CS, unsigned ArgIdx,
|
||||
const TargetLibraryInfo &TLI);
|
||||
|
||||
explicit MemoryLocation(const Value *Ptr = nullptr,
|
||||
uint64_t Size = UnknownSize,
|
||||
const AAMDNodes &AATags = AAMDNodes())
|
||||
@ -132,6 +137,6 @@ template <> struct DenseMapInfo<MemoryLocation> {
|
||||
return LHS == RHS;
|
||||
}
|
||||
};
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -173,6 +173,6 @@ namespace llvm {
|
||||
//
|
||||
FunctionPass *createMemDerefPrinter();
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -112,6 +112,6 @@ template <> struct GraphTraits<PostDominatorTree*>
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -280,6 +280,6 @@ class PtrUseVisitor : protected InstVisitor<DerivedT>,
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -906,5 +906,5 @@ EXTERN_TEMPLATE_INSTANTIATION(class RegionBase<RegionTraits<Function>>);
|
||||
EXTERN_TEMPLATE_INSTANTIATION(class RegionNodeBase<RegionTraits<Function>>);
|
||||
EXTERN_TEMPLATE_INSTANTIATION(class RegionInfoBase<RegionTraits<Function>>);
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
#endif
|
||||
|
@ -123,6 +123,6 @@ class RGPassManager : public FunctionPass, public PMDataManager {
|
||||
}
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -981,6 +981,6 @@ namespace llvm {
|
||||
/// to locate them all and call their destructors.
|
||||
SCEVUnknown *FirstUnknown;
|
||||
};
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -275,6 +275,6 @@ namespace llvm {
|
||||
Value *expandIVInc(PHINode *PN, Value *StepV, const Loop *L,
|
||||
Type *ExpandTy, Type *IntTy, bool useSubtract);
|
||||
};
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -829,6 +829,6 @@ static inline const SCEV *apply(const SCEV *Scev, LoopToScevMapT &Map,
|
||||
return SCEVApplyRewriter::rewrite(Scev, Map, SE);
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -73,6 +73,6 @@ const SCEV *TransformForPostIncUse(TransformKind Kind,
|
||||
ScalarEvolution &SE,
|
||||
DominatorTree &DT);
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -265,6 +265,6 @@ class TargetFolder {
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
@ -908,6 +908,6 @@ class TargetTransformInfoWrapperPass : public ImmutablePass {
|
||||
/// clients.
|
||||
ImmutablePass *createTargetTransformInfoWrapperPass(TargetIRAnalysis TIRA);
|
||||
|
||||
} // End llvm namespace
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user