CMakeLists.txt 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. # Copyright (C) 2019 Intel Corporation. All rights reserved.
  2. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  3. cmake_minimum_required(VERSION 3.14)
  4. project(wamr_fuzzing LANGUAGES ASM C CXX)
  5. include(CMakePrintHelpers)
  6. # Ensure Clang is used as the compiler
  7. if(NOT CMAKE_C_COMPILER_ID STREQUAL "Clang"
  8. OR NOT CMAKE_ASM_COMPILER_ID STREQUAL "Clang")
  9. message(FATAL_ERROR "Please use Clang as the C compiler for libFuzzer compatibility.")
  10. endif()
  11. #
  12. # Global settings
  13. #
  14. set(CMAKE_BUILD_TYPE Debug)
  15. set(CMAKE_C_STANDARD 11)
  16. set(CMAKE_CXX_STANDARD 17)
  17. string(TOLOWER ${CMAKE_HOST_SYSTEM_NAME} WAMR_BUILD_PLATFORM)
  18. # Reset default linker flags
  19. set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
  20. set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
  21. # Check if the compiler supports the sanitizer flags
  22. include(CheckCXXCompilerFlag)
  23. check_cxx_compiler_flag("-fsanitize=address" HAS_ADDRESS_SANITIZER)
  24. check_cxx_compiler_flag("-fsanitize=memory" HAS_MEMORY_SANITIZER)
  25. check_cxx_compiler_flag("-fsanitize=undefined" HAS_UNDEFINED_SANITIZER)
  26. # Determine WAMR_BUILD_TARGET based on system properties
  27. if(NOT DEFINED WAMR_BUILD_TARGET)
  28. if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm64|aarch64)")
  29. set(WAMR_BUILD_TARGET "AARCH64")
  30. elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64")
  31. set(WAMR_BUILD_TARGET "RISCV64")
  32. elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
  33. set(WAMR_BUILD_TARGET "X86_64")
  34. elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
  35. set(WAMR_BUILD_TARGET "X86_32")
  36. else()
  37. message(SEND_ERROR "Unsupported build target platform!")
  38. endif()
  39. endif()
  40. if(APPLE)
  41. add_definitions(-DBH_PLATFORM_DARWIN)
  42. endif()
  43. # Disable hardware bound check and enable AOT validator
  44. set(WAMR_DISABLE_HW_BOUND_CHECK 1)
  45. set(WAMR_BUILD_AOT_VALIDATOR 1)
  46. set(REPO_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../../..)
  47. message(STATUS "REPO_ROOT_DIR: ${REPO_ROOT_DIR}")
  48. # Use LLVM_DIR from command line if defined
  49. # LLVM_DIR should be something like /path/to/llvm/build/lib/cmake/llvm
  50. if(DEFINED LLVM_DIR)
  51. set(LLVM_DIR $ENV{LLVM_DIR})
  52. else()
  53. set(LLVM_SRC_ROOT ${REPO_ROOT_DIR}/core/deps/llvm)
  54. set(LLVM_BUILD_ROOT ${LLVM_SRC_ROOT}/build)
  55. set(LLVM_DIR ${LLVM_BUILD_ROOT}/lib/cmake/llvm)
  56. endif()
  57. # if LLVM_DIR is an existing directory, use it
  58. if(NOT EXISTS ${LLVM_DIR})
  59. message(FATAL_ERROR "LLVM_DIR not found: ${LLVM_DIR}")
  60. endif()
  61. find_package(LLVM REQUIRED CONFIG)
  62. message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
  63. message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")
  64. include_directories(${LLVM_INCLUDE_DIRS})
  65. separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS})
  66. add_definitions(${LLVM_DEFINITIONS_LIST})
  67. list(
  68. APPEND
  69. REQUIRED_LLVM_LIBS
  70. LLVMDemangle
  71. LLVMSupport
  72. LLVMTableGen
  73. LLVMTableGenGlobalISel
  74. LLVMCore
  75. LLVMFuzzerCLI
  76. LLVMFuzzMutate
  77. LLVMFileCheck
  78. LLVMInterfaceStub
  79. LLVMIRReader
  80. LLVMCodeGen
  81. LLVMSelectionDAG
  82. LLVMAsmPrinter
  83. LLVMMIRParser
  84. LLVMGlobalISel
  85. LLVMBinaryFormat
  86. LLVMBitReader
  87. LLVMBitWriter
  88. LLVMBitstreamReader
  89. LLVMDWARFLinker
  90. LLVMExtensions
  91. LLVMFrontendOpenACC
  92. LLVMFrontendOpenMP
  93. LLVMTransformUtils
  94. LLVMInstrumentation
  95. LLVMAggressiveInstCombine
  96. LLVMInstCombine
  97. LLVMScalarOpts
  98. LLVMipo
  99. LLVMVectorize
  100. LLVMObjCARCOpts
  101. LLVMCoroutines
  102. LLVMCFGuard
  103. LLVMLinker
  104. LLVMAnalysis
  105. LLVMLTO
  106. LLVMMC
  107. LLVMMCParser
  108. LLVMMCDisassembler
  109. LLVMMCA
  110. LLVMObjCopy
  111. LLVMObject
  112. LLVMObjectYAML
  113. LLVMOption
  114. LLVMRemarks
  115. LLVMDebuginfod
  116. LLVMDebugInfoDWARF
  117. LLVMDebugInfoGSYM
  118. LLVMDebugInfoMSF
  119. LLVMDebugInfoCodeView
  120. LLVMDebugInfoPDB
  121. LLVMSymbolize
  122. LLVMDWP
  123. LLVMExecutionEngine
  124. LLVMInterpreter
  125. LLVMJITLink
  126. LLVMMCJIT
  127. LLVMOrcJIT
  128. LLVMOrcShared
  129. LLVMOrcTargetProcess
  130. LLVMRuntimeDyld
  131. LLVMTarget
  132. LLVMX86CodeGen
  133. LLVMX86AsmParser
  134. LLVMX86Disassembler
  135. LLVMX86TargetMCA
  136. LLVMX86Desc
  137. LLVMX86Info
  138. LLVMAsmParser
  139. LLVMLineEditor
  140. LLVMProfileData
  141. LLVMCoverage
  142. LLVMPasses
  143. LLVMTextAPI
  144. LLVMDlltoolDriver
  145. LLVMLibDriver
  146. LLVMXRay
  147. LLVMWindowsDriver
  148. LLVMWindowsManifest
  149. )
  150. set(SHARED_DIR ${REPO_ROOT_DIR}/core/shared)
  151. set(IWASM_DIR ${REPO_ROOT_DIR}/core/iwasm)
  152. # Global setting
  153. add_compile_options(-Wno-unused-command-line-argument)
  154. # Enable fuzzer
  155. add_definitions(-DWASM_ENABLE_FUZZ_TEST=1)
  156. # '-fsanitize=vptr' not allowed with '-fno-rtti
  157. # But, LLVM by default, disables the use of `rtti` in the compiler
  158. add_compile_options(-fsanitize=fuzzer -fno-sanitize=vptr)
  159. add_link_options(-fsanitize=fuzzer -fno-sanitize=vptr)
  160. # Enable sanitizers if not in oss-fuzz environment
  161. set(CFLAGS_ENV $ENV{CFLAGS})
  162. string(FIND "${CFLAGS_ENV}" "-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION" FUZZ_POS)
  163. if (FUZZ_POS GREATER -1)
  164. set(IN_OSS_FUZZ 1)
  165. else()
  166. set(IN_OSS_FUZZ 0)
  167. endif()
  168. add_subdirectory(aot-compiler)
  169. add_subdirectory(wasm-mutator)