Skip to content
Permalink
Browse files Browse the repository at this point in the history
[tfg][functiondef_import] Error on empty edge names
Return an error in the generic function importer if an edge name is empty.

PiperOrigin-RevId: 449953062
  • Loading branch information
tensorflower-gardener committed May 20, 2022
1 parent cb12f7d commit ad069af
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 3 deletions.
21 changes: 18 additions & 3 deletions tensorflow/core/ir/importexport/functiondef_import.cc
Expand Up @@ -33,13 +33,15 @@ limitations under the License.
#include "tensorflow/core/ir/ops.h"
#include "tensorflow/core/platform/errors.h"
#include "tensorflow/core/platform/status.h"
#include "tensorflow/core/platform/statusor.h"

using tensorflow::AttrValue;
using tensorflow::FunctionDef;
using tensorflow::NodeDef;
using tensorflow::OpDef;
using tensorflow::OpDef_AttrDef;
using tensorflow::Status;
using tensorflow::StatusOr;
using tensorflow::errors::InvalidArgument;
using tensorflow::protobuf::RepeatedPtrField;

Expand Down Expand Up @@ -166,9 +168,12 @@ Status ImportNodes(ValueMapManager value_manager,
if (node.op().empty()) return InvalidArgument("empty op type");
OperationState state(unknown_loc, absl::StrCat("tfg.", node.op()));
// Fetch the inputs, creating placeholder if an input hasn't been visited.
for (const std::string& input : node.input())
for (const std::string& input : node.input()) {
if (input.empty())
return InvalidArgument("Node '", node.name(), "' has an empty input");
state.operands.push_back(
value_manager.GetValueOrCreatePlaceholder(input));
}
// Retrieve the entry in the nodes_map for this node and infer the result
// count from what was inferred during the first traversal above.
state.types.push_back(placeholder_ty);
Expand Down Expand Up @@ -461,21 +466,31 @@ Status ImportGenericFunction(
Value());
for (const auto& ret_val : func.ret()) {
auto position = output_name_to_position.find(ret_val.first);
if (position == output_name_to_position.end())
if (position == output_name_to_position.end()) {
return InvalidArgument(
"Can't import function, returned value references unknown output "
"argument ",
ret_val.first);
}
if (ret_val.second.empty()) {
return InvalidArgument("Function '", func.signature().name(),
"' has empty result name");
}
ret_vals[position->second] =
value_manager.GetValueOrCreatePlaceholder(ret_val.second);
}
for (const auto& ret_val : func.control_ret()) {
auto position = control_output_to_position.find(ret_val.first);
if (position == control_output_to_position.end())
if (position == control_output_to_position.end()) {
return InvalidArgument(
"Can't import function, returned value references unknown output "
"argument ",
ret_val.first);
}
if (ret_val.second.empty()) {
return InvalidArgument("Function '", func.signature().name(),
"' has empty control result name");
}
Value result = value_manager.GetValueOrCreatePlaceholder(
(Twine("^") + ret_val.second).str());
if (!result.getType().isa<ControlType>())
Expand Down
@@ -0,0 +1,26 @@
# RUN: not tfg-translate -graphdef-to-mlir %s 2>&1 | FileCheck %s

# CHECK: Function 'foo' has empty control result name

library {
function {
signature {
name: "foo"
control_output: "output"
}
node_def {
name: "y"
op: "NoOp"
attr {
key: "T"
value {
placeholder: "T"
}
}
}
control_ret {
key: "output"
value: ""
}
}
}
@@ -0,0 +1,22 @@
# RUN: not tfg-translate -graphdef-to-mlir %s 2>&1 | FileCheck %s

# CHECK: Node 'y' has an empty input

library {
function {
signature {
name: "foo"
}
node_def {
name: "y"
input: ""
op: "Identity"
attr {
key: "T"
value {
placeholder: "T"
}
}
}
}
}
@@ -0,0 +1,29 @@
# RUN: not tfg-translate -graphdef-to-mlir %s 2>&1 | FileCheck %s

# CHECK: Function 'foo' has empty result name

library {
function {
signature {
name: "foo"
output_arg {
name: "output"
type: DT_INT32
}
}
node_def {
name: "y"
op: "NoOp"
attr {
key: "T"
value {
placeholder: "T"
}
}
}
ret {
key: "output"
value: ""
}
}
}

0 comments on commit ad069af

Please sign in to comment.