Support builds without RTTI (#4333)

* Support builds without RTTI

* Disable RTTI in all builds
This commit is contained in:
Tiago Koji Castro Shibata 2020-07-01 13:05:35 -07:00 committed by GitHub
parent 5dcb9b4858
commit 7fea332f93
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 59 additions and 27 deletions

View file

@ -85,6 +85,7 @@ option(onnxruntime_CROSS_COMPILING "Cross compiling onnx runtime" OFF)
option(onnxruntime_USE_FULL_PROTOBUF "Link to libprotobuf instead of libprotobuf-lite when this option is ON" OFF)
option(onnxruntime_DISABLE_CONTRIB_OPS "Disable contrib ops" OFF)
option(onnxruntime_DISABLE_ML_OPS "Disable traditional ML ops" OFF)
option(onnxruntime_DISABLE_RTTI "Disable RTTI" OFF)
option(tensorflow_C_PACKAGE_PATH "Path to tensorflow C package installation dir")
option(onnxruntime_ENABLE_LANGUAGE_INTEROP_OPS "Enable operator implemented in language other than cpp" OFF)
option(onnxruntime_DEBUG_NODE_INPUTS_OUTPUTS "Dump node input shapes and output data to standard output when executing the model." OFF)
@ -186,6 +187,16 @@ if(onnxruntime_USE_NNAPI_BUILTIN AND onnxruntime_USE_NNAPI_DNNLIBRARY)
message(FATAL_ERROR "Please use only one of onnxruntime_USE_NNAPI_BUILTIN, onnxruntime_USE_NNAPI_DNNLIBRARY")
endif()
if(onnxruntime_DISABLE_RTTI)
add_compile_definitions(ORT_NO_RTTI GOOGLE_PROTOBUF_NO_RTTI)
if(MSVC)
# Disable RTTI and turn usage of dynamic_cast and typeid into errors
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:/GR->" "$<$<COMPILE_LANGUAGE:CXX>:/we4541>")
else()
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-fno-rtti>")
endif()
endif()
set(REPO_ROOT ${PROJECT_SOURCE_DIR}/..)
set(ONNXRUNTIME_ROOT ${PROJECT_SOURCE_DIR}/../onnxruntime)
set(ORTTRAINING_ROOT ${PROJECT_SOURCE_DIR}/../orttraining)

View file

@ -697,7 +697,11 @@ const char* DataTypeImpl::ToString(MLDataType type) {
if (type_proto != nullptr) {
return ONNX_NAMESPACE::Utils::DataTypeUtils::ToType(*type_proto)->c_str();
}
#ifdef ORT_NO_RTTI
return "(unknown type)";
#else
return typeid(*type).name();
#endif
}
const TensorTypeBase* DataTypeImpl::TensorTypeFromONNXEnum(int type) {
@ -951,7 +955,11 @@ std::ostream& operator<<(std::ostream& out, const DataTypeImpl* data_type) {
if (data_type == nullptr)
return out << "(null)";
#ifdef ORT_NO_RTTI
return out << "(unknown type)";
#else
return out << typeid(*data_type).name();
#endif
}
namespace utils {

View file

@ -123,7 +123,7 @@ class IfImpl {
std::vector<std::pair<AllocationType, OrtValue>> outputs_;
};
If::If(const OpKernelInfo& info) : OpKernel(info) {
If::If(const OpKernelInfo& info) : IControlFlowKernel(info) {
// make sure the required attributes are present even though we don't need it here.
// The GraphProto attributes are loaded as a Graph instance by main Graph::Resolve,
// and a SessionState instance for executing the subgraph is created by InferenceSession.

View file

@ -13,7 +13,7 @@
namespace onnxruntime {
class SessionState;
class If : public OpKernel, public controlflow::IControlFlowKernel {
class If : public controlflow::IControlFlowKernel {
public:
If(const OpKernelInfo& info);

View file

@ -216,7 +216,7 @@ static Status ConcatenateCpuOutput(std::vector<OrtValue>& per_iteration_output,
return Status::OK();
}
Loop::Loop(const OpKernelInfo& info) : OpKernel(info) {
Loop::Loop(const OpKernelInfo& info) : IControlFlowKernel(info) {
// make sure the attribute was present even though we don't need it here.
// The GraphProto is loaded as a Graph instance by main Graph::Resolve,
// and a SessionState instance for executing the subgraph is created by InferenceSession.

View file

@ -12,7 +12,7 @@
namespace onnxruntime {
class Loop : public OpKernel, public controlflow::IControlFlowKernel {
class Loop : public controlflow::IControlFlowKernel {
public:
Loop(const OpKernelInfo& info);

View file

@ -42,7 +42,7 @@ struct DeviceHelpers {
} // namespace scan
template <int OpSet>
class Scan : public OpKernel, public controlflow::IControlFlowKernel {
class Scan : public controlflow::IControlFlowKernel {
public:
Scan(const OpKernelInfo& info);

View file

@ -135,7 +135,7 @@ class Scan8Impl {
};
template <>
Scan<8>::Scan(const OpKernelInfo& info) : OpKernel(info) {
Scan<8>::Scan(const OpKernelInfo& info) : IControlFlowKernel(info) {
// make sure the attribute was present even though we don't need it here.
// The GraphProto is loaded as a Graph instance by main Graph::Resolve,
// and a SessionState instance for executing the subgraph is created by InferenceSession.

View file

@ -159,7 +159,7 @@ class ScanImpl {
};
template <>
Scan<9>::Scan(const OpKernelInfo& info) : OpKernel(info) {
Scan<9>::Scan(const OpKernelInfo& info) : IControlFlowKernel(info) {
// make sure the attribute was present even though we don't need it here.
// The GraphProto is loaded as a Graph instance by main Graph::Resolve,
// and a SessionState instance for executing the subgraph is created by InferenceSession.

View file

@ -9,6 +9,7 @@
#include "core/common/common.h"
#include "core/framework/feeds_fetches_manager.h"
#include "core/framework/op_kernel.h"
namespace onnxruntime {
class Graph;
@ -31,8 +32,9 @@ OrtValue MakeScalarMLValue(const AllocatorPtr& allocator, T value, bool is_1d) {
namespace controlflow {
/** Interface for control flow kernels */
class IControlFlowKernel {
class IControlFlowKernel : public OpKernel {
public:
explicit IControlFlowKernel(const OpKernelInfo& info) : OpKernel(info) {}
/** Setup information that is re-used each time to execute the subgraph.
@param session_state SessionState for graph containing the control flow node
@param attribute_name Control flow node's attribute name that contained the subgraph

View file

@ -775,7 +775,8 @@ common::Status InferenceSession::InitializeSubgraphSessions(Graph& graph, Sessio
// setup all the info for handling the feeds and fetches used in subgraph execution
auto* p_op_kernel = session_state.GetMutableKernel(node.Index());
ORT_ENFORCE(p_op_kernel);
auto& control_flow_kernel = dynamic_cast<controlflow::IControlFlowKernel&>(*p_op_kernel);
// Downcast is safe, since only control flow nodes have subgraphs (node.GetAttributeNameToMutableSubgraphMap() is non-empty)
auto& control_flow_kernel = static_cast<controlflow::IControlFlowKernel&>(*p_op_kernel);
ORT_RETURN_IF_ERROR_SESSIONID_(
control_flow_kernel.SetupSubgraphExecutionInfo(session_state, name, *subgraph_session_state));
@ -1033,10 +1034,14 @@ static common::Status CheckTypes(MLDataType actual, MLDataType expected) {
if (actual == expected) {
return Status::OK();
}
#ifdef ORT_NO_RTTI
return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "Unexpected input data type");
#else
auto actual_name = std::string(typeid(*actual).name());
auto expected_name = std::string(typeid(*expected).name());
return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT,
"Unexpected input data type. Actual: (" + actual_name + ") , expected: (" + expected_name + ")");
#endif
}
common::Status InferenceSession::ValidateInputs(const std::vector<std::string>& feed_names,

View file

@ -49,7 +49,7 @@ TEST(GraphTransformerUtilsTests, TestGenerateGraphTransformers) {
RuleBasedGraphTransformer* rule_transformer = nullptr;
for (const auto& transformer : transformers) {
if (transformer->Name() == l1_rule_transformer_name) {
rule_transformer = dynamic_cast<RuleBasedGraphTransformer*>(transformers[0].get());
rule_transformer = static_cast<RuleBasedGraphTransformer*>(transformers[0].get());
}
}
ASSERT_TRUE(rule_transformer && rule_transformer->RulesCount() == 1);

View file

@ -298,6 +298,9 @@ def parse_arguments():
parser.add_argument(
"--disable_ml_ops", action='store_true',
help="Disable traditional ML ops (reduces binary size)")
parser.add_argument(
"--disable_rtti", action='store_true',
help="Disable RTTI (reduces binary size)")
parser.add_argument(
"--skip_onnx_tests", action='store_true', help="Explicitly disable "
"all onnx related tests. Note: Use --skip_tests to skip all tests.")
@ -617,6 +620,8 @@ def generate_build_tree(cmake_path, source_dir, build_dir, cuda_home, cudnn_home
"ON" if args.disable_contrib_ops else "OFF"),
"-Donnxruntime_DISABLE_ML_OPS=" + (
"ON" if args.disable_ml_ops else "OFF"),
"-Donnxruntime_DISABLE_RTTI=" + (
"ON" if args.disable_rtti else "OFF"),
"-Donnxruntime_MSVC_STATIC_RUNTIME=" + (
"ON" if args.enable_msvc_static_runtime else "OFF"),
# enable pyop if it is nightly build

View file

@ -141,7 +141,7 @@ jobs:
displayName: 'Generate cmake config'
inputs:
scriptPath: '$(Build.SourcesDirectory)\tools\ci_build\build.py'
arguments: '--config RelWithDebInfo --enable_lto --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --update --cmake_generator "Visual Studio 16 2019" --build_shared_lib --enable_onnx_tests $(TelemetryOption) $(buildparameter)'
arguments: '--config RelWithDebInfo --enable_lto --disable_rtti --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --update --cmake_generator "Visual Studio 16 2019" --build_shared_lib --enable_onnx_tests $(TelemetryOption) $(buildparameter)'
workingDirectory: '$(Build.BinariesDirectory)'
@ -161,7 +161,7 @@ jobs:
displayName: 'test'
inputs:
scriptPath: '$(Build.SourcesDirectory)\tools\ci_build\build.py'
arguments: '--config RelWithDebInfo --enable_lto --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --test --cmake_generator "Visual Studio 16 2019" --build_shared_lib --enable_onnx_tests $(TelemetryOption) $(buildparameter)'
arguments: '--config RelWithDebInfo --enable_lto --disable_rtti --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --test --cmake_generator "Visual Studio 16 2019" --build_shared_lib --enable_onnx_tests $(TelemetryOption) $(buildparameter)'
workingDirectory: '$(Build.BinariesDirectory)'
- template: templates/c-api-artifacts-package-and-publish-steps-windows.yml
@ -225,7 +225,7 @@ jobs:
displayName: 'Generate cmake config'
inputs:
scriptPath: '$(Build.SourcesDirectory)\tools\ci_build\build.py'
arguments: '--config RelWithDebInfo --enable_lto --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --update --cmake_generator "Visual Studio 16 2019" --build_shared_lib --enable_onnx_tests $(TelemetryOption) $(buildparameter)'
arguments: '--config RelWithDebInfo --enable_lto --disable_rtti --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --update --cmake_generator "Visual Studio 16 2019" --build_shared_lib --enable_onnx_tests $(TelemetryOption) $(buildparameter)'
workingDirectory: '$(Build.BinariesDirectory)'
@ -245,7 +245,7 @@ jobs:
displayName: 'test'
inputs:
scriptPath: '$(Build.SourcesDirectory)\tools\ci_build\build.py'
arguments: '--config RelWithDebInfo --enable_lto --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --test --cmake_generator "Visual Studio 16 2019" --build_shared_lib --enable_onnx_tests $(TelemetryOption) $(buildparameter)'
arguments: '--config RelWithDebInfo --enable_lto --disable_rtti --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --test --cmake_generator "Visual Studio 16 2019" --build_shared_lib --enable_onnx_tests $(TelemetryOption) $(buildparameter)'
workingDirectory: '$(Build.BinariesDirectory)'
- template: templates/c-api-artifacts-package-and-publish-steps-windows.yml

View file

@ -77,7 +77,7 @@ jobs:
displayName: 'Generate cmake config'
inputs:
scriptPath: '$(Build.SourcesDirectory)\tools\ci_build\build.py'
arguments: '--config RelWithDebInfo --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_java --build_shared_lib --update --cmake_generator "Visual Studio 16 2019" --enable_lto --build_shared_lib --enable_onnx_tests $(buildparameter)'
arguments: '--config RelWithDebInfo --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_java --build_shared_lib --update --cmake_generator "Visual Studio 16 2019" --enable_lto --disable_rtti --build_shared_lib --enable_onnx_tests $(buildparameter)'
workingDirectory: '$(Build.BinariesDirectory)'
@ -97,7 +97,7 @@ jobs:
displayName: 'test'
inputs:
scriptPath: '$(Build.SourcesDirectory)\tools\ci_build\build.py'
arguments: '--config RelWithDebInfo --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --build_java --test --cmake_generator "Visual Studio 16 2019" --enable_lto --build_shared_lib --enable_onnx_tests $(buildparameter)'
arguments: '--config RelWithDebInfo --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --build_java --test --cmake_generator "Visual Studio 16 2019" --enable_lto --disable_rtti --build_shared_lib --enable_onnx_tests $(buildparameter)'
workingDirectory: '$(Build.BinariesDirectory)'
- template: templates/java-api-artifacts-package-and-publish-steps-windows.yml

View file

@ -123,7 +123,7 @@ jobs:
displayName: 'Generate cmake config'
inputs:
scriptPath: '$(Build.SourcesDirectory)\tools\ci_build\build.py'
arguments: '--config RelWithDebInfo --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --enable_wcos --build_java --update --cmake_generator "Visual Studio 16 2019" --enable_lto --build_shared_lib --enable_onnx_tests $(buildparameter)'
arguments: '--config RelWithDebInfo --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --enable_wcos --build_java --update --cmake_generator "Visual Studio 16 2019" --enable_lto --disable_rtti --build_shared_lib --enable_onnx_tests $(buildparameter)'
workingDirectory: '$(Build.BinariesDirectory)'
@ -144,7 +144,7 @@ jobs:
displayName: 'test'
inputs:
scriptPath: '$(Build.SourcesDirectory)\tools\ci_build\build.py'
arguments: '--config RelWithDebInfo --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_java --build_shared_lib --enable_wcos --build_java --test --cmake_generator "Visual Studio 16 2019" --enable_lto --build_shared_lib --enable_onnx_tests $(buildparameter)'
arguments: '--config RelWithDebInfo --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_java --build_shared_lib --enable_wcos --build_java --test --cmake_generator "Visual Studio 16 2019" --enable_lto --disable_rtti --build_shared_lib --enable_onnx_tests $(buildparameter)'
workingDirectory: '$(Build.BinariesDirectory)'
- template: templates/java-api-artifacts-package-and-publish-steps-windows.yml

View file

@ -275,6 +275,7 @@ stages:
arguments: >
--config RelWithDebInfo
--enable_lto
--disable_rtti
--build_dir $(Build.BinariesDirectory)
--skip_submodule_sync
--cmake_generator "Visual Studio 16 2019"

View file

@ -38,21 +38,21 @@ steps:
inputs:
scriptPath: '$(Build.SourcesDirectory)\tools\ci_build\build.py'
${{ if and(eq(parameters.BuildArch, 'x64'), eq(parameters.BuildForStore, 'false')) }}:
arguments: '--build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --enable_onnx_tests --enable_wcos $(TelemetryOption) --use_dml --use_winml --cmake_generator "Visual Studio 16 2019" --update --config RelWithDebInfo --enable_lto'
arguments: '--build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --enable_onnx_tests --enable_wcos $(TelemetryOption) --use_dml --use_winml --cmake_generator "Visual Studio 16 2019" --update --config RelWithDebInfo --enable_lto --disable_rtti'
${{ if and(eq(parameters.BuildArch, 'x64'), eq(parameters.BuildForStore, 'true')) }}:
arguments: '--build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --enable_onnx_tests --enable_wcos $(TelemetryOption) --use_dml --use_winml --cmake_generator "Visual Studio 16 2019" --update --config RelWithDebInfo --enable_lto --enable_windows_store'
arguments: '--build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --enable_onnx_tests --enable_wcos $(TelemetryOption) --use_dml --use_winml --cmake_generator "Visual Studio 16 2019" --update --config RelWithDebInfo --enable_lto --disable_rtti --enable_windows_store'
${{ if and(eq(parameters.BuildArch, 'x86'), eq(parameters.BuildForStore, 'false')) }}:
arguments: '--build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --enable_onnx_tests --enable_wcos $(TelemetryOption) --use_dml --use_winml --cmake_generator "Visual Studio 16 2019" --update --config RelWithDebInfo --enable_lto --x86'
arguments: '--build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --enable_onnx_tests --enable_wcos $(TelemetryOption) --use_dml --use_winml --cmake_generator "Visual Studio 16 2019" --update --config RelWithDebInfo --enable_lto --disable_rtti --x86'
${{ if and(eq(parameters.BuildArch, 'x86'), eq(parameters.BuildForStore, 'true')) }}:
arguments: '--build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --enable_onnx_tests --enable_wcos $(TelemetryOption) --use_dml --use_winml --cmake_generator "Visual Studio 16 2019" --update --config RelWithDebInfo --enable_lto --x86 --enable_windows_store'
arguments: '--build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --enable_onnx_tests --enable_wcos $(TelemetryOption) --use_dml --use_winml --cmake_generator "Visual Studio 16 2019" --update --config RelWithDebInfo --enable_lto --disable_rtti --x86 --enable_windows_store'
${{ if and(eq(parameters.BuildArch, 'arm64'), eq(parameters.BuildForStore, 'false')) }}:
arguments: '--build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --enable_onnx_tests --enable_wcos $(TelemetryOption) --use_winml --cmake_generator "Visual Studio 16 2019" --update --config RelWithDebInfo --enable_lto --arm64'
arguments: '--build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --enable_onnx_tests --enable_wcos $(TelemetryOption) --use_winml --cmake_generator "Visual Studio 16 2019" --update --config RelWithDebInfo --enable_lto --disable_rtti --arm64'
${{ if and(eq(parameters.BuildArch, 'arm64'), eq(parameters.BuildForStore, 'true')) }}:
arguments: '--build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --enable_onnx_tests --enable_wcos $(TelemetryOption) --use_winml --cmake_generator "Visual Studio 16 2019" --update --config RelWithDebInfo --enable_lto --arm64 --enable_windows_store'
arguments: '--build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --enable_onnx_tests --enable_wcos $(TelemetryOption) --use_winml --cmake_generator "Visual Studio 16 2019" --update --config RelWithDebInfo --enable_lto --disable_rtti --arm64 --enable_windows_store'
${{ if and(eq(parameters.BuildArch, 'arm'), eq(parameters.BuildForStore, 'false')) }}:
arguments: '--build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --enable_onnx_tests --enable_wcos $(TelemetryOption) --use_winml --cmake_generator "Visual Studio 16 2019" --update --config RelWithDebInfo --enable_lto --arm'
arguments: '--build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --enable_onnx_tests --enable_wcos $(TelemetryOption) --use_winml --cmake_generator "Visual Studio 16 2019" --update --config RelWithDebInfo --enable_lto --disable_rtti --arm'
${{ if and(eq(parameters.BuildArch, 'arm'), eq(parameters.BuildForStore, 'true')) }}:
arguments: '--build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --enable_onnx_tests --enable_wcos $(TelemetryOption) --use_winml --cmake_generator "Visual Studio 16 2019" --update --config RelWithDebInfo --enable_lto --arm --enable_windows_store'
arguments: '--build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --enable_onnx_tests --enable_wcos $(TelemetryOption) --use_winml --cmake_generator "Visual Studio 16 2019" --update --config RelWithDebInfo --enable_lto --disable_rtti --arm --enable_windows_store'
workingDirectory: '$(Build.BinariesDirectory)'
- ${{ if notIn(parameters['sln_platform'], 'Win32', 'x64') }}:
@ -84,7 +84,7 @@ steps:
python.exe -m pip install -q --upgrade %WHEEL_FILENAME%
set PATH=%PATH%;$(Build.BinariesDirectory)\RelWithDebInfo\RelWithDebInfo
@echo %PATH%
python $(Build.SourcesDirectory)\tools\ci_build\build.py --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --test --config RelWithDebInfo --enable_lto %BUILD_ARCH_SWITCH%
python $(Build.SourcesDirectory)\tools\ci_build\build.py --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --test --config RelWithDebInfo --enable_lto --disable_rtti %BUILD_ARCH_SWITCH%
workingDirectory: '$(Build.BinariesDirectory)\RelWithDebInfo\RelWithDebInfo'
displayName: 'Run Unit Tests'
env: