mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
e693cbf9f5
This is the first in a series of patches that attempts to migrate existing cost instructions to return a new InstructionCost class in place of a simple integer. This new class is intended to be as light-weight and simple as possible, with a full range of arithmetic and comparison operators that largely mirror the same sets of operations on basic types, such as integers. The main advantage to using an InstructionCost is that it can encode a particular cost state in addition to a value. The initial implementation only has two states - Normal and Invalid - but these could be expanded over time if necessary. An invalid state can be used to represent an unknown cost or an instruction that is prohibitively expensive. This patch adds the new class and changes the getInstructionCost interface to return the new class. Other cost functions, such as getUserCost, etc., will be migrated in future patches as I believe this to be less disruptive. One benefit of this new class is that it provides a way to unify many of the magic costs in the codebase where the cost is set to a deliberately high number to prevent optimisations taking place, e.g. vectorization. It also provides a route to represent the extremely high, and unknown, cost of scalarization of scalable vectors, which is not currently supported. Differential Revision: https://reviews.llvm.org/D91174
276 lines
7.5 KiB
CMake
276 lines
7.5 KiB
CMake
include(GetLibraryName)
|
|
|
|
if(LLVM_ENABLE_ZLIB)
|
|
set(imported_libs ZLIB::ZLIB)
|
|
endif()
|
|
|
|
if( MSVC OR MINGW )
|
|
# libuuid required for FOLDERID_Profile usage in lib/Support/Windows/Path.inc.
|
|
# advapi32 required for CryptAcquireContextW in lib/Support/Windows/Path.inc.
|
|
set(system_libs ${system_libs} psapi shell32 ole32 uuid advapi32)
|
|
elseif( CMAKE_HOST_UNIX )
|
|
if( HAVE_LIBRT )
|
|
set(system_libs ${system_libs} rt)
|
|
endif()
|
|
if( HAVE_LIBDL )
|
|
set(system_libs ${system_libs} ${CMAKE_DL_LIBS})
|
|
endif()
|
|
if( HAVE_BACKTRACE AND NOT "${Backtrace_LIBRARIES}" STREQUAL "" )
|
|
# On BSDs, CMake returns a fully qualified path to the backtrace library.
|
|
# We need to remove the path and the 'lib' prefix, to make it look like a
|
|
# regular short library name, suitable for appending to a -l link flag.
|
|
get_filename_component(Backtrace_LIBFILE ${Backtrace_LIBRARIES} NAME_WE)
|
|
STRING(REGEX REPLACE "^lib" "" Backtrace_LIBFILE ${Backtrace_LIBFILE})
|
|
set(system_libs ${system_libs} ${Backtrace_LIBFILE})
|
|
endif()
|
|
if( LLVM_ENABLE_TERMINFO )
|
|
set(imported_libs ${imported_libs} "${TERMINFO_LIB}")
|
|
endif()
|
|
if( LLVM_ENABLE_THREADS AND (HAVE_LIBATOMIC OR HAVE_CXX_LIBATOMICS64) )
|
|
set(system_libs ${system_libs} atomic)
|
|
endif()
|
|
set(system_libs ${system_libs} ${LLVM_PTHREAD_LIB})
|
|
if( UNIX AND NOT (BEOS OR HAIKU) )
|
|
set(system_libs ${system_libs} m)
|
|
endif()
|
|
if( FUCHSIA )
|
|
set(system_libs ${system_libs} zircon)
|
|
endif()
|
|
endif( MSVC OR MINGW )
|
|
|
|
# Delay load shell32.dll if possible to speed up process startup.
|
|
set (delayload_flags)
|
|
if (MSVC)
|
|
set (delayload_flags delayimp -delayload:shell32.dll -delayload:ole32.dll)
|
|
endif()
|
|
|
|
# Link Z3 if the user wants to build it.
|
|
if(LLVM_WITH_Z3)
|
|
set(system_libs ${system_libs} ${Z3_LIBRARIES})
|
|
endif()
|
|
|
|
# Override the C runtime allocator on Windows and embed it into LLVM tools & libraries
|
|
if(LLVM_INTEGRATED_CRT_ALLOC)
|
|
if (CMAKE_BUILD_TYPE AND NOT ${LLVM_USE_CRT_${uppercase_CMAKE_BUILD_TYPE}} MATCHES "^(MT|MTd)$")
|
|
message(FATAL_ERROR "LLVM_INTEGRATED_CRT_ALLOC only works with /MT or /MTd. Use LLVM_USE_CRT_${uppercase_CMAKE_BUILD_TYPE} to set the appropriate option.")
|
|
endif()
|
|
|
|
string(REGEX REPLACE "(/|\\\\)$" "" LLVM_INTEGRATED_CRT_ALLOC "${LLVM_INTEGRATED_CRT_ALLOC}")
|
|
|
|
if(NOT EXISTS "${LLVM_INTEGRATED_CRT_ALLOC}")
|
|
message(FATAL_ERROR "Cannot find the path to `git clone` for the CRT allocator! (${LLVM_INTEGRATED_CRT_ALLOC}). Currently, rpmalloc, snmalloc and mimalloc are supported.")
|
|
endif()
|
|
|
|
if(LLVM_INTEGRATED_CRT_ALLOC MATCHES "rpmalloc$")
|
|
add_definitions(-DENABLE_OVERRIDE -DENABLE_PRELOAD)
|
|
set(ALLOCATOR_FILES "${LLVM_INTEGRATED_CRT_ALLOC}/rpmalloc/rpmalloc.c")
|
|
elseif(LLVM_INTEGRATED_CRT_ALLOC MATCHES "snmalloc$")
|
|
set(ALLOCATOR_FILES "${LLVM_INTEGRATED_CRT_ALLOC}/src/override/malloc.cc" "${LLVM_INTEGRATED_CRT_ALLOC}/src/override/new.cc")
|
|
set(system_libs ${system_libs} "mincore.lib" "-INCLUDE:malloc")
|
|
elseif(LLVM_INTEGRATED_CRT_ALLOC MATCHES "mimalloc$")
|
|
set(MIMALLOC_LIB "${LLVM_INTEGRATED_CRT_ALLOC}/out/msvc-x64/Release/mimalloc-static.lib")
|
|
if(NOT EXISTS "${MIMALLOC_LIB}")
|
|
message(FATAL_ERROR "Cannot find the mimalloc static library. To build it, first apply the patch from https://github.com/microsoft/mimalloc/issues/268 then build the Release x64 target through ${LLVM_INTEGRATED_CRT_ALLOC}\\ide\\vs2019\\mimalloc.sln")
|
|
endif()
|
|
set(system_libs ${system_libs} "${MIMALLOC_LIB}" "-INCLUDE:malloc")
|
|
endif()
|
|
endif()
|
|
|
|
add_llvm_component_library(LLVMSupport
|
|
AArch64TargetParser.cpp
|
|
ABIBreak.cpp
|
|
ARMTargetParser.cpp
|
|
AMDGPUMetadata.cpp
|
|
APFixedPoint.cpp
|
|
APFloat.cpp
|
|
APInt.cpp
|
|
APSInt.cpp
|
|
ARMBuildAttrs.cpp
|
|
ARMAttributeParser.cpp
|
|
ARMWinEH.cpp
|
|
Allocator.cpp
|
|
BinaryStreamError.cpp
|
|
BinaryStreamReader.cpp
|
|
BinaryStreamRef.cpp
|
|
BinaryStreamWriter.cpp
|
|
BlockFrequency.cpp
|
|
BranchProbability.cpp
|
|
BuryPointer.cpp
|
|
CachePruning.cpp
|
|
circular_raw_ostream.cpp
|
|
Chrono.cpp
|
|
COM.cpp
|
|
CodeGenCoverage.cpp
|
|
CommandLine.cpp
|
|
Compression.cpp
|
|
CRC.cpp
|
|
ConvertUTF.cpp
|
|
ConvertUTFWrapper.cpp
|
|
CrashRecoveryContext.cpp
|
|
DataExtractor.cpp
|
|
Debug.cpp
|
|
DebugCounter.cpp
|
|
DeltaAlgorithm.cpp
|
|
DAGDeltaAlgorithm.cpp
|
|
DJB.cpp
|
|
ELFAttributeParser.cpp
|
|
ELFAttributes.cpp
|
|
Error.cpp
|
|
ErrorHandling.cpp
|
|
ExtensibleRTTI.cpp
|
|
FileCollector.cpp
|
|
FileUtilities.cpp
|
|
FileOutputBuffer.cpp
|
|
FoldingSet.cpp
|
|
FormattedStream.cpp
|
|
FormatVariadic.cpp
|
|
GlobPattern.cpp
|
|
GraphWriter.cpp
|
|
Hashing.cpp
|
|
InitLLVM.cpp
|
|
InstructionCost.cpp
|
|
IntEqClasses.cpp
|
|
IntervalMap.cpp
|
|
ItaniumManglingCanonicalizer.cpp
|
|
JSON.cpp
|
|
KnownBits.cpp
|
|
LEB128.cpp
|
|
LineIterator.cpp
|
|
Locale.cpp
|
|
LockFileManager.cpp
|
|
LowLevelType.cpp
|
|
ManagedStatic.cpp
|
|
MathExtras.cpp
|
|
MemAlloc.cpp
|
|
MemoryBuffer.cpp
|
|
MemoryBufferRef.cpp
|
|
MD5.cpp
|
|
NativeFormatting.cpp
|
|
OptimizedStructLayout.cpp
|
|
Optional.cpp
|
|
Parallel.cpp
|
|
PluginLoader.cpp
|
|
PrettyStackTrace.cpp
|
|
RandomNumberGenerator.cpp
|
|
Regex.cpp
|
|
RISCVAttributes.cpp
|
|
RISCVAttributeParser.cpp
|
|
ScaledNumber.cpp
|
|
ScopedPrinter.cpp
|
|
SHA1.cpp
|
|
Signposts.cpp
|
|
SmallPtrSet.cpp
|
|
SmallVector.cpp
|
|
SourceMgr.cpp
|
|
SpecialCaseList.cpp
|
|
Statistic.cpp
|
|
StringExtras.cpp
|
|
StringMap.cpp
|
|
StringSaver.cpp
|
|
StringRef.cpp
|
|
SuffixTree.cpp
|
|
SymbolRemappingReader.cpp
|
|
SystemUtils.cpp
|
|
TarWriter.cpp
|
|
TargetParser.cpp
|
|
ThreadPool.cpp
|
|
TimeProfiler.cpp
|
|
Timer.cpp
|
|
ToolOutputFile.cpp
|
|
TrigramIndex.cpp
|
|
Triple.cpp
|
|
Twine.cpp
|
|
Unicode.cpp
|
|
UnicodeCaseFold.cpp
|
|
VersionTuple.cpp
|
|
VirtualFileSystem.cpp
|
|
WithColor.cpp
|
|
X86TargetParser.cpp
|
|
YAMLParser.cpp
|
|
YAMLTraits.cpp
|
|
raw_os_ostream.cpp
|
|
raw_ostream.cpp
|
|
regcomp.c
|
|
regerror.c
|
|
regexec.c
|
|
regfree.c
|
|
regstrlcpy.c
|
|
xxhash.cpp
|
|
Z3Solver.cpp
|
|
|
|
${ALLOCATOR_FILES}
|
|
|
|
# System
|
|
Atomic.cpp
|
|
DynamicLibrary.cpp
|
|
Errno.cpp
|
|
Host.cpp
|
|
Memory.cpp
|
|
Path.cpp
|
|
Process.cpp
|
|
Program.cpp
|
|
RWMutex.cpp
|
|
Signals.cpp
|
|
TargetRegistry.cpp
|
|
ThreadLocal.cpp
|
|
Threading.cpp
|
|
Valgrind.cpp
|
|
Watchdog.cpp
|
|
|
|
ADDITIONAL_HEADER_DIRS
|
|
Unix
|
|
Windows
|
|
${LLVM_MAIN_INCLUDE_DIR}/llvm/ADT
|
|
${LLVM_MAIN_INCLUDE_DIR}/llvm/Support
|
|
${Backtrace_INCLUDE_DIRS}
|
|
|
|
LINK_LIBS
|
|
${system_libs} ${imported_libs} ${delayload_flags}
|
|
|
|
LINK_COMPONENTS
|
|
Demangle
|
|
)
|
|
|
|
set(llvm_system_libs ${system_libs})
|
|
|
|
# This block is only needed for llvm-config. When we deprecate llvm-config and
|
|
# move to using CMake export, this block can be removed.
|
|
if(LLVM_ENABLE_ZLIB)
|
|
# CMAKE_BUILD_TYPE is only meaningful to single-configuration generators.
|
|
if(CMAKE_BUILD_TYPE)
|
|
string(TOUPPER ${CMAKE_BUILD_TYPE} build_type)
|
|
get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION_${build_type})
|
|
endif()
|
|
if(NOT zlib_library)
|
|
get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION)
|
|
endif()
|
|
get_library_name(${zlib_library} zlib_library)
|
|
set(llvm_system_libs ${llvm_system_libs} "${zlib_library}")
|
|
endif()
|
|
|
|
if(LLVM_ENABLE_TERMINFO)
|
|
get_library_name(${TERMINFO_LIB} terminfo_library)
|
|
set(llvm_system_libs ${llvm_system_libs} "${terminfo_library}")
|
|
endif()
|
|
|
|
set_property(TARGET LLVMSupport PROPERTY LLVM_SYSTEM_LIBS "${llvm_system_libs}")
|
|
|
|
|
|
if(LLVM_INTEGRATED_CRT_ALLOC)
|
|
if(LLVM_INTEGRATED_CRT_ALLOC MATCHES "snmalloc$")
|
|
set_property(TARGET LLVMSupport PROPERTY CXX_STANDARD 17)
|
|
add_definitions(-D_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING)
|
|
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND
|
|
"${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86_64")
|
|
set_property(TARGET LLVMSupport PROPERTY COMPILE_FLAGS "-mcx16")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
if(LLVM_WITH_Z3)
|
|
target_include_directories(LLVMSupport SYSTEM
|
|
PRIVATE
|
|
${Z3_INCLUDE_DIR}
|
|
)
|
|
endif()
|