11c66b87fSJakob Stoklund Olesen //===- TableGenBackend.cpp - Utilities for TableGen Backends ----*- C++ -*-===//
284c287e3SPeter Collingbourne //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
684c287e3SPeter Collingbourne //
784c287e3SPeter Collingbourne //===----------------------------------------------------------------------===//
884c287e3SPeter Collingbourne //
984c287e3SPeter Collingbourne // This file provides useful services for TableGen backends...
1084c287e3SPeter Collingbourne //
1184c287e3SPeter Collingbourne //===----------------------------------------------------------------------===//
1284c287e3SPeter Collingbourne 
131407b177SCraig Topper #include "llvm/TableGen/TableGenBackend.h"
1483aa9471SBenjamin Kramer #include "llvm/ADT/Twine.h"
151c66b87fSJakob Stoklund Olesen #include "llvm/Support/raw_ostream.h"
16*eb812efaSJoerg Sonnenberger #include <cassert>
17f0705254SNadav Rotem 
1884c287e3SPeter Collingbourne using namespace llvm;
1984c287e3SPeter Collingbourne 
20f0705254SNadav Rotem const size_t MAX_LINE_LEN = 80U;
21f0705254SNadav Rotem 
printLine(raw_ostream & OS,const Twine & Prefix,char Fill,StringRef Suffix)2283aa9471SBenjamin Kramer static void printLine(raw_ostream &OS, const Twine &Prefix, char Fill,
2383aa9471SBenjamin Kramer                       StringRef Suffix) {
24f0705254SNadav Rotem   size_t Pos = (size_t)OS.tell();
2533684f9eSCraig Topper   assert((Prefix.str().size() + Suffix.size() <= MAX_LINE_LEN) &&
26f0705254SNadav Rotem          "header line exceeds max limit");
2783aa9471SBenjamin Kramer   OS << Prefix;
2833684f9eSCraig Topper   for (size_t i = (size_t)OS.tell() - Pos, e = MAX_LINE_LEN - Suffix.size();
2933684f9eSCraig Topper          i < e; ++i)
3083aa9471SBenjamin Kramer     OS << Fill;
3183aa9471SBenjamin Kramer   OS << Suffix << '\n';
3283aa9471SBenjamin Kramer }
3383aa9471SBenjamin Kramer 
emitSourceFileHeader(StringRef Desc,raw_ostream & OS)34e6aed139SJakob Stoklund Olesen void llvm::emitSourceFileHeader(StringRef Desc, raw_ostream &OS) {
3583aa9471SBenjamin Kramer   printLine(OS, "/*===- TableGen'erated file ", '-', "*- C++ -*-===*\\");
36f0705254SNadav Rotem   StringRef Prefix("|* ");
37f0705254SNadav Rotem   StringRef Suffix(" *|");
38cb7648beSCraig Topper   printLine(OS, Prefix, ' ', Suffix);
39f58341c6SCraig Topper   size_t PSLen = Prefix.size() + Suffix.size();
40f58341c6SCraig Topper   assert(PSLen < MAX_LINE_LEN);
41cb7648beSCraig Topper   size_t Pos = 0U;
42f0705254SNadav Rotem   do {
43f58341c6SCraig Topper     size_t Length = std::min(Desc.size() - Pos, MAX_LINE_LEN - PSLen);
44f58341c6SCraig Topper     printLine(OS, Prefix + Desc.substr(Pos, Length), ' ', Suffix);
45f58341c6SCraig Topper     Pos += Length;
46f0705254SNadav Rotem   } while (Pos < Desc.size());
47f0705254SNadav Rotem   printLine(OS, Prefix, ' ', Suffix);
48f0705254SNadav Rotem   printLine(OS, Prefix + "Automatically generated file, do not edit!", ' ',
49f0705254SNadav Rotem     Suffix);
50f0705254SNadav Rotem   printLine(OS, Prefix, ' ', Suffix);
5183aa9471SBenjamin Kramer   printLine(OS, "\\*===", '-', "===*/");
5283aa9471SBenjamin Kramer   OS << '\n';
5384c287e3SPeter Collingbourne }
54