ffd1746d03
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
85 lines
2.3 KiB
C++
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 {
|
|
|
|
/// ClangASTNodesEmitter - 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
|