diff options
author | Joel E. Denny <jdenny.ornl@gmail.com> | 2018-03-13 14:51:22 +0000 |
---|---|---|
committer | Joel E. Denny <jdenny.ornl@gmail.com> | 2018-03-13 14:51:22 +0000 |
commit | f4ca1ac809d708ef762f1134686a7afec656668d (patch) | |
tree | 943caffa47ef6d61479598faf1c0d39effb3d13f /utils | |
parent | 39d91bde1edb585124a77c89d019ff85b0c9d4e6 (diff) |
Reland "[Attr] Fix parameter indexing for several attributes"
Relands r326602 (reverted in r326862) with new test and fix for
PR36620.
Differential Revision: https://reviews.llvm.org/D43248
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@327405 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r-- | utils/TableGen/ClangAttrEmitter.cpp | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/utils/TableGen/ClangAttrEmitter.cpp b/utils/TableGen/ClangAttrEmitter.cpp index 5c786f5341..4f4f94bf37 100644 --- a/utils/TableGen/ClangAttrEmitter.cpp +++ b/utils/TableGen/ClangAttrEmitter.cpp @@ -104,6 +104,7 @@ static std::string ReadPCHRecord(StringRef type) { .Case("Expr *", "Record.readExpr()") .Case("IdentifierInfo *", "Record.getIdentifierInfo()") .Case("StringRef", "Record.readString()") + .Case("ParamIdx", "ParamIdx::deserialize(Record.readInt())") .Default("Record.readInt()"); } @@ -122,6 +123,7 @@ static std::string WritePCHRecord(StringRef type, StringRef name) { .Case("Expr *", "AddStmt(" + std::string(name) + ");\n") .Case("IdentifierInfo *", "AddIdentifierRef(" + std::string(name) + ");\n") .Case("StringRef", "AddString(" + std::string(name) + ");\n") + .Case("ParamIdx", "push_back(" + std::string(name) + ".serialize());\n") .Default("push_back(" + std::string(name) + ");\n"); } @@ -302,9 +304,8 @@ namespace { std::string getIsOmitted() const override { if (type == "IdentifierInfo *") return "!get" + getUpperName().str() + "()"; - // FIXME: Do this declaratively in Attr.td. - if (getAttrName() == "AllocSize") - return "0 == get" + getUpperName().str() + "()"; + if (type == "ParamIdx") + return "!get" + getUpperName().str() + "().isValid()"; return "false"; } @@ -319,6 +320,8 @@ namespace { << "()->getName() : \"\") << \""; else if (type == "TypeSourceInfo *") OS << "\" << get" << getUpperName() << "().getAsString() << \""; + else if (type == "ParamIdx") + OS << "\" << get" << getUpperName() << "().getSourceIndex() << \""; else OS << "\" << get" << getUpperName() << "() << \""; } @@ -341,6 +344,11 @@ namespace { << getUpperName() << "\";\n"; } else if (type == "int" || type == "unsigned") { OS << " OS << \" \" << SA->get" << getUpperName() << "();\n"; + } else if (type == "ParamIdx") { + if (isOptional()) + OS << " if (SA->get" << getUpperName() << "().isValid())\n "; + OS << " OS << \" \" << SA->get" << getUpperName() + << "().getSourceIndex();\n"; } else { llvm_unreachable("Unknown SimpleArgument type!"); } @@ -618,6 +626,10 @@ namespace { virtual void writeValueImpl(raw_ostream &OS) const { OS << " OS << Val;\n"; } + // Assumed to receive a parameter: raw_ostream OS. + virtual void writeDumpImpl(raw_ostream &OS) const { + OS << " OS << \" \" << Val;\n"; + } public: VariadicArgument(const Record &Arg, StringRef Attr, std::string T) @@ -744,7 +756,22 @@ namespace { void writeDump(raw_ostream &OS) const override { OS << " for (const auto &Val : SA->" << RangeName << "())\n"; - OS << " OS << \" \" << Val;\n"; + writeDumpImpl(OS); + } + }; + + class VariadicParamIdxArgument : public VariadicArgument { + public: + VariadicParamIdxArgument(const Record &Arg, StringRef Attr) + : VariadicArgument(Arg, Attr, "ParamIdx") {} + + public: + void writeValueImpl(raw_ostream &OS) const override { + OS << " OS << Val.getSourceIndex();\n"; + } + + void writeDumpImpl(raw_ostream &OS) const override { + OS << " OS << \" \" << Val.getSourceIndex();\n"; } }; @@ -1247,6 +1274,10 @@ createArgument(const Record &Arg, StringRef Attr, Ptr = llvm::make_unique<VariadicEnumArgument>(Arg, Attr); else if (ArgName == "VariadicExprArgument") Ptr = llvm::make_unique<VariadicExprArgument>(Arg, Attr); + else if (ArgName == "VariadicParamIdxArgument") + Ptr = llvm::make_unique<VariadicParamIdxArgument>(Arg, Attr); + else if (ArgName == "ParamIdxArgument") + Ptr = llvm::make_unique<SimpleArgument>(Arg, Attr, "ParamIdx"); else if (ArgName == "VersionArgument") Ptr = llvm::make_unique<VersionArgument>(Arg, Attr); |