diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h index 6737721e1ed1b..8d1235be78a4a 100644 --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -6480,6 +6480,15 @@ class AtomicExpr : public Expr { QualType getValueType() const; AtomicOp getOp() const { return Op; } + StringRef getOpAsString() const { + switch (Op) { +#define BUILTIN(ID, TYPE, ATTRS) +#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \ + case AO##ID: \ + return #ID; +#include "clang/Basic/Builtins.def" + } + } unsigned getNumSubExprs() const { return NumSubExprs; } Expr **getSubExprs() { return reinterpret_cast(SubExprs); } diff --git a/clang/include/clang/AST/JSONNodeDumper.h b/clang/include/clang/AST/JSONNodeDumper.h index 0ce272df8df65..4def5389137fa 100644 --- a/clang/include/clang/AST/JSONNodeDumper.h +++ b/clang/include/clang/AST/JSONNodeDumper.h @@ -285,6 +285,7 @@ class JSONNodeDumper void VisitBinaryOperator(const BinaryOperator *BO); void VisitCompoundAssignOperator(const CompoundAssignOperator *CAO); void VisitMemberExpr(const MemberExpr *ME); + void VisitAtomicExpr(const AtomicExpr *AE); void VisitCXXNewExpr(const CXXNewExpr *NE); void VisitCXXDeleteExpr(const CXXDeleteExpr *DE); void VisitCXXThisExpr(const CXXThisExpr *TE); diff --git a/clang/lib/AST/JSONNodeDumper.cpp b/clang/lib/AST/JSONNodeDumper.cpp index 139dfce41e914..e67c2c7e216dc 100644 --- a/clang/lib/AST/JSONNodeDumper.cpp +++ b/clang/lib/AST/JSONNodeDumper.cpp @@ -1179,6 +1179,10 @@ void JSONNodeDumper::VisitBlockDecl(const BlockDecl *D) { attributeOnlyIfTrue("capturesThis", D->capturesCXXThis()); } +void JSONNodeDumper::VisitAtomicExpr(const AtomicExpr *AE) { + JOS.attribute("name", AE->getOpAsString()); +} + void JSONNodeDumper::VisitObjCEncodeExpr(const ObjCEncodeExpr *OEE) { JOS.attribute("encodedType", createQualType(OEE->getEncodedType())); } diff --git a/clang/test/AST/ast-dump-atomic-json.c b/clang/test/AST/ast-dump-atomic-json.c new file mode 100644 index 0000000000000..fa236cee25a1b --- /dev/null +++ b/clang/test/AST/ast-dump-atomic-json.c @@ -0,0 +1,60 @@ +// RUN: %clang_cc1 -triple x86_64-pc-linux -Wno-unused-value -ast-dump=json %s | FileCheck %s + +int foo(int * ptr) { + return __atomic_load_n(ptr, __ATOMIC_SEQ_CST); +} + +// NOTE: CHECK lines have *not* been autogenerated by gen_ast_dump_json_test.py +// as its output is not portable for AtomicExpr across platforms. Instead rely +// on loose CHECKS. + + +// CHECK-NOT: {{^}}Dumping +// CHECK: "kind": "AtomicExpr", +// CHECK: "type": { +// CHECK: "qualType": "int" +// CHECK: }, +// CHECK: "valueCategory": "prvalue", +// CHECK: "name": "__atomic_load_n", +// CHECK: "inner": [ +// CHECK: { +// CHECK: "id": "0x{{.*}}", +// CHECK: "kind": "ImplicitCastExpr", +// CHECK: }, +// CHECK: "type": { +// CHECK: "qualType": "int *" +// CHECK: }, +// CHECK: "valueCategory": "prvalue", +// CHECK: "castKind": "LValueToRValue", +// CHECK: "inner": [ +// CHECK: { +// CHECK: "id": "0x{{.*}}", +// CHECK: "kind": "DeclRefExpr", +// CHECK: }, +// CHECK: "type": { +// CHECK: "qualType": "int *" +// CHECK: }, +// CHECK: "valueCategory": "lvalue", +// CHECK: "referencedDecl": { +// CHECK: "id": "0x{{.*}}", +// CHECK: "kind": "ParmVarDecl", +// CHECK: "name": "ptr", +// CHECK: "type": { +// CHECK: "qualType": "int *" +// CHECK: } +// CHECK: } +// CHECK: } +// CHECK: ] +// CHECK: }, +// CHECK: { +// CHECK: "id": "0x{{.*}}", +// CHECK: "kind": "IntegerLiteral", +// CHECK: }, +// CHECK: "type": { +// CHECK: "qualType": "int" +// CHECK: }, +// CHECK: "valueCategory": "prvalue", +// CHECK: "value": "5" +// CHECK: } +// CHECK: ] +// CHECK: }