1239462Sdim//===- TableGenBackend.cpp - Utilities for TableGen Backends ----*- C++ -*-===// 2226584Sdim// 3226584Sdim// The LLVM Compiler Infrastructure 4226584Sdim// 5226584Sdim// This file is distributed under the University of Illinois Open Source 6226584Sdim// License. See LICENSE.TXT for details. 7226584Sdim// 8226584Sdim//===----------------------------------------------------------------------===// 9226584Sdim// 10226584Sdim// This file provides useful services for TableGen backends... 11226584Sdim// 12226584Sdim//===----------------------------------------------------------------------===// 13226584Sdim 14239462Sdim#include "llvm/ADT/Twine.h" 15239462Sdim#include "llvm/Support/raw_ostream.h" 16226584Sdim#include "llvm/TableGen/TableGenBackend.h" 17249423Sdim#include <algorithm> 18249423Sdim 19226584Sdimusing namespace llvm; 20226584Sdim 21249423Sdimconst size_t MAX_LINE_LEN = 80U; 22249423Sdim 23239462Sdimstatic void printLine(raw_ostream &OS, const Twine &Prefix, char Fill, 24239462Sdim StringRef Suffix) { 25249423Sdim size_t Pos = (size_t)OS.tell(); 26249423Sdim assert((MAX_LINE_LEN - Prefix.str().size() - Suffix.size() > 0) && 27249423Sdim "header line exceeds max limit"); 28239462Sdim OS << Prefix; 29249423Sdim const size_t e = MAX_LINE_LEN - Suffix.size(); 30249423Sdim for (size_t i = (size_t)OS.tell() - Pos; i < e; ++i) 31239462Sdim OS << Fill; 32239462Sdim OS << Suffix << '\n'; 33239462Sdim} 34234353Sdim 35239462Sdimvoid llvm::emitSourceFileHeader(StringRef Desc, raw_ostream &OS) { 36239462Sdim printLine(OS, "/*===- TableGen'erated file ", '-', "*- C++ -*-===*\\"); 37239462Sdim printLine(OS, "|*", ' ', "*|"); 38249423Sdim size_t Pos = 0U; 39249423Sdim size_t PosE; 40249423Sdim StringRef Prefix("|*"); 41249423Sdim StringRef Suffix(" *|"); 42249423Sdim do{ 43249423Sdim size_t PSLen = Suffix.size() + Prefix.size(); 44249423Sdim PosE = Pos + ((MAX_LINE_LEN > (Desc.size() - PSLen)) ? 45249423Sdim Desc.size() : 46249423Sdim MAX_LINE_LEN - PSLen); 47249423Sdim printLine(OS, Prefix + Desc.slice(Pos, PosE), ' ', Suffix); 48249423Sdim Pos = PosE; 49249423Sdim } while(Pos < Desc.size()); 50249423Sdim printLine(OS, Prefix, ' ', Suffix); 51249423Sdim printLine(OS, Prefix + " Automatically generated file, do not edit!", ' ', 52249423Sdim Suffix); 53249423Sdim printLine(OS, Prefix, ' ', Suffix); 54239462Sdim printLine(OS, "\\*===", '-', "===*/"); 55239462Sdim OS << '\n'; 56226584Sdim} 57