//===- offload-tblgen/APIGen.cpp - Tablegen backend for Offload functions -===// // // 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 // //===----------------------------------------------------------------------===// // // This is a Tablegen backend that handles generation of various small files // pertaining to the API functions. // //===----------------------------------------------------------------------===// #include "llvm/Support/FormatVariadic.h" #include "llvm/TableGen/Record.h" #include "GenCommon.hpp" #include "RecordTypes.hpp" using namespace llvm; using namespace offload::tblgen; // Emit a list of just the API function names void EmitOffloadFuncNames(const RecordKeeper &Records, raw_ostream &OS) { OS << GenericHeader; OS << R"( #ifndef OFFLOAD_FUNC #error Please define the macro OFFLOAD_FUNC(Function) #endif )"; for (auto *R : Records.getAllDerivedDefinitions("Function")) { FunctionRec FR{R}; OS << formatv("OFFLOAD_FUNC({0})", FR.getName()) << "\n"; } for (auto *R : Records.getAllDerivedDefinitions("Function")) { FunctionRec FR{R}; OS << formatv("OFFLOAD_FUNC({0}WithCodeLoc)", FR.getName()) << "\n"; } OS << "\n#undef OFFLOAD_FUNC\n"; } void EmitOffloadExports(const RecordKeeper &Records, raw_ostream &OS) { OS << "VERS1.0 {\n"; OS << TAB_1 "global:\n"; for (auto *R : Records.getAllDerivedDefinitions("Function")) { OS << formatv(TAB_2 "{0};\n", FunctionRec(R).getName()); } for (auto *R : Records.getAllDerivedDefinitions("Function")) { OS << formatv(TAB_2 "{0}WithCodeLoc;\n", FunctionRec(R).getName()); } OS << TAB_1 "local:\n"; OS << TAB_2 "*;\n"; OS << "};\n"; } // Emit declarations for every implementation function void EmitOffloadImplFuncDecls(const RecordKeeper &Records, raw_ostream &OS) { OS << GenericHeader; for (auto *R : Records.getAllDerivedDefinitions("Function")) { FunctionRec F{R}; OS << formatv("{0}_impl_result_t {1}_impl(", PrefixLower, F.getName()); auto Params = F.getParams(); for (auto &Param : Params) { OS << Param.getType() << " " << Param.getName(); if (Param != Params.back()) { OS << ", "; } } OS << ");\n\n"; } }