blob: 77ed8414b15f978eaba530c0f0351b14eec2184d [file] [log] [blame]
Jakob Stoklund Olesen764dc752012-06-13 05:15:49 +00001//===- TableGenBackend.cpp - Utilities for TableGen Backends ----*- C++ -*-===//
Misha Brukman3da94ae2005-04-22 00:00:37 +00002//
John Criswell01d45822003-10-20 20:20:30 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattner30609102007-12-29 20:37:13 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Misha Brukman3da94ae2005-04-22 00:00:37 +00007//
John Criswell01d45822003-10-20 20:20:30 +00008//===----------------------------------------------------------------------===//
Chris Lattner2c0f2c72003-08-06 04:23:04 +00009//
10// This file provides useful services for TableGen backends...
11//
12//===----------------------------------------------------------------------===//
13
Craig Toppercfacb302015-05-26 06:48:46 +000014#include "llvm/TableGen/TableGenBackend.h"
Benjamin Kramer90540ad2012-06-19 17:04:16 +000015#include "llvm/ADT/Twine.h"
Jakob Stoklund Olesen764dc752012-06-13 05:15:49 +000016#include "llvm/Support/raw_ostream.h"
Nadav Rotem6ab4cbc2013-01-28 07:35:33 +000017
Chris Lattner2082ebe2004-08-01 03:55:39 +000018using namespace llvm;
Brian Gaeked0fde302003-11-11 22:41:34 +000019
Nadav Rotem6ab4cbc2013-01-28 07:35:33 +000020const size_t MAX_LINE_LEN = 80U;
21
Benjamin Kramer90540ad2012-06-19 17:04:16 +000022static void printLine(raw_ostream &OS, const Twine &Prefix, char Fill,
23 StringRef Suffix) {
Nadav Rotem6ab4cbc2013-01-28 07:35:33 +000024 size_t Pos = (size_t)OS.tell();
Craig Topperc9739ec2015-05-26 08:07:49 +000025 assert((Prefix.str().size() + Suffix.size() <= MAX_LINE_LEN) &&
Craig Topperd0185f82015-05-26 06:48:47 +000026 "header line exceeds max limit");
Benjamin Kramer90540ad2012-06-19 17:04:16 +000027 OS << Prefix;
Craig Topperc9739ec2015-05-26 08:07:49 +000028 for (size_t i = (size_t)OS.tell() - Pos, e = MAX_LINE_LEN - Suffix.size();
29 i < e; ++i)
Benjamin Kramer90540ad2012-06-19 17:04:16 +000030 OS << Fill;
31 OS << Suffix << '\n';
32}
33
Jakob Stoklund Olesen6f36fa92012-06-11 15:37:55 +000034void llvm::emitSourceFileHeader(StringRef Desc, raw_ostream &OS) {
Benjamin Kramer90540ad2012-06-19 17:04:16 +000035 printLine(OS, "/*===- TableGen'erated file ", '-', "*- C++ -*-===*\\");
Craig Topper88008cb2015-05-26 08:07:45 +000036 StringRef Prefix("|* ");
Nadav Rotem6ab4cbc2013-01-28 07:35:33 +000037 StringRef Suffix(" *|");
Craig Topper88008cb2015-05-26 08:07:45 +000038 printLine(OS, Prefix, ' ', Suffix);
Craig Topper7b0f8fc2015-05-26 08:07:56 +000039 size_t PSLen = Prefix.size() + Suffix.size();
40 assert(PSLen < MAX_LINE_LEN);
Craig Topper88008cb2015-05-26 08:07:45 +000041 size_t Pos = 0U;
Craig Topper7b0f8fc2015-05-26 08:07:56 +000042 do {
43 size_t Length = std::min(Desc.size() - Pos, MAX_LINE_LEN - PSLen);
44 printLine(OS, Prefix + Desc.substr(Pos, Length), ' ', Suffix);
45 Pos += Length;
Craig Topper88008cb2015-05-26 08:07:45 +000046 } while (Pos < Desc.size());
Nadav Rotem6ab4cbc2013-01-28 07:35:33 +000047 printLine(OS, Prefix, ' ', Suffix);
Craig Topper88008cb2015-05-26 08:07:45 +000048 printLine(OS, Prefix + "Automatically generated file, do not edit!", ' ',
Nadav Rotem6ab4cbc2013-01-28 07:35:33 +000049 Suffix);
50 printLine(OS, Prefix, ' ', Suffix);
Benjamin Kramer90540ad2012-06-19 17:04:16 +000051 printLine(OS, "\\*===", '-', "===*/");
52 OS << '\n';
Chris Lattner2c0f2c72003-08-06 04:23:04 +000053}