diff --git a/compiler/src/iree/compiler/Dialect/VM/Target/C/CppEmitter.h b/compiler/src/iree/compiler/Dialect/VM/Target/C/CppEmitter.h deleted file mode 100644 index 5efb1b273ccc..000000000000 --- a/compiler/src/iree/compiler/Dialect/VM/Target/C/CppEmitter.h +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright 2020 The IREE Authors -// -// Licensed under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -// Formated in LLVM style. Avoid reformatting for upcoming upstreaming. -// clang-format off - -#ifndef EMITC_TARGET_CPP_CPPEMITTER_H -#define EMITC_TARGET_CPP_CPPEMITTER_H - -#include "mlir/IR/BuiltinTypes.h" -#include "mlir/IR/Value.h" -#include "mlir/Support/IndentedOstream.h" -#include "llvm/ADT/ScopedHashTable.h" -#include "llvm/Support/raw_ostream.h" -#include - -namespace mlir { -namespace emitc { - -/// Convenience functions to produce interleaved output with functions returning -/// a LogicalResult. This is different than those in STL as functions used on -/// each element doesn't return a string. -template -inline LogicalResult -interleaveWithError(ForwardIterator begin, ForwardIterator end, - UnaryFunctor eachFn, NullaryFunctor betweenFn) { - if (begin == end) - return success(); - if (failed(eachFn(*begin))) - return failure(); - ++begin; - for (; begin != end; ++begin) { - betweenFn(); - if (failed(eachFn(*begin))) - return failure(); - } - return success(); -} - -template -inline LogicalResult interleaveWithError(const Container &c, - UnaryFunctor eachFn, - NullaryFunctor betweenFn) { - return interleaveWithError(c.begin(), c.end(), eachFn, betweenFn); -} - -template -inline LogicalResult interleaveCommaWithError(const Container &c, - raw_ostream &os, - UnaryFunctor eachFn) { - return interleaveWithError(c.begin(), c.end(), eachFn, [&]() { os << ", "; }); -} - -/// Emitter that uses dialect specific emitters to emit C++ code. -struct CppEmitter { - explicit CppEmitter(raw_ostream &os, bool declareVariablesAtTop); - - /// Emits attribute or returns failure. - LogicalResult emitAttribute(Location loc, Attribute attr); - - /// Emits operation 'op' with/without training semicolon or returns failure. - LogicalResult emitOperation(Operation &op, bool trailingSemicolon); - - /// Emits type 'type' or returns failure. - LogicalResult emitType(Location loc, Type type); - - /// Emits array of types as a std::tuple of the emitted types. - /// - emits void for an empty array; - /// - emits the type of the only element for arrays of size one; - /// - emits a std::tuple otherwise; - LogicalResult emitTypes(Location loc, ArrayRef types); - - /// Emits array of types as a std::tuple of the emitted types independently of - /// the array size. - LogicalResult emitTupleType(Location loc, ArrayRef types); - - /// Emits an assignment for a variable which has been declared previously. - LogicalResult emitVariableAssignment(OpResult result); - - /// Emits a variable declaration for a result of an operation. - LogicalResult emitVariableDeclaration(OpResult result, - bool trailingSemicolon); - - /// Emits the variable declaration and assignment prefix for 'op'. - /// - emits separate variable followed by std::tie for multi-valued operation; - /// - emits single type followed by variable for single result; - /// - emits nothing if no value produced by op; - /// Emits final '=' operator where a type is produced. Returns failure if - /// any result type could not be converted. - LogicalResult emitAssignPrefix(Operation &op); - - /// Emits a label for the block. - LogicalResult emitLabel(Block &block); - - /// Emits the operands and atttributes of the operation. All operands are - /// emitted first and then all attributes in alphabetical order. - LogicalResult emitOperandsAndAttributes(Operation &op, - ArrayRef exclude = {}); - - /// Emits the operands of the operation. All operands are emitted in order. - LogicalResult emitOperands(Operation &op); - - /// Return the existing or a new name for a Value. - StringRef getOrCreateName(Value val); - - /// Return the existing or a new label of a Block. - StringRef getOrCreateName(Block &block); - - /// Whether to map an mlir integer to a unsigned integer in C++. - bool shouldMapToUnsigned(IntegerType::SignednessSemantics val); - - /// RAII helper function to manage entering/exiting C++ scopes. - struct Scope { - Scope(CppEmitter &emitter) - : valueMapperScope(emitter.valueMapper), - blockMapperScope(emitter.blockMapper), emitter(emitter) { - emitter.valueInScopeCount.push(emitter.valueInScopeCount.top()); - emitter.labelInScopeCount.push(emitter.labelInScopeCount.top()); - } - ~Scope() { - emitter.valueInScopeCount.pop(); - emitter.labelInScopeCount.pop(); - } - - private: - llvm::ScopedHashTableScope valueMapperScope; - llvm::ScopedHashTableScope blockMapperScope; - CppEmitter &emitter; - }; - - /// Returns wether the Value is assigned to a C++ variable in the scope. - bool hasValueInScope(Value val); - - // Returns whether a label is assigned to the block. - bool hasBlockLabel(Block &block); - - /// Returns the output stream. - raw_indented_ostream &ostream() { return os; }; - - /// Returns if all variables for op results and basic block arguments need to - /// be declared at the beginning of a function. - bool shouldDeclareVariablesAtTop() { return declareVariablesAtTop; }; - -private: - using ValueMapper = llvm::ScopedHashTable; - using BlockMapper = llvm::ScopedHashTable; - - /// Output stream to emit to. - raw_indented_ostream os; - - /// Boolean to enforce that all variables for op results and block - /// arguments are declared at the beginning of the function. This also - /// includes results from ops located in nested regions. - bool declareVariablesAtTop; - - /// Map from value to name of C++ variable that contain the name. - ValueMapper valueMapper; - - /// Map from block to name of C++ label. - BlockMapper blockMapper; - - /// The number of values in the current scope. This is used to declare the - /// names of values in a scope. - std::stack valueInScopeCount; - std::stack labelInScopeCount; -}; - -/// Translates the given operation to C++ code. The operation or operations in -/// the region of 'op' need almost all be in EmitC dialect. The parameter -/// 'declareVariablesAtTop' enforces that all variables for op results and block -/// arguments are declared at the beginning of the function. -LogicalResult translateToCpp(Operation *op, raw_ostream &os, - bool declareVariablesAtTop = false); -} // namespace emitc -} // namespace mlir - -#endif // EMITC_TARGET_CPP_CPPEMITTER_H -// clang-format on diff --git a/compiler/src/iree/compiler/Dialect/VM/Target/C/README.md b/compiler/src/iree/compiler/Dialect/VM/Target/C/README.md deleted file mode 100644 index 4800d27d3669..000000000000 --- a/compiler/src/iree/compiler/Dialect/VM/Target/C/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# MLIR EmitC - -The Cpp emitter is a partial copy of MLIR EmitC, forked from https://github.com/iml130/mlir-emitc. - -The initial import contains the C/C++ emitter (namely the files `CppEmitter.h` and `TranslateToCpp.cpp`) -and reflects the state of iml130/mlir-emitc@f9968f65 for those files. - -It is intended to switch to the C/C++ emitter in the MLIR core repository as soon as possible.