freebsd-dev/contrib/llvm/utils/TableGen/ClangAttrEmitter.cpp
Ed Schouten ffd1746d03 Upgrade our Clang in base to r108428.
This commit merges the latest LLVM sources from the vendor space. It
also updates the build glue to match the new sources. Clang's version
number is changed to match LLVM's, which means /usr/include/clang/2.0
has been renamed to /usr/include/clang/2.8.

Obtained from:	projects/clangbsd
2010-07-20 17:16:57 +00:00

85 lines
2.4 KiB
C++

//===- ClangAttrEmitter.cpp - Generate Clang attribute handling =-*- C++ -*--=//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// These tablegen backends emit Clang attribute processing code
//
//===----------------------------------------------------------------------===//
#include "ClangAttrEmitter.h"
#include "Record.h"
#include <algorithm>
using namespace llvm;
void ClangAttrClassEmitter::run(raw_ostream &OS) {
OS << "// This file is generated by TableGen. Do not edit.\n\n";
OS << "#ifndef LLVM_CLANG_ATTR_CLASSES_INC\n";
OS << "#define LLVM_CLANG_ATTR_CLASSES_INC\n\n";
std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
for (std::vector<Record*>::iterator i = Attrs.begin(), e = Attrs.end();
i != e; ++i) {
Record &R = **i;
if (R.getValueAsBit("DoNotEmit"))
continue;
OS << "class " << R.getName() << "Attr : public Attr {\n";
std::vector<Record*> Args = R.getValueAsListOfDefs("Args");
// FIXME: Handle arguments
assert(Args.empty() && "Can't yet handle arguments");
OS << "\n public:\n";
OS << " " << R.getName() << "Attr(";
// Arguments go here
OS << ")\n";
OS << " : Attr(attr::" << R.getName() << ")";
// Arguments go here
OS << " {}\n\n";
OS << " virtual Attr *clone (ASTContext &C) const;\n";
OS << " static bool classof(const Attr *A) { return A->getKind() == "
<< "attr::" << R.getName() << "; }\n";
OS << " static bool classof(const " << R.getName()
<< "Attr *) { return true; }\n";
OS << "};\n\n";
}
OS << "#endif\n";
}
void ClangAttrListEmitter::run(raw_ostream &OS) {
OS << "// This file is generated by TableGen. Do not edit.\n\n";
OS << "#ifndef LAST_ATTR\n";
OS << "#define LAST_ATTR(NAME) ATTR(NAME)\n";
OS << "#endif\n\n";
std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
std::vector<Record*>::iterator i = Attrs.begin(), e = Attrs.end();
if (i != e) {
// Move the end iterator back to emit the last attribute.
for(--e; i != e; ++i)
OS << "ATTR(" << (*i)->getName() << ")\n";
OS << "LAST_ATTR(" << (*i)->getName() << ")\n\n";
}
OS << "#undef LAST_ATTR\n";
OS << "#undef ATTR\n";
}