llvm-6502/utils/TableGen/ClangASTNodesEmitter.h
Sean Hunt c10a62b0d5 Allow for creation of clang DeclNodes tables.
The StmtNodes generator has been generalized to allow for the
creation of DeclNodes tables as well, and another emitter was
added for DeclContexts.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@105164 91177308-0d34-0410-b5e6-96231b3b80d8
2010-05-30 07:21:42 +00:00

85 lines
2.3 KiB
C++

//===- ClangASTNodesEmitter.h - Generate Clang AST node tables -*- 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 AST node tables
//
//===----------------------------------------------------------------------===//
#ifndef CLANGAST_EMITTER_H
#define CLANGAST_EMITTER_H
#include "TableGenBackend.h"
#include "Record.h"
#include <string>
#include <cctype>
#include <map>
namespace llvm {
/// ClangStmtNodesEmitter - The top-level class emits .inc files containing
/// declarations of Clang statements.
///
class ClangASTNodesEmitter : public TableGenBackend {
// A map from a node to each of its derived nodes.
typedef std::multimap<Record*, Record*> ChildMap;
typedef ChildMap::const_iterator ChildIterator;
RecordKeeper &Records;
Record Root;
const std::string &BaseSuffix;
// Create a macro-ized version of a name
static std::string macroName(std::string S) {
for (unsigned i = 0; i < S.size(); ++i)
S[i] = std::toupper(S[i]);
return S;
}
// Return the name to be printed in the base field. Normally this is
// the record's name plus the base suffix, but if it is the root node and
// the suffix is non-empty, it's just the suffix.
std::string baseName(Record &R) {
if (&R == &Root && !BaseSuffix.empty())
return BaseSuffix;
return R.getName() + BaseSuffix;
}
std::pair<Record *, Record *> EmitNode (const ChildMap &Tree, raw_ostream& OS,
Record *Base);
public:
explicit ClangASTNodesEmitter(RecordKeeper &R, const std::string &N,
const std::string &S)
: Records(R), Root(N, SMLoc()), BaseSuffix(S)
{}
// run - Output the .inc file contents
void run(raw_ostream &OS);
};
/// ClangDeclContextEmitter - Emits an addendum to a .inc file to enumerate the
/// clang declaration contexts.
///
class ClangDeclContextEmitter : public TableGenBackend {
RecordKeeper &Records;
public:
explicit ClangDeclContextEmitter(RecordKeeper &R)
: Records(R)
{}
// run - Output the .inc file contents
void run(raw_ostream &OS);
};
} // End llvm namespace
#endif