10b57cec5SDimitry Andric //===- llvm/TableGen/TableGenBackend.h - Backend utilities ------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // Useful utilities for TableGen backends. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #ifndef LLVM_TABLEGEN_TABLEGENBACKEND_H 140b57cec5SDimitry Andric #define LLVM_TABLEGEN_TABLEGENBACKEND_H 150b57cec5SDimitry Andric 1606c3fb27SDimitry Andric #include "llvm/ADT/StringRef.h" 1706c3fb27SDimitry Andric #include "llvm/Support/CommandLine.h" 1806c3fb27SDimitry Andric #include "llvm/Support/ManagedStatic.h" 19*5f757f3fSDimitry Andric #include "llvm/TableGen/Record.h" 2006c3fb27SDimitry Andric 210b57cec5SDimitry Andric namespace llvm { 220b57cec5SDimitry Andric 2306c3fb27SDimitry Andric class RecordKeeper; 240b57cec5SDimitry Andric class raw_ostream; 250b57cec5SDimitry Andric 2606c3fb27SDimitry Andric namespace TableGen::Emitter { 2706c3fb27SDimitry Andric using FnT = void (*)(RecordKeeper &Records, raw_ostream &OS); 2806c3fb27SDimitry Andric 2906c3fb27SDimitry Andric struct OptCreatorT { 3006c3fb27SDimitry Andric static void *call(); 3106c3fb27SDimitry Andric }; 3206c3fb27SDimitry Andric 3306c3fb27SDimitry Andric extern ManagedStatic<cl::opt<FnT>, OptCreatorT> Action; 3406c3fb27SDimitry Andric 3506c3fb27SDimitry Andric struct Opt { 3606c3fb27SDimitry Andric Opt(StringRef Name, FnT CB, StringRef Desc, bool ByDefault = false) { 3706c3fb27SDimitry Andric if (ByDefault) 3806c3fb27SDimitry Andric Action->setInitialValue(CB); 3906c3fb27SDimitry Andric Action->getParser().addLiteralOption(Name, CB, Desc); 4006c3fb27SDimitry Andric } 4106c3fb27SDimitry Andric }; 4206c3fb27SDimitry Andric 4306c3fb27SDimitry Andric template <class EmitterC> class OptClass : Opt { run(RecordKeeper & RK,raw_ostream & OS)4406c3fb27SDimitry Andric static void run(RecordKeeper &RK, raw_ostream &OS) { EmitterC(RK).run(OS); } 4506c3fb27SDimitry Andric 4606c3fb27SDimitry Andric public: OptClass(StringRef Name,StringRef Desc)4706c3fb27SDimitry Andric OptClass(StringRef Name, StringRef Desc) : Opt(Name, run, Desc) {} 4806c3fb27SDimitry Andric }; 4906c3fb27SDimitry Andric 5006c3fb27SDimitry Andric } // namespace TableGen::Emitter 5106c3fb27SDimitry Andric 520b57cec5SDimitry Andric /// emitSourceFileHeader - Output an LLVM style file header to the specified 530b57cec5SDimitry Andric /// raw_ostream. 54*5f757f3fSDimitry Andric void emitSourceFileHeader(StringRef Desc, raw_ostream &OS, 55*5f757f3fSDimitry Andric const RecordKeeper &Record = RecordKeeper()); 560b57cec5SDimitry Andric 570b57cec5SDimitry Andric } // End llvm namespace 580b57cec5SDimitry Andric 590b57cec5SDimitry Andric #endif 60