#include "Record.h"
#include "llvm/ADT/StringSwitch.h"
#include <algorithm>
+#include <cctype>
using namespace llvm;
-static const std::vector<StringRef> getValueAsListOfStrings(Record &R,
- StringRef FieldName) {
+static const std::vector<StringRef>
+getValueAsListOfStrings(Record &R, StringRef FieldName) {
ListInit *List = R.getValueAsListInit(FieldName);
assert (List && "Got a null ListInit");
return StringSwitch<std::string>(type)
.EndsWith("Decl *", "cast_or_null<" + std::string(type, 0, type.size()-1) +
">(GetDecl(Record[Idx++]))")
- .Case("QualType", "ReadTypeRecord(Idx++)")
+ .Case("QualType", "GetType(Record[Idx++])")
.Default("Record[Idx++]");
}
upperName[0] = std::toupper(upperName[0]);
}
}
+ virtual ~Argument() {}
- StringRef getLowerName() const { return lowerName; };
- StringRef getUpperName() const { return upperName; };
- StringRef getAttrName() const { return attrName; };
+ StringRef getLowerName() const { return lowerName; }
+ StringRef getUpperName() const { return upperName; }
+ StringRef getAttrName() const { return attrName; }
// These functions print the argument contents formatted in different ways.
virtual void writeAccessors(raw_ostream &OS) const = 0;
: Argument(Arg, Attr), type(T)
{}
- std::string getType() const { return type; }
-
void writeAccessors(raw_ostream &OS) const {
OS << " " << type << " get" << getUpperName() << "() const {\n";
OS << " return " << getLowerName() << ";\n";
OS << "char *" << getLowerName() << ";";
}
void writePCHReadDecls(raw_ostream &OS) const {
- OS << " std::string " << getLowerName() << "= ReadString(Record, Idx);\n";
+ OS << " std::string " << getLowerName()
+ << "= ReadString(Record, Idx);\n";
}
void writePCHReadArgs(raw_ostream &OS) const {
OS << getLowerName();
OS << " bool is" << getLowerName() << "Expr = Record[Idx++];\n";
OS << " void *" << getLowerName() << "Ptr;\n";
OS << " if (is" << getLowerName() << "Expr)\n";
- OS << " " << getLowerName() << "Ptr = ReadExpr(DeclsCursor);\n";
+ OS << " " << getLowerName() << "Ptr = ReadExpr(F);\n";
OS << " else\n";
OS << " " << getLowerName()
- << "Ptr = GetTypeSourceInfo(DeclsCursor, Record, Idx);\n";
+ << "Ptr = GetTypeSourceInfo(F, Record, Idx);\n";
}
void writePCHWrite(raw_ostream &OS) const {
OS << " Record.push_back(SA->is" << getUpperName() << "Expr());\n";
};
class EnumArgument : public Argument {
- StringRef type;
+ std::string type;
std::vector<StringRef> values, enums;
public:
EnumArgument(Record &Arg, StringRef Attr)
}
void ClangAttrPCHReadEmitter::run(raw_ostream &OS) {
- OS << "// This file is generated by TableGen. Do not edi.\n\n";
+ OS << "// This file is generated by TableGen. Do not edit.\n\n";
std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr"),
ArgRecords;
}
OS << " }\n";
}
+
+void ClangAttrSpellingListEmitter::run(raw_ostream &OS) {
+ OS << "// This file is generated by TableGen. Do not edit.\n\n";
+
+ std::vector<Record*> Attrs = Records.getAllDerivedDefinitions("Attr");
+
+ for (std::vector<Record*>::iterator I = Attrs.begin(), E = Attrs.end(); I != E; ++I) {
+ Record &Attr = **I;
+
+ std::vector<StringRef> Spellings = getValueAsListOfStrings(Attr, "Spellings");
+
+ for (std::vector<StringRef>::const_iterator I = Spellings.begin(), E = Spellings.end(); I != E; ++I) {
+ StringRef Spelling = *I;
+ OS << ".Case(\"" << Spelling << "\", true)\n";
+ }
+ }
+
+}