1*a86e966aSRahul Joshi //===- TableGenBackendSkeleton.cpp - Skeleton TableGen backend --*- C++ -*-===// 2848d66faSPaul C. Anagnostopoulos // 3848d66faSPaul C. Anagnostopoulos // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4848d66faSPaul C. Anagnostopoulos // See https://llvm.org/LICENSE.txt for license information. 5848d66faSPaul C. Anagnostopoulos // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6848d66faSPaul C. Anagnostopoulos // 7848d66faSPaul C. Anagnostopoulos //===----------------------------------------------------------------------===// 8848d66faSPaul C. Anagnostopoulos // 9848d66faSPaul C. Anagnostopoulos // This Tablegen backend emits ... 10848d66faSPaul C. Anagnostopoulos // 11848d66faSPaul C. Anagnostopoulos //===----------------------------------------------------------------------===// 12848d66faSPaul C. Anagnostopoulos 1392f49b89Sserge-sans-paille #include "llvm/ADT/StringRef.h" 14848d66faSPaul C. Anagnostopoulos #include "llvm/TableGen/TableGenBackend.h" 15848d66faSPaul C. Anagnostopoulos 16848d66faSPaul C. Anagnostopoulos #define DEBUG_TYPE "skeleton-emitter" 17848d66faSPaul C. Anagnostopoulos 1892f49b89Sserge-sans-paille namespace llvm { 1992f49b89Sserge-sans-paille class RecordKeeper; 2092f49b89Sserge-sans-paille class raw_ostream; 2192f49b89Sserge-sans-paille } // namespace llvm 2292f49b89Sserge-sans-paille 23848d66faSPaul C. Anagnostopoulos using namespace llvm; 24848d66faSPaul C. Anagnostopoulos 25848d66faSPaul C. Anagnostopoulos namespace { 26848d66faSPaul C. Anagnostopoulos 27848d66faSPaul C. Anagnostopoulos // Any helper data structures can be defined here. Some backends use 28848d66faSPaul C. Anagnostopoulos // structs to collect information from the records. 29848d66faSPaul C. Anagnostopoulos 30848d66faSPaul C. Anagnostopoulos class SkeletonEmitter { 31848d66faSPaul C. Anagnostopoulos private: 32*a86e966aSRahul Joshi const RecordKeeper &Records; 33848d66faSPaul C. Anagnostopoulos 34848d66faSPaul C. Anagnostopoulos public: 35*a86e966aSRahul Joshi SkeletonEmitter(const RecordKeeper &RK) : Records(RK) {} 36848d66faSPaul C. Anagnostopoulos 37848d66faSPaul C. Anagnostopoulos void run(raw_ostream &OS); 380c1bb4f8SPaul C. Anagnostopoulos }; // emitter class 39848d66faSPaul C. Anagnostopoulos 400c1bb4f8SPaul C. Anagnostopoulos } // anonymous namespace 41848d66faSPaul C. Anagnostopoulos 42848d66faSPaul C. Anagnostopoulos void SkeletonEmitter::run(raw_ostream &OS) { 43848d66faSPaul C. Anagnostopoulos emitSourceFileHeader("Skeleton data structures", OS); 4421f5f509SPaul C. Anagnostopoulos 4521f5f509SPaul C. Anagnostopoulos (void)Records; // To suppress unused variable warning; remove on use. 46848d66faSPaul C. Anagnostopoulos } 47848d66faSPaul C. Anagnostopoulos 484178ef43SNAKAMURA Takumi // Choose either option A or B. 49848d66faSPaul C. Anagnostopoulos 504178ef43SNAKAMURA Takumi //===----------------------------------------------------------------------===// 514178ef43SNAKAMURA Takumi // Option A: Register the backed as class <SkeletonEmitter> 524178ef43SNAKAMURA Takumi static TableGen::Emitter::OptClass<SkeletonEmitter> 534178ef43SNAKAMURA Takumi X("gen-skeleton-class", "Generate example skeleton class"); 54848d66faSPaul C. Anagnostopoulos 554178ef43SNAKAMURA Takumi //===----------------------------------------------------------------------===// 564178ef43SNAKAMURA Takumi // Option B: Register "EmitSkeleton" directly 574178ef43SNAKAMURA Takumi // The emitter entry may be private scope. 58*a86e966aSRahul Joshi static void EmitSkeleton(const RecordKeeper &RK, raw_ostream &OS) { 59848d66faSPaul C. Anagnostopoulos // Instantiate the emitter class and invoke run(). 60848d66faSPaul C. Anagnostopoulos SkeletonEmitter(RK).run(OS); 61848d66faSPaul C. Anagnostopoulos } 62848d66faSPaul C. Anagnostopoulos 634178ef43SNAKAMURA Takumi static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, 644178ef43SNAKAMURA Takumi "Generate example skeleton entry"); 65