Skip to content

Commit 7d34eb8

Browse files
tqchenjunrushao
andcommitted
[REFACTOR] Introduce and modernize FFI system (apache#17920)
This PR modernizes the FFI foundation of the project and introduce a new minimal and lightweight module [tvm ffi](https://github.com/apache/tvm/tree/refactor-s3/ffi) based on our lessons in the past few years. It implements a modern version of the [Unified Packed and Object RFC](https://github.com/apache/tvm-rfcs/blob/main/rfcs/0097-unify-packed-and-object.md) that unifies the packed function call and object systems. Summary of the change: - A dedicated clean Any/AnyView that can store strong and weak references of items - Function(previously PackedFunc) system built on top of the Any/AnyView - A minimal C API that backs the overall calls. We are stabilizing the API with a goal to bring clean, stable FFI conventions for both compiled and registered code - A rewrite of core python binding and generated code based on the module - Update existing code and test cases to the new module - Latest dlpack support The new module brings many benefits thanks to the cleaner design, to name a few: - Any can support both POD types(int) and object types. - Containers (e.g. Array) can now also contain Any value, e.g. now `Array<int>` is supported, no need for boxed types - Error handling now upgrades to object-based, allowing cleaner traceback across languages - Map now preserves insertion orders - Path toward isolated stabilize minimum core ABI/API foundation module - Type traits based design that cleanly defines how values interact with Any system - Automatic conversion of different types based on traits if needed Because FFI upgrade is at heart of the project, the change touches every component of the system. Importantly, this is an upgrade of the ABI so the change is not backward compatible. The code compiled under the old FFI won't work under the new one. We did provide example ABI translation (e.g. LegacyTVMArgValueToFFIAny) functions for compatibility. The PR tries to leave files in their old places while creating redirections. The goal is to have the first milestone landed and infrastructure in place, so we can do further refactors to complete features and cleanup legacy code as trackable PRs. As of now, python binding and compiled code are under the new convention while RPC and some other bindings still relies on legacy ABI translation. We will work on upgrades in the coming PRs, including areas such as reflection, phasing out legacy redirections etc. Co-authored-by: Junru Shao <[email protected]>
0 parents  commit 7d34eb8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+15328
-0
lines changed

3rdparty/dlpack

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Subproject commit 3ea601bb413074c49a77c4ce3218bc08f8c4703c

CMakeLists.txt

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
# Licensed to the Apache Software Foundation (ASF) under one
2+
# or more contributor license agreements. See the NOTICE file
3+
# distributed with this work for additional information
4+
# regarding copyright ownership. The ASF licenses this file
5+
# to you under the Apache License, Version 2.0 (the
6+
# "License"); you may not use this file except in compliance
7+
# with the License. You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing,
12+
# software distributed under the License is distributed on an
13+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
# KIND, either express or implied. See the License for the
15+
# specific language governing permissions and limitations
16+
# under the License.
17+
18+
cmake_minimum_required(VERSION 3.14)
19+
20+
project(
21+
tvm_ffi
22+
VERSION 1.0
23+
DESCRIPTION "TVM's FFI system"
24+
LANGUAGES CXX C
25+
)
26+
27+
option(TVM_FFI_BUILD_TESTS "Adding test targets." OFF)
28+
29+
########## NOTE: all options below are related to dynamic registry #####
30+
option(TVM_FFI_BUILD_REGISTRY
31+
"Support for objects with non-static type indices. When turned on, \
32+
targets linked against `tvm_ffi` will allow objects that comes with non-pre-defined type indices, \
33+
as well as getting full stacktrace during debugging. \
34+
so that the object hierarchy could expand without limitation. \
35+
This will require the downstream targets to link against target `tvm_ffi` to be effective."
36+
OFF
37+
)
38+
option(TVM_FFI_USE_LIBBACKTRACE "Enable libbacktrace" ON)
39+
option(TVM_FFI_BACKTRACE_ON_SEGFAULT "Set signal handler to print traceback on segfault" ON)
40+
41+
include(cmake/Utils/CxxWarning.cmake)
42+
include(cmake/Utils/Sanitizer.cmake)
43+
include(cmake/Utils/Library.cmake)
44+
if (TVM_FFI_USE_LIBBACKTRACE)
45+
include(cmake/Utils/AddLibbacktrace.cmake)
46+
endif()
47+
48+
########## Target: `dlpack_header` ##########
49+
50+
add_library(dlpack_header INTERFACE)
51+
target_include_directories(dlpack_header INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/dlpack/include")
52+
53+
########## Target: `tvm_ffi_header` ##########
54+
55+
add_library(tvm_ffi_header INTERFACE)
56+
target_include_directories(tvm_ffi_header INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include")
57+
target_link_libraries(tvm_ffi_header INTERFACE dlpack_header)
58+
59+
########## Target: `tvm_ffi` ##########
60+
add_library(tvm_ffi_objs OBJECT
61+
"${CMAKE_CURRENT_SOURCE_DIR}/src/ffi/traceback.cc"
62+
"${CMAKE_CURRENT_SOURCE_DIR}/src/ffi/traceback_win.cc"
63+
"${CMAKE_CURRENT_SOURCE_DIR}/src/ffi/object.cc"
64+
"${CMAKE_CURRENT_SOURCE_DIR}/src/ffi/error.cc"
65+
"${CMAKE_CURRENT_SOURCE_DIR}/src/ffi/function.cc"
66+
"${CMAKE_CURRENT_SOURCE_DIR}/src/ffi/ndarray.cc"
67+
"${CMAKE_CURRENT_SOURCE_DIR}/src/ffi/dtype.cc"
68+
"${CMAKE_CURRENT_SOURCE_DIR}/src/ffi/testing.cc"
69+
"${CMAKE_CURRENT_SOURCE_DIR}/src/ffi/container.cc"
70+
)
71+
set_target_properties(
72+
tvm_ffi_objs PROPERTIES
73+
POSITION_INDEPENDENT_CODE ON
74+
CXX_STANDARD 17
75+
CXX_EXTENSIONS OFF
76+
CXX_STANDARD_REQUIRED ON
77+
CXX_VISIBILITY_PRESET hidden
78+
VISIBILITY_INLINES_HIDDEN ON
79+
PREFIX "lib"
80+
)
81+
add_cxx_warning(tvm_ffi_objs)
82+
target_link_libraries(tvm_ffi_objs PRIVATE dlpack_header)
83+
target_include_directories(tvm_ffi_objs PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include")
84+
85+
if (TVM_FFI_USE_LIBBACKTRACE)
86+
message(STATUS "Setting C++ macro TVM_FFI_USE_LIBBACKTRACE - 1")
87+
target_compile_definitions(tvm_ffi_objs PRIVATE TVM_FFI_USE_LIBBACKTRACE=1)
88+
else()
89+
message(STATUS "Setting C++ macro TVM_FFI_USE_LIBBACKTRACE - 0")
90+
target_compile_definitions(tvm_ffi_objs PRIVATE TVM_FFI_USE_LIBBACKTRACE=0)
91+
endif()
92+
93+
if (TVM_FFI_BACKTRACE_ON_SEGFAULT)
94+
message(STATUS "Setting C++ macro TVM_FFI_BACKTRACE_ON_SEGFAULT - 1")
95+
target_compile_definitions(tvm_ffi_objs PRIVATE TVM_FFI_BACKTRACE_ON_SEGFAULT=1)
96+
else()
97+
message(STATUS "Setting C++ macro TVM_FFI_BACKTRACE_ON_SEGFAULT - 0")
98+
target_compile_definitions(tvm_ffi_objs PRIVATE TVM_FFI_BACKTRACE_ON_SEGFAULT=0)
99+
endif()
100+
101+
add_target_from_obj(tvm_ffi tvm_ffi_objs)
102+
103+
if (TARGET libbacktrace)
104+
target_link_libraries(tvm_ffi_objs PRIVATE libbacktrace)
105+
target_link_libraries(tvm_ffi_shared PRIVATE libbacktrace)
106+
target_link_libraries(tvm_ffi_static PRIVATE libbacktrace)
107+
endif ()
108+
109+
if (MSVC)
110+
target_link_libraries(tvm_ffi_objs PRIVATE DbgHelp.lib)
111+
target_link_libraries(tvm_ffi_shared PRIVATE DbgHelp.lib)
112+
target_link_libraries(tvm_ffi_static PRIVATE DbgHelp.lib)
113+
endif ()
114+
115+
target_link_libraries(tvm_ffi_objs PUBLIC tvm_ffi_header)
116+
target_link_libraries(tvm_ffi_shared PUBLIC tvm_ffi_header)
117+
target_link_libraries(tvm_ffi_static PUBLIC tvm_ffi_header)
118+
119+
install(TARGETS tvm_ffi_static DESTINATION lib${LIB_SUFFIX})
120+
install(TARGETS tvm_ffi_shared DESTINATION lib${LIB_SUFFIX})
121+
122+
add_msvc_flags(tvm_ffi_objs)
123+
124+
########## Adding tests ##########
125+
126+
if (${PROJECT_NAME} STREQUAL ${CMAKE_PROJECT_NAME})
127+
if (TVM_FFI_BUILD_TESTS)
128+
enable_testing()
129+
message(STATUS "Enable Testing")
130+
include(cmake/Utils/AddGoogleTest.cmake)
131+
add_subdirectory(tests/cpp/)
132+
endif()
133+
endif ()

cmake/Utils/AddGoogleTest.cmake

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# Licensed to the Apache Software Foundation (ASF) under one
2+
# or more contributor license agreements. See the NOTICE file
3+
# distributed with this work for additional information
4+
# regarding copyright ownership. The ASF licenses this file
5+
# to you under the Apache License, Version 2.0 (the
6+
# "License"); you may not use this file except in compliance
7+
# with the License. You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing,
12+
# software distributed under the License is distributed on an
13+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
# KIND, either express or implied. See the License for the
15+
# specific language governing permissions and limitations
16+
# under the License.
17+
18+
include(FetchContent)
19+
set(gtest_force_shared_crt ON CACHE BOOL "Always use msvcrt.dll" FORCE)
20+
set(BUILD_GMOCK ON CACHE BOOL "" FORCE)
21+
set(BUILD_GTEST ON CACHE BOOL "" FORCE)
22+
FetchContent_Declare(
23+
googletest
24+
GIT_REPOSITORY https://github.com/google/googletest.git
25+
GIT_TAG v1.14.0
26+
)
27+
FetchContent_GetProperties(googletest)
28+
if (NOT googletest_POPULATED)
29+
FetchContent_Populate(googletest)
30+
message(STATUS "Found googletest_SOURCE_DIR - ${googletest_SOURCE_DIR}")
31+
message(STATUS "Found googletest_BINARY_DIR - ${googletest_BINARY_DIR}")
32+
add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR})
33+
include(GoogleTest)
34+
set_target_properties(gtest PROPERTIES EXPORT_COMPILE_COMMANDS OFF EXCLUDE_FROM_ALL ON FOLDER 3rdparty)
35+
set_target_properties(gtest_main PROPERTIES EXPORT_COMPILE_COMMANDS OFF EXCLUDE_FROM_ALL ON FOLDER 3rdparty)
36+
set_target_properties(gmock PROPERTIES EXPORT_COMPILE_COMMANDS OFF EXCLUDE_FROM_ALL ON FOLDER 3rdparty)
37+
set_target_properties(gmock_main PROPERTIES EXPORT_COMPILE_COMMANDS OFF EXCLUDE_FROM_ALL ON FOLDER 3rdparty)
38+
mark_as_advanced(
39+
BUILD_GMOCK BUILD_GTEST BUILD_SHARED_LIBS
40+
gmock_build_tests gtest_build_samples gtest_build_tests
41+
gtest_disable_pthreads gtest_force_shared_crt gtest_hide_internal_symbols
42+
)
43+
endif()
44+
45+
macro(add_googletest target_name)
46+
add_test(
47+
NAME ${target_name}
48+
COMMAND ${target_name}
49+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
50+
)
51+
target_link_libraries(${target_name} PRIVATE gtest_main)
52+
gtest_discover_tests(${target_name}
53+
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
54+
DISCOVERY_MODE PRE_TEST
55+
PROPERTIES
56+
VS_DEBUGGER_WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
57+
)
58+
set_target_properties(${target_name} PROPERTIES FOLDER tests)
59+
endmacro()

cmake/Utils/AddLibbacktrace.cmake

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# Licensed to the Apache Software Foundation (ASF) under one
2+
# or more contributor license agreements. See the NOTICE file
3+
# distributed with this work for additional information
4+
# regarding copyright ownership. The ASF licenses this file
5+
# to you under the Apache License, Version 2.0 (the
6+
# "License"); you may not use this file except in compliance
7+
# with the License. You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing,
12+
# software distributed under the License is distributed on an
13+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
# KIND, either express or implied. See the License for the
15+
# specific language governing permissions and limitations
16+
# under the License.
17+
18+
include(ExternalProject)
19+
20+
function(_libbacktrace_compile)
21+
set(_libbacktrace_source ${CMAKE_CURRENT_LIST_DIR}/../../../3rdparty/libbacktrace)
22+
set(_libbacktrace_prefix ${CMAKE_CURRENT_BINARY_DIR}/libbacktrace)
23+
if(CMAKE_SYSTEM_NAME MATCHES "Darwin" AND (CMAKE_C_COMPILER MATCHES "^/Library" OR CMAKE_C_COMPILER MATCHES "^/Applications"))
24+
set(_cmake_c_compiler "/usr/bin/cc")
25+
else()
26+
set(_cmake_c_compiler "${CMAKE_C_COMPILER}")
27+
endif()
28+
29+
message(STATUS CMAKC_C_COMPILER="${CMAKE_C_COMPILER}")
30+
31+
file(MAKE_DIRECTORY ${_libbacktrace_prefix}/include)
32+
file(MAKE_DIRECTORY ${_libbacktrace_prefix}/lib)
33+
34+
ExternalProject_Add(project_libbacktrace
35+
PREFIX libbacktrace
36+
SOURCE_DIR ${_libbacktrace_source}
37+
BINARY_DIR ${_libbacktrace_prefix}
38+
CONFIGURE_COMMAND
39+
"${_libbacktrace_source}/configure"
40+
"--prefix=${_libbacktrace_prefix}"
41+
--with-pic
42+
"CC=${_cmake_c_compiler}"
43+
"CPP=${_cmake_c_compiler} -E"
44+
"CFLAGS=${CMAKE_C_FLAGS}"
45+
"LDFLAGS=${CMAKE_EXE_LINKER_FLAGS}"
46+
"NM=${CMAKE_NM}"
47+
"STRIP=${CMAKE_STRIP}"
48+
"--host=${MACHINE_NAME}"
49+
INSTALL_DIR ${_libbacktrace_prefix}
50+
BUILD_COMMAND make
51+
INSTALL_COMMAND make install
52+
BUILD_BYPRODUCTS "${_libbacktrace_prefix}/lib/libbacktrace.a"
53+
"${_libbacktrace_prefix}/include/backtrace.h"
54+
)
55+
ExternalProject_Add_Step(project_libbacktrace checkout DEPENDERS configure DEPENDEES download)
56+
set_target_properties(project_libbacktrace PROPERTIES EXCLUDE_FROM_ALL TRUE)
57+
add_library(libbacktrace STATIC IMPORTED)
58+
add_dependencies(libbacktrace project_libbacktrace)
59+
set_target_properties(libbacktrace PROPERTIES
60+
IMPORTED_LOCATION ${_libbacktrace_prefix}/lib/libbacktrace.a
61+
INTERFACE_INCLUDE_DIRECTORIES ${_libbacktrace_prefix}/include
62+
)
63+
endfunction()
64+
65+
if(NOT MSVC)
66+
_libbacktrace_compile()
67+
endif()

cmake/Utils/CxxWarning.cmake

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Licensed to the Apache Software Foundation (ASF) under one
2+
# or more contributor license agreements. See the NOTICE file
3+
# distributed with this work for additional information
4+
# regarding copyright ownership. The ASF licenses this file
5+
# to you under the Apache License, Version 2.0 (the
6+
# "License"); you may not use this file except in compliance
7+
# with the License. You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing,
12+
# software distributed under the License is distributed on an
13+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
# KIND, either express or implied. See the License for the
15+
# specific language governing permissions and limitations
16+
# under the License.
17+
18+
function(add_cxx_warning target_name)
19+
# GNU, Clang, or AppleClang
20+
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang")
21+
target_compile_options(${target_name} PRIVATE "-Werror" "-Wall" "-Wextra" "-Wpedantic" "-Wno-unused-parameter")
22+
return()
23+
endif()
24+
# MSVC
25+
if(MSVC)
26+
# target_compile_options(${target_name} PRIVATE "/W4" "/WX")
27+
return()
28+
endif()
29+
message(FATAL_ERROR "Unsupported compiler: ${CMAKE_CXX_COMPILER_ID}")
30+
endfunction()

cmake/Utils/Library.cmake

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# Licensed to the Apache Software Foundation (ASF) under one
2+
# or more contributor license agreements. See the NOTICE file
3+
# distributed with this work for additional information
4+
# regarding copyright ownership. The ASF licenses this file
5+
# to you under the Apache License, Version 2.0 (the
6+
# "License"); you may not use this file except in compliance
7+
# with the License. You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing,
12+
# software distributed under the License is distributed on an
13+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
# KIND, either express or implied. See the License for the
15+
# specific language governing permissions and limitations
16+
# under the License.
17+
function(add_dsymutil target_name)
18+
# running dsymutil on macos to generate debugging symbols for backtraces
19+
if(APPLE)
20+
find_program(DSYMUTIL dsymutil)
21+
mark_as_advanced(DSYMUTIL)
22+
add_custom_command(TARGET ${target_name}
23+
POST_BUILD
24+
COMMAND ${DSYMUTIL} ARGS $<TARGET_FILE:${target_name}>
25+
COMMENT "[COMMAND] dsymutil $<TARGET_FILE:${target_name}>"
26+
VERBATIM
27+
)
28+
endif()
29+
endfunction()
30+
31+
function(add_msvc_flags target_name)
32+
# running if we are under msvc
33+
if(MSVC)
34+
target_compile_definitions(${target_name} PUBLIC -DWIN32_LEAN_AND_MEAN)
35+
target_compile_definitions(${target_name} PUBLIC -D_CRT_SECURE_NO_WARNINGS)
36+
target_compile_definitions(${target_name} PUBLIC -D_SCL_SECURE_NO_WARNINGS)
37+
target_compile_definitions(${target_name} PUBLIC -D_ENABLE_EXTENDED_ALIGNED_STORAGE)
38+
target_compile_definitions(${target_name} PUBLIC -DNOMINMAX)
39+
target_compile_options(${target_name} PRIVATE "/Z7")
40+
endif()
41+
endfunction()
42+
43+
function(add_target_from_obj target_name obj_target_name)
44+
add_library(${target_name}_static STATIC $<TARGET_OBJECTS:${obj_target_name}>)
45+
set_target_properties(
46+
${target_name}_static PROPERTIES
47+
OUTPUT_NAME "${target_name}_static"
48+
PREFIX "lib"
49+
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
50+
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
51+
)
52+
add_library(${target_name}_shared SHARED $<TARGET_OBJECTS:${obj_target_name}>)
53+
set_target_properties(
54+
${target_name}_shared PROPERTIES
55+
OUTPUT_NAME "${target_name}"
56+
PREFIX "lib"
57+
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
58+
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
59+
)
60+
add_custom_target(${target_name})
61+
add_dependencies(${target_name} ${target_name}_static ${target_name}_shared)
62+
if (MSVC)
63+
target_compile_definitions(${obj_target_name} PRIVATE TVM_FFI_EXPORTS)
64+
endif()
65+
add_dsymutil(${target_name}_shared)
66+
add_msvc_flags(${target_name}_shared)
67+
endfunction()

cmake/Utils/Sanitizer.cmake

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Licensed to the Apache Software Foundation (ASF) under one
2+
# or more contributor license agreements. See the NOTICE file
3+
# distributed with this work for additional information
4+
# regarding copyright ownership. The ASF licenses this file
5+
# to you under the Apache License, Version 2.0 (the
6+
# "License"); you may not use this file except in compliance
7+
# with the License. You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing,
12+
# software distributed under the License is distributed on an
13+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
# KIND, either express or implied. See the License for the
15+
# specific language governing permissions and limitations
16+
# under the License.
17+
18+
function(add_sanitizer_address target_name)
19+
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang")
20+
include(CheckCXXCompilerFlag)
21+
set (_saved_CRF ${CMAKE_REQUIRED_FLAGS})
22+
set(CMAKE_REQUIRED_FLAGS "-fsanitize=address")
23+
check_cxx_source_compiles("int main() { return 0; }" COMPILER_SUPPORTS_ASAN)
24+
set (CMAKE_REQUIRED_FLAGS ${_saved_CRF})
25+
get_target_property(_saved_type ${target_name} TYPE)
26+
if (${_saved_type} STREQUAL "INTERFACE_LIBRARY")
27+
set(_saved_type INTERFACE)
28+
else()
29+
set(_saved_type PRIVATE)
30+
endif()
31+
target_link_options(${target_name} ${_saved_type} "-fsanitize=address")
32+
target_compile_options(${target_name} ${_saved_type} "-fsanitize=address" "-fno-omit-frame-pointer" "-g")
33+
return()
34+
endif()
35+
endfunction()

0 commit comments

Comments
 (0)