[cfe-commits] r171760 - in /cfe/trunk: include/clang/AST/CMakeLists.txt include/clang/AST/Makefile lib/AST/ASTDumper.cpp lib/AST/CMakeLists.txt test/Misc/ast-dump-attr.cpp test/Tooling/clang-check-ast-dump.cpp utils/TableGen/ClangAttrEmitter.cpp utils/TableGen/TableGen.cpp utils/TableGen/TableGenBackends.h
Alexander Kornienko
alexfh at google.com
Mon Jan 7 16:01:39 PST 2013
Does r171808 fix the issue?
On Mon, Jan 7, 2013 at 11:38 PM, David Dean <david_dean at apple.com> wrote:
> I'm seeing the following test failure on darwin:
>
> ******************** TEST 'Clang :: Misc/ast-dump-attr.cpp' FAILED
> ********************Script:
> --
> /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-nobootstrap-RA/clang-build/Release+Asserts/bin/clang
> -cc1 -internal-isystem
> /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-nobootstrap-RA/clang-build/Release+Asserts/bin/../lib/clang/3.3/include
> -std=c++11 -ast-dump -ast-dump-filter Test
> /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-nobootstrap-RA/clang.src/test/Misc/ast-dump-attr.cpp
> | FileCheck --strict-whitespace
> /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-nobootstrap-RA/clang.src/test/Misc/ast-dump-attr.cpp
> --
> Exit Code: 1
> Command Output (stderr):
> --
> /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-nobootstrap-RA/clang.src/test/Misc/ast-dump-attr.cpp:82:31:
> error: only weak aliases are supported on darwin
> int TestString __attribute__((alias("alias1")));
> ^
> 1 error generated.
> /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-nobootstrap-RA/clang.src/test/Misc/ast-dump-attr.cpp:84:18:
> error: expected string not found in input
> // CHECK-NEXT: AliasAttr{{.*}} "alias1"
> ^
> <stdin>:84:180: note: scanning from here
> (VarDecl 0x10285abf0
> </Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-nobootstrap-RA/clang.src/test/Misc/ast-dump-attr.cpp:82:1,
> col:5> TestString 'int')
>
>
> ^
> <stdin>:93:7: note: possible intended match here
> (AllocSizeAttr 0x10285afd0 <col:49, col:61> 0))
> ^
> --
>
> ********************
> On 7 Jan 2013, at 9:53 AM, Alexander Kornienko <alexfh at google.com> wrote:
>
> > Author: alexfh
> > Date: Mon Jan 7 11:53:08 2013
> > New Revision: 171760
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=171760&view=rev
> > Log:
> > Implement Attr dumping for -ast-dump.
> > http://llvm-reviews.chandlerc.com/D234
> >
> > Patch by Philip Craig!
> >
> > Added:
> > cfe/trunk/test/Misc/ast-dump-attr.cpp
> > Modified:
> > cfe/trunk/include/clang/AST/CMakeLists.txt
> > cfe/trunk/include/clang/AST/Makefile
> > cfe/trunk/lib/AST/ASTDumper.cpp
> > cfe/trunk/lib/AST/CMakeLists.txt
> > cfe/trunk/test/Tooling/clang-check-ast-dump.cpp
> > cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp
> > cfe/trunk/utils/TableGen/TableGen.cpp
> > cfe/trunk/utils/TableGen/TableGenBackends.h
> >
> > Modified: cfe/trunk/include/clang/AST/CMakeLists.txt
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/CMakeLists.txt?rev=171760&r1=171759&r2=171760&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/include/clang/AST/CMakeLists.txt (original)
> > +++ cfe/trunk/include/clang/AST/CMakeLists.txt Mon Jan 7 11:53:08 2013
> > @@ -8,6 +8,11 @@
> > SOURCE ../Basic/Attr.td
> > TARGET ClangAttrImpl)
> >
> > +clang_tablegen(AttrDump.inc -gen-clang-attr-dump
> > + -I ${CMAKE_CURRENT_SOURCE_DIR}/../../
> > + SOURCE ../Basic/Attr.td
> > + TARGET ClangAttrDump)
> > +
> > clang_tablegen(StmtNodes.inc -gen-clang-stmt-nodes
> > SOURCE ../Basic/StmtNodes.td
> > TARGET ClangStmtNodes)
> >
> > Modified: cfe/trunk/include/clang/AST/Makefile
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Makefile?rev=171760&r1=171759&r2=171760&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/include/clang/AST/Makefile (original)
> > +++ cfe/trunk/include/clang/AST/Makefile Mon Jan 7 11:53:08 2013
> > @@ -1,6 +1,7 @@
> > CLANG_LEVEL := ../../..
> > TD_SRC_DIR = $(PROJ_SRC_DIR)/../Basic
> > -BUILT_SOURCES = Attrs.inc AttrImpl.inc StmtNodes.inc DeclNodes.inc \
> > +BUILT_SOURCES = Attrs.inc AttrImpl.inc AttrDump.inc \
> > + StmtNodes.inc DeclNodes.inc \
> > CommentNodes.inc CommentHTMLTags.inc \
> > CommentHTMLTagsProperties.inc CommentCommandInfo.inc
> >
> > @@ -20,6 +21,12 @@
> > $(Verb) $(ClangTableGen) -gen-clang-attr-impl -o $(call SYSPATH,
> $@) \
> > -I $(PROJ_SRC_DIR)/../../ $<
> >
> > +$(ObjDir)/AttrDump.inc.tmp : $(TD_SRC_DIR)/Attr.td $(CLANG_TBLGEN) \
> > + $(ObjDir)/.dir
> > + $(Echo) "Building Clang attribute dumper with tblgen"
> > + $(Verb) $(ClangTableGen) -gen-clang-attr-dump -o $(call SYSPATH,
> $@) \
> > + -I $(PROJ_SRC_DIR)/../../ $<
> > +
> > $(ObjDir)/StmtNodes.inc.tmp : $(TD_SRC_DIR)/StmtNodes.td $(CLANG_TBLGEN)
> \
> > $(ObjDir)/.dir
> > $(Echo) "Building Clang statement node tables with tblgen"
> >
> > Modified: cfe/trunk/lib/AST/ASTDumper.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTDumper.cpp?rev=171760&r1=171759&r2=171760&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/AST/ASTDumper.cpp (original)
> > +++ cfe/trunk/lib/AST/ASTDumper.cpp Mon Jan 7 11:53:08 2013
> > @@ -13,6 +13,7 @@
> >
> //===----------------------------------------------------------------------===//
> >
> > #include "clang/AST/ASTContext.h"
> > +#include "clang/AST/Attr.h"
> > #include "clang/AST/DeclCXX.h"
> > #include "clang/AST/DeclObjC.h"
> > #include "clang/AST/DeclVisitor.h"
> > @@ -74,6 +75,7 @@
> > void dumpDeclRef(const Decl *Node, const char *Label = 0);
> > void dumpName(const NamedDecl *D);
> > void dumpDeclContext(const DeclContext *DC);
> > + void dumpAttr(const Attr *A);
> >
> > // C++ Utilities
> > void dumpAccessSpecifier(AccessSpecifier AS);
> > @@ -141,6 +143,7 @@
> > // Stmts.
> > void VisitStmt(Stmt *Node);
> > void VisitDeclStmt(DeclStmt *Node);
> > + void VisitAttributedStmt(AttributedStmt *Node);
> > void VisitLabelStmt(LabelStmt *Node);
> > void VisitGotoStmt(GotoStmt *Node);
> >
> > @@ -308,6 +311,19 @@
> > dumpDecl(*I);
> > }
> >
> > +void ASTDumper::dumpAttr(const Attr *A) {
> > + IndentScope Indent(*this);
> > + switch (A->getKind()) {
> > +#define ATTR(X) case attr::X: OS << #X; break;
> > +#include "clang/Basic/AttrList.inc"
> > + default: llvm_unreachable("unexpected attribute kind");
> > + }
> > + OS << "Attr";
> > + dumpPointer(A);
> > + dumpSourceRange(A->getRange());
> > +#include "clang/AST/AttrDump.inc"
> > +}
> > +
> >
> //===----------------------------------------------------------------------===//
> > // C++ Utilities
> >
> //===----------------------------------------------------------------------===//
> > @@ -425,6 +441,11 @@
> > dumpPointer(D);
> > dumpSourceRange(D->getSourceRange());
> > DeclVisitor<ASTDumper>::Visit(D);
> > + if (D->hasAttrs()) {
> > + for (AttrVec::const_iterator I = D->getAttrs().begin(),
> > + E = D->getAttrs().end(); I != E; ++I)
> > + dumpAttr(*I);
> > + }
> > // Decls within functions are visited by the body
> > if (!isa<FunctionDecl>(*D) && !isa<ObjCMethodDecl>(*D))
> > dumpDeclContext(dyn_cast<DeclContext>(D));
> > @@ -959,6 +980,13 @@
> > dumpDecl(*I);
> > }
> >
> > +void ASTDumper::VisitAttributedStmt(AttributedStmt *Node) {
> > + VisitStmt(Node);
> > + for (ArrayRef<const Attr*>::iterator I = Node->getAttrs().begin(),
> > + E = Node->getAttrs().end(); I != E; ++I)
> > + dumpAttr(*I);
> > +}
> > +
> > void ASTDumper::VisitLabelStmt(LabelStmt *Node) {
> > VisitStmt(Node);
> > OS << " '" << Node->getName() << "'";
> >
> > Modified: cfe/trunk/lib/AST/CMakeLists.txt
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/CMakeLists.txt?rev=171760&r1=171759&r2=171760&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/AST/CMakeLists.txt (original)
> > +++ cfe/trunk/lib/AST/CMakeLists.txt Mon Jan 7 11:53:08 2013
> > @@ -64,6 +64,7 @@
> > ClangAttrClasses
> > ClangAttrList
> > ClangAttrImpl
> > + ClangAttrDump
> > ClangCommentCommandInfo
> > ClangCommentNodes
> > ClangCommentHTMLTags
> >
> > Added: cfe/trunk/test/Misc/ast-dump-attr.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/ast-dump-attr.cpp?rev=171760&view=auto
> >
> ==============================================================================
> > --- cfe/trunk/test/Misc/ast-dump-attr.cpp (added)
> > +++ cfe/trunk/test/Misc/ast-dump-attr.cpp Mon Jan 7 11:53:08 2013
> > @@ -0,0 +1,97 @@
> > +// RUN: %clang_cc1 -std=c++11 -ast-dump -ast-dump-filter Test %s |
> FileCheck --strict-whitespace %s
> > +
> > +int TestLocation
> > +__attribute__((unused));
> > +// CHECK: VarDecl{{.*}}TestLocation
> > +// CHECK-NEXT: UnusedAttr 0x{{[^ ]*}} <line:[[@LINE-2]]:16>
> > +
> > +int TestIndent
> > +__attribute__((unused));
> > +// CHECK: {{^\(VarDecl.*TestIndent[^()]*$}}
> > +// CHECK-NEXT: {{^ \(UnusedAttr[^()]*\)\)$}}
> > +
> > +void TestAttributedStmt() {
> > + switch (1) {
> > + case 1:
> > + [[clang::fallthrough]];
> > + case 2:
> > + ;
> > + }
> > +}
> > +// CHECK: FunctionDecl{{.*}}TestAttributedStmt
> > +// CHECK: AttributedStmt
> > +// CHECK-NEXT: FallThroughAttr
> > +// CHECK-NEXT: NullStmt
> > +
> > +[[clang::warn_unused_result]] int TestCXX11DeclAttr();
> > +// CHECK: FunctionDecl{{.*}}TestCXX11DeclAttr
> > +// CHECK-NEXT: WarnUnusedResultAttr
> > +
> > +int TestAlignedNull __attribute__((aligned));
> > +// CHECK: VarDecl{{.*}}TestAlignedNull
> > +// CHECK-NEXT: AlignedAttr
> > +// CHECK-NEXT: <<<NULL>>>
> > +
> > +int TestAlignedExpr __attribute__((aligned(4)));
> > +// CHECK: VarDecl{{.*}}TestAlignedExpr
> > +// CHECK-NEXT: AlignedAttr
> > +// CHECK-NEXT: IntegerLiteral
> > +
> > +int TestEnum __attribute__((visibility("default")));
> > +// CHECK: VarDecl{{.*}}TestEnum
> > +// CHECK-NEXT: VisibilityAttr{{.*}} Default
> > +
> > +class __attribute__((lockable)) Mutex {
> > +} mu1, mu2;
> > +int TestExpr __attribute__((guarded_by(mu1)));
> > +// CHECK: VarDecl{{.*}}TestExpr
> > +// CHECK-NEXT: GuardedByAttr
> > +// CHECK-NEXT: DeclRefExpr{{.*}}mu1
> > +
> > +class Mutex TestVariadicExpr __attribute__((acquired_after(mu1, mu2)));
> > +// CHECK: VarDecl{{.*}}TestVariadicExpr
> > +// CHECK: AcquiredAfterAttr
> > +// CHECK-NEXT: DeclRefExpr{{.*}}mu1
> > +// CHECK-NEXT: DeclRefExpr{{.*}}mu2
> > +
> > +void function1(void *) {
> > + int TestFunction __attribute__((cleanup(function1)));
> > +}
> > +// CHECK: VarDecl{{.*}}TestFunction
> > +// CHECK-NEXT: CleanupAttr{{.*}} Function{{.*}}function1
> > +
> > +void TestIdentifier(void *, int)
> > +__attribute__((pointer_with_type_tag(ident1,1,2)));
> > +// CHECK: FunctionDecl{{.*}}TestIdentifier
> > +// CHECK: ArgumentWithTypeTagAttr{{.*}} ident1
> > +
> > +void TestBool(void *, int)
> > +__attribute__((pointer_with_type_tag(bool1,1,2)));
> > +// CHECK: FunctionDecl{{.*}}TestBool
> > +// CHECK: ArgumentWithTypeTagAttr{{.*}} IsPointer
> > +
> > +void TestUnsigned(void *, int)
> > +__attribute__((pointer_with_type_tag(unsigned1,1,2)));
> > +// CHECK: FunctionDecl{{.*}}TestUnsigned
> > +// CHECK: ArgumentWithTypeTagAttr{{.*}} 0 1
> > +
> > +void TestInt(void) __attribute__((constructor(123)));
> > +// CHECK: FunctionDecl{{.*}}TestInt
> > +// CHECK-NEXT: ConstructorAttr{{.*}} 123
> > +
> > +int TestString __attribute__((alias("alias1")));
> > +// CHECK: VarDecl{{.*}}TestString
> > +// CHECK-NEXT: AliasAttr{{.*}} "alias1"
> > +
> > +extern struct s1 TestType
> > +__attribute__((type_tag_for_datatype(ident1,int)));
> > +// CHECK: VarDecl{{.*}}TestType
> > +// CHECK-NEXT: TypeTagForDatatypeAttr{{.*}} int
> > +
> > +void *TestVariadicUnsigned1(int) __attribute__((alloc_size(1)));
> > +// CHECK: FunctionDecl{{.*}}TestVariadicUnsigned1
> > +// CHECK: AllocSizeAttr{{.*}} 0
> > +
> > +void *TestVariadicUnsigned2(int, int) __attribute__((alloc_size(1,2)));
> > +// CHECK: FunctionDecl{{.*}}TestVariadicUnsigned2
> > +// CHECK: AllocSizeAttr{{.*}} 0 1
> >
> > Modified: cfe/trunk/test/Tooling/clang-check-ast-dump.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/clang-check-ast-dump.cpp?rev=171760&r1=171759&r2=171760&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/test/Tooling/clang-check-ast-dump.cpp (original)
> > +++ cfe/trunk/test/Tooling/clang-check-ast-dump.cpp Mon Jan 7 11:53:08
> 2013
> > @@ -31,7 +31,8 @@
> > // RUN: clang-check -ast-dump -ast-dump-filter
> test_namespace::TheClass::n "%s" -- 2>&1 | FileCheck -check-prefix
> CHECK-ATTR %s
> > // CHECK-ATTR: test_namespace
> > // CHECK-ATTR-NEXT: (FieldDecl{{.*}}n
> > -// FIXME: attribute dumping not implemented yet
> > +// CHECK-ATTR-NEXT: (AlignedAttr
> > +// CHECK-ATTR-NEXT: (BinaryOperator
> > //
> > // RUN: clang-check -ast-dump -ast-dump-filter
> test_namespace::AfterNullNode "%s" -- 2>&1 | FileCheck -check-prefix
> CHECK-AFTER-NULL %s
> > // CHECK-AFTER-NULL: class AfterNullNode
> >
> > Modified: cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp?rev=171760&r1=171759&r2=171760&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp (original)
> > +++ cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp Mon Jan 7 11:53:08
> 2013
> > @@ -125,6 +125,8 @@
> > virtual void writePCHReadDecls(raw_ostream &OS) const = 0;
> > virtual void writePCHWrite(raw_ostream &OS) const = 0;
> > virtual void writeValue(raw_ostream &OS) const = 0;
> > + virtual void writeDump(raw_ostream &OS) const = 0;
> > + virtual void writeDumpChildren(raw_ostream &OS) const {}
> > };
> >
> > class SimpleArgument : public Argument {
> > @@ -181,6 +183,28 @@
> > OS << "\" << get" << getUpperName() << "() << \"";
> > }
> > }
> > + void writeDump(raw_ostream &OS) const {
> > + if (type == "FunctionDecl *") {
> > + OS << " OS << \" \";\n";
> > + OS << " dumpBareDeclRef(SA->get" << getUpperName() <<
> "());\n";
> > + } else if (type == "IdentifierInfo *") {
> > + OS << " OS << \" \" << SA->get" << getUpperName()
> > + << "()->getName();\n";
> > + } else if (type == "QualType") {
> > + OS << " OS << \" \" << SA->get" << getUpperName()
> > + << "().getAsString();\n";
> > + } else if (type == "SourceLocation") {
> > + OS << " OS << \" \";\n";
> > + OS << " SA->get" << getUpperName() << "().print(OS, *SM);\n";
> > + } else if (type == "bool") {
> > + OS << " if (SA->get" << getUpperName() << "()) OS << \" "
> > + << getUpperName() << "\";\n";
> > + } else if (type == "int" || type == "unsigned") {
> > + OS << " OS << \" \" << SA->get" << getUpperName() << "();\n";
> > + } else {
> > + llvm_unreachable("Unknown SimpleArgument type!");
> > + }
> > + }
> > };
> >
> > class StringArgument : public Argument {
> > @@ -241,6 +265,10 @@
> > void writeValue(raw_ostream &OS) const {
> > OS << "\\\"\" << get" << getUpperName() << "() << \"\\\"";
> > }
> > + void writeDump(raw_ostream &OS) const {
> > + OS << " OS << \" \\\"\" << SA->get" << getUpperName()
> > + << "() << \"\\\"\";\n";
> > + }
> > };
> >
> > class AlignedArgument : public Argument {
> > @@ -353,6 +381,15 @@
> > << " " << getLowerName() << "Expr->printPretty(OS, 0,
> Policy);\n"
> > << " OS << \"";
> > }
> > + void writeDump(raw_ostream &OS) const {
> > + }
> > + void writeDumpChildren(raw_ostream &OS) const {
> > + OS << " if (SA->is" << getUpperName() << "Expr())\n";
> > + OS << " dumpStmt(SA->get" << getUpperName() << "Expr());\n";
> > + OS << " else\n";
> > + OS << " dumpType(SA->get" << getUpperName()
> > + << "Type()->getType());\n";
> > + }
> > };
> >
> > class VariadicArgument : public Argument {
> > @@ -439,17 +476,30 @@
> > << " }\n";
> > OS << " OS << \"";
> > }
> > + void writeDump(raw_ostream &OS) const {
> > + OS << " for (" << getAttrName() << "Attr::" << getLowerName()
> > + << "_iterator I = SA->" << getLowerName() << "_begin(), E =
> SA->"
> > + << getLowerName() << "_end(); I != E; ++I)\n";
> > + OS << " OS << \" \" << *I;\n";
> > + }
> > };
> >
> > class EnumArgument : public Argument {
> > std::string type;
> > - std::vector<StringRef> values, enums;
> > + std::vector<StringRef> values, enums, uniques;
> > public:
> > EnumArgument(Record &Arg, StringRef Attr)
> > : Argument(Arg, Attr), type(Arg.getValueAsString("Type")),
> > values(getValueAsListOfStrings(Arg, "Values")),
> > - enums(getValueAsListOfStrings(Arg, "Enums"))
> > - {}
> > + enums(getValueAsListOfStrings(Arg, "Enums")),
> > + uniques(enums)
> > + {
> > + // Calculate the various enum values
> > + std::sort(uniques.begin(), uniques.end());
> > + uniques.erase(std::unique(uniques.begin(), uniques.end()),
> uniques.end());
> > + // FIXME: Emit a proper error
> > + assert(!uniques.empty());
> > + }
> >
> > void writeAccessors(raw_ostream &OS) const {
> > OS << " " << type << " get" << getUpperName() << "() const {\n";
> > @@ -469,16 +519,8 @@
> > OS << type << " " << getUpperName();
> > }
> > void writeDeclarations(raw_ostream &OS) const {
> > - // Calculate the various enum values
> > - std::vector<StringRef> uniques(enums);
> > - std::sort(uniques.begin(), uniques.end());
> > - uniques.erase(std::unique(uniques.begin(), uniques.end()),
> > - uniques.end());
> > - // FIXME: Emit a proper error
> > - assert(!uniques.empty());
> > -
> > - std::vector<StringRef>::iterator i = uniques.begin(),
> > - e = uniques.end();
> > + std::vector<StringRef>::const_iterator i = uniques.begin(),
> > + e = uniques.end();
> > // The last one needs to not have a comma.
> > --e;
> >
> > @@ -505,6 +547,21 @@
> > void writeValue(raw_ostream &OS) const {
> > OS << "\" << get" << getUpperName() << "() << \"";
> > }
> > + void writeDump(raw_ostream &OS) const {
> > + OS << " switch(SA->get" << getUpperName() << "()) {\n";
> > + OS << " default:\n";
> > + OS << " llvm_unreachable(\"Unknown " << getAttrName() <<
> "Attr::"
> > + << type << "!\");\n";
> > + OS << " break;\n";
> > +
> > + for (std::vector<StringRef>::const_iterator I = uniques.begin(),
> > + E = uniques.end(); I != E; ++I) {
> > + OS << " case " << getAttrName() << "Attr::" << *I << ":\n";
> > + OS << " OS << \" " << *I << "\";\n";
> > + OS << " break;\n";
> > + }
> > + OS << " }\n";
> > + }
> > };
> >
> > class VersionArgument : public Argument {
> > @@ -552,6 +609,9 @@
> > void writeValue(raw_ostream &OS) const {
> > OS << getLowerName() << "=\" << get" << getUpperName() << "() <<
> \"";
> > }
> > + void writeDump(raw_ostream &OS) const {
> > + OS << " OS << \" \" << SA->get" << getUpperName() << "();\n";
> > + }
> > };
> >
> > class ExprArgument : public SimpleArgument {
> > @@ -575,6 +635,13 @@
> > << "Result.takeAs<Expr>();\n";
> > OS << " }\n";
> > }
> > +
> > + void writeDump(raw_ostream &OS) const {
> > + }
> > +
> > + void writeDumpChildren(raw_ostream &OS) const {
> > + OS << " dumpStmt(SA->get" << getUpperName() << "());\n";
> > + }
> > };
> >
> > class VariadicExprArgument : public VariadicArgument {
> > @@ -607,6 +674,16 @@
> > OS << " }\n";
> > OS << " }\n";
> > }
> > +
> > + void writeDump(raw_ostream &OS) const {
> > + }
> > +
> > + void writeDumpChildren(raw_ostream &OS) const {
> > + OS << " for (" << getAttrName() << "Attr::" << getLowerName()
> > + << "_iterator I = SA->" << getLowerName() << "_begin(), E =
> SA->"
> > + << getLowerName() << "_end(); I != E; ++I)\n";
> > + OS << " dumpStmt(*I);\n";
> > + }
> > };
> > }
> >
> > @@ -1163,4 +1240,36 @@
> > << "}\n";
> > }
> >
> > +// Emits the code to dump an attribute.
> > +void EmitClangAttrDump(RecordKeeper &Records, raw_ostream &OS) {
> > + OS <<
> > + " switch (A->getKind()) {\n"
> > + " default:\n"
> > + " llvm_unreachable(\"Unknown attribute kind!\");\n"
> > + " break;\n";
> > + std::vector<Record*> Attrs =
> Records.getAllDerivedDefinitions("Attr"), Args;
> > + for (std::vector<Record*>::iterator I = Attrs.begin(), E =
> Attrs.end();
> > + I != E; ++I) {
> > + Record &R = **I;
> > + if (!R.getValueAsBit("ASTNode"))
> > + continue;
> > + OS << " case attr::" << R.getName() << ": {\n";
> > + Args = R.getValueAsListOfDefs("Args");
> > + if (!Args.empty()) {
> > + OS << " const " << R.getName() << "Attr *SA = cast<" <<
> R.getName()
> > + << "Attr>(A);\n";
> > + for (std::vector<Record*>::iterator I = Args.begin(), E =
> Args.end();
> > + I != E; ++I)
> > + createArgument(**I, R.getName())->writeDump(OS);
> > + for (std::vector<Record*>::iterator I = Args.begin(), E =
> Args.end();
> > + I != E; ++I)
> > + createArgument(**I, R.getName())->writeDumpChildren(OS);
> > + }
> > + OS <<
> > + " break;\n"
> > + " }\n";
> > + }
> > + OS << " }\n";
> > +}
> > +
> > } // end namespace clang
> >
> > Modified: cfe/trunk/utils/TableGen/TableGen.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/TableGen/TableGen.cpp?rev=171760&r1=171759&r2=171760&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/utils/TableGen/TableGen.cpp (original)
> > +++ cfe/trunk/utils/TableGen/TableGen.cpp Mon Jan 7 11:53:08 2013
> > @@ -33,6 +33,7 @@
> > GenClangAttrTemplateInstantiate,
> > GenClangAttrParsedAttrList,
> > GenClangAttrParsedAttrKinds,
> > + GenClangAttrDump,
> > GenClangDiagsDefs,
> > GenClangDiagGroups,
> > GenClangDiagsIndexName,
> > @@ -81,6 +82,8 @@
> > clEnumValN(GenClangAttrParsedAttrKinds,
> > "gen-clang-attr-parsed-attr-kinds",
> > "Generate a clang parsed attribute
> kinds"),
> > + clEnumValN(GenClangAttrDump, "gen-clang-attr-dump",
> > + "Generate clang attribute dumper"),
> > clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
> > "Generate Clang diagnostics definitions"),
> > clEnumValN(GenClangDiagGroups,
> "gen-clang-diag-groups",
> > @@ -153,6 +156,9 @@
> > case GenClangAttrParsedAttrKinds:
> > EmitClangAttrParsedAttrKinds(Records, OS);
> > break;
> > + case GenClangAttrDump:
> > + EmitClangAttrDump(Records, OS);
> > + break;
> > case GenClangDiagsDefs:
> > EmitClangDiagsDefs(Records, OS, ClangComponent);
> > break;
> >
> > Modified: cfe/trunk/utils/TableGen/TableGenBackends.h
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/TableGen/TableGenBackends.h?rev=171760&r1=171759&r2=171760&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/utils/TableGen/TableGenBackends.h (original)
> > +++ cfe/trunk/utils/TableGen/TableGenBackends.h Mon Jan 7 11:53:08 2013
> > @@ -39,6 +39,7 @@
> > void EmitClangAttrTemplateInstantiate(RecordKeeper &Records, raw_ostream
> &OS);
> > void EmitClangAttrParsedAttrList(RecordKeeper &Records, raw_ostream &OS);
> > void EmitClangAttrParsedAttrKinds(RecordKeeper &Records, raw_ostream
> &OS);
> > +void EmitClangAttrDump(RecordKeeper &Records, raw_ostream &OS);
> >
> > void EmitClangDiagsDefs(RecordKeeper &Records, raw_ostream &OS,
> > const std::string &Component);
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
> -David
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130108/57968689/attachment.html>
More information about the cfe-commits
mailing list