//===========- DirectiveCommonGen.cpp - Directive common info generator -=====// // // Part of the LLVM Project, 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 // //===----------------------------------------------------------------------===// // // OpenMPCommonGen generates utility information from the single OpenMP source // of truth in llvm/lib/Frontend/OpenMP. // //===----------------------------------------------------------------------===// #include "mlir/TableGen/GenInfo.h" #include "llvm/ADT/Twine.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/raw_ostream.h" #include "llvm/TableGen/DirectiveEmitter.h" #include "llvm/TableGen/Error.h" #include "llvm/TableGen/Record.h" Clause; ClauseVal; raw_ostream; Record; RecordKeeper; // LLVM has multiple places (Clang, Flang, MLIR) where information about // the directives (OpenMP/OpenACC), and clauses are needed. It is good software // engineering to keep the common information in a single place to avoid // duplication, reduce engineering effort and prevent mistakes. // Currently that common place is llvm/include/llvm/Frontend/OpenMP/OMP.td for // OpenMP and llvm/include/llvm/Frontend/OpenACC/ACC.td for OpenACC. // We plan to use this tablegen source to generate all the required // declarations, functions etc. // // Some OpenMP/OpenACC clauses accept only a fixed set of values as inputs. // These can be represented as a Enum Attributes (EnumAttrDef) in MLIR // ODS. The emitDecls function below currently generates these enumerations. The // name of the enumeration is specified in the enumClauseValue field of // Clause record in OMP.td. This name can be used to specify the type of the // OpenMP operation's operand. The allowedClauseValues field provides the list // of ClauseValues which are part of the enumeration. static bool emitDecls(const RecordKeeper &records, llvm::StringRef dialect, raw_ostream &os) { … } static llvm::cl::OptionCategory directiveGenCat("Options for gen-directive-decl"); static llvm::cl::opt<std::string> dialect("directives-dialect", llvm::cl::desc("Generate directives for this dialect"), llvm::cl::cat(directiveGenCat), llvm::cl::CommaSeparated); // Registers the generator to mlir-tblgen. static mlir::GenRegistration genDirectiveDecls( "gen-directive-decl", "Generate declarations for directives (OpenMP/OpenACC etc.)", [](const RecordKeeper &records, raw_ostream &os) { … });