summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorAaron Ballman <aaron@aaronballman.com>2013-11-21 00:28:23 +0000
committerAaron Ballman <aaron@aaronballman.com>2013-11-21 00:28:23 +0000
commit18a7838e3e419ee95e9590a1416dd01e3290b40d (patch)
treea2f3f4acb11b60ceacd215ead77ca17421563d84 /clang
parent7cd45f29b26b6cb4e0019b7355ed69db9ab55992 (diff)
downloadbcm5719-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.td4
-rw-r--r--clang/lib/Sema/SemaDeclAttr.cpp8
-rw-r--r--clang/utils/TableGen/ClangAttrEmitter.cpp24
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;
OpenPOWER on IntegriCloud