diff options
| author | Aaron Ballman <aaron@aaronballman.com> | 2013-11-21 00:28:23 +0000 |
|---|---|---|
| committer | Aaron Ballman <aaron@aaronballman.com> | 2013-11-21 00:28:23 +0000 |
| commit | 18a7838e3e419ee95e9590a1416dd01e3290b40d (patch) | |
| tree | a2f3f4acb11b60ceacd215ead77ca17421563d84 /clang | |
| parent | 7cd45f29b26b6cb4e0019b7355ed69db9ab55992 (diff) | |
| download | bcm5719-llvm-18a7838e3e419ee95e9590a1416dd01e3290b40d.tar.gz bcm5719-llvm-18a7838e3e419ee95e9590a1416dd01e3290b40d.zip | |
Implemented DefaultIntArgument in the table generator and start using it in semantic analysis. Removes some magic numbers.
llvm-svn: 195287
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/Basic/Attr.td | 4 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 8 | ||||
| -rw-r--r-- | clang/utils/TableGen/ClangAttrEmitter.cpp | 24 |
3 files changed, 28 insertions, 8 deletions
diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 27a27e33a78..bcca1d25ef7 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -321,7 +321,7 @@ def Const : InheritableAttr { def Constructor : InheritableAttr { let Spellings = [GNU<"constructor">, CXX11<"gnu", "constructor">]; - let Args = [IntArgument<"Priority", 1>]; + let Args = [DefaultIntArgument<"Priority", 65535>]; } def CUDAConstant : InheritableAttr { @@ -377,7 +377,7 @@ def Deprecated : InheritableAttr { def Destructor : InheritableAttr { let Spellings = [GNU<"destructor">, CXX11<"gnu", "destructor">]; - let Args = [IntArgument<"Priority", 1>]; + let Args = [DefaultIntArgument<"Priority", 65535>]; } def ExtVectorType : Attr { diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 16725675a41..23395cacfec 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -2035,7 +2035,7 @@ static void handleConstructorAttr(Sema &S, Decl *D, const AttributeList &Attr) { return; } - int priority = 65535; // FIXME: Do not hardcode such constants. + int priority = ConstructorAttr::DefaultPriority; if (Attr.getNumArgs() > 0) { Expr *E = Attr.getArgAsExpr(0); llvm::APSInt Idx(32); @@ -2067,7 +2067,7 @@ static void handleDestructorAttr(Sema &S, Decl *D, const AttributeList &Attr) { return; } - int priority = 65535; // FIXME: Do not hardcode such constants. + int priority = DestructorAttr::DefaultPriority; if (Attr.getNumArgs() > 0) { Expr *E = Attr.getArgAsExpr(0); llvm::APSInt Idx(32); @@ -2562,7 +2562,7 @@ static void handleSentinelAttr(Sema &S, Decl *D, const AttributeList &Attr) { return; } - unsigned sentinel = 0; + unsigned sentinel = (unsigned)SentinelAttr::DefaultSentinel; if (Attr.getNumArgs() > 0) { Expr *E = Attr.getArgAsExpr(0); llvm::APSInt Idx(32); @@ -2583,7 +2583,7 @@ static void handleSentinelAttr(Sema &S, Decl *D, const AttributeList &Attr) { sentinel = Idx.getZExtValue(); } - unsigned nullPos = 0; + unsigned nullPos = (unsigned)SentinelAttr::DefaultNullPos; if (Attr.getNumArgs() > 1) { Expr *E = Attr.getArgAsExpr(1); llvm::APSInt Idx(32); diff --git a/clang/utils/TableGen/ClangAttrEmitter.cpp b/clang/utils/TableGen/ClangAttrEmitter.cpp index 653d7b79e28..71eaf131dd3 100644 --- a/clang/utils/TableGen/ClangAttrEmitter.cpp +++ b/clang/utils/TableGen/ClangAttrEmitter.cpp @@ -222,6 +222,22 @@ namespace { } }; + class DefaultSimpleArgument : public SimpleArgument { + int64_t Default; + + public: + DefaultSimpleArgument(Record &Arg, StringRef Attr, + std::string T, int64_t Default) + : SimpleArgument(Arg, Attr, T), Default(Default) {} + + void writeAccessors(raw_ostream &OS) const { + SimpleArgument::writeAccessors(OS); + + OS << "\n\n static const " << getType() << " Default" << getUpperName() + << " = " << Default << ";"; + } + }; + class StringArgument : public Argument { public: StringArgument(Record &Arg, StringRef Attr) @@ -871,6 +887,9 @@ static Argument *createArgument(Record &Arg, StringRef Attr, Ptr = new SimpleArgument(Arg, Attr, "IdentifierInfo *"); else if (ArgName == "BoolArgument") Ptr = new SimpleArgument(Arg, Attr, "bool"); + else if (ArgName == "DefaultIntArgument") + Ptr = new DefaultSimpleArgument(Arg, Attr, "int", + Arg.getValueAsInt("Default")); else if (ArgName == "IntArgument") Ptr = new SimpleArgument(Arg, Attr, "int"); else if (ArgName == "StringArgument") Ptr = new StringArgument(Arg, Attr); else if (ArgName == "TypeArgument") Ptr = new TypeArgument(Arg, Attr); @@ -888,9 +907,10 @@ static Argument *createArgument(Record &Arg, StringRef Attr, Ptr = new VersionArgument(Arg, Attr); if (!Ptr) { + // Search in reverse order so that the most-derived type is handled first. std::vector<Record*> Bases = Search->getSuperClasses(); - for (std::vector<Record*>::iterator i = Bases.begin(), e = Bases.end(); - i != e; ++i) { + for (std::vector<Record*>::reverse_iterator i = Bases.rbegin(), + e = Bases.rend(); i != e; ++i) { Ptr = createArgument(Arg, Attr, *i); if (Ptr) break; |

