A bugfix for tblgen, in the function ‘emitSourceFileHeader’.

When the first parameter (‘Desc’) is more than 80 characters long, it will result the header line that contains the description to be more
Than (4GB!) long. Not only it takes forever to produce, the output file cannot be open, since its ginormous.

Patch by Elior Malul.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173672 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nadav Rotem 2013-01-28 07:35:33 +00:00
parent 53597b2c5c
commit 6ab4cbc986

View File

@ -14,13 +14,20 @@
#include "llvm/ADT/Twine.h" #include "llvm/ADT/Twine.h"
#include "llvm/Support/raw_ostream.h" #include "llvm/Support/raw_ostream.h"
#include "llvm/TableGen/TableGenBackend.h" #include "llvm/TableGen/TableGenBackend.h"
#include <algorithm>
using namespace llvm; using namespace llvm;
const size_t MAX_LINE_LEN = 80U;
static void printLine(raw_ostream &OS, const Twine &Prefix, char Fill, static void printLine(raw_ostream &OS, const Twine &Prefix, char Fill,
StringRef Suffix) { StringRef Suffix) {
uint64_t Pos = OS.tell(); size_t Pos = (size_t)OS.tell();
assert((MAX_LINE_LEN - Prefix.str().size() - Suffix.size() > 0) &&
"header line exceeds max limit");
OS << Prefix; OS << Prefix;
for (unsigned i = OS.tell() - Pos, e = 80 - Suffix.size(); i != e; ++i) const size_t e = MAX_LINE_LEN - Suffix.size();
for (size_t i = (size_t)OS.tell() - Pos; i < e; ++i)
OS << Fill; OS << Fill;
OS << Suffix << '\n'; OS << Suffix << '\n';
} }
@ -28,10 +35,22 @@ static void printLine(raw_ostream &OS, const Twine &Prefix, char Fill,
void llvm::emitSourceFileHeader(StringRef Desc, raw_ostream &OS) { void llvm::emitSourceFileHeader(StringRef Desc, raw_ostream &OS) {
printLine(OS, "/*===- TableGen'erated file ", '-', "*- C++ -*-===*\\"); printLine(OS, "/*===- TableGen'erated file ", '-', "*- C++ -*-===*\\");
printLine(OS, "|*", ' ', "*|"); printLine(OS, "|*", ' ', "*|");
printLine(OS, "|* " + Desc, ' ', "*|"); size_t Pos = 0U;
printLine(OS, "|*", ' ', "*|"); size_t PosE;
printLine(OS, "|* Automatically generated file, do not edit!", ' ', "*|"); StringRef Prefix("|*");
printLine(OS, "|*", ' ', "*|"); StringRef Suffix(" *|");
do{
size_t PSLen = Suffix.size() + Prefix.size();
PosE = Pos + ((MAX_LINE_LEN > (Desc.size() - PSLen)) ?
Desc.size() :
MAX_LINE_LEN - PSLen);
printLine(OS, Prefix + Desc.slice(Pos, PosE), ' ', Suffix);
Pos = PosE;
} while(Pos < Desc.size());
printLine(OS, Prefix, ' ', Suffix);
printLine(OS, Prefix + " Automatically generated file, do not edit!", ' ',
Suffix);
printLine(OS, Prefix, ' ', Suffix);
printLine(OS, "\\*===", '-', "===*/"); printLine(OS, "\\*===", '-', "===*/");
OS << '\n'; OS << '\n';
} }