mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-05-07 12:16:24 +00:00

LLVM, by default, disables the use of C++'s built-in Run-Time Type Information. This decision is primarily driven by concerns about code size and efficiency. But '-fsanitize=vptr' not allowed with '-fno-rtti'.
104 lines
3.2 KiB
CMake
104 lines
3.2 KiB
CMake
# Copyright (C) 2019 Intel Corporation. All rights reserved.
|
|
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
cmake_minimum_required(VERSION 3.14)
|
|
|
|
project(wamr_fuzzing LANGUAGES ASM C CXX)
|
|
|
|
include(CMakePrintHelpers)
|
|
|
|
# Ensure Clang is used as the compiler
|
|
if(NOT CMAKE_C_COMPILER_ID STREQUAL "Clang"
|
|
OR NOT CMAKE_ASM_COMPILER_ID STREQUAL "Clang")
|
|
message(FATAL_ERROR "Please use Clang as the C compiler for libFuzzer compatibility.")
|
|
endif()
|
|
|
|
#
|
|
# Global settings
|
|
#
|
|
set(CMAKE_BUILD_TYPE Debug)
|
|
set(CMAKE_C_STANDARD 11)
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
|
|
string(TOLOWER ${CMAKE_HOST_SYSTEM_NAME} WAMR_BUILD_PLATFORM)
|
|
|
|
# Reset default linker flags
|
|
set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
|
|
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
|
|
|
|
# Check if the compiler supports the sanitizer flags
|
|
include(CheckCXXCompilerFlag)
|
|
check_cxx_compiler_flag("-fsanitize=address" HAS_ADDRESS_SANITIZER)
|
|
check_cxx_compiler_flag("-fsanitize=memory" HAS_MEMORY_SANITIZER)
|
|
check_cxx_compiler_flag("-fsanitize=undefined" HAS_UNDEFINED_SANITIZER)
|
|
|
|
# Determine WAMR_BUILD_TARGET based on system properties
|
|
if(NOT DEFINED WAMR_BUILD_TARGET)
|
|
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm64|aarch64)")
|
|
set(WAMR_BUILD_TARGET "AARCH64")
|
|
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64")
|
|
set(WAMR_BUILD_TARGET "RISCV64")
|
|
elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
|
set(WAMR_BUILD_TARGET "X86_64")
|
|
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
|
|
set(WAMR_BUILD_TARGET "X86_32")
|
|
else()
|
|
message(SEND_ERROR "Unsupported build target platform!")
|
|
endif()
|
|
endif()
|
|
|
|
if(APPLE)
|
|
add_definitions(-DBH_PLATFORM_DARWIN)
|
|
endif()
|
|
|
|
# Disable hardware bound check and enable AOT validator
|
|
set(WAMR_DISABLE_HW_BOUND_CHECK 1)
|
|
set(WAMR_BUILD_AOT_VALIDATOR 1)
|
|
|
|
set(REPO_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../../..)
|
|
message(STATUS "REPO_ROOT_DIR: ${REPO_ROOT_DIR}")
|
|
|
|
# Use LLVM_DIR from command line if defined
|
|
# LLVM_DIR should be something like /path/to/llvm/build/lib/cmake/llvm
|
|
if(DEFINED LLVM_DIR)
|
|
set(LLVM_DIR $ENV{LLVM_DIR})
|
|
else()
|
|
set(LLVM_SRC_ROOT ${REPO_ROOT_DIR}/core/deps/llvm)
|
|
set(LLVM_BUILD_ROOT ${LLVM_SRC_ROOT}/build)
|
|
set(LLVM_DIR ${LLVM_BUILD_ROOT}/lib/cmake/llvm)
|
|
endif()
|
|
|
|
# if LLVM_DIR is an existing directory, use it
|
|
if(NOT EXISTS ${LLVM_DIR})
|
|
message(FATAL_ERROR "LLVM_DIR not found: ${LLVM_DIR}")
|
|
endif()
|
|
|
|
find_package(LLVM REQUIRED CONFIG)
|
|
|
|
message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
|
|
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")
|
|
|
|
include_directories(${LLVM_INCLUDE_DIRS})
|
|
separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS})
|
|
add_definitions(${LLVM_DEFINITIONS_LIST})
|
|
|
|
set(SHARED_DIR ${REPO_ROOT_DIR}/core/shared)
|
|
set(IWASM_DIR ${REPO_ROOT_DIR}/core/iwasm)
|
|
|
|
# Global setting
|
|
add_compile_options(-Wno-unused-command-line-argument)
|
|
|
|
# Enable fuzzer
|
|
add_definitions(-DWASM_ENABLE_FUZZ_TEST=1)
|
|
# '-fsanitize=vptr' not allowed with '-fno-rtti
|
|
# But, LLVM by default, disables the use of `rtti` in the compiler
|
|
add_compile_options(-fsanitize=fuzzer -fno-sanitize=vptr)
|
|
add_link_options(-fsanitize=fuzzer -fno-sanitize=vptr)
|
|
|
|
# Enable sanitizers if not in oss-fuzz environment
|
|
set(CFLAGS_ENV $ENV{CFLAGS})
|
|
string(FIND "${CFLAGS_ENV}" "-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION" IN_OSS_FUZZ)
|
|
|
|
add_subdirectory(aot-compiler)
|
|
add_subdirectory(wasm-mutator)
|