diff options
author | Jared Duke <jdduke@google.com> | 2018-10-04 12:59:38 -0700 |
---|---|---|
committer | TensorFlower Gardener <gardener@tensorflow.org> | 2018-10-04 13:04:08 -0700 |
commit | 158b6b8becb6afd08f9d6c87f0c7f144ba5f0584 (patch) | |
tree | 52bbbadbcce1ea40a170eae684cd7d662da25350 /tensorflow/contrib/lite/model.cc | |
parent | 2c75da86ffdb9d04b2b94ce89891f17a8656da22 (diff) |
Use weak symbols to inject flex delegates
PiperOrigin-RevId: 215788183
Diffstat (limited to 'tensorflow/contrib/lite/model.cc')
-rw-r--r-- | tensorflow/contrib/lite/model.cc | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/tensorflow/contrib/lite/model.cc b/tensorflow/contrib/lite/model.cc index d50c345194..d7b109ac1a 100644 --- a/tensorflow/contrib/lite/model.cc +++ b/tensorflow/contrib/lite/model.cc @@ -27,9 +27,6 @@ limitations under the License. #ifndef TFLITE_MCU #include "tensorflow/contrib/lite/nnapi_delegate.h" #endif -#if defined(TFLITE_FLEX) -#include "tensorflow/contrib/lite/delegates/flex/delegate.h" -#endif #include "tensorflow/contrib/lite/version.h" namespace tflite { @@ -43,6 +40,25 @@ ErrorReporter* ValidateErrorReporter(ErrorReporter* e) { const char* kEmptyTensorName = ""; +// Normally we'd use ABSL_HAVE_ATTRIBUTE_WEAK and ABSL_ATTRIBUTE_WEAK, but +// we avoid the absl dependency for binary size reasons. +#ifdef __has_attribute +#define TFLITE_HAS_ATTRIBUTE(x) __has_attribute(x) +#else +#define TFLITE_HAS_ATTRIBUTE(x) 0 +#endif + +#if TFLITE_HAS_ATTRIBUTE(weak) || (defined(__GNUC__) && !defined(__clang__)) +// Using weak symbols for the flex delegate allows automatic injection of the +// delegate simply by adding it as a dependency. See also the strong override in +// lite/delegates/flex/delegate.cc. +__attribute__((weak)) Interpreter::TfLiteDelegatePtr AcquireFlexDelegate() { + return Interpreter::TfLiteDelegatePtr(nullptr, [](TfLiteDelegate*) {}); +} +#else +Interpreter::TfLiteDelegatePtr (*AcquireFlexDelegate)() = nullptr; +#endif + #ifndef TFLITE_MCU // Loads a model from `filename`. If `mmap_file` is true then use mmap, // otherwise make a copy of the model in a buffer. @@ -450,13 +466,14 @@ TfLiteStatus InterpreterBuilder::operator()( } (**interpreter).SetVariables(std::move(variables)); -#if defined(TFLITE_FLEX) - if (auto delegate = FlexDelegate::Create()) { - (**interpreter) - .ModifyGraphWithDelegate(std::move(delegate), - /*allow_dynamic_tensors=*/true); + // TODO(b/116667551): Only create the flex delegate if the model has flex ops. + if (AcquireFlexDelegate != nullptr) { + if (auto flex_delegate = AcquireFlexDelegate()) { + (**interpreter) + .ModifyGraphWithDelegate(std::move(flex_delegate), + /*allow_dynamic_tensors=*/true); + } } -#endif return kTfLiteOk; } |