xref: /freebsd-src/contrib/llvm-project/llvm/include/llvm/TableGen/TableGenBackend.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
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