xref: /freebsd/contrib/llvm-project/llvm/lib/TableGen/TableGenBackend.cpp (revision 1c4ee7dfb8affed302171232b0f612e6bcba3c10)
1 //===- TableGenBackend.cpp - Utilities for TableGen Backends ----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file provides useful services for TableGen backends...
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "llvm/TableGen/TableGenBackend.h"
14 #include "llvm/ADT/Twine.h"
15 #include "llvm/Support/Path.h"
16 #include "llvm/Support/raw_ostream.h"
17 #include <algorithm>
18 #include <cassert>
19 #include <cstddef>
20 
21 using namespace llvm;
22 
23 const size_t MAX_LINE_LEN = 80U;
24 
25 namespace llvm::TableGen::Emitter {
26 ManagedStatic<cl::opt<FnT>, OptCreatorT> Action;
27 void *OptCreatorT::call() {
28   return new cl::opt<FnT>(cl::desc("Action to perform:"));
29 }
30 } // namespace llvm::TableGen::Emitter
31 
32 static void printLine(raw_ostream &OS, const Twine &Prefix, char Fill,
33                       StringRef Suffix) {
34   size_t Pos = (size_t)OS.tell();
35   assert((Prefix.str().size() + Suffix.size() <= MAX_LINE_LEN) &&
36          "header line exceeds max limit");
37   OS << Prefix;
38   for (size_t i = (size_t)OS.tell() - Pos, e = MAX_LINE_LEN - Suffix.size();
39          i < e; ++i)
40     OS << Fill;
41   OS << Suffix << '\n';
42 }
43 
44 void llvm::emitSourceFileHeader(StringRef Desc, raw_ostream &OS,
45                                 const RecordKeeper &Record) {
46   printLine(OS, "/*===- TableGen'erated file ", '-', "*- C++ -*-===*\\");
47   StringRef Prefix("|* ");
48   StringRef Suffix(" *|");
49   printLine(OS, Prefix, ' ', Suffix);
50   size_t PSLen = Prefix.size() + Suffix.size();
51   assert(PSLen < MAX_LINE_LEN);
52   size_t Pos = 0U;
53   do {
54     size_t Length = std::min(Desc.size() - Pos, MAX_LINE_LEN - PSLen);
55     printLine(OS, Prefix + Desc.substr(Pos, Length), ' ', Suffix);
56     Pos += Length;
57   } while (Pos < Desc.size());
58   printLine(OS, Prefix, ' ', Suffix);
59   printLine(OS, Prefix + "Automatically generated file, do not edit!", ' ',
60             Suffix);
61 
62   // Print the filename of source file
63   if (!Record.getInputFilename().empty())
64     printLine(
65         OS, Prefix + "From: " + sys::path::filename(Record.getInputFilename()),
66         ' ', Suffix);
67   printLine(OS, Prefix, ' ', Suffix);
68   printLine(OS, "\\*===", '-', "===*/");
69   OS << '\n';
70 }
71