summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSrujan Vandrangi <srujan.vandrangi@ittiam.com>2023-05-25 10:33:34 +0530
committerHarish Mahendrakar <harish.mahendrakar@ittiam.com>2023-05-25 19:05:30 +0530
commitd84f0f4abceadbc318dfdc414f7be6597fa0ad9e (patch)
tree383e3131773a0644d4beb08db2da41071b001691
parentdfce659c5712046a171147324ff151474f7fe288 (diff)
downloadlibmpeg2-d84f0f4abceadbc318dfdc414f7be6597fa0ad9e.tar.gz
add mpeg2_dec_fuzzer build target
Test: Build
-rw-r--r--CMakeLists.txt15
-rw-r--r--cmake/utils.cmake114
2 files changed, 128 insertions, 1 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9ef4a43..9c810a6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,8 +1,14 @@
-cmake_minimum_required(VERSION 3.5)
+cmake_minimum_required(VERSION 3.9.1)
+project(libmpeg2 C CXX)
+enable_language(ASM)
set(MPEG2_ROOT "${CMAKE_CURRENT_SOURCE_DIR}")
set(MPEG2_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}")
+set(CMAKE_C_COMPILER clang)
+set(CMAKE_CXX_COMPILER clang++)
+set(CMAKE_BUILD_TYPE Debug)
+
if("${MPEG2_ROOT}" STREQUAL "${MPEG2_CONFIG_DIR}")
message(
FATAL_ERROR
@@ -93,3 +99,10 @@ add_executable(mpeg2dec ${MPEG2DEC_SRCS})
set_target_properties(mpeg2dec
PROPERTIES COMPILE_FLAGS "-DMD5_DISABLE -DPROFILE_ENABLE")
target_link_libraries(mpeg2dec libmpeg2dec Threads::Threads)
+
+include("${MPEG2_ROOT}/cmake/utils.cmake")
+libmpeg2_add_compile_options()
+libmpeg2_add_definitions()
+libmpeg2_set_link_libraries()
+
+libmpeg2_add_fuzzer(mpeg2_dec_fuzzer libmpeg2dec SOURCES ${MPEG2_ROOT}/fuzzer/mpeg2_dec_fuzzer.cpp) \ No newline at end of file
diff --git a/cmake/utils.cmake b/cmake/utils.cmake
new file mode 100644
index 0000000..559ebe6
--- /dev/null
+++ b/cmake/utils.cmake
@@ -0,0 +1,114 @@
+include(CheckCXXCompilerFlag)
+
+# Adds compiler options for all targets
+function(libmpeg2_add_compile_options)
+ if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
+ add_compile_options(-march=armv8-a)
+ elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch32")
+ add_compile_options(-march=armv7-a -mfpu=neon)
+ else()
+ add_compile_options(-msse4.2 -mno-avx)
+ endif()
+
+ set(CMAKE_REQUIRED_FLAGS -fsanitize=fuzzer-no-link)
+ check_cxx_compiler_flag(-fsanitize=fuzzer-no-link
+ COMPILER_HAS_SANITIZE_FUZZER)
+ unset(CMAKE_REQUIRED_FLAGS)
+
+ if(DEFINED SANITIZE)
+ set(CMAKE_REQUIRED_FLAGS -fsanitize=${SANITIZE})
+ check_cxx_compiler_flag(-fsanitize=${SANITIZE} COMPILER_HAS_SANITIZER)
+ unset(CMAKE_REQUIRED_FLAGS)
+
+ if(NOT COMPILER_HAS_SANITIZER)
+ message(
+ FATAL_ERROR "ERROR: Compiler doesn't support -fsanitize=${SANITIZE}")
+ return()
+ endif()
+ add_compile_options(-fno-omit-frame-pointer -fsanitize=${SANITIZE})
+ endif()
+
+endfunction()
+
+# Adds defintions for all targets
+function(libmpeg2_add_definitions)
+ if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
+ add_definitions(-DARMV8 -DDEFAULT_ARCH=D_ARCH_ARMV8_GENERIC -DENABLE_NEON)
+ elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch32")
+ add_definitions(-DARMV7 -DDEFAULT_ARCH=D_ARCH_ARM_A9Q -DENABLE_NEON
+ -DDISABLE_NEONINTR)
+ else()
+ add_definitions(-DX86 -DX86_LINUX=1 -DDISABLE_AVX2
+ -DDEFAULT_ARCH=D_ARCH_X86_SSE42)
+ endif()
+endfunction()
+
+# Adds libraries needed for executables
+function(libmpeg2_set_link_libraries)
+ link_libraries(Threads::Threads m)
+endfunction()
+
+# cmake-format: off
+# Adds a target for an executable
+#
+# Arguments:
+# NAME: Name of the executatble
+# LIB: Library that executable depends on
+# SOURCES: Source files
+#
+# Optional Arguments:
+# INCLUDES: Include paths
+# LIBS: Additional libraries
+# FUZZER: flag to specify if the target is a fuzzer binary
+# cmake-format: on
+
+function(libmpeg2_add_executable NAME LIB)
+ set(multi_value_args SOURCES INCLUDES LIBS)
+ set(optional_args FUZZER)
+ cmake_parse_arguments(ARG "${optional_args}" "${single_value_args}"
+ "${multi_value_args}" ${ARGN})
+
+ # Check if compiler supports -fsanitize=fuzzer. If not, skip building fuzzer
+ # binary
+ if(ARG_FUZZER)
+ if(NOT COMPILER_HAS_SANITIZE_FUZZER)
+ message("Compiler doesn't support -fsanitize=fuzzer. Skipping ${NAME}")
+ return()
+ endif()
+ endif()
+
+ add_executable(${NAME} ${ARG_SOURCES})
+ target_include_directories(${NAME} PRIVATE ${ARG_INCLUDES})
+ add_dependencies(${NAME} ${LIB} ${ARG_LIBS})
+
+ target_link_libraries(${NAME} ${LIB} ${ARG_LIBS})
+ if(ARG_FUZZER)
+ target_compile_options(${NAME}
+ PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-std=c++17>)
+ if(DEFINED ENV{LIB_FUZZING_ENGINE})
+ set_target_properties(${NAME} PROPERTIES LINK_FLAGS
+ $ENV{LIB_FUZZING_ENGINE})
+ elseif(DEFINED SANITIZE)
+ set_target_properties(${NAME} PROPERTIES LINK_FLAGS
+ -fsanitize=fuzzer,${SANITIZE})
+ else()
+ set_target_properties(${NAME} PROPERTIES LINK_FLAGS -fsanitize=fuzzer)
+ endif()
+ else()
+ if(DEFINED SANITIZE)
+ set_target_properties(${NAME} PROPERTIES LINK_FLAGS
+ -fsanitize=${SANITIZE})
+ endif()
+ endif()
+endfunction()
+
+# cmake-format: off
+# Adds a target for a fuzzer binary
+# Calls libhevc_add_executable with all arguments with FUZZER set to 1
+# Arguments:
+# Refer to libhevc_add_executable's arguments
+# cmake-format: on
+
+function(libmpeg2_add_fuzzer NAME LIB)
+ libmpeg2_add_executable(${NAME} ${LIB} FUZZER 1 ${ARGV})
+endfunction()